even nicer indentation, thanks to LRN's indent patch
[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_NO
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 == (GNUNET_TIME_absolute_subtract (now, rel)).abs_value);
164
165   /*check relative divide */
166   GNUNET_assert (GNUNET_TIME_UNIT_FOREVER_REL.rel_value ==
167                  (GNUNET_TIME_relative_divide (rel, 0)).rel_value);
168
169   rel = GNUNET_TIME_UNIT_FOREVER_REL;
170   GNUNET_assert (GNUNET_TIME_UNIT_FOREVER_REL.rel_value ==
171                  (GNUNET_TIME_relative_divide (rel, 2)).rel_value);
172
173   rel = GNUNET_TIME_relative_divide (relUnit, 2);
174   GNUNET_assert (rel.rel_value == relUnit.rel_value / 2);
175
176
177   /* check Return absolute time of 0ms */
178   zero = GNUNET_TIME_absolute_get_zero ();
179
180   /* check GNUNET_TIME_calculate_eta */
181   last.abs_value = GNUNET_TIME_absolute_get ().abs_value - 1024;
182   forever = GNUNET_TIME_absolute_get_forever ();
183   forever.abs_value = forever.abs_value - 1024;
184   GNUNET_assert (GNUNET_TIME_absolute_get_zero ().abs_value ==
185                  GNUNET_TIME_calculate_eta (forever, 50000, 100000).rel_value);
186   /* check zero */
187   GNUNET_log_skip (1, GNUNET_NO);
188   GNUNET_assert (GNUNET_TIME_UNIT_ZERO.rel_value ==
189                  (GNUNET_TIME_calculate_eta (last, 60000, 50000)).rel_value);
190   GNUNET_log_skip (0, GNUNET_YES);
191   /*check forever */
192   GNUNET_assert (GNUNET_TIME_UNIT_FOREVER_REL.rel_value ==
193                  (GNUNET_TIME_calculate_eta (last, 0, 50000)).rel_value);
194
195   /*check relative subtract */
196   now = GNUNET_TIME_absolute_get ();
197   rel.rel_value = now.abs_value;
198   relForever.rel_value = rel.rel_value + 1024;
199   GNUNET_assert (1024 ==
200                  GNUNET_TIME_relative_subtract (relForever, rel).rel_value);
201   /*check zero */
202   GNUNET_assert (GNUNET_TIME_relative_get_zero ().rel_value ==
203                  GNUNET_TIME_relative_subtract (rel, relForever).rel_value);
204   /*check forever */
205   rel.rel_value = UINT64_MAX;
206   GNUNET_assert (GNUNET_TIME_relative_get_forever ().rel_value ==
207                  GNUNET_TIME_relative_subtract (rel, relForever).rel_value);
208
209   /*check GNUNET_TIME_relative_min */
210   now = GNUNET_TIME_absolute_get ();
211   rel.rel_value = now.abs_value;
212   relForever.rel_value = rel.rel_value - 1024;
213   GNUNET_assert (relForever.rel_value ==
214                  GNUNET_TIME_relative_min (rel, relForever).rel_value);
215
216   /*check GNUNET_TIME_relative_max */
217   GNUNET_assert (rel.rel_value ==
218                  GNUNET_TIME_relative_max (rel, relForever).rel_value);
219
220   /*check GNUNET_TIME_absolute_min */
221   now = GNUNET_TIME_absolute_get ();
222   last.abs_value = now.abs_value - 1024;
223   GNUNET_assert (last.abs_value ==
224                  GNUNET_TIME_absolute_min (now, last).abs_value);
225
226   /*check  GNUNET_TIME_absolute_max */
227   GNUNET_assert (now.abs_value ==
228                  GNUNET_TIME_absolute_max (now, last).abs_value);
229
230   return 0;
231 }
232
233 int
234 main (int argc, char *argv[])
235 {
236   int ret;
237
238   GNUNET_log_setup ("test-time", "WARNING", NULL);
239   ret = check ();
240
241   return ret;
242 }
243
244 /* end of test_time.c */