avocado-framework/avocado

View on GitHub
selftests/functional/teststmpdir.py

Summary

Maintainability
A
0 mins
Test Coverage
import os
import tempfile
import unittest

from avocado.core import exit_codes, test
from avocado.utils import process, script
from selftests.utils import AVOCADO, TestCaseTmpDir

INSTRUMENTED_SCRIPT = """import os
import tempfile
from avocado import Test
class MyTest(Test):
    def test1(self):
        tempfile.mkstemp(dir=self.teststmpdir)
        if len(os.listdir(self.teststmpdir)) != 2:
            self.fail()

"""

SIMPLE_SCRIPT = f"""#!/bin/bash
mktemp ${{{test.COMMON_TMPDIR_NAME}}}/XXXXXX
if [ $(ls ${{{test.COMMON_TMPDIR_NAME}}} | wc -l) == 1 ]
then
    exit 0
else
    exit 1
fi
"""


class TestsTmpDirTests(TestCaseTmpDir):
    def setUp(self):
        super().setUp()
        self.simple_test = script.TemporaryScript("test_simple.sh", SIMPLE_SCRIPT)
        self.simple_test.save()
        self.instrumented_test = script.TemporaryScript(
            "test_instrumented.py", INSTRUMENTED_SCRIPT
        )
        self.instrumented_test.save()

    def run_and_check(self, cmd_line, expected_rc, env=None):
        result = process.run(cmd_line, ignore_status=True, env=env)
        self.assertEqual(
            result.exit_status,
            expected_rc,
            (f"Command {cmd_line} did not return rc " f"{expected_rc}:\n{result}"),
        )
        return result

    @unittest.skipIf(
        test.COMMON_TMPDIR_NAME in os.environ,
        f"{test.COMMON_TMPDIR_NAME} already set in os.environ",
    )
    def test_tests_tmp_dir(self):
        """
        Tests whether automatically created teststmpdir is shared across
        all tests.
        """
        cmd_line = (
            f"{AVOCADO} run --disable-sysinfo "
            f"--max-parallel-tasks=1 "
            f"--job-results-dir {self.tmpdir.name} "
            f"{self.simple_test} {self.instrumented_test}"
        )
        self.run_and_check(cmd_line, exit_codes.AVOCADO_ALL_OK)

    def test_manualy_created(self):
        """
        Tests whether manually set teststmpdir is used and not deleted by
        avocado
        """
        with tempfile.TemporaryDirectory(dir=self.tmpdir.name) as shared_tmp:
            cmd = (
                f"{AVOCADO} run --disable-sysinfo "
                f"--job-results-dir {self.tmpdir.name} %s"
            )
            self.run_and_check(
                cmd % self.simple_test,
                exit_codes.AVOCADO_ALL_OK,
                {test.COMMON_TMPDIR_NAME: shared_tmp},
            )
            self.run_and_check(
                cmd % self.instrumented_test,
                exit_codes.AVOCADO_ALL_OK,
                {test.COMMON_TMPDIR_NAME: shared_tmp},
            )
            content = os.listdir(shared_tmp)
            self.assertEqual(
                len(content),
                2,
                (
                    f"The number of tests in manually set teststmpdir "
                    f"is not 2 ({len(content)}):\n{content}"
                ),
            )

    def tearDown(self):
        super().tearDown()
        self.instrumented_test.remove()
        self.simple_test.remove()


if __name__ == "__main__":
    unittest.main()