fix
[oweals/gnunet.git] / src / util / test_time.c
1 /*
2      This file is part of GNUnet.
3      (C) 2001, 2002, 2003, 2004, 2006, 2009 Christian Grothoff (and other contributing authors)
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20 /**
21  * @file util/test_time.c
22  * @brief testcase for time.c
23  */
24 #include "platform.h"
25 #include "gnunet_common.h"
26 #include "gnunet_time_lib.h"
27
28 #define VERBOSE GNUNET_EXTRA_LOGGING
29
30 static int
31 check ()
32 {
33   struct GNUNET_TIME_Absolute now;
34   struct GNUNET_TIME_AbsoluteNBO nown;
35   struct GNUNET_TIME_Absolute future;
36   struct GNUNET_TIME_Absolute past;
37   struct GNUNET_TIME_Absolute last;
38   struct GNUNET_TIME_Absolute forever;
39   struct GNUNET_TIME_Absolute zero;
40   struct GNUNET_TIME_Relative rel;
41   struct GNUNET_TIME_Relative relForever;
42   struct GNUNET_TIME_Relative relUnit;
43   struct GNUNET_TIME_RelativeNBO reln;
44   unsigned int i;
45
46   forever = GNUNET_TIME_absolute_get_forever ();
47   relForever = GNUNET_TIME_relative_get_forever ();
48   relUnit = GNUNET_TIME_relative_get_unit ();
49   zero.abs_value = 0;
50
51   last = now = GNUNET_TIME_absolute_get ();
52   while (now.abs_value == last.abs_value)
53     now = GNUNET_TIME_absolute_get ();
54   GNUNET_assert (now.abs_value > last.abs_value);
55
56   /* test overflow checking in multiply */
57   rel = GNUNET_TIME_UNIT_SECONDS;
58   GNUNET_log_skip (1, GNUNET_NO);
59   for (i = 0; i < 55; i++)
60     rel = GNUNET_TIME_relative_multiply (rel, 2);
61   GNUNET_log_skip (0, GNUNET_NO);
62   GNUNET_assert (rel.rel_value == GNUNET_TIME_UNIT_FOREVER_REL.rel_value);
63   /*check zero */
64   rel.rel_value = (UINT64_MAX) - 1024;
65   GNUNET_assert (GNUNET_TIME_relative_get_zero ().rel_value ==
66                  GNUNET_TIME_relative_multiply (rel, 0).rel_value);
67
68   /* test infinity-check for relative to absolute */
69   GNUNET_log_skip (1, GNUNET_NO);
70   last = GNUNET_TIME_relative_to_absolute (rel);
71   GNUNET_assert (last.abs_value == GNUNET_TIME_UNIT_FOREVER_ABS.abs_value);
72   GNUNET_log_skip (0, GNUNET_YES);
73
74   /*check relative to absolute */
75   rel.rel_value = 0;
76   GNUNET_assert (GNUNET_TIME_absolute_get ().abs_value ==
77                  GNUNET_TIME_relative_to_absolute (rel).abs_value);
78   /*check forever */
79   rel.rel_value = UINT64_MAX;
80   GNUNET_assert (GNUNET_TIME_absolute_get_forever ().abs_value ==
81                  GNUNET_TIME_relative_to_absolute (rel).abs_value);
82   /* check overflow for r2a */
83   rel.rel_value = (UINT64_MAX) - 1024;
84   GNUNET_log_skip (1, GNUNET_NO);
85   last = GNUNET_TIME_relative_to_absolute (rel);
86   GNUNET_log_skip (0, GNUNET_NO);
87   GNUNET_assert (last.abs_value == GNUNET_TIME_UNIT_FOREVER_ABS.abs_value);
88
89   /* check overflow for relative add */
90   GNUNET_log_skip (1, GNUNET_NO);
91   rel = GNUNET_TIME_relative_add (rel, rel);
92   GNUNET_log_skip (0, GNUNET_NO);
93   GNUNET_assert (rel.rel_value == GNUNET_TIME_UNIT_FOREVER_REL.rel_value);
94
95   GNUNET_log_skip (1, GNUNET_NO);
96   rel = GNUNET_TIME_relative_add (relForever, relForever);
97   GNUNET_log_skip (0, GNUNET_NO);
98   GNUNET_assert (rel.rel_value == relForever.rel_value);
99
100   GNUNET_log_skip (1, GNUNET_NO);
101   rel = GNUNET_TIME_relative_add (relUnit, relUnit);
102   GNUNET_assert (rel.rel_value == 2 * relUnit.rel_value);
103
104   /* check relation check in get_duration */
105   future.abs_value = now.abs_value + 1000000;
106   GNUNET_assert (GNUNET_TIME_absolute_get_difference (now, future).rel_value
107                  == 1000000);
108   GNUNET_assert (GNUNET_TIME_absolute_get_difference (future, now).rel_value
109                  == 0);
110
111   GNUNET_assert (GNUNET_TIME_absolute_get_difference (zero, forever).rel_value
112                  == forever.abs_value);
113
114   past.abs_value = now.abs_value - 1000000;
115   rel = GNUNET_TIME_absolute_get_duration (future);
116   GNUNET_assert (rel.rel_value == 0);
117   rel = GNUNET_TIME_absolute_get_duration (past);
118   GNUNET_assert (rel.rel_value >= 1000000);
119
120   /* check get remaining */
121   rel = GNUNET_TIME_absolute_get_remaining (now);
122   GNUNET_assert (rel.rel_value == 0);
123   rel = GNUNET_TIME_absolute_get_remaining (past);
124   GNUNET_assert (rel.rel_value == 0);
125   rel = GNUNET_TIME_absolute_get_remaining (future);
126   GNUNET_assert (rel.rel_value > 0);
127   GNUNET_assert (rel.rel_value <= 1000000);
128   forever = GNUNET_TIME_absolute_get_forever ();
129   GNUNET_assert (GNUNET_TIME_relative_get_forever ().rel_value ==
130                  GNUNET_TIME_absolute_get_remaining (forever).rel_value);
131
132   /* check endianess */
133   reln = GNUNET_TIME_relative_hton (rel);
134   GNUNET_assert (rel.rel_value == GNUNET_TIME_relative_ntoh (reln).rel_value);
135   nown = GNUNET_TIME_absolute_hton (now);
136   GNUNET_assert (now.abs_value == GNUNET_TIME_absolute_ntoh (nown).abs_value);
137
138   /* check absolute addition */
139   future = GNUNET_TIME_absolute_add (now, GNUNET_TIME_UNIT_SECONDS);
140   GNUNET_assert (future.abs_value == now.abs_value + 1000);
141
142   future = GNUNET_TIME_absolute_add (forever, GNUNET_TIME_UNIT_ZERO);
143   GNUNET_assert (future.abs_value == forever.abs_value);
144
145   rel.rel_value = (UINT64_MAX) - 1024;
146   now.abs_value = rel.rel_value;
147   future = GNUNET_TIME_absolute_add (now, rel);
148   GNUNET_assert (future.abs_value == forever.abs_value);
149
150   /* check zero */
151   future = GNUNET_TIME_absolute_add (now, GNUNET_TIME_UNIT_ZERO);
152   GNUNET_assert (future.abs_value == now.abs_value);
153
154   GNUNET_assert (forever.abs_value ==
155                  GNUNET_TIME_absolute_subtract (forever,
156                                                 GNUNET_TIME_UNIT_MINUTES).abs_value);
157   /*check absolute subtract */
158   now.abs_value = 50000;
159   rel.rel_value = 100000;
160   GNUNET_assert (GNUNET_TIME_UNIT_ZERO_ABS.abs_value ==
161                  (GNUNET_TIME_absolute_subtract (now, rel)).abs_value);
162   rel.rel_value = 10000;
163   GNUNET_assert (40000 ==
164                  (GNUNET_TIME_absolute_subtract (now, rel)).abs_value);
165
166   /*check relative divide */
167   GNUNET_assert (GNUNET_TIME_UNIT_FOREVER_REL.rel_value ==
168                  (GNUNET_TIME_relative_divide (rel, 0)).rel_value);
169
170   rel = GNUNET_TIME_UNIT_FOREVER_REL;
171   GNUNET_assert (GNUNET_TIME_UNIT_FOREVER_REL.rel_value ==
172                  (GNUNET_TIME_relative_divide (rel, 2)).rel_value);
173
174   rel = GNUNET_TIME_relative_divide (relUnit, 2);
175   GNUNET_assert (rel.rel_value == relUnit.rel_value / 2);
176
177
178   /* check Return absolute time of 0ms */
179   zero = GNUNET_TIME_absolute_get_zero ();
180
181   /* check GNUNET_TIME_calculate_eta */
182   last.abs_value = GNUNET_TIME_absolute_get ().abs_value - 1024;
183   forever = GNUNET_TIME_absolute_get_forever ();
184   forever.abs_value = forever.abs_value - 1024;
185   GNUNET_assert (GNUNET_TIME_absolute_get_zero ().abs_value ==
186                  GNUNET_TIME_calculate_eta (forever, 50000,
187                                             100000).rel_value);
188   /* check zero */
189   GNUNET_log_skip (1, GNUNET_NO);
190   GNUNET_assert (GNUNET_TIME_UNIT_ZERO.rel_value ==
191                  (GNUNET_TIME_calculate_eta (last, 60000, 50000)).rel_value);
192   GNUNET_log_skip (0, GNUNET_YES);
193   /*check forever */
194   GNUNET_assert (GNUNET_TIME_UNIT_FOREVER_REL.rel_value ==
195                  (GNUNET_TIME_calculate_eta (last, 0, 50000)).rel_value);
196
197   /*check relative subtract */
198   now = GNUNET_TIME_absolute_get ();
199   rel.rel_value = now.abs_value;
200   relForever.rel_value = rel.rel_value + 1024;
201   GNUNET_assert (1024 ==
202                  GNUNET_TIME_relative_subtract (relForever, rel).rel_value);
203   /*check zero */
204   GNUNET_assert (GNUNET_TIME_relative_get_zero ().rel_value ==
205                  GNUNET_TIME_relative_subtract (rel, relForever).rel_value);
206   /*check forever */
207   rel.rel_value = UINT64_MAX;
208   GNUNET_assert (GNUNET_TIME_relative_get_forever ().rel_value ==
209                  GNUNET_TIME_relative_subtract (rel, relForever).rel_value);
210
211   /*check GNUNET_TIME_relative_min */
212   now = GNUNET_TIME_absolute_get ();
213   rel.rel_value = now.abs_value;
214   relForever.rel_value = rel.rel_value - 1024;
215   GNUNET_assert (relForever.rel_value ==
216                  GNUNET_TIME_relative_min (rel, relForever).rel_value);
217
218   /*check GNUNET_TIME_relative_max */
219   GNUNET_assert (rel.rel_value ==
220                  GNUNET_TIME_relative_max (rel, relForever).rel_value);
221
222   /*check GNUNET_TIME_absolute_min */
223   now = GNUNET_TIME_absolute_get ();
224   last.abs_value = now.abs_value - 1024;
225   GNUNET_assert (last.abs_value ==
226                  GNUNET_TIME_absolute_min (now, last).abs_value);
227
228   /*check  GNUNET_TIME_absolute_max */
229   GNUNET_assert (now.abs_value ==
230                  GNUNET_TIME_absolute_max (now, last).abs_value);
231
232   return 0;
233 }
234
235 int
236 main (int argc, char *argv[])
237 {
238   int ret;
239
240   GNUNET_log_setup ("test-time", "WARNING", NULL);
241   ret = check ();
242
243   return ret;
244 }
245
246 /* end of test_time.c */