| #!/usr/bin/env python3 |
| # |
| # Copyright (C) 2016 Intel Corporation |
| # |
| # SPDX-License-Identifier: MIT |
| # |
| |
| import signal |
| import unittest |
| |
| from common import setup_sys_path, TestBase |
| setup_sys_path() |
| |
| from oeqa.core.exception import OEQADependency |
| from oeqa.core.utils.test import getCaseMethod, getSuiteCasesNames, getSuiteCasesIDs |
| |
| class TestTagDecorator(TestBase): |
| def _runTest(self, modules, filterfn, expect): |
| tc = self._testLoader(modules = modules, tags_filter = filterfn) |
| test_loaded = set(getSuiteCasesIDs(tc.suites)) |
| self.assertEqual(expect, test_loaded) |
| |
| def test_oetag(self): |
| # get all cases without any filtering |
| self._runTest(['oetag'], None, { |
| 'oetag.TagTest.testTagGood', |
| 'oetag.TagTest.testTagOther', |
| 'oetag.TagTest.testTagOtherMulti', |
| 'oetag.TagTest.testTagNone', |
| 'oetag.TagClassTest.testTagOther', |
| 'oetag.TagClassTest.testTagOtherMulti', |
| 'oetag.TagClassTest.testTagNone', |
| }) |
| |
| # exclude any case with tags |
| self._runTest(['oetag'], lambda tags: tags, { |
| 'oetag.TagTest.testTagNone', |
| }) |
| |
| # exclude any case with otherTag |
| self._runTest(['oetag'], lambda tags: "otherTag" in tags, { |
| 'oetag.TagTest.testTagGood', |
| 'oetag.TagTest.testTagNone', |
| 'oetag.TagClassTest.testTagNone', |
| }) |
| |
| # exclude any case with classTag |
| self._runTest(['oetag'], lambda tags: "classTag" in tags, { |
| 'oetag.TagTest.testTagGood', |
| 'oetag.TagTest.testTagOther', |
| 'oetag.TagTest.testTagOtherMulti', |
| 'oetag.TagTest.testTagNone', |
| }) |
| |
| # include any case with classTag |
| self._runTest(['oetag'], lambda tags: "classTag" not in tags, { |
| 'oetag.TagClassTest.testTagOther', |
| 'oetag.TagClassTest.testTagOtherMulti', |
| 'oetag.TagClassTest.testTagNone', |
| }) |
| |
| # include any case with classTag or no tags |
| self._runTest(['oetag'], lambda tags: tags and "classTag" not in tags, { |
| 'oetag.TagTest.testTagNone', |
| 'oetag.TagClassTest.testTagOther', |
| 'oetag.TagClassTest.testTagOtherMulti', |
| 'oetag.TagClassTest.testTagNone', |
| }) |
| |
| class TestDependsDecorator(TestBase): |
| modules = ['depends'] |
| |
| def test_depends_order(self): |
| tests = ['depends.DependsTest.testDependsFirst', |
| 'depends.DependsTest.testDependsSecond', |
| 'depends.DependsTest.testDependsThird', |
| 'depends.DependsTest.testDependsFourth', |
| 'depends.DependsTest.testDependsFifth'] |
| tests2 = list(tests) |
| tests2[2], tests2[3] = tests[3], tests[2] |
| tc = self._testLoader(modules=self.modules, tests=tests) |
| test_loaded = getSuiteCasesIDs(tc.suites) |
| result = True if test_loaded == tests or test_loaded == tests2 else False |
| msg = 'Failed to order tests using OETestDepends decorator.\nTest order:'\ |
| ' %s.\nExpected: %s\nOr: %s' % (test_loaded, tests, tests2) |
| self.assertTrue(result, msg=msg) |
| |
| def test_depends_fail_missing_dependency(self): |
| expect = "TestCase depends.DependsTest.testDependsSecond depends on "\ |
| "depends.DependsTest.testDependsFirst and isn't available" |
| tests = ['depends.DependsTest.testDependsSecond'] |
| try: |
| # Must throw OEQADependency because missing 'testDependsFirst' |
| tc = self._testLoader(modules=self.modules, tests=tests) |
| self.fail('Expected OEQADependency exception') |
| except OEQADependency as e: |
| result = True if expect in str(e) else False |
| msg = 'Expected OEQADependency exception missing testDependsFirst test' |
| self.assertTrue(result, msg=msg) |
| |
| def test_depends_fail_circular_dependency(self): |
| expect = 'have a circular dependency' |
| tests = ['depends.DependsTest.testDependsCircular1', |
| 'depends.DependsTest.testDependsCircular2', |
| 'depends.DependsTest.testDependsCircular3'] |
| try: |
| # Must throw OEQADependency because circular dependency |
| tc = self._testLoader(modules=self.modules, tests=tests) |
| self.fail('Expected OEQADependency exception') |
| except OEQADependency as e: |
| result = True if expect in str(e) else False |
| msg = 'Expected OEQADependency exception having a circular dependency' |
| self.assertTrue(result, msg=msg) |
| |
| class TestTimeoutDecorator(TestBase): |
| modules = ['timeout'] |
| |
| def test_timeout(self): |
| tests = ['timeout.TimeoutTest.testTimeoutPass'] |
| msg = 'Failed to run test using OETestTimeout' |
| alarm_signal = signal.getsignal(signal.SIGALRM) |
| tc = self._testLoader(modules=self.modules, tests=tests) |
| self.assertTrue(tc.runTests().wasSuccessful(), msg=msg) |
| msg = "OETestTimeout didn't restore SIGALRM" |
| self.assertIs(alarm_signal, signal.getsignal(signal.SIGALRM), msg=msg) |
| |
| def test_timeout_fail(self): |
| tests = ['timeout.TimeoutTest.testTimeoutFail'] |
| msg = "OETestTimeout test didn't timeout as expected" |
| alarm_signal = signal.getsignal(signal.SIGALRM) |
| tc = self._testLoader(modules=self.modules, tests=tests) |
| self.assertFalse(tc.runTests().wasSuccessful(), msg=msg) |
| msg = "OETestTimeout didn't restore SIGALRM" |
| self.assertIs(alarm_signal, signal.getsignal(signal.SIGALRM), msg=msg) |
| |
| def test_timeout_cancel(self): |
| tests = ['timeout.TimeoutTest.testTimeoutSkip', 'timeout.TimeoutTest.testTimeoutDepends', 'timeout.TimeoutTest.testTimeoutUnrelated'] |
| msg = 'Unrelated test failed to complete' |
| tc = self._testLoader(modules=self.modules, tests=tests) |
| self.assertTrue(tc.runTests().wasSuccessful(), msg=msg) |
| |
| if __name__ == '__main__': |
| unittest.main() |