17db96d56Sopenharmony_cifrom test import support 27db96d56Sopenharmony_cifrom test.support import warnings_helper 37db96d56Sopenharmony_ciimport decimal 47db96d56Sopenharmony_ciimport enum 57db96d56Sopenharmony_ciimport locale 67db96d56Sopenharmony_ciimport math 77db96d56Sopenharmony_ciimport platform 87db96d56Sopenharmony_ciimport sys 97db96d56Sopenharmony_ciimport sysconfig 107db96d56Sopenharmony_ciimport time 117db96d56Sopenharmony_ciimport threading 127db96d56Sopenharmony_ciimport unittest 137db96d56Sopenharmony_citry: 147db96d56Sopenharmony_ci import _testcapi 157db96d56Sopenharmony_ciexcept ImportError: 167db96d56Sopenharmony_ci _testcapi = None 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_cifrom test.support import skip_if_buggy_ucrt_strfptime 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci# Max year is only limited by the size of C int. 217db96d56Sopenharmony_ciSIZEOF_INT = sysconfig.get_config_var('SIZEOF_INT') or 4 227db96d56Sopenharmony_ciTIME_MAXYEAR = (1 << 8 * SIZEOF_INT - 1) - 1 237db96d56Sopenharmony_ciTIME_MINYEAR = -TIME_MAXYEAR - 1 + 1900 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ciSEC_TO_US = 10 ** 6 267db96d56Sopenharmony_ciUS_TO_NS = 10 ** 3 277db96d56Sopenharmony_ciMS_TO_NS = 10 ** 6 287db96d56Sopenharmony_ciSEC_TO_NS = 10 ** 9 297db96d56Sopenharmony_ciNS_TO_SEC = 10 ** 9 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ciclass _PyTime(enum.IntEnum): 327db96d56Sopenharmony_ci # Round towards minus infinity (-inf) 337db96d56Sopenharmony_ci ROUND_FLOOR = 0 347db96d56Sopenharmony_ci # Round towards infinity (+inf) 357db96d56Sopenharmony_ci ROUND_CEILING = 1 367db96d56Sopenharmony_ci # Round to nearest with ties going to nearest even integer 377db96d56Sopenharmony_ci ROUND_HALF_EVEN = 2 387db96d56Sopenharmony_ci # Round away from zero 397db96d56Sopenharmony_ci ROUND_UP = 3 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ci# _PyTime_t is int64_t 427db96d56Sopenharmony_ci_PyTime_MIN = -2 ** 63 437db96d56Sopenharmony_ci_PyTime_MAX = 2 ** 63 - 1 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ci# Rounding modes supported by PyTime 467db96d56Sopenharmony_ciROUNDING_MODES = ( 477db96d56Sopenharmony_ci # (PyTime rounding method, decimal rounding method) 487db96d56Sopenharmony_ci (_PyTime.ROUND_FLOOR, decimal.ROUND_FLOOR), 497db96d56Sopenharmony_ci (_PyTime.ROUND_CEILING, decimal.ROUND_CEILING), 507db96d56Sopenharmony_ci (_PyTime.ROUND_HALF_EVEN, decimal.ROUND_HALF_EVEN), 517db96d56Sopenharmony_ci (_PyTime.ROUND_UP, decimal.ROUND_UP), 527db96d56Sopenharmony_ci) 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci 557db96d56Sopenharmony_ciclass TimeTestCase(unittest.TestCase): 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci def setUp(self): 587db96d56Sopenharmony_ci self.t = time.time() 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ci def test_data_attributes(self): 617db96d56Sopenharmony_ci time.altzone 627db96d56Sopenharmony_ci time.daylight 637db96d56Sopenharmony_ci time.timezone 647db96d56Sopenharmony_ci time.tzname 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci def test_time(self): 677db96d56Sopenharmony_ci time.time() 687db96d56Sopenharmony_ci info = time.get_clock_info('time') 697db96d56Sopenharmony_ci self.assertFalse(info.monotonic) 707db96d56Sopenharmony_ci self.assertTrue(info.adjustable) 717db96d56Sopenharmony_ci 727db96d56Sopenharmony_ci def test_time_ns_type(self): 737db96d56Sopenharmony_ci def check_ns(sec, ns): 747db96d56Sopenharmony_ci self.assertIsInstance(ns, int) 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci sec_ns = int(sec * 1e9) 777db96d56Sopenharmony_ci # tolerate a difference of 50 ms 787db96d56Sopenharmony_ci self.assertLess((sec_ns - ns), 50 ** 6, (sec, ns)) 797db96d56Sopenharmony_ci 807db96d56Sopenharmony_ci check_ns(time.time(), 817db96d56Sopenharmony_ci time.time_ns()) 827db96d56Sopenharmony_ci check_ns(time.monotonic(), 837db96d56Sopenharmony_ci time.monotonic_ns()) 847db96d56Sopenharmony_ci check_ns(time.perf_counter(), 857db96d56Sopenharmony_ci time.perf_counter_ns()) 867db96d56Sopenharmony_ci check_ns(time.process_time(), 877db96d56Sopenharmony_ci time.process_time_ns()) 887db96d56Sopenharmony_ci 897db96d56Sopenharmony_ci if hasattr(time, 'thread_time'): 907db96d56Sopenharmony_ci check_ns(time.thread_time(), 917db96d56Sopenharmony_ci time.thread_time_ns()) 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci if hasattr(time, 'clock_gettime'): 947db96d56Sopenharmony_ci check_ns(time.clock_gettime(time.CLOCK_REALTIME), 957db96d56Sopenharmony_ci time.clock_gettime_ns(time.CLOCK_REALTIME)) 967db96d56Sopenharmony_ci 977db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(time, 'clock_gettime'), 987db96d56Sopenharmony_ci 'need time.clock_gettime()') 997db96d56Sopenharmony_ci def test_clock_realtime(self): 1007db96d56Sopenharmony_ci t = time.clock_gettime(time.CLOCK_REALTIME) 1017db96d56Sopenharmony_ci self.assertIsInstance(t, float) 1027db96d56Sopenharmony_ci 1037db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(time, 'clock_gettime'), 1047db96d56Sopenharmony_ci 'need time.clock_gettime()') 1057db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(time, 'CLOCK_MONOTONIC'), 1067db96d56Sopenharmony_ci 'need time.CLOCK_MONOTONIC') 1077db96d56Sopenharmony_ci def test_clock_monotonic(self): 1087db96d56Sopenharmony_ci a = time.clock_gettime(time.CLOCK_MONOTONIC) 1097db96d56Sopenharmony_ci b = time.clock_gettime(time.CLOCK_MONOTONIC) 1107db96d56Sopenharmony_ci self.assertLessEqual(a, b) 1117db96d56Sopenharmony_ci 1127db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(time, 'pthread_getcpuclockid'), 1137db96d56Sopenharmony_ci 'need time.pthread_getcpuclockid()') 1147db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(time, 'clock_gettime'), 1157db96d56Sopenharmony_ci 'need time.clock_gettime()') 1167db96d56Sopenharmony_ci def test_pthread_getcpuclockid(self): 1177db96d56Sopenharmony_ci clk_id = time.pthread_getcpuclockid(threading.get_ident()) 1187db96d56Sopenharmony_ci self.assertTrue(type(clk_id) is int) 1197db96d56Sopenharmony_ci # when in 32-bit mode AIX only returns the predefined constant 1207db96d56Sopenharmony_ci if platform.system() == "AIX" and (sys.maxsize.bit_length() <= 32): 1217db96d56Sopenharmony_ci self.assertEqual(clk_id, time.CLOCK_THREAD_CPUTIME_ID) 1227db96d56Sopenharmony_ci # Solaris returns CLOCK_THREAD_CPUTIME_ID when current thread is given 1237db96d56Sopenharmony_ci elif sys.platform.startswith("sunos"): 1247db96d56Sopenharmony_ci self.assertEqual(clk_id, time.CLOCK_THREAD_CPUTIME_ID) 1257db96d56Sopenharmony_ci else: 1267db96d56Sopenharmony_ci self.assertNotEqual(clk_id, time.CLOCK_THREAD_CPUTIME_ID) 1277db96d56Sopenharmony_ci t1 = time.clock_gettime(clk_id) 1287db96d56Sopenharmony_ci t2 = time.clock_gettime(clk_id) 1297db96d56Sopenharmony_ci self.assertLessEqual(t1, t2) 1307db96d56Sopenharmony_ci 1317db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(time, 'clock_getres'), 1327db96d56Sopenharmony_ci 'need time.clock_getres()') 1337db96d56Sopenharmony_ci def test_clock_getres(self): 1347db96d56Sopenharmony_ci res = time.clock_getres(time.CLOCK_REALTIME) 1357db96d56Sopenharmony_ci self.assertGreater(res, 0.0) 1367db96d56Sopenharmony_ci self.assertLessEqual(res, 1.0) 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(time, 'clock_settime'), 1397db96d56Sopenharmony_ci 'need time.clock_settime()') 1407db96d56Sopenharmony_ci def test_clock_settime(self): 1417db96d56Sopenharmony_ci t = time.clock_gettime(time.CLOCK_REALTIME) 1427db96d56Sopenharmony_ci try: 1437db96d56Sopenharmony_ci time.clock_settime(time.CLOCK_REALTIME, t) 1447db96d56Sopenharmony_ci except PermissionError: 1457db96d56Sopenharmony_ci pass 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci if hasattr(time, 'CLOCK_MONOTONIC'): 1487db96d56Sopenharmony_ci self.assertRaises(OSError, 1497db96d56Sopenharmony_ci time.clock_settime, time.CLOCK_MONOTONIC, 0) 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ci def test_conversions(self): 1527db96d56Sopenharmony_ci self.assertEqual(time.ctime(self.t), 1537db96d56Sopenharmony_ci time.asctime(time.localtime(self.t))) 1547db96d56Sopenharmony_ci self.assertEqual(int(time.mktime(time.localtime(self.t))), 1557db96d56Sopenharmony_ci int(self.t)) 1567db96d56Sopenharmony_ci 1577db96d56Sopenharmony_ci def test_sleep(self): 1587db96d56Sopenharmony_ci self.assertRaises(ValueError, time.sleep, -2) 1597db96d56Sopenharmony_ci self.assertRaises(ValueError, time.sleep, -1) 1607db96d56Sopenharmony_ci time.sleep(1.2) 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci def test_epoch(self): 1637db96d56Sopenharmony_ci # bpo-43869: Make sure that Python use the same Epoch on all platforms: 1647db96d56Sopenharmony_ci # January 1, 1970, 00:00:00 (UTC). 1657db96d56Sopenharmony_ci epoch = time.gmtime(0) 1667db96d56Sopenharmony_ci # Only test the date and time, ignore other gmtime() members 1677db96d56Sopenharmony_ci self.assertEqual(tuple(epoch)[:6], (1970, 1, 1, 0, 0, 0), epoch) 1687db96d56Sopenharmony_ci 1697db96d56Sopenharmony_ci def test_strftime(self): 1707db96d56Sopenharmony_ci tt = time.gmtime(self.t) 1717db96d56Sopenharmony_ci for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I', 1727db96d56Sopenharmony_ci 'j', 'm', 'M', 'p', 'S', 1737db96d56Sopenharmony_ci 'U', 'w', 'W', 'x', 'X', 'y', 'Y', 'Z', '%'): 1747db96d56Sopenharmony_ci format = ' %' + directive 1757db96d56Sopenharmony_ci try: 1767db96d56Sopenharmony_ci time.strftime(format, tt) 1777db96d56Sopenharmony_ci except ValueError: 1787db96d56Sopenharmony_ci self.fail('conversion specifier: %r failed.' % format) 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ci self.assertRaises(TypeError, time.strftime, b'%S', tt) 1817db96d56Sopenharmony_ci # embedded null character 1827db96d56Sopenharmony_ci self.assertRaises(ValueError, time.strftime, '%S\0', tt) 1837db96d56Sopenharmony_ci 1847db96d56Sopenharmony_ci def _bounds_checking(self, func): 1857db96d56Sopenharmony_ci # Make sure that strftime() checks the bounds of the various parts 1867db96d56Sopenharmony_ci # of the time tuple (0 is valid for *all* values). 1877db96d56Sopenharmony_ci 1887db96d56Sopenharmony_ci # The year field is tested by other test cases above 1897db96d56Sopenharmony_ci 1907db96d56Sopenharmony_ci # Check month [1, 12] + zero support 1917db96d56Sopenharmony_ci func((1900, 0, 1, 0, 0, 0, 0, 1, -1)) 1927db96d56Sopenharmony_ci func((1900, 12, 1, 0, 0, 0, 0, 1, -1)) 1937db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 1947db96d56Sopenharmony_ci (1900, -1, 1, 0, 0, 0, 0, 1, -1)) 1957db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 1967db96d56Sopenharmony_ci (1900, 13, 1, 0, 0, 0, 0, 1, -1)) 1977db96d56Sopenharmony_ci # Check day of month [1, 31] + zero support 1987db96d56Sopenharmony_ci func((1900, 1, 0, 0, 0, 0, 0, 1, -1)) 1997db96d56Sopenharmony_ci func((1900, 1, 31, 0, 0, 0, 0, 1, -1)) 2007db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 2017db96d56Sopenharmony_ci (1900, 1, -1, 0, 0, 0, 0, 1, -1)) 2027db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 2037db96d56Sopenharmony_ci (1900, 1, 32, 0, 0, 0, 0, 1, -1)) 2047db96d56Sopenharmony_ci # Check hour [0, 23] 2057db96d56Sopenharmony_ci func((1900, 1, 1, 23, 0, 0, 0, 1, -1)) 2067db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 2077db96d56Sopenharmony_ci (1900, 1, 1, -1, 0, 0, 0, 1, -1)) 2087db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 2097db96d56Sopenharmony_ci (1900, 1, 1, 24, 0, 0, 0, 1, -1)) 2107db96d56Sopenharmony_ci # Check minute [0, 59] 2117db96d56Sopenharmony_ci func((1900, 1, 1, 0, 59, 0, 0, 1, -1)) 2127db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 2137db96d56Sopenharmony_ci (1900, 1, 1, 0, -1, 0, 0, 1, -1)) 2147db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 2157db96d56Sopenharmony_ci (1900, 1, 1, 0, 60, 0, 0, 1, -1)) 2167db96d56Sopenharmony_ci # Check second [0, 61] 2177db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 2187db96d56Sopenharmony_ci (1900, 1, 1, 0, 0, -1, 0, 1, -1)) 2197db96d56Sopenharmony_ci # C99 only requires allowing for one leap second, but Python's docs say 2207db96d56Sopenharmony_ci # allow two leap seconds (0..61) 2217db96d56Sopenharmony_ci func((1900, 1, 1, 0, 0, 60, 0, 1, -1)) 2227db96d56Sopenharmony_ci func((1900, 1, 1, 0, 0, 61, 0, 1, -1)) 2237db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 2247db96d56Sopenharmony_ci (1900, 1, 1, 0, 0, 62, 0, 1, -1)) 2257db96d56Sopenharmony_ci # No check for upper-bound day of week; 2267db96d56Sopenharmony_ci # value forced into range by a ``% 7`` calculation. 2277db96d56Sopenharmony_ci # Start check at -2 since gettmarg() increments value before taking 2287db96d56Sopenharmony_ci # modulo. 2297db96d56Sopenharmony_ci self.assertEqual(func((1900, 1, 1, 0, 0, 0, -1, 1, -1)), 2307db96d56Sopenharmony_ci func((1900, 1, 1, 0, 0, 0, +6, 1, -1))) 2317db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 2327db96d56Sopenharmony_ci (1900, 1, 1, 0, 0, 0, -2, 1, -1)) 2337db96d56Sopenharmony_ci # Check day of the year [1, 366] + zero support 2347db96d56Sopenharmony_ci func((1900, 1, 1, 0, 0, 0, 0, 0, -1)) 2357db96d56Sopenharmony_ci func((1900, 1, 1, 0, 0, 0, 0, 366, -1)) 2367db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 2377db96d56Sopenharmony_ci (1900, 1, 1, 0, 0, 0, 0, -1, -1)) 2387db96d56Sopenharmony_ci self.assertRaises(ValueError, func, 2397db96d56Sopenharmony_ci (1900, 1, 1, 0, 0, 0, 0, 367, -1)) 2407db96d56Sopenharmony_ci 2417db96d56Sopenharmony_ci def test_strftime_bounding_check(self): 2427db96d56Sopenharmony_ci self._bounds_checking(lambda tup: time.strftime('', tup)) 2437db96d56Sopenharmony_ci 2447db96d56Sopenharmony_ci def test_strftime_format_check(self): 2457db96d56Sopenharmony_ci # Test that strftime does not crash on invalid format strings 2467db96d56Sopenharmony_ci # that may trigger a buffer overread. When not triggered, 2477db96d56Sopenharmony_ci # strftime may succeed or raise ValueError depending on 2487db96d56Sopenharmony_ci # the platform. 2497db96d56Sopenharmony_ci for x in [ '', 'A', '%A', '%AA' ]: 2507db96d56Sopenharmony_ci for y in range(0x0, 0x10): 2517db96d56Sopenharmony_ci for z in [ '%', 'A%', 'AA%', '%A%', 'A%A%', '%#' ]: 2527db96d56Sopenharmony_ci try: 2537db96d56Sopenharmony_ci time.strftime(x * y + z) 2547db96d56Sopenharmony_ci except ValueError: 2557db96d56Sopenharmony_ci pass 2567db96d56Sopenharmony_ci 2577db96d56Sopenharmony_ci def test_default_values_for_zero(self): 2587db96d56Sopenharmony_ci # Make sure that using all zeros uses the proper default 2597db96d56Sopenharmony_ci # values. No test for daylight savings since strftime() does 2607db96d56Sopenharmony_ci # not change output based on its value and no test for year 2617db96d56Sopenharmony_ci # because systems vary in their support for year 0. 2627db96d56Sopenharmony_ci expected = "2000 01 01 00 00 00 1 001" 2637db96d56Sopenharmony_ci with warnings_helper.check_warnings(): 2647db96d56Sopenharmony_ci result = time.strftime("%Y %m %d %H %M %S %w %j", (2000,)+(0,)*8) 2657db96d56Sopenharmony_ci self.assertEqual(expected, result) 2667db96d56Sopenharmony_ci 2677db96d56Sopenharmony_ci @skip_if_buggy_ucrt_strfptime 2687db96d56Sopenharmony_ci def test_strptime(self): 2697db96d56Sopenharmony_ci # Should be able to go round-trip from strftime to strptime without 2707db96d56Sopenharmony_ci # raising an exception. 2717db96d56Sopenharmony_ci tt = time.gmtime(self.t) 2727db96d56Sopenharmony_ci for directive in ('a', 'A', 'b', 'B', 'c', 'd', 'H', 'I', 2737db96d56Sopenharmony_ci 'j', 'm', 'M', 'p', 'S', 2747db96d56Sopenharmony_ci 'U', 'w', 'W', 'x', 'X', 'y', 'Y', 'Z', '%'): 2757db96d56Sopenharmony_ci format = '%' + directive 2767db96d56Sopenharmony_ci strf_output = time.strftime(format, tt) 2777db96d56Sopenharmony_ci try: 2787db96d56Sopenharmony_ci time.strptime(strf_output, format) 2797db96d56Sopenharmony_ci except ValueError: 2807db96d56Sopenharmony_ci self.fail("conversion specifier %r failed with '%s' input." % 2817db96d56Sopenharmony_ci (format, strf_output)) 2827db96d56Sopenharmony_ci 2837db96d56Sopenharmony_ci def test_strptime_bytes(self): 2847db96d56Sopenharmony_ci # Make sure only strings are accepted as arguments to strptime. 2857db96d56Sopenharmony_ci self.assertRaises(TypeError, time.strptime, b'2009', "%Y") 2867db96d56Sopenharmony_ci self.assertRaises(TypeError, time.strptime, '2009', b'%Y') 2877db96d56Sopenharmony_ci 2887db96d56Sopenharmony_ci def test_strptime_exception_context(self): 2897db96d56Sopenharmony_ci # check that this doesn't chain exceptions needlessly (see #17572) 2907db96d56Sopenharmony_ci with self.assertRaises(ValueError) as e: 2917db96d56Sopenharmony_ci time.strptime('', '%D') 2927db96d56Sopenharmony_ci self.assertIs(e.exception.__suppress_context__, True) 2937db96d56Sopenharmony_ci # additional check for IndexError branch (issue #19545) 2947db96d56Sopenharmony_ci with self.assertRaises(ValueError) as e: 2957db96d56Sopenharmony_ci time.strptime('19', '%Y %') 2967db96d56Sopenharmony_ci self.assertIs(e.exception.__suppress_context__, True) 2977db96d56Sopenharmony_ci 2987db96d56Sopenharmony_ci def test_asctime(self): 2997db96d56Sopenharmony_ci time.asctime(time.gmtime(self.t)) 3007db96d56Sopenharmony_ci 3017db96d56Sopenharmony_ci # Max year is only limited by the size of C int. 3027db96d56Sopenharmony_ci for bigyear in TIME_MAXYEAR, TIME_MINYEAR: 3037db96d56Sopenharmony_ci asc = time.asctime((bigyear, 6, 1) + (0,) * 6) 3047db96d56Sopenharmony_ci self.assertEqual(asc[-len(str(bigyear)):], str(bigyear)) 3057db96d56Sopenharmony_ci self.assertRaises(OverflowError, time.asctime, 3067db96d56Sopenharmony_ci (TIME_MAXYEAR + 1,) + (0,) * 8) 3077db96d56Sopenharmony_ci self.assertRaises(OverflowError, time.asctime, 3087db96d56Sopenharmony_ci (TIME_MINYEAR - 1,) + (0,) * 8) 3097db96d56Sopenharmony_ci self.assertRaises(TypeError, time.asctime, 0) 3107db96d56Sopenharmony_ci self.assertRaises(TypeError, time.asctime, ()) 3117db96d56Sopenharmony_ci self.assertRaises(TypeError, time.asctime, (0,) * 10) 3127db96d56Sopenharmony_ci 3137db96d56Sopenharmony_ci def test_asctime_bounding_check(self): 3147db96d56Sopenharmony_ci self._bounds_checking(time.asctime) 3157db96d56Sopenharmony_ci 3167db96d56Sopenharmony_ci @unittest.skipIf( 3177db96d56Sopenharmony_ci support.is_emscripten, "musl libc issue on Emscripten, bpo-46390" 3187db96d56Sopenharmony_ci ) 3197db96d56Sopenharmony_ci def test_ctime(self): 3207db96d56Sopenharmony_ci t = time.mktime((1973, 9, 16, 1, 3, 52, 0, 0, -1)) 3217db96d56Sopenharmony_ci self.assertEqual(time.ctime(t), 'Sun Sep 16 01:03:52 1973') 3227db96d56Sopenharmony_ci t = time.mktime((2000, 1, 1, 0, 0, 0, 0, 0, -1)) 3237db96d56Sopenharmony_ci self.assertEqual(time.ctime(t), 'Sat Jan 1 00:00:00 2000') 3247db96d56Sopenharmony_ci for year in [-100, 100, 1000, 2000, 2050, 10000]: 3257db96d56Sopenharmony_ci try: 3267db96d56Sopenharmony_ci testval = time.mktime((year, 1, 10) + (0,)*6) 3277db96d56Sopenharmony_ci except (ValueError, OverflowError): 3287db96d56Sopenharmony_ci # If mktime fails, ctime will fail too. This may happen 3297db96d56Sopenharmony_ci # on some platforms. 3307db96d56Sopenharmony_ci pass 3317db96d56Sopenharmony_ci else: 3327db96d56Sopenharmony_ci self.assertEqual(time.ctime(testval)[20:], str(year)) 3337db96d56Sopenharmony_ci 3347db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(time, "tzset"), 3357db96d56Sopenharmony_ci "time module has no attribute tzset") 3367db96d56Sopenharmony_ci def test_tzset(self): 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci from os import environ 3397db96d56Sopenharmony_ci 3407db96d56Sopenharmony_ci # Epoch time of midnight Dec 25th 2002. Never DST in northern 3417db96d56Sopenharmony_ci # hemisphere. 3427db96d56Sopenharmony_ci xmas2002 = 1040774400.0 3437db96d56Sopenharmony_ci 3447db96d56Sopenharmony_ci # These formats are correct for 2002, and possibly future years 3457db96d56Sopenharmony_ci # This format is the 'standard' as documented at: 3467db96d56Sopenharmony_ci # http://www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap08.html 3477db96d56Sopenharmony_ci # They are also documented in the tzset(3) man page on most Unix 3487db96d56Sopenharmony_ci # systems. 3497db96d56Sopenharmony_ci eastern = 'EST+05EDT,M4.1.0,M10.5.0' 3507db96d56Sopenharmony_ci victoria = 'AEST-10AEDT-11,M10.5.0,M3.5.0' 3517db96d56Sopenharmony_ci utc='UTC+0' 3527db96d56Sopenharmony_ci 3537db96d56Sopenharmony_ci org_TZ = environ.get('TZ',None) 3547db96d56Sopenharmony_ci try: 3557db96d56Sopenharmony_ci # Make sure we can switch to UTC time and results are correct 3567db96d56Sopenharmony_ci # Note that unknown timezones default to UTC. 3577db96d56Sopenharmony_ci # Note that altzone is undefined in UTC, as there is no DST 3587db96d56Sopenharmony_ci environ['TZ'] = eastern 3597db96d56Sopenharmony_ci time.tzset() 3607db96d56Sopenharmony_ci environ['TZ'] = utc 3617db96d56Sopenharmony_ci time.tzset() 3627db96d56Sopenharmony_ci self.assertEqual( 3637db96d56Sopenharmony_ci time.gmtime(xmas2002), time.localtime(xmas2002) 3647db96d56Sopenharmony_ci ) 3657db96d56Sopenharmony_ci self.assertEqual(time.daylight, 0) 3667db96d56Sopenharmony_ci self.assertEqual(time.timezone, 0) 3677db96d56Sopenharmony_ci self.assertEqual(time.localtime(xmas2002).tm_isdst, 0) 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci # Make sure we can switch to US/Eastern 3707db96d56Sopenharmony_ci environ['TZ'] = eastern 3717db96d56Sopenharmony_ci time.tzset() 3727db96d56Sopenharmony_ci self.assertNotEqual(time.gmtime(xmas2002), time.localtime(xmas2002)) 3737db96d56Sopenharmony_ci self.assertEqual(time.tzname, ('EST', 'EDT')) 3747db96d56Sopenharmony_ci self.assertEqual(len(time.tzname), 2) 3757db96d56Sopenharmony_ci self.assertEqual(time.daylight, 1) 3767db96d56Sopenharmony_ci self.assertEqual(time.timezone, 18000) 3777db96d56Sopenharmony_ci self.assertEqual(time.altzone, 14400) 3787db96d56Sopenharmony_ci self.assertEqual(time.localtime(xmas2002).tm_isdst, 0) 3797db96d56Sopenharmony_ci self.assertEqual(len(time.tzname), 2) 3807db96d56Sopenharmony_ci 3817db96d56Sopenharmony_ci # Now go to the southern hemisphere. 3827db96d56Sopenharmony_ci environ['TZ'] = victoria 3837db96d56Sopenharmony_ci time.tzset() 3847db96d56Sopenharmony_ci self.assertNotEqual(time.gmtime(xmas2002), time.localtime(xmas2002)) 3857db96d56Sopenharmony_ci 3867db96d56Sopenharmony_ci # Issue #11886: Australian Eastern Standard Time (UTC+10) is called 3877db96d56Sopenharmony_ci # "EST" (as Eastern Standard Time, UTC-5) instead of "AEST" 3887db96d56Sopenharmony_ci # (non-DST timezone), and "EDT" instead of "AEDT" (DST timezone), 3897db96d56Sopenharmony_ci # on some operating systems (e.g. FreeBSD), which is wrong. See for 3907db96d56Sopenharmony_ci # example this bug: 3917db96d56Sopenharmony_ci # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=93810 3927db96d56Sopenharmony_ci self.assertIn(time.tzname[0], ('AEST' 'EST'), time.tzname[0]) 3937db96d56Sopenharmony_ci self.assertTrue(time.tzname[1] in ('AEDT', 'EDT'), str(time.tzname[1])) 3947db96d56Sopenharmony_ci self.assertEqual(len(time.tzname), 2) 3957db96d56Sopenharmony_ci self.assertEqual(time.daylight, 1) 3967db96d56Sopenharmony_ci self.assertEqual(time.timezone, -36000) 3977db96d56Sopenharmony_ci self.assertEqual(time.altzone, -39600) 3987db96d56Sopenharmony_ci self.assertEqual(time.localtime(xmas2002).tm_isdst, 1) 3997db96d56Sopenharmony_ci 4007db96d56Sopenharmony_ci finally: 4017db96d56Sopenharmony_ci # Repair TZ environment variable in case any other tests 4027db96d56Sopenharmony_ci # rely on it. 4037db96d56Sopenharmony_ci if org_TZ is not None: 4047db96d56Sopenharmony_ci environ['TZ'] = org_TZ 4057db96d56Sopenharmony_ci elif 'TZ' in environ: 4067db96d56Sopenharmony_ci del environ['TZ'] 4077db96d56Sopenharmony_ci time.tzset() 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci def test_insane_timestamps(self): 4107db96d56Sopenharmony_ci # It's possible that some platform maps time_t to double, 4117db96d56Sopenharmony_ci # and that this test will fail there. This test should 4127db96d56Sopenharmony_ci # exempt such platforms (provided they return reasonable 4137db96d56Sopenharmony_ci # results!). 4147db96d56Sopenharmony_ci for func in time.ctime, time.gmtime, time.localtime: 4157db96d56Sopenharmony_ci for unreasonable in -1e200, 1e200: 4167db96d56Sopenharmony_ci self.assertRaises(OverflowError, func, unreasonable) 4177db96d56Sopenharmony_ci 4187db96d56Sopenharmony_ci def test_ctime_without_arg(self): 4197db96d56Sopenharmony_ci # Not sure how to check the values, since the clock could tick 4207db96d56Sopenharmony_ci # at any time. Make sure these are at least accepted and 4217db96d56Sopenharmony_ci # don't raise errors. 4227db96d56Sopenharmony_ci time.ctime() 4237db96d56Sopenharmony_ci time.ctime(None) 4247db96d56Sopenharmony_ci 4257db96d56Sopenharmony_ci def test_gmtime_without_arg(self): 4267db96d56Sopenharmony_ci gt0 = time.gmtime() 4277db96d56Sopenharmony_ci gt1 = time.gmtime(None) 4287db96d56Sopenharmony_ci t0 = time.mktime(gt0) 4297db96d56Sopenharmony_ci t1 = time.mktime(gt1) 4307db96d56Sopenharmony_ci self.assertAlmostEqual(t1, t0, delta=0.2) 4317db96d56Sopenharmony_ci 4327db96d56Sopenharmony_ci def test_localtime_without_arg(self): 4337db96d56Sopenharmony_ci lt0 = time.localtime() 4347db96d56Sopenharmony_ci lt1 = time.localtime(None) 4357db96d56Sopenharmony_ci t0 = time.mktime(lt0) 4367db96d56Sopenharmony_ci t1 = time.mktime(lt1) 4377db96d56Sopenharmony_ci self.assertAlmostEqual(t1, t0, delta=0.2) 4387db96d56Sopenharmony_ci 4397db96d56Sopenharmony_ci def test_mktime(self): 4407db96d56Sopenharmony_ci # Issue #1726687 4417db96d56Sopenharmony_ci for t in (-2, -1, 0, 1): 4427db96d56Sopenharmony_ci try: 4437db96d56Sopenharmony_ci tt = time.localtime(t) 4447db96d56Sopenharmony_ci except (OverflowError, OSError): 4457db96d56Sopenharmony_ci pass 4467db96d56Sopenharmony_ci else: 4477db96d56Sopenharmony_ci self.assertEqual(time.mktime(tt), t) 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ci # Issue #13309: passing extreme values to mktime() or localtime() 4507db96d56Sopenharmony_ci # borks the glibc's internal timezone data. 4517db96d56Sopenharmony_ci @unittest.skipUnless(platform.libc_ver()[0] != 'glibc', 4527db96d56Sopenharmony_ci "disabled because of a bug in glibc. Issue #13309") 4537db96d56Sopenharmony_ci def test_mktime_error(self): 4547db96d56Sopenharmony_ci # It may not be possible to reliably make mktime return an error 4557db96d56Sopenharmony_ci # on all platforms. This will make sure that no other exception 4567db96d56Sopenharmony_ci # than OverflowError is raised for an extreme value. 4577db96d56Sopenharmony_ci tt = time.gmtime(self.t) 4587db96d56Sopenharmony_ci tzname = time.strftime('%Z', tt) 4597db96d56Sopenharmony_ci self.assertNotEqual(tzname, 'LMT') 4607db96d56Sopenharmony_ci try: 4617db96d56Sopenharmony_ci time.mktime((-1, 1, 1, 0, 0, 0, -1, -1, -1)) 4627db96d56Sopenharmony_ci except OverflowError: 4637db96d56Sopenharmony_ci pass 4647db96d56Sopenharmony_ci self.assertEqual(time.strftime('%Z', tt), tzname) 4657db96d56Sopenharmony_ci 4667db96d56Sopenharmony_ci def test_monotonic(self): 4677db96d56Sopenharmony_ci # monotonic() should not go backward 4687db96d56Sopenharmony_ci times = [time.monotonic() for n in range(100)] 4697db96d56Sopenharmony_ci t1 = times[0] 4707db96d56Sopenharmony_ci for t2 in times[1:]: 4717db96d56Sopenharmony_ci self.assertGreaterEqual(t2, t1, "times=%s" % times) 4727db96d56Sopenharmony_ci t1 = t2 4737db96d56Sopenharmony_ci 4747db96d56Sopenharmony_ci # monotonic() includes time elapsed during a sleep 4757db96d56Sopenharmony_ci t1 = time.monotonic() 4767db96d56Sopenharmony_ci time.sleep(0.5) 4777db96d56Sopenharmony_ci t2 = time.monotonic() 4787db96d56Sopenharmony_ci dt = t2 - t1 4797db96d56Sopenharmony_ci self.assertGreater(t2, t1) 4807db96d56Sopenharmony_ci # bpo-20101: tolerate a difference of 50 ms because of bad timer 4817db96d56Sopenharmony_ci # resolution on Windows 4827db96d56Sopenharmony_ci self.assertTrue(0.450 <= dt) 4837db96d56Sopenharmony_ci 4847db96d56Sopenharmony_ci # monotonic() is a monotonic but non adjustable clock 4857db96d56Sopenharmony_ci info = time.get_clock_info('monotonic') 4867db96d56Sopenharmony_ci self.assertTrue(info.monotonic) 4877db96d56Sopenharmony_ci self.assertFalse(info.adjustable) 4887db96d56Sopenharmony_ci 4897db96d56Sopenharmony_ci def test_perf_counter(self): 4907db96d56Sopenharmony_ci time.perf_counter() 4917db96d56Sopenharmony_ci 4927db96d56Sopenharmony_ci @unittest.skipIf( 4937db96d56Sopenharmony_ci support.is_wasi, "process_time not available on WASI" 4947db96d56Sopenharmony_ci ) 4957db96d56Sopenharmony_ci def test_process_time(self): 4967db96d56Sopenharmony_ci # process_time() should not include time spend during a sleep 4977db96d56Sopenharmony_ci start = time.process_time() 4987db96d56Sopenharmony_ci time.sleep(0.100) 4997db96d56Sopenharmony_ci stop = time.process_time() 5007db96d56Sopenharmony_ci # use 20 ms because process_time() has usually a resolution of 15 ms 5017db96d56Sopenharmony_ci # on Windows 5027db96d56Sopenharmony_ci self.assertLess(stop - start, 0.020) 5037db96d56Sopenharmony_ci 5047db96d56Sopenharmony_ci info = time.get_clock_info('process_time') 5057db96d56Sopenharmony_ci self.assertTrue(info.monotonic) 5067db96d56Sopenharmony_ci self.assertFalse(info.adjustable) 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ci def test_thread_time(self): 5097db96d56Sopenharmony_ci if not hasattr(time, 'thread_time'): 5107db96d56Sopenharmony_ci if sys.platform.startswith(('linux', 'win')): 5117db96d56Sopenharmony_ci self.fail("time.thread_time() should be available on %r" 5127db96d56Sopenharmony_ci % (sys.platform,)) 5137db96d56Sopenharmony_ci else: 5147db96d56Sopenharmony_ci self.skipTest("need time.thread_time") 5157db96d56Sopenharmony_ci 5167db96d56Sopenharmony_ci # thread_time() should not include time spend during a sleep 5177db96d56Sopenharmony_ci start = time.thread_time() 5187db96d56Sopenharmony_ci time.sleep(0.100) 5197db96d56Sopenharmony_ci stop = time.thread_time() 5207db96d56Sopenharmony_ci # use 20 ms because thread_time() has usually a resolution of 15 ms 5217db96d56Sopenharmony_ci # on Windows 5227db96d56Sopenharmony_ci self.assertLess(stop - start, 0.020) 5237db96d56Sopenharmony_ci 5247db96d56Sopenharmony_ci info = time.get_clock_info('thread_time') 5257db96d56Sopenharmony_ci self.assertTrue(info.monotonic) 5267db96d56Sopenharmony_ci self.assertFalse(info.adjustable) 5277db96d56Sopenharmony_ci 5287db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(time, 'clock_settime'), 5297db96d56Sopenharmony_ci 'need time.clock_settime') 5307db96d56Sopenharmony_ci def test_monotonic_settime(self): 5317db96d56Sopenharmony_ci t1 = time.monotonic() 5327db96d56Sopenharmony_ci realtime = time.clock_gettime(time.CLOCK_REALTIME) 5337db96d56Sopenharmony_ci # jump backward with an offset of 1 hour 5347db96d56Sopenharmony_ci try: 5357db96d56Sopenharmony_ci time.clock_settime(time.CLOCK_REALTIME, realtime - 3600) 5367db96d56Sopenharmony_ci except PermissionError as err: 5377db96d56Sopenharmony_ci self.skipTest(err) 5387db96d56Sopenharmony_ci t2 = time.monotonic() 5397db96d56Sopenharmony_ci time.clock_settime(time.CLOCK_REALTIME, realtime) 5407db96d56Sopenharmony_ci # monotonic must not be affected by system clock updates 5417db96d56Sopenharmony_ci self.assertGreaterEqual(t2, t1) 5427db96d56Sopenharmony_ci 5437db96d56Sopenharmony_ci def test_localtime_failure(self): 5447db96d56Sopenharmony_ci # Issue #13847: check for localtime() failure 5457db96d56Sopenharmony_ci invalid_time_t = None 5467db96d56Sopenharmony_ci for time_t in (-1, 2**30, 2**33, 2**60): 5477db96d56Sopenharmony_ci try: 5487db96d56Sopenharmony_ci time.localtime(time_t) 5497db96d56Sopenharmony_ci except OverflowError: 5507db96d56Sopenharmony_ci self.skipTest("need 64-bit time_t") 5517db96d56Sopenharmony_ci except OSError: 5527db96d56Sopenharmony_ci invalid_time_t = time_t 5537db96d56Sopenharmony_ci break 5547db96d56Sopenharmony_ci if invalid_time_t is None: 5557db96d56Sopenharmony_ci self.skipTest("unable to find an invalid time_t value") 5567db96d56Sopenharmony_ci 5577db96d56Sopenharmony_ci self.assertRaises(OSError, time.localtime, invalid_time_t) 5587db96d56Sopenharmony_ci self.assertRaises(OSError, time.ctime, invalid_time_t) 5597db96d56Sopenharmony_ci 5607db96d56Sopenharmony_ci # Issue #26669: check for localtime() failure 5617db96d56Sopenharmony_ci self.assertRaises(ValueError, time.localtime, float("nan")) 5627db96d56Sopenharmony_ci self.assertRaises(ValueError, time.ctime, float("nan")) 5637db96d56Sopenharmony_ci 5647db96d56Sopenharmony_ci def test_get_clock_info(self): 5657db96d56Sopenharmony_ci clocks = [ 5667db96d56Sopenharmony_ci 'monotonic', 5677db96d56Sopenharmony_ci 'perf_counter', 5687db96d56Sopenharmony_ci 'process_time', 5697db96d56Sopenharmony_ci 'time', 5707db96d56Sopenharmony_ci ] 5717db96d56Sopenharmony_ci if hasattr(time, 'thread_time'): 5727db96d56Sopenharmony_ci clocks.append('thread_time') 5737db96d56Sopenharmony_ci 5747db96d56Sopenharmony_ci for name in clocks: 5757db96d56Sopenharmony_ci with self.subTest(name=name): 5767db96d56Sopenharmony_ci info = time.get_clock_info(name) 5777db96d56Sopenharmony_ci 5787db96d56Sopenharmony_ci self.assertIsInstance(info.implementation, str) 5797db96d56Sopenharmony_ci self.assertNotEqual(info.implementation, '') 5807db96d56Sopenharmony_ci self.assertIsInstance(info.monotonic, bool) 5817db96d56Sopenharmony_ci self.assertIsInstance(info.resolution, float) 5827db96d56Sopenharmony_ci # 0.0 < resolution <= 1.0 5837db96d56Sopenharmony_ci self.assertGreater(info.resolution, 0.0) 5847db96d56Sopenharmony_ci self.assertLessEqual(info.resolution, 1.0) 5857db96d56Sopenharmony_ci self.assertIsInstance(info.adjustable, bool) 5867db96d56Sopenharmony_ci 5877db96d56Sopenharmony_ci self.assertRaises(ValueError, time.get_clock_info, 'xxx') 5887db96d56Sopenharmony_ci 5897db96d56Sopenharmony_ci 5907db96d56Sopenharmony_ciclass TestLocale(unittest.TestCase): 5917db96d56Sopenharmony_ci def setUp(self): 5927db96d56Sopenharmony_ci self.oldloc = locale.setlocale(locale.LC_ALL) 5937db96d56Sopenharmony_ci 5947db96d56Sopenharmony_ci def tearDown(self): 5957db96d56Sopenharmony_ci locale.setlocale(locale.LC_ALL, self.oldloc) 5967db96d56Sopenharmony_ci 5977db96d56Sopenharmony_ci def test_bug_3061(self): 5987db96d56Sopenharmony_ci try: 5997db96d56Sopenharmony_ci tmp = locale.setlocale(locale.LC_ALL, "fr_FR") 6007db96d56Sopenharmony_ci except locale.Error: 6017db96d56Sopenharmony_ci self.skipTest('could not set locale.LC_ALL to fr_FR') 6027db96d56Sopenharmony_ci # This should not cause an exception 6037db96d56Sopenharmony_ci time.strftime("%B", (2009,2,1,0,0,0,0,0,0)) 6047db96d56Sopenharmony_ci 6057db96d56Sopenharmony_ci 6067db96d56Sopenharmony_ciclass _TestAsctimeYear: 6077db96d56Sopenharmony_ci _format = '%d' 6087db96d56Sopenharmony_ci 6097db96d56Sopenharmony_ci def yearstr(self, y): 6107db96d56Sopenharmony_ci return time.asctime((y,) + (0,) * 8).split()[-1] 6117db96d56Sopenharmony_ci 6127db96d56Sopenharmony_ci def test_large_year(self): 6137db96d56Sopenharmony_ci # Check that it doesn't crash for year > 9999 6147db96d56Sopenharmony_ci self.assertEqual(self.yearstr(12345), '12345') 6157db96d56Sopenharmony_ci self.assertEqual(self.yearstr(123456789), '123456789') 6167db96d56Sopenharmony_ci 6177db96d56Sopenharmony_ciclass _TestStrftimeYear: 6187db96d56Sopenharmony_ci 6197db96d56Sopenharmony_ci # Issue 13305: For years < 1000, the value is not always 6207db96d56Sopenharmony_ci # padded to 4 digits across platforms. The C standard 6217db96d56Sopenharmony_ci # assumes year >= 1900, so it does not specify the number 6227db96d56Sopenharmony_ci # of digits. 6237db96d56Sopenharmony_ci 6247db96d56Sopenharmony_ci if time.strftime('%Y', (1,) + (0,) * 8) == '0001': 6257db96d56Sopenharmony_ci _format = '%04d' 6267db96d56Sopenharmony_ci else: 6277db96d56Sopenharmony_ci _format = '%d' 6287db96d56Sopenharmony_ci 6297db96d56Sopenharmony_ci def yearstr(self, y): 6307db96d56Sopenharmony_ci return time.strftime('%Y', (y,) + (0,) * 8) 6317db96d56Sopenharmony_ci 6327db96d56Sopenharmony_ci @unittest.skipUnless( 6337db96d56Sopenharmony_ci support.has_strftime_extensions, "requires strftime extension" 6347db96d56Sopenharmony_ci ) 6357db96d56Sopenharmony_ci def test_4dyear(self): 6367db96d56Sopenharmony_ci # Check that we can return the zero padded value. 6377db96d56Sopenharmony_ci if self._format == '%04d': 6387db96d56Sopenharmony_ci self.test_year('%04d') 6397db96d56Sopenharmony_ci else: 6407db96d56Sopenharmony_ci def year4d(y): 6417db96d56Sopenharmony_ci return time.strftime('%4Y', (y,) + (0,) * 8) 6427db96d56Sopenharmony_ci self.test_year('%04d', func=year4d) 6437db96d56Sopenharmony_ci 6447db96d56Sopenharmony_ci def skip_if_not_supported(y): 6457db96d56Sopenharmony_ci msg = "strftime() is limited to [1; 9999] with Visual Studio" 6467db96d56Sopenharmony_ci # Check that it doesn't crash for year > 9999 6477db96d56Sopenharmony_ci try: 6487db96d56Sopenharmony_ci time.strftime('%Y', (y,) + (0,) * 8) 6497db96d56Sopenharmony_ci except ValueError: 6507db96d56Sopenharmony_ci cond = False 6517db96d56Sopenharmony_ci else: 6527db96d56Sopenharmony_ci cond = True 6537db96d56Sopenharmony_ci return unittest.skipUnless(cond, msg) 6547db96d56Sopenharmony_ci 6557db96d56Sopenharmony_ci @skip_if_not_supported(10000) 6567db96d56Sopenharmony_ci def test_large_year(self): 6577db96d56Sopenharmony_ci return super().test_large_year() 6587db96d56Sopenharmony_ci 6597db96d56Sopenharmony_ci @skip_if_not_supported(0) 6607db96d56Sopenharmony_ci def test_negative(self): 6617db96d56Sopenharmony_ci return super().test_negative() 6627db96d56Sopenharmony_ci 6637db96d56Sopenharmony_ci del skip_if_not_supported 6647db96d56Sopenharmony_ci 6657db96d56Sopenharmony_ci 6667db96d56Sopenharmony_ciclass _Test4dYear: 6677db96d56Sopenharmony_ci _format = '%d' 6687db96d56Sopenharmony_ci 6697db96d56Sopenharmony_ci def test_year(self, fmt=None, func=None): 6707db96d56Sopenharmony_ci fmt = fmt or self._format 6717db96d56Sopenharmony_ci func = func or self.yearstr 6727db96d56Sopenharmony_ci self.assertEqual(func(1), fmt % 1) 6737db96d56Sopenharmony_ci self.assertEqual(func(68), fmt % 68) 6747db96d56Sopenharmony_ci self.assertEqual(func(69), fmt % 69) 6757db96d56Sopenharmony_ci self.assertEqual(func(99), fmt % 99) 6767db96d56Sopenharmony_ci self.assertEqual(func(999), fmt % 999) 6777db96d56Sopenharmony_ci self.assertEqual(func(9999), fmt % 9999) 6787db96d56Sopenharmony_ci 6797db96d56Sopenharmony_ci def test_large_year(self): 6807db96d56Sopenharmony_ci self.assertEqual(self.yearstr(12345).lstrip('+'), '12345') 6817db96d56Sopenharmony_ci self.assertEqual(self.yearstr(123456789).lstrip('+'), '123456789') 6827db96d56Sopenharmony_ci self.assertEqual(self.yearstr(TIME_MAXYEAR).lstrip('+'), str(TIME_MAXYEAR)) 6837db96d56Sopenharmony_ci self.assertRaises(OverflowError, self.yearstr, TIME_MAXYEAR + 1) 6847db96d56Sopenharmony_ci 6857db96d56Sopenharmony_ci def test_negative(self): 6867db96d56Sopenharmony_ci self.assertEqual(self.yearstr(-1), self._format % -1) 6877db96d56Sopenharmony_ci self.assertEqual(self.yearstr(-1234), '-1234') 6887db96d56Sopenharmony_ci self.assertEqual(self.yearstr(-123456), '-123456') 6897db96d56Sopenharmony_ci self.assertEqual(self.yearstr(-123456789), str(-123456789)) 6907db96d56Sopenharmony_ci self.assertEqual(self.yearstr(-1234567890), str(-1234567890)) 6917db96d56Sopenharmony_ci self.assertEqual(self.yearstr(TIME_MINYEAR), str(TIME_MINYEAR)) 6927db96d56Sopenharmony_ci # Modules/timemodule.c checks for underflow 6937db96d56Sopenharmony_ci self.assertRaises(OverflowError, self.yearstr, TIME_MINYEAR - 1) 6947db96d56Sopenharmony_ci with self.assertRaises(OverflowError): 6957db96d56Sopenharmony_ci self.yearstr(-TIME_MAXYEAR - 1) 6967db96d56Sopenharmony_ci 6977db96d56Sopenharmony_ci 6987db96d56Sopenharmony_ciclass TestAsctime4dyear(_TestAsctimeYear, _Test4dYear, unittest.TestCase): 6997db96d56Sopenharmony_ci pass 7007db96d56Sopenharmony_ci 7017db96d56Sopenharmony_ciclass TestStrftime4dyear(_TestStrftimeYear, _Test4dYear, unittest.TestCase): 7027db96d56Sopenharmony_ci pass 7037db96d56Sopenharmony_ci 7047db96d56Sopenharmony_ci 7057db96d56Sopenharmony_ciclass TestPytime(unittest.TestCase): 7067db96d56Sopenharmony_ci @skip_if_buggy_ucrt_strfptime 7077db96d56Sopenharmony_ci @unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support") 7087db96d56Sopenharmony_ci @unittest.skipIf( 7097db96d56Sopenharmony_ci support.is_emscripten, "musl libc issue on Emscripten, bpo-46390" 7107db96d56Sopenharmony_ci ) 7117db96d56Sopenharmony_ci def test_localtime_timezone(self): 7127db96d56Sopenharmony_ci 7137db96d56Sopenharmony_ci # Get the localtime and examine it for the offset and zone. 7147db96d56Sopenharmony_ci lt = time.localtime() 7157db96d56Sopenharmony_ci self.assertTrue(hasattr(lt, "tm_gmtoff")) 7167db96d56Sopenharmony_ci self.assertTrue(hasattr(lt, "tm_zone")) 7177db96d56Sopenharmony_ci 7187db96d56Sopenharmony_ci # See if the offset and zone are similar to the module 7197db96d56Sopenharmony_ci # attributes. 7207db96d56Sopenharmony_ci if lt.tm_gmtoff is None: 7217db96d56Sopenharmony_ci self.assertTrue(not hasattr(time, "timezone")) 7227db96d56Sopenharmony_ci else: 7237db96d56Sopenharmony_ci self.assertEqual(lt.tm_gmtoff, -[time.timezone, time.altzone][lt.tm_isdst]) 7247db96d56Sopenharmony_ci if lt.tm_zone is None: 7257db96d56Sopenharmony_ci self.assertTrue(not hasattr(time, "tzname")) 7267db96d56Sopenharmony_ci else: 7277db96d56Sopenharmony_ci self.assertEqual(lt.tm_zone, time.tzname[lt.tm_isdst]) 7287db96d56Sopenharmony_ci 7297db96d56Sopenharmony_ci # Try and make UNIX times from the localtime and a 9-tuple 7307db96d56Sopenharmony_ci # created from the localtime. Test to see that the times are 7317db96d56Sopenharmony_ci # the same. 7327db96d56Sopenharmony_ci t = time.mktime(lt); t9 = time.mktime(lt[:9]) 7337db96d56Sopenharmony_ci self.assertEqual(t, t9) 7347db96d56Sopenharmony_ci 7357db96d56Sopenharmony_ci # Make localtimes from the UNIX times and compare them to 7367db96d56Sopenharmony_ci # the original localtime, thus making a round trip. 7377db96d56Sopenharmony_ci new_lt = time.localtime(t); new_lt9 = time.localtime(t9) 7387db96d56Sopenharmony_ci self.assertEqual(new_lt, lt) 7397db96d56Sopenharmony_ci self.assertEqual(new_lt.tm_gmtoff, lt.tm_gmtoff) 7407db96d56Sopenharmony_ci self.assertEqual(new_lt.tm_zone, lt.tm_zone) 7417db96d56Sopenharmony_ci self.assertEqual(new_lt9, lt) 7427db96d56Sopenharmony_ci self.assertEqual(new_lt.tm_gmtoff, lt.tm_gmtoff) 7437db96d56Sopenharmony_ci self.assertEqual(new_lt9.tm_zone, lt.tm_zone) 7447db96d56Sopenharmony_ci 7457db96d56Sopenharmony_ci @unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support") 7467db96d56Sopenharmony_ci def test_strptime_timezone(self): 7477db96d56Sopenharmony_ci t = time.strptime("UTC", "%Z") 7487db96d56Sopenharmony_ci self.assertEqual(t.tm_zone, 'UTC') 7497db96d56Sopenharmony_ci t = time.strptime("+0500", "%z") 7507db96d56Sopenharmony_ci self.assertEqual(t.tm_gmtoff, 5 * 3600) 7517db96d56Sopenharmony_ci 7527db96d56Sopenharmony_ci @unittest.skipUnless(time._STRUCT_TM_ITEMS == 11, "needs tm_zone support") 7537db96d56Sopenharmony_ci def test_short_times(self): 7547db96d56Sopenharmony_ci 7557db96d56Sopenharmony_ci import pickle 7567db96d56Sopenharmony_ci 7577db96d56Sopenharmony_ci # Load a short time structure using pickle. 7587db96d56Sopenharmony_ci st = b"ctime\nstruct_time\np0\n((I2007\nI8\nI11\nI1\nI24\nI49\nI5\nI223\nI1\ntp1\n(dp2\ntp3\nRp4\n." 7597db96d56Sopenharmony_ci lt = pickle.loads(st) 7607db96d56Sopenharmony_ci self.assertIs(lt.tm_gmtoff, None) 7617db96d56Sopenharmony_ci self.assertIs(lt.tm_zone, None) 7627db96d56Sopenharmony_ci 7637db96d56Sopenharmony_ci 7647db96d56Sopenharmony_ci@unittest.skipIf(_testcapi is None, 'need the _testcapi module') 7657db96d56Sopenharmony_ciclass CPyTimeTestCase: 7667db96d56Sopenharmony_ci """ 7677db96d56Sopenharmony_ci Base class to test the C _PyTime_t API. 7687db96d56Sopenharmony_ci """ 7697db96d56Sopenharmony_ci OVERFLOW_SECONDS = None 7707db96d56Sopenharmony_ci 7717db96d56Sopenharmony_ci def setUp(self): 7727db96d56Sopenharmony_ci from _testcapi import SIZEOF_TIME_T 7737db96d56Sopenharmony_ci bits = SIZEOF_TIME_T * 8 - 1 7747db96d56Sopenharmony_ci self.time_t_min = -2 ** bits 7757db96d56Sopenharmony_ci self.time_t_max = 2 ** bits - 1 7767db96d56Sopenharmony_ci 7777db96d56Sopenharmony_ci def time_t_filter(self, seconds): 7787db96d56Sopenharmony_ci return (self.time_t_min <= seconds <= self.time_t_max) 7797db96d56Sopenharmony_ci 7807db96d56Sopenharmony_ci def _rounding_values(self, use_float): 7817db96d56Sopenharmony_ci "Build timestamps used to test rounding." 7827db96d56Sopenharmony_ci 7837db96d56Sopenharmony_ci units = [1, US_TO_NS, MS_TO_NS, SEC_TO_NS] 7847db96d56Sopenharmony_ci if use_float: 7857db96d56Sopenharmony_ci # picoseconds are only tested to pytime_converter accepting floats 7867db96d56Sopenharmony_ci units.append(1e-3) 7877db96d56Sopenharmony_ci 7887db96d56Sopenharmony_ci values = ( 7897db96d56Sopenharmony_ci # small values 7907db96d56Sopenharmony_ci 1, 2, 5, 7, 123, 456, 1234, 7917db96d56Sopenharmony_ci # 10^k - 1 7927db96d56Sopenharmony_ci 9, 7937db96d56Sopenharmony_ci 99, 7947db96d56Sopenharmony_ci 999, 7957db96d56Sopenharmony_ci 9999, 7967db96d56Sopenharmony_ci 99999, 7977db96d56Sopenharmony_ci 999999, 7987db96d56Sopenharmony_ci # test half even rounding near 0.5, 1.5, 2.5, 3.5, 4.5 7997db96d56Sopenharmony_ci 499, 500, 501, 8007db96d56Sopenharmony_ci 1499, 1500, 1501, 8017db96d56Sopenharmony_ci 2500, 8027db96d56Sopenharmony_ci 3500, 8037db96d56Sopenharmony_ci 4500, 8047db96d56Sopenharmony_ci ) 8057db96d56Sopenharmony_ci 8067db96d56Sopenharmony_ci ns_timestamps = [0] 8077db96d56Sopenharmony_ci for unit in units: 8087db96d56Sopenharmony_ci for value in values: 8097db96d56Sopenharmony_ci ns = value * unit 8107db96d56Sopenharmony_ci ns_timestamps.extend((-ns, ns)) 8117db96d56Sopenharmony_ci for pow2 in (0, 5, 10, 15, 22, 23, 24, 30, 33): 8127db96d56Sopenharmony_ci ns = (2 ** pow2) * SEC_TO_NS 8137db96d56Sopenharmony_ci ns_timestamps.extend(( 8147db96d56Sopenharmony_ci -ns-1, -ns, -ns+1, 8157db96d56Sopenharmony_ci ns-1, ns, ns+1 8167db96d56Sopenharmony_ci )) 8177db96d56Sopenharmony_ci for seconds in (_testcapi.INT_MIN, _testcapi.INT_MAX): 8187db96d56Sopenharmony_ci ns_timestamps.append(seconds * SEC_TO_NS) 8197db96d56Sopenharmony_ci if use_float: 8207db96d56Sopenharmony_ci # numbers with an exact representation in IEEE 754 (base 2) 8217db96d56Sopenharmony_ci for pow2 in (3, 7, 10, 15): 8227db96d56Sopenharmony_ci ns = 2.0 ** (-pow2) 8237db96d56Sopenharmony_ci ns_timestamps.extend((-ns, ns)) 8247db96d56Sopenharmony_ci 8257db96d56Sopenharmony_ci # seconds close to _PyTime_t type limit 8267db96d56Sopenharmony_ci ns = (2 ** 63 // SEC_TO_NS) * SEC_TO_NS 8277db96d56Sopenharmony_ci ns_timestamps.extend((-ns, ns)) 8287db96d56Sopenharmony_ci 8297db96d56Sopenharmony_ci return ns_timestamps 8307db96d56Sopenharmony_ci 8317db96d56Sopenharmony_ci def _check_rounding(self, pytime_converter, expected_func, 8327db96d56Sopenharmony_ci use_float, unit_to_sec, value_filter=None): 8337db96d56Sopenharmony_ci 8347db96d56Sopenharmony_ci def convert_values(ns_timestamps): 8357db96d56Sopenharmony_ci if use_float: 8367db96d56Sopenharmony_ci unit_to_ns = SEC_TO_NS / float(unit_to_sec) 8377db96d56Sopenharmony_ci values = [ns / unit_to_ns for ns in ns_timestamps] 8387db96d56Sopenharmony_ci else: 8397db96d56Sopenharmony_ci unit_to_ns = SEC_TO_NS // unit_to_sec 8407db96d56Sopenharmony_ci values = [ns // unit_to_ns for ns in ns_timestamps] 8417db96d56Sopenharmony_ci 8427db96d56Sopenharmony_ci if value_filter: 8437db96d56Sopenharmony_ci values = filter(value_filter, values) 8447db96d56Sopenharmony_ci 8457db96d56Sopenharmony_ci # remove duplicates and sort 8467db96d56Sopenharmony_ci return sorted(set(values)) 8477db96d56Sopenharmony_ci 8487db96d56Sopenharmony_ci # test rounding 8497db96d56Sopenharmony_ci ns_timestamps = self._rounding_values(use_float) 8507db96d56Sopenharmony_ci valid_values = convert_values(ns_timestamps) 8517db96d56Sopenharmony_ci for time_rnd, decimal_rnd in ROUNDING_MODES : 8527db96d56Sopenharmony_ci with decimal.localcontext() as context: 8537db96d56Sopenharmony_ci context.rounding = decimal_rnd 8547db96d56Sopenharmony_ci 8557db96d56Sopenharmony_ci for value in valid_values: 8567db96d56Sopenharmony_ci debug_info = {'value': value, 'rounding': decimal_rnd} 8577db96d56Sopenharmony_ci try: 8587db96d56Sopenharmony_ci result = pytime_converter(value, time_rnd) 8597db96d56Sopenharmony_ci expected = expected_func(value) 8607db96d56Sopenharmony_ci except Exception: 8617db96d56Sopenharmony_ci self.fail("Error on timestamp conversion: %s" % debug_info) 8627db96d56Sopenharmony_ci self.assertEqual(result, 8637db96d56Sopenharmony_ci expected, 8647db96d56Sopenharmony_ci debug_info) 8657db96d56Sopenharmony_ci 8667db96d56Sopenharmony_ci # test overflow 8677db96d56Sopenharmony_ci ns = self.OVERFLOW_SECONDS * SEC_TO_NS 8687db96d56Sopenharmony_ci ns_timestamps = (-ns, ns) 8697db96d56Sopenharmony_ci overflow_values = convert_values(ns_timestamps) 8707db96d56Sopenharmony_ci for time_rnd, _ in ROUNDING_MODES : 8717db96d56Sopenharmony_ci for value in overflow_values: 8727db96d56Sopenharmony_ci debug_info = {'value': value, 'rounding': time_rnd} 8737db96d56Sopenharmony_ci with self.assertRaises(OverflowError, msg=debug_info): 8747db96d56Sopenharmony_ci pytime_converter(value, time_rnd) 8757db96d56Sopenharmony_ci 8767db96d56Sopenharmony_ci def check_int_rounding(self, pytime_converter, expected_func, 8777db96d56Sopenharmony_ci unit_to_sec=1, value_filter=None): 8787db96d56Sopenharmony_ci self._check_rounding(pytime_converter, expected_func, 8797db96d56Sopenharmony_ci False, unit_to_sec, value_filter) 8807db96d56Sopenharmony_ci 8817db96d56Sopenharmony_ci def check_float_rounding(self, pytime_converter, expected_func, 8827db96d56Sopenharmony_ci unit_to_sec=1, value_filter=None): 8837db96d56Sopenharmony_ci self._check_rounding(pytime_converter, expected_func, 8847db96d56Sopenharmony_ci True, unit_to_sec, value_filter) 8857db96d56Sopenharmony_ci 8867db96d56Sopenharmony_ci def decimal_round(self, x): 8877db96d56Sopenharmony_ci d = decimal.Decimal(x) 8887db96d56Sopenharmony_ci d = d.quantize(1) 8897db96d56Sopenharmony_ci return int(d) 8907db96d56Sopenharmony_ci 8917db96d56Sopenharmony_ci 8927db96d56Sopenharmony_ciclass TestCPyTime(CPyTimeTestCase, unittest.TestCase): 8937db96d56Sopenharmony_ci """ 8947db96d56Sopenharmony_ci Test the C _PyTime_t API. 8957db96d56Sopenharmony_ci """ 8967db96d56Sopenharmony_ci # _PyTime_t is a 64-bit signed integer 8977db96d56Sopenharmony_ci OVERFLOW_SECONDS = math.ceil((2**63 + 1) / SEC_TO_NS) 8987db96d56Sopenharmony_ci 8997db96d56Sopenharmony_ci def test_FromSeconds(self): 9007db96d56Sopenharmony_ci from _testcapi import PyTime_FromSeconds 9017db96d56Sopenharmony_ci 9027db96d56Sopenharmony_ci # PyTime_FromSeconds() expects a C int, reject values out of range 9037db96d56Sopenharmony_ci def c_int_filter(secs): 9047db96d56Sopenharmony_ci return (_testcapi.INT_MIN <= secs <= _testcapi.INT_MAX) 9057db96d56Sopenharmony_ci 9067db96d56Sopenharmony_ci self.check_int_rounding(lambda secs, rnd: PyTime_FromSeconds(secs), 9077db96d56Sopenharmony_ci lambda secs: secs * SEC_TO_NS, 9087db96d56Sopenharmony_ci value_filter=c_int_filter) 9097db96d56Sopenharmony_ci 9107db96d56Sopenharmony_ci # test nan 9117db96d56Sopenharmony_ci for time_rnd, _ in ROUNDING_MODES: 9127db96d56Sopenharmony_ci with self.assertRaises(TypeError): 9137db96d56Sopenharmony_ci PyTime_FromSeconds(float('nan')) 9147db96d56Sopenharmony_ci 9157db96d56Sopenharmony_ci def test_FromSecondsObject(self): 9167db96d56Sopenharmony_ci from _testcapi import PyTime_FromSecondsObject 9177db96d56Sopenharmony_ci 9187db96d56Sopenharmony_ci self.check_int_rounding( 9197db96d56Sopenharmony_ci PyTime_FromSecondsObject, 9207db96d56Sopenharmony_ci lambda secs: secs * SEC_TO_NS) 9217db96d56Sopenharmony_ci 9227db96d56Sopenharmony_ci self.check_float_rounding( 9237db96d56Sopenharmony_ci PyTime_FromSecondsObject, 9247db96d56Sopenharmony_ci lambda ns: self.decimal_round(ns * SEC_TO_NS)) 9257db96d56Sopenharmony_ci 9267db96d56Sopenharmony_ci # test nan 9277db96d56Sopenharmony_ci for time_rnd, _ in ROUNDING_MODES: 9287db96d56Sopenharmony_ci with self.assertRaises(ValueError): 9297db96d56Sopenharmony_ci PyTime_FromSecondsObject(float('nan'), time_rnd) 9307db96d56Sopenharmony_ci 9317db96d56Sopenharmony_ci def test_AsSecondsDouble(self): 9327db96d56Sopenharmony_ci from _testcapi import PyTime_AsSecondsDouble 9337db96d56Sopenharmony_ci 9347db96d56Sopenharmony_ci def float_converter(ns): 9357db96d56Sopenharmony_ci if abs(ns) % SEC_TO_NS == 0: 9367db96d56Sopenharmony_ci return float(ns // SEC_TO_NS) 9377db96d56Sopenharmony_ci else: 9387db96d56Sopenharmony_ci return float(ns) / SEC_TO_NS 9397db96d56Sopenharmony_ci 9407db96d56Sopenharmony_ci self.check_int_rounding(lambda ns, rnd: PyTime_AsSecondsDouble(ns), 9417db96d56Sopenharmony_ci float_converter, 9427db96d56Sopenharmony_ci NS_TO_SEC) 9437db96d56Sopenharmony_ci 9447db96d56Sopenharmony_ci # test nan 9457db96d56Sopenharmony_ci for time_rnd, _ in ROUNDING_MODES: 9467db96d56Sopenharmony_ci with self.assertRaises(TypeError): 9477db96d56Sopenharmony_ci PyTime_AsSecondsDouble(float('nan')) 9487db96d56Sopenharmony_ci 9497db96d56Sopenharmony_ci def create_decimal_converter(self, denominator): 9507db96d56Sopenharmony_ci denom = decimal.Decimal(denominator) 9517db96d56Sopenharmony_ci 9527db96d56Sopenharmony_ci def converter(value): 9537db96d56Sopenharmony_ci d = decimal.Decimal(value) / denom 9547db96d56Sopenharmony_ci return self.decimal_round(d) 9557db96d56Sopenharmony_ci 9567db96d56Sopenharmony_ci return converter 9577db96d56Sopenharmony_ci 9587db96d56Sopenharmony_ci def test_AsTimeval(self): 9597db96d56Sopenharmony_ci from _testcapi import PyTime_AsTimeval 9607db96d56Sopenharmony_ci 9617db96d56Sopenharmony_ci us_converter = self.create_decimal_converter(US_TO_NS) 9627db96d56Sopenharmony_ci 9637db96d56Sopenharmony_ci def timeval_converter(ns): 9647db96d56Sopenharmony_ci us = us_converter(ns) 9657db96d56Sopenharmony_ci return divmod(us, SEC_TO_US) 9667db96d56Sopenharmony_ci 9677db96d56Sopenharmony_ci if sys.platform == 'win32': 9687db96d56Sopenharmony_ci from _testcapi import LONG_MIN, LONG_MAX 9697db96d56Sopenharmony_ci 9707db96d56Sopenharmony_ci # On Windows, timeval.tv_sec type is a C long 9717db96d56Sopenharmony_ci def seconds_filter(secs): 9727db96d56Sopenharmony_ci return LONG_MIN <= secs <= LONG_MAX 9737db96d56Sopenharmony_ci else: 9747db96d56Sopenharmony_ci seconds_filter = self.time_t_filter 9757db96d56Sopenharmony_ci 9767db96d56Sopenharmony_ci self.check_int_rounding(PyTime_AsTimeval, 9777db96d56Sopenharmony_ci timeval_converter, 9787db96d56Sopenharmony_ci NS_TO_SEC, 9797db96d56Sopenharmony_ci value_filter=seconds_filter) 9807db96d56Sopenharmony_ci 9817db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(_testcapi, 'PyTime_AsTimespec'), 9827db96d56Sopenharmony_ci 'need _testcapi.PyTime_AsTimespec') 9837db96d56Sopenharmony_ci def test_AsTimespec(self): 9847db96d56Sopenharmony_ci from _testcapi import PyTime_AsTimespec 9857db96d56Sopenharmony_ci 9867db96d56Sopenharmony_ci def timespec_converter(ns): 9877db96d56Sopenharmony_ci return divmod(ns, SEC_TO_NS) 9887db96d56Sopenharmony_ci 9897db96d56Sopenharmony_ci self.check_int_rounding(lambda ns, rnd: PyTime_AsTimespec(ns), 9907db96d56Sopenharmony_ci timespec_converter, 9917db96d56Sopenharmony_ci NS_TO_SEC, 9927db96d56Sopenharmony_ci value_filter=self.time_t_filter) 9937db96d56Sopenharmony_ci 9947db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(_testcapi, 'PyTime_AsTimeval_clamp'), 9957db96d56Sopenharmony_ci 'need _testcapi.PyTime_AsTimeval_clamp') 9967db96d56Sopenharmony_ci def test_AsTimeval_clamp(self): 9977db96d56Sopenharmony_ci from _testcapi import PyTime_AsTimeval_clamp 9987db96d56Sopenharmony_ci 9997db96d56Sopenharmony_ci if sys.platform == 'win32': 10007db96d56Sopenharmony_ci from _testcapi import LONG_MIN, LONG_MAX 10017db96d56Sopenharmony_ci tv_sec_max = LONG_MAX 10027db96d56Sopenharmony_ci tv_sec_min = LONG_MIN 10037db96d56Sopenharmony_ci else: 10047db96d56Sopenharmony_ci tv_sec_max = self.time_t_max 10057db96d56Sopenharmony_ci tv_sec_min = self.time_t_min 10067db96d56Sopenharmony_ci 10077db96d56Sopenharmony_ci for t in (_PyTime_MIN, _PyTime_MAX): 10087db96d56Sopenharmony_ci ts = PyTime_AsTimeval_clamp(t, _PyTime.ROUND_CEILING) 10097db96d56Sopenharmony_ci with decimal.localcontext() as context: 10107db96d56Sopenharmony_ci context.rounding = decimal.ROUND_CEILING 10117db96d56Sopenharmony_ci us = self.decimal_round(decimal.Decimal(t) / US_TO_NS) 10127db96d56Sopenharmony_ci tv_sec, tv_usec = divmod(us, SEC_TO_US) 10137db96d56Sopenharmony_ci if tv_sec_max < tv_sec: 10147db96d56Sopenharmony_ci tv_sec = tv_sec_max 10157db96d56Sopenharmony_ci tv_usec = 0 10167db96d56Sopenharmony_ci elif tv_sec < tv_sec_min: 10177db96d56Sopenharmony_ci tv_sec = tv_sec_min 10187db96d56Sopenharmony_ci tv_usec = 0 10197db96d56Sopenharmony_ci self.assertEqual(ts, (tv_sec, tv_usec)) 10207db96d56Sopenharmony_ci 10217db96d56Sopenharmony_ci @unittest.skipUnless(hasattr(_testcapi, 'PyTime_AsTimespec_clamp'), 10227db96d56Sopenharmony_ci 'need _testcapi.PyTime_AsTimespec_clamp') 10237db96d56Sopenharmony_ci def test_AsTimespec_clamp(self): 10247db96d56Sopenharmony_ci from _testcapi import PyTime_AsTimespec_clamp 10257db96d56Sopenharmony_ci 10267db96d56Sopenharmony_ci for t in (_PyTime_MIN, _PyTime_MAX): 10277db96d56Sopenharmony_ci ts = PyTime_AsTimespec_clamp(t) 10287db96d56Sopenharmony_ci tv_sec, tv_nsec = divmod(t, NS_TO_SEC) 10297db96d56Sopenharmony_ci if self.time_t_max < tv_sec: 10307db96d56Sopenharmony_ci tv_sec = self.time_t_max 10317db96d56Sopenharmony_ci tv_nsec = 0 10327db96d56Sopenharmony_ci elif tv_sec < self.time_t_min: 10337db96d56Sopenharmony_ci tv_sec = self.time_t_min 10347db96d56Sopenharmony_ci tv_nsec = 0 10357db96d56Sopenharmony_ci self.assertEqual(ts, (tv_sec, tv_nsec)) 10367db96d56Sopenharmony_ci 10377db96d56Sopenharmony_ci def test_AsMilliseconds(self): 10387db96d56Sopenharmony_ci from _testcapi import PyTime_AsMilliseconds 10397db96d56Sopenharmony_ci 10407db96d56Sopenharmony_ci self.check_int_rounding(PyTime_AsMilliseconds, 10417db96d56Sopenharmony_ci self.create_decimal_converter(MS_TO_NS), 10427db96d56Sopenharmony_ci NS_TO_SEC) 10437db96d56Sopenharmony_ci 10447db96d56Sopenharmony_ci def test_AsMicroseconds(self): 10457db96d56Sopenharmony_ci from _testcapi import PyTime_AsMicroseconds 10467db96d56Sopenharmony_ci 10477db96d56Sopenharmony_ci self.check_int_rounding(PyTime_AsMicroseconds, 10487db96d56Sopenharmony_ci self.create_decimal_converter(US_TO_NS), 10497db96d56Sopenharmony_ci NS_TO_SEC) 10507db96d56Sopenharmony_ci 10517db96d56Sopenharmony_ci 10527db96d56Sopenharmony_ciclass TestOldPyTime(CPyTimeTestCase, unittest.TestCase): 10537db96d56Sopenharmony_ci """ 10547db96d56Sopenharmony_ci Test the old C _PyTime_t API: _PyTime_ObjectToXXX() functions. 10557db96d56Sopenharmony_ci """ 10567db96d56Sopenharmony_ci 10577db96d56Sopenharmony_ci # time_t is a 32-bit or 64-bit signed integer 10587db96d56Sopenharmony_ci OVERFLOW_SECONDS = 2 ** 64 10597db96d56Sopenharmony_ci 10607db96d56Sopenharmony_ci def test_object_to_time_t(self): 10617db96d56Sopenharmony_ci from _testcapi import pytime_object_to_time_t 10627db96d56Sopenharmony_ci 10637db96d56Sopenharmony_ci self.check_int_rounding(pytime_object_to_time_t, 10647db96d56Sopenharmony_ci lambda secs: secs, 10657db96d56Sopenharmony_ci value_filter=self.time_t_filter) 10667db96d56Sopenharmony_ci 10677db96d56Sopenharmony_ci self.check_float_rounding(pytime_object_to_time_t, 10687db96d56Sopenharmony_ci self.decimal_round, 10697db96d56Sopenharmony_ci value_filter=self.time_t_filter) 10707db96d56Sopenharmony_ci 10717db96d56Sopenharmony_ci def create_converter(self, sec_to_unit): 10727db96d56Sopenharmony_ci def converter(secs): 10737db96d56Sopenharmony_ci floatpart, intpart = math.modf(secs) 10747db96d56Sopenharmony_ci intpart = int(intpart) 10757db96d56Sopenharmony_ci floatpart *= sec_to_unit 10767db96d56Sopenharmony_ci floatpart = self.decimal_round(floatpart) 10777db96d56Sopenharmony_ci if floatpart < 0: 10787db96d56Sopenharmony_ci floatpart += sec_to_unit 10797db96d56Sopenharmony_ci intpart -= 1 10807db96d56Sopenharmony_ci elif floatpart >= sec_to_unit: 10817db96d56Sopenharmony_ci floatpart -= sec_to_unit 10827db96d56Sopenharmony_ci intpart += 1 10837db96d56Sopenharmony_ci return (intpart, floatpart) 10847db96d56Sopenharmony_ci return converter 10857db96d56Sopenharmony_ci 10867db96d56Sopenharmony_ci def test_object_to_timeval(self): 10877db96d56Sopenharmony_ci from _testcapi import pytime_object_to_timeval 10887db96d56Sopenharmony_ci 10897db96d56Sopenharmony_ci self.check_int_rounding(pytime_object_to_timeval, 10907db96d56Sopenharmony_ci lambda secs: (secs, 0), 10917db96d56Sopenharmony_ci value_filter=self.time_t_filter) 10927db96d56Sopenharmony_ci 10937db96d56Sopenharmony_ci self.check_float_rounding(pytime_object_to_timeval, 10947db96d56Sopenharmony_ci self.create_converter(SEC_TO_US), 10957db96d56Sopenharmony_ci value_filter=self.time_t_filter) 10967db96d56Sopenharmony_ci 10977db96d56Sopenharmony_ci # test nan 10987db96d56Sopenharmony_ci for time_rnd, _ in ROUNDING_MODES: 10997db96d56Sopenharmony_ci with self.assertRaises(ValueError): 11007db96d56Sopenharmony_ci pytime_object_to_timeval(float('nan'), time_rnd) 11017db96d56Sopenharmony_ci 11027db96d56Sopenharmony_ci def test_object_to_timespec(self): 11037db96d56Sopenharmony_ci from _testcapi import pytime_object_to_timespec 11047db96d56Sopenharmony_ci 11057db96d56Sopenharmony_ci self.check_int_rounding(pytime_object_to_timespec, 11067db96d56Sopenharmony_ci lambda secs: (secs, 0), 11077db96d56Sopenharmony_ci value_filter=self.time_t_filter) 11087db96d56Sopenharmony_ci 11097db96d56Sopenharmony_ci self.check_float_rounding(pytime_object_to_timespec, 11107db96d56Sopenharmony_ci self.create_converter(SEC_TO_NS), 11117db96d56Sopenharmony_ci value_filter=self.time_t_filter) 11127db96d56Sopenharmony_ci 11137db96d56Sopenharmony_ci # test nan 11147db96d56Sopenharmony_ci for time_rnd, _ in ROUNDING_MODES: 11157db96d56Sopenharmony_ci with self.assertRaises(ValueError): 11167db96d56Sopenharmony_ci pytime_object_to_timespec(float('nan'), time_rnd) 11177db96d56Sopenharmony_ci 11187db96d56Sopenharmony_ci@unittest.skipUnless(sys.platform == "darwin", "test weak linking on macOS") 11197db96d56Sopenharmony_ciclass TestTimeWeaklinking(unittest.TestCase): 11207db96d56Sopenharmony_ci # These test cases verify that weak linking support on macOS works 11217db96d56Sopenharmony_ci # as expected. These cases only test new behaviour introduced by weak linking, 11227db96d56Sopenharmony_ci # regular behaviour is tested by the normal test cases. 11237db96d56Sopenharmony_ci # 11247db96d56Sopenharmony_ci # See the section on Weak Linking in Mac/README.txt for more information. 11257db96d56Sopenharmony_ci def test_clock_functions(self): 11267db96d56Sopenharmony_ci import sysconfig 11277db96d56Sopenharmony_ci import platform 11287db96d56Sopenharmony_ci 11297db96d56Sopenharmony_ci config_vars = sysconfig.get_config_vars() 11307db96d56Sopenharmony_ci var_name = "HAVE_CLOCK_GETTIME" 11317db96d56Sopenharmony_ci if var_name not in config_vars or not config_vars[var_name]: 11327db96d56Sopenharmony_ci raise unittest.SkipTest(f"{var_name} is not available") 11337db96d56Sopenharmony_ci 11347db96d56Sopenharmony_ci mac_ver = tuple(int(x) for x in platform.mac_ver()[0].split(".")) 11357db96d56Sopenharmony_ci 11367db96d56Sopenharmony_ci clock_names = [ 11377db96d56Sopenharmony_ci "CLOCK_MONOTONIC", "clock_gettime", "clock_gettime_ns", "clock_settime", 11387db96d56Sopenharmony_ci "clock_settime_ns", "clock_getres"] 11397db96d56Sopenharmony_ci 11407db96d56Sopenharmony_ci if mac_ver >= (10, 12): 11417db96d56Sopenharmony_ci for name in clock_names: 11427db96d56Sopenharmony_ci self.assertTrue(hasattr(time, name), f"time.{name} is not available") 11437db96d56Sopenharmony_ci 11447db96d56Sopenharmony_ci else: 11457db96d56Sopenharmony_ci for name in clock_names: 11467db96d56Sopenharmony_ci self.assertFalse(hasattr(time, name), f"time.{name} is available") 11477db96d56Sopenharmony_ci 11487db96d56Sopenharmony_ci 11497db96d56Sopenharmony_ciif __name__ == "__main__": 11507db96d56Sopenharmony_ci unittest.main() 1151