17db96d56Sopenharmony_ciimport io 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ciimport os 47db96d56Sopenharmony_ciimport sys 57db96d56Sopenharmony_ciimport subprocess 67db96d56Sopenharmony_cifrom test import support 77db96d56Sopenharmony_ciimport unittest 87db96d56Sopenharmony_ciimport unittest.test 97db96d56Sopenharmony_cifrom unittest.test.test_result import BufferedWriter 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ciclass Test_TestProgram(unittest.TestCase): 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci def test_discovery_from_dotted_path(self): 157db96d56Sopenharmony_ci loader = unittest.TestLoader() 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ci tests = [self] 187db96d56Sopenharmony_ci expectedPath = os.path.abspath(os.path.dirname(unittest.test.__file__)) 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci self.wasRun = False 217db96d56Sopenharmony_ci def _find_tests(start_dir, pattern): 227db96d56Sopenharmony_ci self.wasRun = True 237db96d56Sopenharmony_ci self.assertEqual(start_dir, expectedPath) 247db96d56Sopenharmony_ci return tests 257db96d56Sopenharmony_ci loader._find_tests = _find_tests 267db96d56Sopenharmony_ci suite = loader.discover('unittest.test') 277db96d56Sopenharmony_ci self.assertTrue(self.wasRun) 287db96d56Sopenharmony_ci self.assertEqual(suite._tests, tests) 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci # Horrible white box test 317db96d56Sopenharmony_ci def testNoExit(self): 327db96d56Sopenharmony_ci result = object() 337db96d56Sopenharmony_ci test = object() 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci class FakeRunner(object): 367db96d56Sopenharmony_ci def run(self, test): 377db96d56Sopenharmony_ci self.test = test 387db96d56Sopenharmony_ci return result 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci runner = FakeRunner() 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci oldParseArgs = unittest.TestProgram.parseArgs 437db96d56Sopenharmony_ci def restoreParseArgs(): 447db96d56Sopenharmony_ci unittest.TestProgram.parseArgs = oldParseArgs 457db96d56Sopenharmony_ci unittest.TestProgram.parseArgs = lambda *args: None 467db96d56Sopenharmony_ci self.addCleanup(restoreParseArgs) 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci def removeTest(): 497db96d56Sopenharmony_ci del unittest.TestProgram.test 507db96d56Sopenharmony_ci unittest.TestProgram.test = test 517db96d56Sopenharmony_ci self.addCleanup(removeTest) 527db96d56Sopenharmony_ci 537db96d56Sopenharmony_ci program = unittest.TestProgram(testRunner=runner, exit=False, verbosity=2) 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_ci self.assertEqual(program.result, result) 567db96d56Sopenharmony_ci self.assertEqual(runner.test, test) 577db96d56Sopenharmony_ci self.assertEqual(program.verbosity, 2) 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci class FooBar(unittest.TestCase): 607db96d56Sopenharmony_ci def testPass(self): 617db96d56Sopenharmony_ci pass 627db96d56Sopenharmony_ci def testFail(self): 637db96d56Sopenharmony_ci raise AssertionError 647db96d56Sopenharmony_ci def testError(self): 657db96d56Sopenharmony_ci 1/0 667db96d56Sopenharmony_ci @unittest.skip('skipping') 677db96d56Sopenharmony_ci def testSkipped(self): 687db96d56Sopenharmony_ci raise AssertionError 697db96d56Sopenharmony_ci @unittest.expectedFailure 707db96d56Sopenharmony_ci def testExpectedFailure(self): 717db96d56Sopenharmony_ci raise AssertionError 727db96d56Sopenharmony_ci @unittest.expectedFailure 737db96d56Sopenharmony_ci def testUnexpectedSuccess(self): 747db96d56Sopenharmony_ci pass 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci class FooBarLoader(unittest.TestLoader): 777db96d56Sopenharmony_ci """Test loader that returns a suite containing FooBar.""" 787db96d56Sopenharmony_ci def loadTestsFromModule(self, module): 797db96d56Sopenharmony_ci return self.suiteClass( 807db96d56Sopenharmony_ci [self.loadTestsFromTestCase(Test_TestProgram.FooBar)]) 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci def loadTestsFromNames(self, names, module): 837db96d56Sopenharmony_ci return self.suiteClass( 847db96d56Sopenharmony_ci [self.loadTestsFromTestCase(Test_TestProgram.FooBar)]) 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci def test_defaultTest_with_string(self): 877db96d56Sopenharmony_ci class FakeRunner(object): 887db96d56Sopenharmony_ci def run(self, test): 897db96d56Sopenharmony_ci self.test = test 907db96d56Sopenharmony_ci return True 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ci old_argv = sys.argv 937db96d56Sopenharmony_ci sys.argv = ['faketest'] 947db96d56Sopenharmony_ci runner = FakeRunner() 957db96d56Sopenharmony_ci program = unittest.TestProgram(testRunner=runner, exit=False, 967db96d56Sopenharmony_ci defaultTest='unittest.test', 977db96d56Sopenharmony_ci testLoader=self.FooBarLoader()) 987db96d56Sopenharmony_ci sys.argv = old_argv 997db96d56Sopenharmony_ci self.assertEqual(('unittest.test',), program.testNames) 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci def test_defaultTest_with_iterable(self): 1027db96d56Sopenharmony_ci class FakeRunner(object): 1037db96d56Sopenharmony_ci def run(self, test): 1047db96d56Sopenharmony_ci self.test = test 1057db96d56Sopenharmony_ci return True 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci old_argv = sys.argv 1087db96d56Sopenharmony_ci sys.argv = ['faketest'] 1097db96d56Sopenharmony_ci runner = FakeRunner() 1107db96d56Sopenharmony_ci program = unittest.TestProgram( 1117db96d56Sopenharmony_ci testRunner=runner, exit=False, 1127db96d56Sopenharmony_ci defaultTest=['unittest.test', 'unittest.test2'], 1137db96d56Sopenharmony_ci testLoader=self.FooBarLoader()) 1147db96d56Sopenharmony_ci sys.argv = old_argv 1157db96d56Sopenharmony_ci self.assertEqual(['unittest.test', 'unittest.test2'], 1167db96d56Sopenharmony_ci program.testNames) 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci def test_NonExit(self): 1197db96d56Sopenharmony_ci stream = BufferedWriter() 1207db96d56Sopenharmony_ci program = unittest.main(exit=False, 1217db96d56Sopenharmony_ci argv=["foobar"], 1227db96d56Sopenharmony_ci testRunner=unittest.TextTestRunner(stream=stream), 1237db96d56Sopenharmony_ci testLoader=self.FooBarLoader()) 1247db96d56Sopenharmony_ci self.assertTrue(hasattr(program, 'result')) 1257db96d56Sopenharmony_ci out = stream.getvalue() 1267db96d56Sopenharmony_ci self.assertIn('\nFAIL: testFail ', out) 1277db96d56Sopenharmony_ci self.assertIn('\nERROR: testError ', out) 1287db96d56Sopenharmony_ci self.assertIn('\nUNEXPECTED SUCCESS: testUnexpectedSuccess ', out) 1297db96d56Sopenharmony_ci expected = ('\n\nFAILED (failures=1, errors=1, skipped=1, ' 1307db96d56Sopenharmony_ci 'expected failures=1, unexpected successes=1)\n') 1317db96d56Sopenharmony_ci self.assertTrue(out.endswith(expected)) 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci def test_Exit(self): 1347db96d56Sopenharmony_ci stream = BufferedWriter() 1357db96d56Sopenharmony_ci self.assertRaises( 1367db96d56Sopenharmony_ci SystemExit, 1377db96d56Sopenharmony_ci unittest.main, 1387db96d56Sopenharmony_ci argv=["foobar"], 1397db96d56Sopenharmony_ci testRunner=unittest.TextTestRunner(stream=stream), 1407db96d56Sopenharmony_ci exit=True, 1417db96d56Sopenharmony_ci testLoader=self.FooBarLoader()) 1427db96d56Sopenharmony_ci out = stream.getvalue() 1437db96d56Sopenharmony_ci self.assertIn('\nFAIL: testFail ', out) 1447db96d56Sopenharmony_ci self.assertIn('\nERROR: testError ', out) 1457db96d56Sopenharmony_ci self.assertIn('\nUNEXPECTED SUCCESS: testUnexpectedSuccess ', out) 1467db96d56Sopenharmony_ci expected = ('\n\nFAILED (failures=1, errors=1, skipped=1, ' 1477db96d56Sopenharmony_ci 'expected failures=1, unexpected successes=1)\n') 1487db96d56Sopenharmony_ci self.assertTrue(out.endswith(expected)) 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci def test_ExitAsDefault(self): 1517db96d56Sopenharmony_ci stream = BufferedWriter() 1527db96d56Sopenharmony_ci self.assertRaises( 1537db96d56Sopenharmony_ci SystemExit, 1547db96d56Sopenharmony_ci unittest.main, 1557db96d56Sopenharmony_ci argv=["foobar"], 1567db96d56Sopenharmony_ci testRunner=unittest.TextTestRunner(stream=stream), 1577db96d56Sopenharmony_ci testLoader=self.FooBarLoader()) 1587db96d56Sopenharmony_ci out = stream.getvalue() 1597db96d56Sopenharmony_ci self.assertIn('\nFAIL: testFail ', out) 1607db96d56Sopenharmony_ci self.assertIn('\nERROR: testError ', out) 1617db96d56Sopenharmony_ci self.assertIn('\nUNEXPECTED SUCCESS: testUnexpectedSuccess ', out) 1627db96d56Sopenharmony_ci expected = ('\n\nFAILED (failures=1, errors=1, skipped=1, ' 1637db96d56Sopenharmony_ci 'expected failures=1, unexpected successes=1)\n') 1647db96d56Sopenharmony_ci self.assertTrue(out.endswith(expected)) 1657db96d56Sopenharmony_ci 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ciclass InitialisableProgram(unittest.TestProgram): 1687db96d56Sopenharmony_ci exit = False 1697db96d56Sopenharmony_ci result = None 1707db96d56Sopenharmony_ci verbosity = 1 1717db96d56Sopenharmony_ci defaultTest = None 1727db96d56Sopenharmony_ci tb_locals = False 1737db96d56Sopenharmony_ci testRunner = None 1747db96d56Sopenharmony_ci testLoader = unittest.defaultTestLoader 1757db96d56Sopenharmony_ci module = '__main__' 1767db96d56Sopenharmony_ci progName = 'test' 1777db96d56Sopenharmony_ci test = 'test' 1787db96d56Sopenharmony_ci def __init__(self, *args): 1797db96d56Sopenharmony_ci pass 1807db96d56Sopenharmony_ci 1817db96d56Sopenharmony_ciRESULT = object() 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ciclass FakeRunner(object): 1847db96d56Sopenharmony_ci initArgs = None 1857db96d56Sopenharmony_ci test = None 1867db96d56Sopenharmony_ci raiseError = 0 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ci def __init__(self, **kwargs): 1897db96d56Sopenharmony_ci FakeRunner.initArgs = kwargs 1907db96d56Sopenharmony_ci if FakeRunner.raiseError: 1917db96d56Sopenharmony_ci FakeRunner.raiseError -= 1 1927db96d56Sopenharmony_ci raise TypeError 1937db96d56Sopenharmony_ci 1947db96d56Sopenharmony_ci def run(self, test): 1957db96d56Sopenharmony_ci FakeRunner.test = test 1967db96d56Sopenharmony_ci return RESULT 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci 1997db96d56Sopenharmony_ci@support.requires_subprocess() 2007db96d56Sopenharmony_ciclass TestCommandLineArgs(unittest.TestCase): 2017db96d56Sopenharmony_ci 2027db96d56Sopenharmony_ci def setUp(self): 2037db96d56Sopenharmony_ci self.program = InitialisableProgram() 2047db96d56Sopenharmony_ci self.program.createTests = lambda: None 2057db96d56Sopenharmony_ci FakeRunner.initArgs = None 2067db96d56Sopenharmony_ci FakeRunner.test = None 2077db96d56Sopenharmony_ci FakeRunner.raiseError = 0 2087db96d56Sopenharmony_ci 2097db96d56Sopenharmony_ci def testVerbosity(self): 2107db96d56Sopenharmony_ci program = self.program 2117db96d56Sopenharmony_ci 2127db96d56Sopenharmony_ci for opt in '-q', '--quiet': 2137db96d56Sopenharmony_ci program.verbosity = 1 2147db96d56Sopenharmony_ci program.parseArgs([None, opt]) 2157db96d56Sopenharmony_ci self.assertEqual(program.verbosity, 0) 2167db96d56Sopenharmony_ci 2177db96d56Sopenharmony_ci for opt in '-v', '--verbose': 2187db96d56Sopenharmony_ci program.verbosity = 1 2197db96d56Sopenharmony_ci program.parseArgs([None, opt]) 2207db96d56Sopenharmony_ci self.assertEqual(program.verbosity, 2) 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci def testBufferCatchFailfast(self): 2237db96d56Sopenharmony_ci program = self.program 2247db96d56Sopenharmony_ci for arg, attr in (('buffer', 'buffer'), ('failfast', 'failfast'), 2257db96d56Sopenharmony_ci ('catch', 'catchbreak')): 2267db96d56Sopenharmony_ci 2277db96d56Sopenharmony_ci setattr(program, attr, None) 2287db96d56Sopenharmony_ci program.parseArgs([None]) 2297db96d56Sopenharmony_ci self.assertIs(getattr(program, attr), False) 2307db96d56Sopenharmony_ci 2317db96d56Sopenharmony_ci false = [] 2327db96d56Sopenharmony_ci setattr(program, attr, false) 2337db96d56Sopenharmony_ci program.parseArgs([None]) 2347db96d56Sopenharmony_ci self.assertIs(getattr(program, attr), false) 2357db96d56Sopenharmony_ci 2367db96d56Sopenharmony_ci true = [42] 2377db96d56Sopenharmony_ci setattr(program, attr, true) 2387db96d56Sopenharmony_ci program.parseArgs([None]) 2397db96d56Sopenharmony_ci self.assertIs(getattr(program, attr), true) 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ci short_opt = '-%s' % arg[0] 2427db96d56Sopenharmony_ci long_opt = '--%s' % arg 2437db96d56Sopenharmony_ci for opt in short_opt, long_opt: 2447db96d56Sopenharmony_ci setattr(program, attr, None) 2457db96d56Sopenharmony_ci program.parseArgs([None, opt]) 2467db96d56Sopenharmony_ci self.assertIs(getattr(program, attr), True) 2477db96d56Sopenharmony_ci 2487db96d56Sopenharmony_ci setattr(program, attr, False) 2497db96d56Sopenharmony_ci with support.captured_stderr() as stderr, \ 2507db96d56Sopenharmony_ci self.assertRaises(SystemExit) as cm: 2517db96d56Sopenharmony_ci program.parseArgs([None, opt]) 2527db96d56Sopenharmony_ci self.assertEqual(cm.exception.args, (2,)) 2537db96d56Sopenharmony_ci 2547db96d56Sopenharmony_ci setattr(program, attr, True) 2557db96d56Sopenharmony_ci with support.captured_stderr() as stderr, \ 2567db96d56Sopenharmony_ci self.assertRaises(SystemExit) as cm: 2577db96d56Sopenharmony_ci program.parseArgs([None, opt]) 2587db96d56Sopenharmony_ci self.assertEqual(cm.exception.args, (2,)) 2597db96d56Sopenharmony_ci 2607db96d56Sopenharmony_ci def testWarning(self): 2617db96d56Sopenharmony_ci """Test the warnings argument""" 2627db96d56Sopenharmony_ci # see #10535 2637db96d56Sopenharmony_ci class FakeTP(unittest.TestProgram): 2647db96d56Sopenharmony_ci def parseArgs(self, *args, **kw): pass 2657db96d56Sopenharmony_ci def runTests(self, *args, **kw): pass 2667db96d56Sopenharmony_ci warnoptions = sys.warnoptions[:] 2677db96d56Sopenharmony_ci try: 2687db96d56Sopenharmony_ci sys.warnoptions[:] = [] 2697db96d56Sopenharmony_ci # no warn options, no arg -> default 2707db96d56Sopenharmony_ci self.assertEqual(FakeTP().warnings, 'default') 2717db96d56Sopenharmony_ci # no warn options, w/ arg -> arg value 2727db96d56Sopenharmony_ci self.assertEqual(FakeTP(warnings='ignore').warnings, 'ignore') 2737db96d56Sopenharmony_ci sys.warnoptions[:] = ['somevalue'] 2747db96d56Sopenharmony_ci # warn options, no arg -> None 2757db96d56Sopenharmony_ci # warn options, w/ arg -> arg value 2767db96d56Sopenharmony_ci self.assertEqual(FakeTP().warnings, None) 2777db96d56Sopenharmony_ci self.assertEqual(FakeTP(warnings='ignore').warnings, 'ignore') 2787db96d56Sopenharmony_ci finally: 2797db96d56Sopenharmony_ci sys.warnoptions[:] = warnoptions 2807db96d56Sopenharmony_ci 2817db96d56Sopenharmony_ci def testRunTestsRunnerClass(self): 2827db96d56Sopenharmony_ci program = self.program 2837db96d56Sopenharmony_ci 2847db96d56Sopenharmony_ci program.testRunner = FakeRunner 2857db96d56Sopenharmony_ci program.verbosity = 'verbosity' 2867db96d56Sopenharmony_ci program.failfast = 'failfast' 2877db96d56Sopenharmony_ci program.buffer = 'buffer' 2887db96d56Sopenharmony_ci program.warnings = 'warnings' 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci program.runTests() 2917db96d56Sopenharmony_ci 2927db96d56Sopenharmony_ci self.assertEqual(FakeRunner.initArgs, {'verbosity': 'verbosity', 2937db96d56Sopenharmony_ci 'failfast': 'failfast', 2947db96d56Sopenharmony_ci 'buffer': 'buffer', 2957db96d56Sopenharmony_ci 'tb_locals': False, 2967db96d56Sopenharmony_ci 'warnings': 'warnings'}) 2977db96d56Sopenharmony_ci self.assertEqual(FakeRunner.test, 'test') 2987db96d56Sopenharmony_ci self.assertIs(program.result, RESULT) 2997db96d56Sopenharmony_ci 3007db96d56Sopenharmony_ci def testRunTestsRunnerInstance(self): 3017db96d56Sopenharmony_ci program = self.program 3027db96d56Sopenharmony_ci 3037db96d56Sopenharmony_ci program.testRunner = FakeRunner() 3047db96d56Sopenharmony_ci FakeRunner.initArgs = None 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_ci program.runTests() 3077db96d56Sopenharmony_ci 3087db96d56Sopenharmony_ci # A new FakeRunner should not have been instantiated 3097db96d56Sopenharmony_ci self.assertIsNone(FakeRunner.initArgs) 3107db96d56Sopenharmony_ci 3117db96d56Sopenharmony_ci self.assertEqual(FakeRunner.test, 'test') 3127db96d56Sopenharmony_ci self.assertIs(program.result, RESULT) 3137db96d56Sopenharmony_ci 3147db96d56Sopenharmony_ci def test_locals(self): 3157db96d56Sopenharmony_ci program = self.program 3167db96d56Sopenharmony_ci 3177db96d56Sopenharmony_ci program.testRunner = FakeRunner 3187db96d56Sopenharmony_ci program.parseArgs([None, '--locals']) 3197db96d56Sopenharmony_ci self.assertEqual(True, program.tb_locals) 3207db96d56Sopenharmony_ci program.runTests() 3217db96d56Sopenharmony_ci self.assertEqual(FakeRunner.initArgs, {'buffer': False, 3227db96d56Sopenharmony_ci 'failfast': False, 3237db96d56Sopenharmony_ci 'tb_locals': True, 3247db96d56Sopenharmony_ci 'verbosity': 1, 3257db96d56Sopenharmony_ci 'warnings': None}) 3267db96d56Sopenharmony_ci 3277db96d56Sopenharmony_ci def testRunTestsOldRunnerClass(self): 3287db96d56Sopenharmony_ci program = self.program 3297db96d56Sopenharmony_ci 3307db96d56Sopenharmony_ci # Two TypeErrors are needed to fall all the way back to old-style 3317db96d56Sopenharmony_ci # runners - one to fail tb_locals, one to fail buffer etc. 3327db96d56Sopenharmony_ci FakeRunner.raiseError = 2 3337db96d56Sopenharmony_ci program.testRunner = FakeRunner 3347db96d56Sopenharmony_ci program.verbosity = 'verbosity' 3357db96d56Sopenharmony_ci program.failfast = 'failfast' 3367db96d56Sopenharmony_ci program.buffer = 'buffer' 3377db96d56Sopenharmony_ci program.test = 'test' 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_ci program.runTests() 3407db96d56Sopenharmony_ci 3417db96d56Sopenharmony_ci # If initialising raises a type error it should be retried 3427db96d56Sopenharmony_ci # without the new keyword arguments 3437db96d56Sopenharmony_ci self.assertEqual(FakeRunner.initArgs, {}) 3447db96d56Sopenharmony_ci self.assertEqual(FakeRunner.test, 'test') 3457db96d56Sopenharmony_ci self.assertIs(program.result, RESULT) 3467db96d56Sopenharmony_ci 3477db96d56Sopenharmony_ci def testCatchBreakInstallsHandler(self): 3487db96d56Sopenharmony_ci module = sys.modules['unittest.main'] 3497db96d56Sopenharmony_ci original = module.installHandler 3507db96d56Sopenharmony_ci def restore(): 3517db96d56Sopenharmony_ci module.installHandler = original 3527db96d56Sopenharmony_ci self.addCleanup(restore) 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci self.installed = False 3557db96d56Sopenharmony_ci def fakeInstallHandler(): 3567db96d56Sopenharmony_ci self.installed = True 3577db96d56Sopenharmony_ci module.installHandler = fakeInstallHandler 3587db96d56Sopenharmony_ci 3597db96d56Sopenharmony_ci program = self.program 3607db96d56Sopenharmony_ci program.catchbreak = True 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci program.testRunner = FakeRunner 3637db96d56Sopenharmony_ci 3647db96d56Sopenharmony_ci program.runTests() 3657db96d56Sopenharmony_ci self.assertTrue(self.installed) 3667db96d56Sopenharmony_ci 3677db96d56Sopenharmony_ci def _patch_isfile(self, names, exists=True): 3687db96d56Sopenharmony_ci def isfile(path): 3697db96d56Sopenharmony_ci return path in names 3707db96d56Sopenharmony_ci original = os.path.isfile 3717db96d56Sopenharmony_ci os.path.isfile = isfile 3727db96d56Sopenharmony_ci def restore(): 3737db96d56Sopenharmony_ci os.path.isfile = original 3747db96d56Sopenharmony_ci self.addCleanup(restore) 3757db96d56Sopenharmony_ci 3767db96d56Sopenharmony_ci 3777db96d56Sopenharmony_ci def testParseArgsFileNames(self): 3787db96d56Sopenharmony_ci # running tests with filenames instead of module names 3797db96d56Sopenharmony_ci program = self.program 3807db96d56Sopenharmony_ci argv = ['progname', 'foo.py', 'bar.Py', 'baz.PY', 'wing.txt'] 3817db96d56Sopenharmony_ci self._patch_isfile(argv) 3827db96d56Sopenharmony_ci 3837db96d56Sopenharmony_ci program.createTests = lambda: None 3847db96d56Sopenharmony_ci program.parseArgs(argv) 3857db96d56Sopenharmony_ci 3867db96d56Sopenharmony_ci # note that 'wing.txt' is not a Python file so the name should 3877db96d56Sopenharmony_ci # *not* be converted to a module name 3887db96d56Sopenharmony_ci expected = ['foo', 'bar', 'baz', 'wing.txt'] 3897db96d56Sopenharmony_ci self.assertEqual(program.testNames, expected) 3907db96d56Sopenharmony_ci 3917db96d56Sopenharmony_ci 3927db96d56Sopenharmony_ci def testParseArgsFilePaths(self): 3937db96d56Sopenharmony_ci program = self.program 3947db96d56Sopenharmony_ci argv = ['progname', 'foo/bar/baz.py', 'green\\red.py'] 3957db96d56Sopenharmony_ci self._patch_isfile(argv) 3967db96d56Sopenharmony_ci 3977db96d56Sopenharmony_ci program.createTests = lambda: None 3987db96d56Sopenharmony_ci program.parseArgs(argv) 3997db96d56Sopenharmony_ci 4007db96d56Sopenharmony_ci expected = ['foo.bar.baz', 'green.red'] 4017db96d56Sopenharmony_ci self.assertEqual(program.testNames, expected) 4027db96d56Sopenharmony_ci 4037db96d56Sopenharmony_ci 4047db96d56Sopenharmony_ci def testParseArgsNonExistentFiles(self): 4057db96d56Sopenharmony_ci program = self.program 4067db96d56Sopenharmony_ci argv = ['progname', 'foo/bar/baz.py', 'green\\red.py'] 4077db96d56Sopenharmony_ci self._patch_isfile([]) 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci program.createTests = lambda: None 4107db96d56Sopenharmony_ci program.parseArgs(argv) 4117db96d56Sopenharmony_ci 4127db96d56Sopenharmony_ci self.assertEqual(program.testNames, argv[1:]) 4137db96d56Sopenharmony_ci 4147db96d56Sopenharmony_ci def testParseArgsAbsolutePathsThatCanBeConverted(self): 4157db96d56Sopenharmony_ci cur_dir = os.getcwd() 4167db96d56Sopenharmony_ci program = self.program 4177db96d56Sopenharmony_ci def _join(name): 4187db96d56Sopenharmony_ci return os.path.join(cur_dir, name) 4197db96d56Sopenharmony_ci argv = ['progname', _join('foo/bar/baz.py'), _join('green\\red.py')] 4207db96d56Sopenharmony_ci self._patch_isfile(argv) 4217db96d56Sopenharmony_ci 4227db96d56Sopenharmony_ci program.createTests = lambda: None 4237db96d56Sopenharmony_ci program.parseArgs(argv) 4247db96d56Sopenharmony_ci 4257db96d56Sopenharmony_ci expected = ['foo.bar.baz', 'green.red'] 4267db96d56Sopenharmony_ci self.assertEqual(program.testNames, expected) 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_ci def testParseArgsAbsolutePathsThatCannotBeConverted(self): 4297db96d56Sopenharmony_ci program = self.program 4307db96d56Sopenharmony_ci # even on Windows '/...' is considered absolute by os.path.abspath 4317db96d56Sopenharmony_ci argv = ['progname', '/foo/bar/baz.py', '/green/red.py'] 4327db96d56Sopenharmony_ci self._patch_isfile(argv) 4337db96d56Sopenharmony_ci 4347db96d56Sopenharmony_ci program.createTests = lambda: None 4357db96d56Sopenharmony_ci program.parseArgs(argv) 4367db96d56Sopenharmony_ci 4377db96d56Sopenharmony_ci self.assertEqual(program.testNames, argv[1:]) 4387db96d56Sopenharmony_ci 4397db96d56Sopenharmony_ci # it may be better to use platform specific functions to normalise paths 4407db96d56Sopenharmony_ci # rather than accepting '.PY' and '\' as file separator on Linux / Mac 4417db96d56Sopenharmony_ci # it would also be better to check that a filename is a valid module 4427db96d56Sopenharmony_ci # identifier (we have a regex for this in loader.py) 4437db96d56Sopenharmony_ci # for invalid filenames should we raise a useful error rather than 4447db96d56Sopenharmony_ci # leaving the current error message (import of filename fails) in place? 4457db96d56Sopenharmony_ci 4467db96d56Sopenharmony_ci def testParseArgsSelectedTestNames(self): 4477db96d56Sopenharmony_ci program = self.program 4487db96d56Sopenharmony_ci argv = ['progname', '-k', 'foo', '-k', 'bar', '-k', '*pat*'] 4497db96d56Sopenharmony_ci 4507db96d56Sopenharmony_ci program.createTests = lambda: None 4517db96d56Sopenharmony_ci program.parseArgs(argv) 4527db96d56Sopenharmony_ci 4537db96d56Sopenharmony_ci self.assertEqual(program.testNamePatterns, ['*foo*', '*bar*', '*pat*']) 4547db96d56Sopenharmony_ci 4557db96d56Sopenharmony_ci def testSelectedTestNamesFunctionalTest(self): 4567db96d56Sopenharmony_ci def run_unittest(args): 4577db96d56Sopenharmony_ci # Use -E to ignore PYTHONSAFEPATH env var 4587db96d56Sopenharmony_ci cmd = [sys.executable, '-E', '-m', 'unittest'] + args 4597db96d56Sopenharmony_ci p = subprocess.Popen(cmd, 4607db96d56Sopenharmony_ci stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, cwd=os.path.dirname(__file__)) 4617db96d56Sopenharmony_ci with p: 4627db96d56Sopenharmony_ci _, stderr = p.communicate() 4637db96d56Sopenharmony_ci return stderr.decode() 4647db96d56Sopenharmony_ci 4657db96d56Sopenharmony_ci t = '_test_warnings' 4667db96d56Sopenharmony_ci self.assertIn('Ran 7 tests', run_unittest([t])) 4677db96d56Sopenharmony_ci self.assertIn('Ran 7 tests', run_unittest(['-k', 'TestWarnings', t])) 4687db96d56Sopenharmony_ci self.assertIn('Ran 7 tests', run_unittest(['discover', '-p', '*_test*', '-k', 'TestWarnings'])) 4697db96d56Sopenharmony_ci self.assertIn('Ran 2 tests', run_unittest(['-k', 'f', t])) 4707db96d56Sopenharmony_ci self.assertIn('Ran 7 tests', run_unittest(['-k', 't', t])) 4717db96d56Sopenharmony_ci self.assertIn('Ran 3 tests', run_unittest(['-k', '*t', t])) 4727db96d56Sopenharmony_ci self.assertIn('Ran 7 tests', run_unittest(['-k', '*test_warnings.*Warning*', t])) 4737db96d56Sopenharmony_ci self.assertIn('Ran 1 test', run_unittest(['-k', '*test_warnings.*warning*', t])) 4747db96d56Sopenharmony_ci 4757db96d56Sopenharmony_ci 4767db96d56Sopenharmony_ciif __name__ == '__main__': 4777db96d56Sopenharmony_ci unittest.main() 478