]> granicus.if.org Git - python/commitdiff
Fix test_time on platform with 32-bit time_t type
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 10 Sep 2015 08:10:39 +0000 (10:10 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 10 Sep 2015 08:10:39 +0000 (10:10 +0200)
Filter values which would overflow when converted to a C time_t type.

Lib/test/test_time.py
Modules/_testcapimodule.c

index 7f1613b7ce2e69dee2415b5b752bf12c26dc478f..891c99d009265eb7f5d43f76bc4649b4ea4ac961 100644 (file)
@@ -680,6 +680,15 @@ class CPyTimeTestCase:
     """
     OVERFLOW_SECONDS = None
 
+    def setUp(self):
+        from _testcapi import SIZEOF_TIME_T
+        bits = SIZEOF_TIME_T * 8 - 1
+        self.time_t_min = -2 ** bits
+        self.time_t_max = 2 ** bits - 1
+
+    def time_t_filter(self, seconds):
+        return (self.time_t_min <= seconds <= self.time_t_max)
+
     def _rounding_values(self, use_float):
         "Build timestamps used to test rounding."
 
@@ -858,7 +867,7 @@ class TestCPyTime(CPyTimeTestCase, unittest.TestCase):
             def seconds_filter(secs):
                 return LONG_MIN <= secs <= LONG_MAX
         else:
-            seconds_filter = None
+            seconds_filter = self.time_t_filter
 
         self.check_int_rounding(PyTime_AsTimeval,
                                 timeval_converter,
@@ -875,7 +884,8 @@ class TestCPyTime(CPyTimeTestCase, unittest.TestCase):
 
         self.check_int_rounding(lambda ns, rnd: PyTime_AsTimespec(ns),
                                 timespec_converter,
-                                NS_TO_SEC)
+                                NS_TO_SEC,
+                                value_filter=self.time_t_filter)
 
     def test_AsMilliseconds(self):
         from _testcapi import PyTime_AsMilliseconds
@@ -904,7 +914,8 @@ class TestOldPyTime(CPyTimeTestCase, unittest.TestCase):
         from _testcapi import pytime_object_to_time_t
 
         self.check_int_rounding(pytime_object_to_time_t,
-                                lambda secs: secs)
+                                lambda secs: secs,
+                                value_filter=self.time_t_filter)
 
         self.check_float_rounding(pytime_object_to_time_t,
                                   self.decimal_round)
@@ -928,7 +939,8 @@ class TestOldPyTime(CPyTimeTestCase, unittest.TestCase):
         from _testcapi import pytime_object_to_timeval
 
         self.check_int_rounding(pytime_object_to_timeval,
-                                lambda secs: (secs, 0))
+                                lambda secs: (secs, 0),
+                                value_filter=self.time_t_filter)
 
         self.check_float_rounding(pytime_object_to_timeval,
                                   self.create_converter(SEC_TO_US))
@@ -937,7 +949,8 @@ class TestOldPyTime(CPyTimeTestCase, unittest.TestCase):
         from _testcapi import pytime_object_to_timespec
 
         self.check_int_rounding(pytime_object_to_timespec,
-                                lambda secs: (secs, 0))
+                                lambda secs: (secs, 0),
+                                value_filter=self.time_t_filter)
 
         self.check_float_rounding(pytime_object_to_timespec,
                                   self.create_converter(SEC_TO_NS))
index fed3286ac19a0adc78e535f6b5d1f1584a8ded28..1f013c21d579cf405b388ab52e2a6f545ce5b95b 100644 (file)
@@ -4114,6 +4114,7 @@ PyInit__testcapi(void)
     PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX));
     PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN));
     PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head)));
+    PyModule_AddObject(m, "SIZEOF_TIME_T", PyLong_FromSsize_t(sizeof(time_t)));
     Py_INCREF(&PyInstanceMethod_Type);
     PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type);