17db96d56Sopenharmony_ci""" 27db96d56Sopenharmony_ciTests common to genericpath, ntpath and posixpath 37db96d56Sopenharmony_ci""" 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ciimport genericpath 67db96d56Sopenharmony_ciimport os 77db96d56Sopenharmony_ciimport sys 87db96d56Sopenharmony_ciimport unittest 97db96d56Sopenharmony_ciimport warnings 107db96d56Sopenharmony_cifrom test.support import is_emscripten 117db96d56Sopenharmony_cifrom test.support import os_helper 127db96d56Sopenharmony_cifrom test.support import warnings_helper 137db96d56Sopenharmony_cifrom test.support.script_helper import assert_python_ok 147db96d56Sopenharmony_cifrom test.support.os_helper import FakePath 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_cidef create_file(filename, data=b'foo'): 187db96d56Sopenharmony_ci with open(filename, 'xb', 0) as fp: 197db96d56Sopenharmony_ci fp.write(data) 207db96d56Sopenharmony_ci 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ciclass GenericTest: 237db96d56Sopenharmony_ci common_attributes = ['commonprefix', 'getsize', 'getatime', 'getctime', 247db96d56Sopenharmony_ci 'getmtime', 'exists', 'isdir', 'isfile'] 257db96d56Sopenharmony_ci attributes = [] 267db96d56Sopenharmony_ci 277db96d56Sopenharmony_ci def test_no_argument(self): 287db96d56Sopenharmony_ci for attr in self.common_attributes + self.attributes: 297db96d56Sopenharmony_ci with self.assertRaises(TypeError): 307db96d56Sopenharmony_ci getattr(self.pathmodule, attr)() 317db96d56Sopenharmony_ci raise self.fail("{}.{}() did not raise a TypeError" 327db96d56Sopenharmony_ci .format(self.pathmodule.__name__, attr)) 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci def test_commonprefix(self): 357db96d56Sopenharmony_ci commonprefix = self.pathmodule.commonprefix 367db96d56Sopenharmony_ci self.assertEqual( 377db96d56Sopenharmony_ci commonprefix([]), 387db96d56Sopenharmony_ci "" 397db96d56Sopenharmony_ci ) 407db96d56Sopenharmony_ci self.assertEqual( 417db96d56Sopenharmony_ci commonprefix(["/home/swenson/spam", "/home/swen/spam"]), 427db96d56Sopenharmony_ci "/home/swen" 437db96d56Sopenharmony_ci ) 447db96d56Sopenharmony_ci self.assertEqual( 457db96d56Sopenharmony_ci commonprefix(["/home/swen/spam", "/home/swen/eggs"]), 467db96d56Sopenharmony_ci "/home/swen/" 477db96d56Sopenharmony_ci ) 487db96d56Sopenharmony_ci self.assertEqual( 497db96d56Sopenharmony_ci commonprefix(["/home/swen/spam", "/home/swen/spam"]), 507db96d56Sopenharmony_ci "/home/swen/spam" 517db96d56Sopenharmony_ci ) 527db96d56Sopenharmony_ci self.assertEqual( 537db96d56Sopenharmony_ci commonprefix(["home:swenson:spam", "home:swen:spam"]), 547db96d56Sopenharmony_ci "home:swen" 557db96d56Sopenharmony_ci ) 567db96d56Sopenharmony_ci self.assertEqual( 577db96d56Sopenharmony_ci commonprefix([":home:swen:spam", ":home:swen:eggs"]), 587db96d56Sopenharmony_ci ":home:swen:" 597db96d56Sopenharmony_ci ) 607db96d56Sopenharmony_ci self.assertEqual( 617db96d56Sopenharmony_ci commonprefix([":home:swen:spam", ":home:swen:spam"]), 627db96d56Sopenharmony_ci ":home:swen:spam" 637db96d56Sopenharmony_ci ) 647db96d56Sopenharmony_ci 657db96d56Sopenharmony_ci self.assertEqual( 667db96d56Sopenharmony_ci commonprefix([b"/home/swenson/spam", b"/home/swen/spam"]), 677db96d56Sopenharmony_ci b"/home/swen" 687db96d56Sopenharmony_ci ) 697db96d56Sopenharmony_ci self.assertEqual( 707db96d56Sopenharmony_ci commonprefix([b"/home/swen/spam", b"/home/swen/eggs"]), 717db96d56Sopenharmony_ci b"/home/swen/" 727db96d56Sopenharmony_ci ) 737db96d56Sopenharmony_ci self.assertEqual( 747db96d56Sopenharmony_ci commonprefix([b"/home/swen/spam", b"/home/swen/spam"]), 757db96d56Sopenharmony_ci b"/home/swen/spam" 767db96d56Sopenharmony_ci ) 777db96d56Sopenharmony_ci self.assertEqual( 787db96d56Sopenharmony_ci commonprefix([b"home:swenson:spam", b"home:swen:spam"]), 797db96d56Sopenharmony_ci b"home:swen" 807db96d56Sopenharmony_ci ) 817db96d56Sopenharmony_ci self.assertEqual( 827db96d56Sopenharmony_ci commonprefix([b":home:swen:spam", b":home:swen:eggs"]), 837db96d56Sopenharmony_ci b":home:swen:" 847db96d56Sopenharmony_ci ) 857db96d56Sopenharmony_ci self.assertEqual( 867db96d56Sopenharmony_ci commonprefix([b":home:swen:spam", b":home:swen:spam"]), 877db96d56Sopenharmony_ci b":home:swen:spam" 887db96d56Sopenharmony_ci ) 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ci testlist = ['', 'abc', 'Xbcd', 'Xb', 'XY', 'abcd', 917db96d56Sopenharmony_ci 'aXc', 'abd', 'ab', 'aX', 'abcX'] 927db96d56Sopenharmony_ci for s1 in testlist: 937db96d56Sopenharmony_ci for s2 in testlist: 947db96d56Sopenharmony_ci p = commonprefix([s1, s2]) 957db96d56Sopenharmony_ci self.assertTrue(s1.startswith(p)) 967db96d56Sopenharmony_ci self.assertTrue(s2.startswith(p)) 977db96d56Sopenharmony_ci if s1 != s2: 987db96d56Sopenharmony_ci n = len(p) 997db96d56Sopenharmony_ci self.assertNotEqual(s1[n:n+1], s2[n:n+1]) 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci def test_getsize(self): 1027db96d56Sopenharmony_ci filename = os_helper.TESTFN 1037db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, filename) 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ci create_file(filename, b'Hello') 1067db96d56Sopenharmony_ci self.assertEqual(self.pathmodule.getsize(filename), 5) 1077db96d56Sopenharmony_ci os.remove(filename) 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci create_file(filename, b'Hello World!') 1107db96d56Sopenharmony_ci self.assertEqual(self.pathmodule.getsize(filename), 12) 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_ci def test_filetime(self): 1137db96d56Sopenharmony_ci filename = os_helper.TESTFN 1147db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, filename) 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci create_file(filename, b'foo') 1177db96d56Sopenharmony_ci 1187db96d56Sopenharmony_ci with open(filename, "ab", 0) as f: 1197db96d56Sopenharmony_ci f.write(b"bar") 1207db96d56Sopenharmony_ci 1217db96d56Sopenharmony_ci with open(filename, "rb", 0) as f: 1227db96d56Sopenharmony_ci data = f.read() 1237db96d56Sopenharmony_ci self.assertEqual(data, b"foobar") 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci self.assertLessEqual( 1267db96d56Sopenharmony_ci self.pathmodule.getctime(filename), 1277db96d56Sopenharmony_ci self.pathmodule.getmtime(filename) 1287db96d56Sopenharmony_ci ) 1297db96d56Sopenharmony_ci 1307db96d56Sopenharmony_ci def test_exists(self): 1317db96d56Sopenharmony_ci filename = os_helper.TESTFN 1327db96d56Sopenharmony_ci bfilename = os.fsencode(filename) 1337db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, filename) 1347db96d56Sopenharmony_ci 1357db96d56Sopenharmony_ci self.assertIs(self.pathmodule.exists(filename), False) 1367db96d56Sopenharmony_ci self.assertIs(self.pathmodule.exists(bfilename), False) 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci create_file(filename) 1397db96d56Sopenharmony_ci 1407db96d56Sopenharmony_ci self.assertIs(self.pathmodule.exists(filename), True) 1417db96d56Sopenharmony_ci self.assertIs(self.pathmodule.exists(bfilename), True) 1427db96d56Sopenharmony_ci 1437db96d56Sopenharmony_ci self.assertIs(self.pathmodule.exists(filename + '\udfff'), False) 1447db96d56Sopenharmony_ci self.assertIs(self.pathmodule.exists(bfilename + b'\xff'), False) 1457db96d56Sopenharmony_ci self.assertIs(self.pathmodule.exists(filename + '\x00'), False) 1467db96d56Sopenharmony_ci self.assertIs(self.pathmodule.exists(bfilename + b'\x00'), False) 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_ci if self.pathmodule is not genericpath: 1497db96d56Sopenharmony_ci self.assertIs(self.pathmodule.lexists(filename), True) 1507db96d56Sopenharmony_ci self.assertIs(self.pathmodule.lexists(bfilename), True) 1517db96d56Sopenharmony_ci 1527db96d56Sopenharmony_ci self.assertIs(self.pathmodule.lexists(filename + '\udfff'), False) 1537db96d56Sopenharmony_ci self.assertIs(self.pathmodule.lexists(bfilename + b'\xff'), False) 1547db96d56Sopenharmony_ci self.assertIs(self.pathmodule.lexists(filename + '\x00'), False) 1557db96d56Sopenharmony_ci self.assertIs(self.pathmodule.lexists(bfilename + b'\x00'), False) 1567db96d56Sopenharmony_ci 1577db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(os, "pipe"), "requires os.pipe()") 1587db96d56Sopenharmony_ci @unittest.skipIf(is_emscripten, "Emscripten pipe fds have no stat") 1597db96d56Sopenharmony_ci def test_exists_fd(self): 1607db96d56Sopenharmony_ci r, w = os.pipe() 1617db96d56Sopenharmony_ci try: 1627db96d56Sopenharmony_ci self.assertTrue(self.pathmodule.exists(r)) 1637db96d56Sopenharmony_ci finally: 1647db96d56Sopenharmony_ci os.close(r) 1657db96d56Sopenharmony_ci os.close(w) 1667db96d56Sopenharmony_ci self.assertFalse(self.pathmodule.exists(r)) 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ci def test_isdir(self): 1697db96d56Sopenharmony_ci filename = os_helper.TESTFN 1707db96d56Sopenharmony_ci bfilename = os.fsencode(filename) 1717db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isdir(filename), False) 1727db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isdir(bfilename), False) 1737db96d56Sopenharmony_ci 1747db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isdir(filename + '\udfff'), False) 1757db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isdir(bfilename + b'\xff'), False) 1767db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isdir(filename + '\x00'), False) 1777db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isdir(bfilename + b'\x00'), False) 1787db96d56Sopenharmony_ci 1797db96d56Sopenharmony_ci try: 1807db96d56Sopenharmony_ci create_file(filename) 1817db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isdir(filename), False) 1827db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isdir(bfilename), False) 1837db96d56Sopenharmony_ci finally: 1847db96d56Sopenharmony_ci os_helper.unlink(filename) 1857db96d56Sopenharmony_ci 1867db96d56Sopenharmony_ci try: 1877db96d56Sopenharmony_ci os.mkdir(filename) 1887db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isdir(filename), True) 1897db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isdir(bfilename), True) 1907db96d56Sopenharmony_ci finally: 1917db96d56Sopenharmony_ci os_helper.rmdir(filename) 1927db96d56Sopenharmony_ci 1937db96d56Sopenharmony_ci def test_isfile(self): 1947db96d56Sopenharmony_ci filename = os_helper.TESTFN 1957db96d56Sopenharmony_ci bfilename = os.fsencode(filename) 1967db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isfile(filename), False) 1977db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isfile(bfilename), False) 1987db96d56Sopenharmony_ci 1997db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isfile(filename + '\udfff'), False) 2007db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isfile(bfilename + b'\xff'), False) 2017db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isfile(filename + '\x00'), False) 2027db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isfile(bfilename + b'\x00'), False) 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ci try: 2057db96d56Sopenharmony_ci create_file(filename) 2067db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isfile(filename), True) 2077db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isfile(bfilename), True) 2087db96d56Sopenharmony_ci finally: 2097db96d56Sopenharmony_ci os_helper.unlink(filename) 2107db96d56Sopenharmony_ci 2117db96d56Sopenharmony_ci try: 2127db96d56Sopenharmony_ci os.mkdir(filename) 2137db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isfile(filename), False) 2147db96d56Sopenharmony_ci self.assertIs(self.pathmodule.isfile(bfilename), False) 2157db96d56Sopenharmony_ci finally: 2167db96d56Sopenharmony_ci os_helper.rmdir(filename) 2177db96d56Sopenharmony_ci 2187db96d56Sopenharmony_ci def test_samefile(self): 2197db96d56Sopenharmony_ci file1 = os_helper.TESTFN 2207db96d56Sopenharmony_ci file2 = os_helper.TESTFN + "2" 2217db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, file1) 2227db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, file2) 2237db96d56Sopenharmony_ci 2247db96d56Sopenharmony_ci create_file(file1) 2257db96d56Sopenharmony_ci self.assertTrue(self.pathmodule.samefile(file1, file1)) 2267db96d56Sopenharmony_ci 2277db96d56Sopenharmony_ci create_file(file2) 2287db96d56Sopenharmony_ci self.assertFalse(self.pathmodule.samefile(file1, file2)) 2297db96d56Sopenharmony_ci 2307db96d56Sopenharmony_ci self.assertRaises(TypeError, self.pathmodule.samefile) 2317db96d56Sopenharmony_ci 2327db96d56Sopenharmony_ci def _test_samefile_on_link_func(self, func): 2337db96d56Sopenharmony_ci test_fn1 = os_helper.TESTFN 2347db96d56Sopenharmony_ci test_fn2 = os_helper.TESTFN + "2" 2357db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, test_fn1) 2367db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, test_fn2) 2377db96d56Sopenharmony_ci 2387db96d56Sopenharmony_ci create_file(test_fn1) 2397db96d56Sopenharmony_ci 2407db96d56Sopenharmony_ci func(test_fn1, test_fn2) 2417db96d56Sopenharmony_ci self.assertTrue(self.pathmodule.samefile(test_fn1, test_fn2)) 2427db96d56Sopenharmony_ci os.remove(test_fn2) 2437db96d56Sopenharmony_ci 2447db96d56Sopenharmony_ci create_file(test_fn2) 2457db96d56Sopenharmony_ci self.assertFalse(self.pathmodule.samefile(test_fn1, test_fn2)) 2467db96d56Sopenharmony_ci 2477db96d56Sopenharmony_ci @os_helper.skip_unless_symlink 2487db96d56Sopenharmony_ci def test_samefile_on_symlink(self): 2497db96d56Sopenharmony_ci self._test_samefile_on_link_func(os.symlink) 2507db96d56Sopenharmony_ci 2517db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(os, 'link'), 'requires os.link') 2527db96d56Sopenharmony_ci def test_samefile_on_link(self): 2537db96d56Sopenharmony_ci try: 2547db96d56Sopenharmony_ci self._test_samefile_on_link_func(os.link) 2557db96d56Sopenharmony_ci except PermissionError as e: 2567db96d56Sopenharmony_ci self.skipTest('os.link(): %s' % e) 2577db96d56Sopenharmony_ci 2587db96d56Sopenharmony_ci def test_samestat(self): 2597db96d56Sopenharmony_ci test_fn1 = os_helper.TESTFN 2607db96d56Sopenharmony_ci test_fn2 = os_helper.TESTFN + "2" 2617db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, test_fn1) 2627db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, test_fn2) 2637db96d56Sopenharmony_ci 2647db96d56Sopenharmony_ci create_file(test_fn1) 2657db96d56Sopenharmony_ci stat1 = os.stat(test_fn1) 2667db96d56Sopenharmony_ci self.assertTrue(self.pathmodule.samestat(stat1, os.stat(test_fn1))) 2677db96d56Sopenharmony_ci 2687db96d56Sopenharmony_ci create_file(test_fn2) 2697db96d56Sopenharmony_ci stat2 = os.stat(test_fn2) 2707db96d56Sopenharmony_ci self.assertFalse(self.pathmodule.samestat(stat1, stat2)) 2717db96d56Sopenharmony_ci 2727db96d56Sopenharmony_ci self.assertRaises(TypeError, self.pathmodule.samestat) 2737db96d56Sopenharmony_ci 2747db96d56Sopenharmony_ci def _test_samestat_on_link_func(self, func): 2757db96d56Sopenharmony_ci test_fn1 = os_helper.TESTFN + "1" 2767db96d56Sopenharmony_ci test_fn2 = os_helper.TESTFN + "2" 2777db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, test_fn1) 2787db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, test_fn2) 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci create_file(test_fn1) 2817db96d56Sopenharmony_ci func(test_fn1, test_fn2) 2827db96d56Sopenharmony_ci self.assertTrue(self.pathmodule.samestat(os.stat(test_fn1), 2837db96d56Sopenharmony_ci os.stat(test_fn2))) 2847db96d56Sopenharmony_ci os.remove(test_fn2) 2857db96d56Sopenharmony_ci 2867db96d56Sopenharmony_ci create_file(test_fn2) 2877db96d56Sopenharmony_ci self.assertFalse(self.pathmodule.samestat(os.stat(test_fn1), 2887db96d56Sopenharmony_ci os.stat(test_fn2))) 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci @os_helper.skip_unless_symlink 2917db96d56Sopenharmony_ci def test_samestat_on_symlink(self): 2927db96d56Sopenharmony_ci self._test_samestat_on_link_func(os.symlink) 2937db96d56Sopenharmony_ci 2947db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(os, 'link'), 'requires os.link') 2957db96d56Sopenharmony_ci def test_samestat_on_link(self): 2967db96d56Sopenharmony_ci try: 2977db96d56Sopenharmony_ci self._test_samestat_on_link_func(os.link) 2987db96d56Sopenharmony_ci except PermissionError as e: 2997db96d56Sopenharmony_ci self.skipTest('os.link(): %s' % e) 3007db96d56Sopenharmony_ci 3017db96d56Sopenharmony_ci def test_sameopenfile(self): 3027db96d56Sopenharmony_ci filename = os_helper.TESTFN 3037db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, filename) 3047db96d56Sopenharmony_ci create_file(filename) 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_ci with open(filename, "rb", 0) as fp1: 3077db96d56Sopenharmony_ci fd1 = fp1.fileno() 3087db96d56Sopenharmony_ci with open(filename, "rb", 0) as fp2: 3097db96d56Sopenharmony_ci fd2 = fp2.fileno() 3107db96d56Sopenharmony_ci self.assertTrue(self.pathmodule.sameopenfile(fd1, fd2)) 3117db96d56Sopenharmony_ci 3127db96d56Sopenharmony_ci 3137db96d56Sopenharmony_ciclass TestGenericTest(GenericTest, unittest.TestCase): 3147db96d56Sopenharmony_ci # Issue 16852: GenericTest can't inherit from unittest.TestCase 3157db96d56Sopenharmony_ci # for test discovery purposes; CommonTest inherits from GenericTest 3167db96d56Sopenharmony_ci # and is only meant to be inherited by others. 3177db96d56Sopenharmony_ci pathmodule = genericpath 3187db96d56Sopenharmony_ci 3197db96d56Sopenharmony_ci def test_invalid_paths(self): 3207db96d56Sopenharmony_ci for attr in GenericTest.common_attributes: 3217db96d56Sopenharmony_ci # os.path.commonprefix doesn't raise ValueError 3227db96d56Sopenharmony_ci if attr == 'commonprefix': 3237db96d56Sopenharmony_ci continue 3247db96d56Sopenharmony_ci func = getattr(self.pathmodule, attr) 3257db96d56Sopenharmony_ci with self.subTest(attr=attr): 3267db96d56Sopenharmony_ci if attr in ('exists', 'isdir', 'isfile'): 3277db96d56Sopenharmony_ci func('/tmp\udfffabcds') 3287db96d56Sopenharmony_ci func(b'/tmp\xffabcds') 3297db96d56Sopenharmony_ci func('/tmp\x00abcds') 3307db96d56Sopenharmony_ci func(b'/tmp\x00abcds') 3317db96d56Sopenharmony_ci else: 3327db96d56Sopenharmony_ci with self.assertRaises((OSError, UnicodeEncodeError)): 3337db96d56Sopenharmony_ci func('/tmp\udfffabcds') 3347db96d56Sopenharmony_ci with self.assertRaises((OSError, UnicodeDecodeError)): 3357db96d56Sopenharmony_ci func(b'/tmp\xffabcds') 3367db96d56Sopenharmony_ci with self.assertRaisesRegex(ValueError, 'embedded null'): 3377db96d56Sopenharmony_ci func('/tmp\x00abcds') 3387db96d56Sopenharmony_ci with self.assertRaisesRegex(ValueError, 'embedded null'): 3397db96d56Sopenharmony_ci func(b'/tmp\x00abcds') 3407db96d56Sopenharmony_ci 3417db96d56Sopenharmony_ci# Following TestCase is not supposed to be run from test_genericpath. 3427db96d56Sopenharmony_ci# It is inherited by other test modules (ntpath, posixpath). 3437db96d56Sopenharmony_ci 3447db96d56Sopenharmony_ciclass CommonTest(GenericTest): 3457db96d56Sopenharmony_ci common_attributes = GenericTest.common_attributes + [ 3467db96d56Sopenharmony_ci # Properties 3477db96d56Sopenharmony_ci 'curdir', 'pardir', 'extsep', 'sep', 3487db96d56Sopenharmony_ci 'pathsep', 'defpath', 'altsep', 'devnull', 3497db96d56Sopenharmony_ci # Methods 3507db96d56Sopenharmony_ci 'normcase', 'splitdrive', 'expandvars', 'normpath', 'abspath', 3517db96d56Sopenharmony_ci 'join', 'split', 'splitext', 'isabs', 'basename', 'dirname', 3527db96d56Sopenharmony_ci 'lexists', 'islink', 'ismount', 'expanduser', 'normpath', 'realpath', 3537db96d56Sopenharmony_ci ] 3547db96d56Sopenharmony_ci 3557db96d56Sopenharmony_ci def test_normcase(self): 3567db96d56Sopenharmony_ci normcase = self.pathmodule.normcase 3577db96d56Sopenharmony_ci # check that normcase() is idempotent 3587db96d56Sopenharmony_ci for p in ["FoO/./BaR", b"FoO/./BaR"]: 3597db96d56Sopenharmony_ci p = normcase(p) 3607db96d56Sopenharmony_ci self.assertEqual(p, normcase(p)) 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci self.assertEqual(normcase(''), '') 3637db96d56Sopenharmony_ci self.assertEqual(normcase(b''), b'') 3647db96d56Sopenharmony_ci 3657db96d56Sopenharmony_ci # check that normcase raises a TypeError for invalid types 3667db96d56Sopenharmony_ci for path in (None, True, 0, 2.5, [], bytearray(b''), {'o','o'}): 3677db96d56Sopenharmony_ci self.assertRaises(TypeError, normcase, path) 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci def test_splitdrive(self): 3707db96d56Sopenharmony_ci # splitdrive for non-NT paths 3717db96d56Sopenharmony_ci splitdrive = self.pathmodule.splitdrive 3727db96d56Sopenharmony_ci self.assertEqual(splitdrive("/foo/bar"), ("", "/foo/bar")) 3737db96d56Sopenharmony_ci self.assertEqual(splitdrive("foo:bar"), ("", "foo:bar")) 3747db96d56Sopenharmony_ci self.assertEqual(splitdrive(":foo:bar"), ("", ":foo:bar")) 3757db96d56Sopenharmony_ci 3767db96d56Sopenharmony_ci self.assertEqual(splitdrive(b"/foo/bar"), (b"", b"/foo/bar")) 3777db96d56Sopenharmony_ci self.assertEqual(splitdrive(b"foo:bar"), (b"", b"foo:bar")) 3787db96d56Sopenharmony_ci self.assertEqual(splitdrive(b":foo:bar"), (b"", b":foo:bar")) 3797db96d56Sopenharmony_ci 3807db96d56Sopenharmony_ci def test_expandvars(self): 3817db96d56Sopenharmony_ci expandvars = self.pathmodule.expandvars 3827db96d56Sopenharmony_ci with os_helper.EnvironmentVarGuard() as env: 3837db96d56Sopenharmony_ci env.clear() 3847db96d56Sopenharmony_ci env["foo"] = "bar" 3857db96d56Sopenharmony_ci env["{foo"] = "baz1" 3867db96d56Sopenharmony_ci env["{foo}"] = "baz2" 3877db96d56Sopenharmony_ci self.assertEqual(expandvars("foo"), "foo") 3887db96d56Sopenharmony_ci self.assertEqual(expandvars("$foo bar"), "bar bar") 3897db96d56Sopenharmony_ci self.assertEqual(expandvars("${foo}bar"), "barbar") 3907db96d56Sopenharmony_ci self.assertEqual(expandvars("$[foo]bar"), "$[foo]bar") 3917db96d56Sopenharmony_ci self.assertEqual(expandvars("$bar bar"), "$bar bar") 3927db96d56Sopenharmony_ci self.assertEqual(expandvars("$?bar"), "$?bar") 3937db96d56Sopenharmony_ci self.assertEqual(expandvars("$foo}bar"), "bar}bar") 3947db96d56Sopenharmony_ci self.assertEqual(expandvars("${foo"), "${foo") 3957db96d56Sopenharmony_ci self.assertEqual(expandvars("${{foo}}"), "baz1}") 3967db96d56Sopenharmony_ci self.assertEqual(expandvars("$foo$foo"), "barbar") 3977db96d56Sopenharmony_ci self.assertEqual(expandvars("$bar$bar"), "$bar$bar") 3987db96d56Sopenharmony_ci 3997db96d56Sopenharmony_ci self.assertEqual(expandvars(b"foo"), b"foo") 4007db96d56Sopenharmony_ci self.assertEqual(expandvars(b"$foo bar"), b"bar bar") 4017db96d56Sopenharmony_ci self.assertEqual(expandvars(b"${foo}bar"), b"barbar") 4027db96d56Sopenharmony_ci self.assertEqual(expandvars(b"$[foo]bar"), b"$[foo]bar") 4037db96d56Sopenharmony_ci self.assertEqual(expandvars(b"$bar bar"), b"$bar bar") 4047db96d56Sopenharmony_ci self.assertEqual(expandvars(b"$?bar"), b"$?bar") 4057db96d56Sopenharmony_ci self.assertEqual(expandvars(b"$foo}bar"), b"bar}bar") 4067db96d56Sopenharmony_ci self.assertEqual(expandvars(b"${foo"), b"${foo") 4077db96d56Sopenharmony_ci self.assertEqual(expandvars(b"${{foo}}"), b"baz1}") 4087db96d56Sopenharmony_ci self.assertEqual(expandvars(b"$foo$foo"), b"barbar") 4097db96d56Sopenharmony_ci self.assertEqual(expandvars(b"$bar$bar"), b"$bar$bar") 4107db96d56Sopenharmony_ci 4117db96d56Sopenharmony_ci @unittest.skipUnless(os_helper.FS_NONASCII, 'need os_helper.FS_NONASCII') 4127db96d56Sopenharmony_ci def test_expandvars_nonascii(self): 4137db96d56Sopenharmony_ci expandvars = self.pathmodule.expandvars 4147db96d56Sopenharmony_ci def check(value, expected): 4157db96d56Sopenharmony_ci self.assertEqual(expandvars(value), expected) 4167db96d56Sopenharmony_ci with os_helper.EnvironmentVarGuard() as env: 4177db96d56Sopenharmony_ci env.clear() 4187db96d56Sopenharmony_ci nonascii = os_helper.FS_NONASCII 4197db96d56Sopenharmony_ci env['spam'] = nonascii 4207db96d56Sopenharmony_ci env[nonascii] = 'ham' + nonascii 4217db96d56Sopenharmony_ci check(nonascii, nonascii) 4227db96d56Sopenharmony_ci check('$spam bar', '%s bar' % nonascii) 4237db96d56Sopenharmony_ci check('${spam}bar', '%sbar' % nonascii) 4247db96d56Sopenharmony_ci check('${%s}bar' % nonascii, 'ham%sbar' % nonascii) 4257db96d56Sopenharmony_ci check('$bar%s bar' % nonascii, '$bar%s bar' % nonascii) 4267db96d56Sopenharmony_ci check('$spam}bar', '%s}bar' % nonascii) 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_ci check(os.fsencode(nonascii), os.fsencode(nonascii)) 4297db96d56Sopenharmony_ci check(b'$spam bar', os.fsencode('%s bar' % nonascii)) 4307db96d56Sopenharmony_ci check(b'${spam}bar', os.fsencode('%sbar' % nonascii)) 4317db96d56Sopenharmony_ci check(os.fsencode('${%s}bar' % nonascii), 4327db96d56Sopenharmony_ci os.fsencode('ham%sbar' % nonascii)) 4337db96d56Sopenharmony_ci check(os.fsencode('$bar%s bar' % nonascii), 4347db96d56Sopenharmony_ci os.fsencode('$bar%s bar' % nonascii)) 4357db96d56Sopenharmony_ci check(b'$spam}bar', os.fsencode('%s}bar' % nonascii)) 4367db96d56Sopenharmony_ci 4377db96d56Sopenharmony_ci def test_abspath(self): 4387db96d56Sopenharmony_ci self.assertIn("foo", self.pathmodule.abspath("foo")) 4397db96d56Sopenharmony_ci with warnings.catch_warnings(): 4407db96d56Sopenharmony_ci warnings.simplefilter("ignore", DeprecationWarning) 4417db96d56Sopenharmony_ci self.assertIn(b"foo", self.pathmodule.abspath(b"foo")) 4427db96d56Sopenharmony_ci 4437db96d56Sopenharmony_ci # avoid UnicodeDecodeError on Windows 4447db96d56Sopenharmony_ci undecodable_path = b'' if sys.platform == 'win32' else b'f\xf2\xf2' 4457db96d56Sopenharmony_ci 4467db96d56Sopenharmony_ci # Abspath returns bytes when the arg is bytes 4477db96d56Sopenharmony_ci with warnings.catch_warnings(): 4487db96d56Sopenharmony_ci warnings.simplefilter("ignore", DeprecationWarning) 4497db96d56Sopenharmony_ci for path in (b'', b'foo', undecodable_path, b'/foo', b'C:\\'): 4507db96d56Sopenharmony_ci self.assertIsInstance(self.pathmodule.abspath(path), bytes) 4517db96d56Sopenharmony_ci 4527db96d56Sopenharmony_ci def test_realpath(self): 4537db96d56Sopenharmony_ci self.assertIn("foo", self.pathmodule.realpath("foo")) 4547db96d56Sopenharmony_ci with warnings.catch_warnings(): 4557db96d56Sopenharmony_ci warnings.simplefilter("ignore", DeprecationWarning) 4567db96d56Sopenharmony_ci self.assertIn(b"foo", self.pathmodule.realpath(b"foo")) 4577db96d56Sopenharmony_ci 4587db96d56Sopenharmony_ci def test_normpath_issue5827(self): 4597db96d56Sopenharmony_ci # Make sure normpath preserves unicode 4607db96d56Sopenharmony_ci for path in ('', '.', '/', '\\', '///foo/.//bar//'): 4617db96d56Sopenharmony_ci self.assertIsInstance(self.pathmodule.normpath(path), str) 4627db96d56Sopenharmony_ci 4637db96d56Sopenharmony_ci def test_normpath_issue106242(self): 4647db96d56Sopenharmony_ci for path in ('\x00', 'foo\x00bar', '\x00\x00', '\x00foo', 'foo\x00'): 4657db96d56Sopenharmony_ci self.assertEqual(self.pathmodule.normpath(path), path) 4667db96d56Sopenharmony_ci 4677db96d56Sopenharmony_ci def test_abspath_issue3426(self): 4687db96d56Sopenharmony_ci # Check that abspath returns unicode when the arg is unicode 4697db96d56Sopenharmony_ci # with both ASCII and non-ASCII cwds. 4707db96d56Sopenharmony_ci abspath = self.pathmodule.abspath 4717db96d56Sopenharmony_ci for path in ('', 'fuu', 'f\xf9\xf9', '/fuu', 'U:\\'): 4727db96d56Sopenharmony_ci self.assertIsInstance(abspath(path), str) 4737db96d56Sopenharmony_ci 4747db96d56Sopenharmony_ci unicwd = '\xe7w\xf0' 4757db96d56Sopenharmony_ci try: 4767db96d56Sopenharmony_ci os.fsencode(unicwd) 4777db96d56Sopenharmony_ci except (AttributeError, UnicodeEncodeError): 4787db96d56Sopenharmony_ci # FS encoding is probably ASCII 4797db96d56Sopenharmony_ci pass 4807db96d56Sopenharmony_ci else: 4817db96d56Sopenharmony_ci with os_helper.temp_cwd(unicwd): 4827db96d56Sopenharmony_ci for path in ('', 'fuu', 'f\xf9\xf9', '/fuu', 'U:\\'): 4837db96d56Sopenharmony_ci self.assertIsInstance(abspath(path), str) 4847db96d56Sopenharmony_ci 4857db96d56Sopenharmony_ci def test_nonascii_abspath(self): 4867db96d56Sopenharmony_ci if (os_helper.TESTFN_UNDECODABLE 4877db96d56Sopenharmony_ci # macOS and Emscripten deny the creation of a directory with an 4887db96d56Sopenharmony_ci # invalid UTF-8 name. Windows allows creating a directory with an 4897db96d56Sopenharmony_ci # arbitrary bytes name, but fails to enter this directory 4907db96d56Sopenharmony_ci # (when the bytes name is used). 4917db96d56Sopenharmony_ci and sys.platform not in ('win32', 'darwin', 'emscripten', 'wasi')): 4927db96d56Sopenharmony_ci name = os_helper.TESTFN_UNDECODABLE 4937db96d56Sopenharmony_ci elif os_helper.TESTFN_NONASCII: 4947db96d56Sopenharmony_ci name = os_helper.TESTFN_NONASCII 4957db96d56Sopenharmony_ci else: 4967db96d56Sopenharmony_ci self.skipTest("need os_helper.TESTFN_NONASCII") 4977db96d56Sopenharmony_ci 4987db96d56Sopenharmony_ci with warnings.catch_warnings(): 4997db96d56Sopenharmony_ci warnings.simplefilter("ignore", DeprecationWarning) 5007db96d56Sopenharmony_ci with os_helper.temp_cwd(name): 5017db96d56Sopenharmony_ci self.test_abspath() 5027db96d56Sopenharmony_ci 5037db96d56Sopenharmony_ci def test_join_errors(self): 5047db96d56Sopenharmony_ci # Check join() raises friendly TypeErrors. 5057db96d56Sopenharmony_ci with warnings_helper.check_warnings(('', BytesWarning), quiet=True): 5067db96d56Sopenharmony_ci errmsg = "Can't mix strings and bytes in path components" 5077db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, errmsg): 5087db96d56Sopenharmony_ci self.pathmodule.join(b'bytes', 'str') 5097db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, errmsg): 5107db96d56Sopenharmony_ci self.pathmodule.join('str', b'bytes') 5117db96d56Sopenharmony_ci # regression, see #15377 5127db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, 'int'): 5137db96d56Sopenharmony_ci self.pathmodule.join(42, 'str') 5147db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, 'int'): 5157db96d56Sopenharmony_ci self.pathmodule.join('str', 42) 5167db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, 'int'): 5177db96d56Sopenharmony_ci self.pathmodule.join(42) 5187db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, 'list'): 5197db96d56Sopenharmony_ci self.pathmodule.join([]) 5207db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, 'bytearray'): 5217db96d56Sopenharmony_ci self.pathmodule.join(bytearray(b'foo'), bytearray(b'bar')) 5227db96d56Sopenharmony_ci 5237db96d56Sopenharmony_ci def test_relpath_errors(self): 5247db96d56Sopenharmony_ci # Check relpath() raises friendly TypeErrors. 5257db96d56Sopenharmony_ci with warnings_helper.check_warnings( 5267db96d56Sopenharmony_ci ('', (BytesWarning, DeprecationWarning)), quiet=True): 5277db96d56Sopenharmony_ci errmsg = "Can't mix strings and bytes in path components" 5287db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, errmsg): 5297db96d56Sopenharmony_ci self.pathmodule.relpath(b'bytes', 'str') 5307db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, errmsg): 5317db96d56Sopenharmony_ci self.pathmodule.relpath('str', b'bytes') 5327db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, 'int'): 5337db96d56Sopenharmony_ci self.pathmodule.relpath(42, 'str') 5347db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, 'int'): 5357db96d56Sopenharmony_ci self.pathmodule.relpath('str', 42) 5367db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, 'bytearray'): 5377db96d56Sopenharmony_ci self.pathmodule.relpath(bytearray(b'foo'), bytearray(b'bar')) 5387db96d56Sopenharmony_ci 5397db96d56Sopenharmony_ci def test_import(self): 5407db96d56Sopenharmony_ci assert_python_ok('-S', '-c', 'import ' + self.pathmodule.__name__) 5417db96d56Sopenharmony_ci 5427db96d56Sopenharmony_ci 5437db96d56Sopenharmony_ciclass PathLikeTests(unittest.TestCase): 5447db96d56Sopenharmony_ci 5457db96d56Sopenharmony_ci def setUp(self): 5467db96d56Sopenharmony_ci self.file_name = os_helper.TESTFN 5477db96d56Sopenharmony_ci self.file_path = FakePath(os_helper.TESTFN) 5487db96d56Sopenharmony_ci self.addCleanup(os_helper.unlink, self.file_name) 5497db96d56Sopenharmony_ci create_file(self.file_name, b"test_genericpath.PathLikeTests") 5507db96d56Sopenharmony_ci 5517db96d56Sopenharmony_ci def assertPathEqual(self, func): 5527db96d56Sopenharmony_ci self.assertEqual(func(self.file_path), func(self.file_name)) 5537db96d56Sopenharmony_ci 5547db96d56Sopenharmony_ci def test_path_exists(self): 5557db96d56Sopenharmony_ci self.assertPathEqual(os.path.exists) 5567db96d56Sopenharmony_ci 5577db96d56Sopenharmony_ci def test_path_isfile(self): 5587db96d56Sopenharmony_ci self.assertPathEqual(os.path.isfile) 5597db96d56Sopenharmony_ci 5607db96d56Sopenharmony_ci def test_path_isdir(self): 5617db96d56Sopenharmony_ci self.assertPathEqual(os.path.isdir) 5627db96d56Sopenharmony_ci 5637db96d56Sopenharmony_ci def test_path_commonprefix(self): 5647db96d56Sopenharmony_ci self.assertEqual(os.path.commonprefix([self.file_path, self.file_name]), 5657db96d56Sopenharmony_ci self.file_name) 5667db96d56Sopenharmony_ci 5677db96d56Sopenharmony_ci def test_path_getsize(self): 5687db96d56Sopenharmony_ci self.assertPathEqual(os.path.getsize) 5697db96d56Sopenharmony_ci 5707db96d56Sopenharmony_ci def test_path_getmtime(self): 5717db96d56Sopenharmony_ci self.assertPathEqual(os.path.getatime) 5727db96d56Sopenharmony_ci 5737db96d56Sopenharmony_ci def test_path_getctime(self): 5747db96d56Sopenharmony_ci self.assertPathEqual(os.path.getctime) 5757db96d56Sopenharmony_ci 5767db96d56Sopenharmony_ci def test_path_samefile(self): 5777db96d56Sopenharmony_ci self.assertTrue(os.path.samefile(self.file_path, self.file_name)) 5787db96d56Sopenharmony_ci 5797db96d56Sopenharmony_ci 5807db96d56Sopenharmony_ciif __name__ == "__main__": 5817db96d56Sopenharmony_ci unittest.main() 582