test: refactor Docker-based tests in test-ns3.py

This commit is contained in:
Gabriel Ferreira
2022-11-12 17:02:49 -03:00
parent 0e7a8ebb31
commit 10a61ca102

View File

@@ -180,6 +180,71 @@ def get_enabled_modules():
return read_lock_entry("NS3_ENABLED_MODULES")
class DockerContainerManager:
"""!
Python-on-whales wrapper for Docker-based ns-3 tests
"""
def __init__(self, currentTestCase: unittest.TestCase, containerName: str = "ubuntu:latest"):
"""!
Create and start container with containerName in the current ns-3 directory
@param self: the current DockerContainerManager instance
@param currentTestCase: the test case instance creating the DockerContainerManager
@param containerName: name of the container image to be used
"""
global DockerException
try:
from python_on_whales import docker
from python_on_whales.exceptions import DockerException
except ModuleNotFoundError:
docker = None # noqa
DockerException = None # noqa
currentTestCase.skipTest("python-on-whales was not found")
# Import rootless docker settings from .bashrc
with open(os.path.expanduser("~/.bashrc"), "r") as f:
docker_settings = re.findall("(DOCKER_.*=.*)", f.read())
for setting in docker_settings:
key, value = setting.split("=")
os.environ[key] = value
del docker_settings, setting, key, value
# Create Docker client instance and start it
## The Python-on-whales container instance
self.container = docker.run(containerName,
interactive=True, detach=True,
tty=False,
volumes=[(ns3_path, "/ns-3-dev")]
)
# Redefine the execute command of the container
def split_exec(docker_container, cmd):
return docker_container._execute(cmd.split(), workdir="/ns-3-dev")
self.container._execute = self.container.execute
self.container.execute = partial(split_exec, self.container)
def __enter__(self):
"""!
Return the managed container when entiring the block "with DockerContainerManager() as container"
@param self: the current DockerContainerManager instance
@return container managed by DockerContainerManager.
"""
return self.container
def __exit__(self, exc_type, exc_val, exc_tb):
"""!
Clean up the managed container at the end of the block "with DockerContainerManager() as container"
@param self: the current DockerContainerManager instance
@param exc_type: unused parameter
@param exc_val: unused parameter
@param exc_tb: unused parameter
@return None
"""
self.container.stop()
self.container.remove()
class NS3UnusedSourcesTestCase(unittest.TestCase):
"""!
ns-3 tests related to checking if source files were left behind, not being used by CMake
@@ -606,19 +671,29 @@ class NS3ConfigureBuildProfileTestCase(unittest.TestCase):
return_code, stdout, stderr = run_ns3("configure -G \"{generator}\" --dry-run -d debug")
self.assertEqual(return_code, 0)
self.assertIn("-DCMAKE_BUILD_TYPE=debug -DNS3_ASSERT=ON -DNS3_LOG=ON -DNS3_WARNINGS_AS_ERRORS=ON -DNS3_NATIVE_OPTIMIZATIONS=OFF", stdout)
self.assertIn(
"-DCMAKE_BUILD_TYPE=debug -DNS3_ASSERT=ON -DNS3_LOG=ON -DNS3_WARNINGS_AS_ERRORS=ON -DNS3_NATIVE_OPTIMIZATIONS=OFF",
stdout)
return_code, stdout, stderr = run_ns3("configure -G \"{generator}\" --dry-run -d debug --disable-asserts --disable-logs --disable-werror")
return_code, stdout, stderr = run_ns3(
"configure -G \"{generator}\" --dry-run -d debug --disable-asserts --disable-logs --disable-werror")
self.assertEqual(return_code, 0)
self.assertIn("-DCMAKE_BUILD_TYPE=debug -DNS3_NATIVE_OPTIMIZATIONS=OFF -DNS3_ASSERT=OFF -DNS3_LOG=OFF -DNS3_WARNINGS_AS_ERRORS=OFF", stdout)
self.assertIn(
"-DCMAKE_BUILD_TYPE=debug -DNS3_NATIVE_OPTIMIZATIONS=OFF -DNS3_ASSERT=OFF -DNS3_LOG=OFF -DNS3_WARNINGS_AS_ERRORS=OFF",
stdout)
return_code, stdout, stderr = run_ns3("configure -G \"{generator}\" --dry-run")
self.assertEqual(return_code, 0)
self.assertIn("-DCMAKE_BUILD_TYPE=default -DNS3_ASSERT=ON -DNS3_LOG=ON -DNS3_WARNINGS_AS_ERRORS=OFF -DNS3_NATIVE_OPTIMIZATIONS=OFF", stdout)
self.assertIn(
"-DCMAKE_BUILD_TYPE=default -DNS3_ASSERT=ON -DNS3_LOG=ON -DNS3_WARNINGS_AS_ERRORS=OFF -DNS3_NATIVE_OPTIMIZATIONS=OFF",
stdout)
return_code, stdout, stderr = run_ns3("configure -G \"{generator}\" --dry-run --enable-asserts --enable-logs --enable-werror")
return_code, stdout, stderr = run_ns3(
"configure -G \"{generator}\" --dry-run --enable-asserts --enable-logs --enable-werror")
self.assertEqual(return_code, 0)
self.assertIn("-DCMAKE_BUILD_TYPE=default -DNS3_ASSERT=ON -DNS3_LOG=ON -DNS3_NATIVE_OPTIMIZATIONS=OFF -DNS3_ASSERT=ON -DNS3_LOG=ON -DNS3_WARNINGS_AS_ERRORS=ON", stdout)
self.assertIn(
"-DCMAKE_BUILD_TYPE=default -DNS3_ASSERT=ON -DNS3_LOG=ON -DNS3_NATIVE_OPTIMIZATIONS=OFF -DNS3_ASSERT=ON -DNS3_LOG=ON -DNS3_WARNINGS_AS_ERRORS=ON",
stdout)
class NS3BaseTestCase(unittest.TestCase):
@@ -1419,35 +1494,8 @@ class NS3ConfigureTestCase(NS3BaseTestCase):
@return None
"""
try:
from python_on_whales import docker
from python_on_whales.exceptions import DockerException
except ModuleNotFoundError:
docker = None # noqa
DockerException = None # noqa
self.skipTest("python-on-whales was not found")
# Import rootless docker settings from .bashrc
with open(os.path.expanduser("~/.bashrc"), "r") as f:
docker_settings = re.findall("(DOCKER_.*=.*)", f.read())
for setting in docker_settings:
key, value = setting.split("=")
os.environ[key] = value
del docker_settings, setting, key, value
# Create Docker client instance and start it
with docker.run("ubuntu:22.04",
interactive=True, detach=True,
tty=False,
volumes=[(ns3_path, "/ns-3-dev")]
) as container:
# Redefine the execute command of the container
def split_exec(docker_container, cmd):
return docker_container._execute(cmd.split(), workdir="/ns-3-dev")
container._execute = container.execute
container.execute = partial(split_exec, container)
with DockerContainerManager(self, "ubuntu:22.04") as container:
# Install basic packages
container.execute("apt-get update")
container.execute("apt-get install -y python3 ninja-build cmake g++")
@@ -1572,37 +1620,8 @@ class NS3ConfigureTestCase(NS3BaseTestCase):
@return None
"""
try:
from python_on_whales import docker
from python_on_whales.exceptions import DockerException
except ModuleNotFoundError:
docker = None # noqa
DockerException = None # noqa
self.skipTest("python-on-whales was not found")
run_ns3("clean")
# Import rootless docker settings from .bashrc
with open(os.path.expanduser("~/.bashrc"), "r") as f:
docker_settings = re.findall("(DOCKER_.*=.*)", f.read())
for setting in docker_settings:
key, value = setting.split("=")
os.environ[key] = value
del docker_settings, setting, key, value
# Create Docker client instance and start it
with docker.run("gcc:12.1", # Debian with minimum supported version of GCC for Mold
interactive=True, detach=True,
tty=False,
volumes=[(ns3_path, "/ns-3-dev")],
) as container:
# Redefine the execute command of the container
def split_exec(docker_container, cmd):
return docker_container._execute(cmd.split(), workdir="/ns-3-dev")
container._execute = container.execute
container.execute = partial(split_exec, container)
with DockerContainerManager(self, "gcc:12.1") as container:
# Install basic packages
container.execute("apt-get update")
container.execute("apt-get install -y python3 ninja-build cmake g++ lld")
@@ -2663,7 +2682,8 @@ class NS3QualityControlTestCase(unittest.TestCase):
# User agent string to make ACM and Elsevier let us check if links to papers are working
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36' # noqa
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
# noqa
}
def test_file_url(args):