# Copyright 2019 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

import errno
import os
import platform

import portage.process
from portage.const import BASH_BINARY
from portage.tests import TestCase

CLONE_NEWNET = 0x40000000

UNSHARE_NET_TEST_SCRIPT = """
ping -c 1 -W 1 127.0.0.1 || exit 1
ping -c 1 -W 1 10.0.0.1 || exit 1
[[ -n ${IPV6} ]] || exit 0
ping -c 1 -W 1 ::1 || exit 1
ping -c 1 -W 1 fd::1 || exit 1
"""


class UnshareNetTestCase(TestCase):
    def testUnshareNet(self):

        if platform.system() != "Linux":
            self.skipTest("not Linux")
        if portage.process.find_binary("ping") is None:
            self.skipTest("ping not found")

        errno_value = portage.process._unshare_validate(CLONE_NEWNET)
        if errno_value != 0:
            self.skipTest(
                "Unable to unshare: %s" % (errno.errorcode.get(errno_value, "?"))
            )

        env = os.environ.copy()
        env["IPV6"] = "1" if portage.process._has_ipv6() else ""
        self.assertEqual(
            portage.process.spawn(
                [BASH_BINARY, "-c", UNSHARE_NET_TEST_SCRIPT], unshare_net=True, env=env
            ),
            0,
        )
