• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Test pycore_time.h */
2 
3 #include "parts.h"
4 
5 #include "pycore_time.h"          // _PyTime_FromSeconds()
6 
7 #ifdef MS_WINDOWS
8 #  include <winsock2.h>           // struct timeval
9 #endif
10 
11 
12 static PyObject *
test_pytime_fromseconds(PyObject * self,PyObject * args)13 test_pytime_fromseconds(PyObject *self, PyObject *args)
14 {
15     int seconds;
16     if (!PyArg_ParseTuple(args, "i", &seconds)) {
17         return NULL;
18     }
19     PyTime_t ts = _PyTime_FromSeconds(seconds);
20     return _PyTime_AsLong(ts);
21 }
22 
23 static int
check_time_rounding(int round)24 check_time_rounding(int round)
25 {
26     if (round != _PyTime_ROUND_FLOOR
27         && round != _PyTime_ROUND_CEILING
28         && round != _PyTime_ROUND_HALF_EVEN
29         && round != _PyTime_ROUND_UP)
30     {
31         PyErr_SetString(PyExc_ValueError, "invalid rounding");
32         return -1;
33     }
34     return 0;
35 }
36 
37 static PyObject *
test_pytime_fromsecondsobject(PyObject * self,PyObject * args)38 test_pytime_fromsecondsobject(PyObject *self, PyObject *args)
39 {
40     PyObject *obj;
41     int round;
42     if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
43         return NULL;
44     }
45     if (check_time_rounding(round) < 0) {
46         return NULL;
47     }
48     PyTime_t ts;
49     if (_PyTime_FromSecondsObject(&ts, obj, round) == -1) {
50         return NULL;
51     }
52     return _PyTime_AsLong(ts);
53 }
54 
55 static PyObject *
test_PyTime_AsTimeval(PyObject * self,PyObject * args)56 test_PyTime_AsTimeval(PyObject *self, PyObject *args)
57 {
58     PyObject *obj;
59     int round;
60     if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
61         return NULL;
62     }
63     if (check_time_rounding(round) < 0) {
64         return NULL;
65     }
66     PyTime_t t;
67     if (_PyTime_FromLong(&t, obj) < 0) {
68         return NULL;
69     }
70     struct timeval tv;
71     if (_PyTime_AsTimeval(t, &tv, round) < 0) {
72         return NULL;
73     }
74 
75     PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
76     if (seconds == NULL) {
77         return NULL;
78     }
79     return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
80 }
81 
82 static PyObject *
test_PyTime_AsTimeval_clamp(PyObject * self,PyObject * args)83 test_PyTime_AsTimeval_clamp(PyObject *self, PyObject *args)
84 {
85     PyObject *obj;
86     int round;
87     if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
88         return NULL;
89     }
90     if (check_time_rounding(round) < 0) {
91         return NULL;
92     }
93     PyTime_t t;
94     if (_PyTime_FromLong(&t, obj) < 0) {
95         return NULL;
96     }
97     struct timeval tv;
98     _PyTime_AsTimeval_clamp(t, &tv, round);
99 
100     PyObject *seconds = PyLong_FromLongLong(tv.tv_sec);
101     if (seconds == NULL) {
102         return NULL;
103     }
104     return Py_BuildValue("Nl", seconds, (long)tv.tv_usec);
105 }
106 
107 #ifdef HAVE_CLOCK_GETTIME
108 static PyObject *
test_PyTime_AsTimespec(PyObject * self,PyObject * args)109 test_PyTime_AsTimespec(PyObject *self, PyObject *args)
110 {
111     PyObject *obj;
112     if (!PyArg_ParseTuple(args, "O", &obj)) {
113         return NULL;
114     }
115     PyTime_t t;
116     if (_PyTime_FromLong(&t, obj) < 0) {
117         return NULL;
118     }
119     struct timespec ts;
120     if (_PyTime_AsTimespec(t, &ts) == -1) {
121         return NULL;
122     }
123     return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
124 }
125 
126 static PyObject *
test_PyTime_AsTimespec_clamp(PyObject * self,PyObject * args)127 test_PyTime_AsTimespec_clamp(PyObject *self, PyObject *args)
128 {
129     PyObject *obj;
130     if (!PyArg_ParseTuple(args, "O", &obj)) {
131         return NULL;
132     }
133     PyTime_t t;
134     if (_PyTime_FromLong(&t, obj) < 0) {
135         return NULL;
136     }
137     struct timespec ts;
138     _PyTime_AsTimespec_clamp(t, &ts);
139     return Py_BuildValue("Nl", _PyLong_FromTime_t(ts.tv_sec), ts.tv_nsec);
140 }
141 #endif
142 
143 static PyObject *
test_PyTime_AsMilliseconds(PyObject * self,PyObject * args)144 test_PyTime_AsMilliseconds(PyObject *self, PyObject *args)
145 {
146     PyObject *obj;
147     int round;
148     if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
149         return NULL;
150     }
151     PyTime_t t;
152     if (_PyTime_FromLong(&t, obj) < 0) {
153         return NULL;
154     }
155     if (check_time_rounding(round) < 0) {
156         return NULL;
157     }
158     PyTime_t ms = _PyTime_AsMilliseconds(t, round);
159     return _PyTime_AsLong(ms);
160 }
161 
162 static PyObject *
test_PyTime_AsMicroseconds(PyObject * self,PyObject * args)163 test_PyTime_AsMicroseconds(PyObject *self, PyObject *args)
164 {
165     PyObject *obj;
166     int round;
167     if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
168         return NULL;
169     }
170     PyTime_t t;
171     if (_PyTime_FromLong(&t, obj) < 0) {
172         return NULL;
173     }
174     if (check_time_rounding(round) < 0) {
175         return NULL;
176     }
177     PyTime_t us = _PyTime_AsMicroseconds(t, round);
178     return _PyTime_AsLong(us);
179 }
180 
181 static PyObject *
test_pytime_object_to_time_t(PyObject * self,PyObject * args)182 test_pytime_object_to_time_t(PyObject *self, PyObject *args)
183 {
184     PyObject *obj;
185     time_t sec;
186     int round;
187     if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
188         return NULL;
189     }
190     if (check_time_rounding(round) < 0) {
191         return NULL;
192     }
193     if (_PyTime_ObjectToTime_t(obj, &sec, round) == -1) {
194         return NULL;
195     }
196     return _PyLong_FromTime_t(sec);
197 }
198 
199 static PyObject *
test_pytime_object_to_timeval(PyObject * self,PyObject * args)200 test_pytime_object_to_timeval(PyObject *self, PyObject *args)
201 {
202     PyObject *obj;
203     time_t sec;
204     long usec;
205     int round;
206     if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
207         return NULL;
208     }
209     if (check_time_rounding(round) < 0) {
210         return NULL;
211     }
212     if (_PyTime_ObjectToTimeval(obj, &sec, &usec, round) == -1) {
213         return NULL;
214     }
215     return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), usec);
216 }
217 
218 static PyObject *
test_pytime_object_to_timespec(PyObject * self,PyObject * args)219 test_pytime_object_to_timespec(PyObject *self, PyObject *args)
220 {
221     PyObject *obj;
222     time_t sec;
223     long nsec;
224     int round;
225     if (!PyArg_ParseTuple(args, "Oi", &obj, &round)) {
226         return NULL;
227     }
228     if (check_time_rounding(round) < 0) {
229         return NULL;
230     }
231     if (_PyTime_ObjectToTimespec(obj, &sec, &nsec, round) == -1) {
232         return NULL;
233     }
234     return Py_BuildValue("Nl", _PyLong_FromTime_t(sec), nsec);
235 }
236 
237 static PyMethodDef TestMethods[] = {
238     {"_PyTime_AsMicroseconds",    test_PyTime_AsMicroseconds,     METH_VARARGS},
239     {"_PyTime_AsMilliseconds",    test_PyTime_AsMilliseconds,     METH_VARARGS},
240 #ifdef HAVE_CLOCK_GETTIME
241     {"_PyTime_AsTimespec",        test_PyTime_AsTimespec,         METH_VARARGS},
242     {"_PyTime_AsTimespec_clamp",  test_PyTime_AsTimespec_clamp,   METH_VARARGS},
243 #endif
244     {"_PyTime_AsTimeval",         test_PyTime_AsTimeval,          METH_VARARGS},
245     {"_PyTime_AsTimeval_clamp",   test_PyTime_AsTimeval_clamp,    METH_VARARGS},
246     {"_PyTime_FromSeconds",       test_pytime_fromseconds,        METH_VARARGS},
247     {"_PyTime_FromSecondsObject", test_pytime_fromsecondsobject,  METH_VARARGS},
248     {"_PyTime_ObjectToTime_t",    test_pytime_object_to_time_t,   METH_VARARGS},
249     {"_PyTime_ObjectToTimespec",  test_pytime_object_to_timespec, METH_VARARGS},
250     {"_PyTime_ObjectToTimeval",   test_pytime_object_to_timeval,  METH_VARARGS},
251     {NULL, NULL} /* sentinel */
252 };
253 
254 int
_PyTestInternalCapi_Init_PyTime(PyObject * m)255 _PyTestInternalCapi_Init_PyTime(PyObject *m)
256 {
257     if (PyModule_AddFunctions(m, TestMethods) < 0) {
258         return -1;
259     }
260     return 0;
261 }
262