proper shutdown
[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   forever = GNUNET_TIME_absolute_get_forever ();
46   relForever = GNUNET_TIME_relative_get_forever ();
47   relUnit = GNUNET_TIME_relative_get_unit ();
48   zero.abs_value = 0;
49
50   last = now = GNUNET_TIME_absolute_get ();
51   while (now.abs_value == last.abs_value)
52     now = GNUNET_TIME_absolute_get ();
53   GNUNET_assert (now.abs_value > last.abs_value);
54
55   /* test overflow checking in multiply */
56   rel = GNUNET_TIME_UNIT_SECONDS;
57   GNUNET_log_skip (1, GNUNET_NO);
58   for (i = 0; i < 55; i++)
59     rel = GNUNET_TIME_relative_multiply (rel, 2);
60   GNUNET_log_skip (0, GNUNET_NO);
61   GNUNET_assert (rel.rel_value == GNUNET_TIME_UNIT_FOREVER_REL.rel_value);
62   /*check zero*/
63   rel.rel_value = (UINT64_MAX) - 1024;
64   GNUNET_assert (GNUNET_TIME_relative_get_zero ().rel_value == GNUNET_TIME_relative_multiply (rel,0).rel_value);
65
66   /* test infinity-check for relative to absolute */
67   GNUNET_log_skip (1, GNUNET_NO);
68   last = GNUNET_TIME_relative_to_absolute (rel);
69   GNUNET_assert (last.abs_value == GNUNET_TIME_UNIT_FOREVER_ABS.abs_value);
70   GNUNET_log_skip (0, GNUNET_YES);
71
72   /*check relative to absolute*/
73   rel.rel_value = 0;
74   GNUNET_assert (GNUNET_TIME_absolute_get ().abs_value ==
75                  GNUNET_TIME_relative_to_absolute(rel).abs_value);
76   /*check forever*/
77   rel.rel_value = UINT64_MAX;
78   GNUNET_assert (GNUNET_TIME_absolute_get_forever ().abs_value ==
79                  GNUNET_TIME_relative_to_absolute(rel).abs_value);
80   /* check overflow for r2a */
81   rel.rel_value = (UINT64_MAX) - 1024;
82   GNUNET_log_skip (1, GNUNET_NO);
83   last = GNUNET_TIME_relative_to_absolute (rel);
84   GNUNET_log_skip (0, GNUNET_NO);
85   GNUNET_assert (last.abs_value == GNUNET_TIME_UNIT_FOREVER_ABS.abs_value);
86
87   /* check overflow for relative add */
88   GNUNET_log_skip (1, GNUNET_NO);
89   rel = GNUNET_TIME_relative_add (rel, rel);
90   GNUNET_log_skip (0, GNUNET_NO);
91   GNUNET_assert (rel.rel_value == GNUNET_TIME_UNIT_FOREVER_REL.rel_value);
92
93   GNUNET_log_skip (1, GNUNET_NO);
94   rel = GNUNET_TIME_relative_add (relForever, relForever);
95   GNUNET_log_skip (0, GNUNET_NO);
96   GNUNET_assert (rel.rel_value == relForever.rel_value);
97
98   GNUNET_log_skip (1, GNUNET_NO);
99   rel = GNUNET_TIME_relative_add (relUnit, relUnit);
100   GNUNET_assert (rel.rel_value == 2 * relUnit.rel_value);
101
102   /* check relation check in get_duration */
103   future.abs_value = now.abs_value + 1000000;
104   GNUNET_assert (GNUNET_TIME_absolute_get_difference (now, future).rel_value ==
105                  1000000);
106   GNUNET_assert (GNUNET_TIME_absolute_get_difference (future, now).rel_value ==
107                  0);
108
109   GNUNET_assert (GNUNET_TIME_absolute_get_difference (zero, forever).rel_value ==
110                  forever.abs_value);
111
112   past.abs_value = now.abs_value - 1000000;
113   rel = GNUNET_TIME_absolute_get_duration (future);
114   GNUNET_assert (rel.rel_value == 0);
115   rel = GNUNET_TIME_absolute_get_duration (past);
116   GNUNET_assert (rel.rel_value >= 1000000);
117
118   /* check get remaining */
119   rel = GNUNET_TIME_absolute_get_remaining (now);
120   GNUNET_assert (rel.rel_value == 0);
121   rel = GNUNET_TIME_absolute_get_remaining (past);
122   GNUNET_assert (rel.rel_value == 0);
123   rel = GNUNET_TIME_absolute_get_remaining (future);
124   GNUNET_assert (rel.rel_value > 0);
125   GNUNET_assert (rel.rel_value <= 1000000);
126   forever = GNUNET_TIME_absolute_get_forever ();
127   GNUNET_assert (GNUNET_TIME_relative_get_forever ().rel_value ==
128                  GNUNET_TIME_absolute_get_remaining (forever).rel_value);
129
130   /* check endianess */
131   reln = GNUNET_TIME_relative_hton (rel);
132   GNUNET_assert (rel.rel_value == GNUNET_TIME_relative_ntoh (reln).rel_value);
133   nown = GNUNET_TIME_absolute_hton (now);
134   GNUNET_assert (now.abs_value == GNUNET_TIME_absolute_ntoh (nown).abs_value);
135
136   /* check absolute addition */
137   future = GNUNET_TIME_absolute_add (now, GNUNET_TIME_UNIT_SECONDS);
138   GNUNET_assert (future.abs_value == now.abs_value + 1000);
139
140   future = GNUNET_TIME_absolute_add (forever, GNUNET_TIME_UNIT_ZERO);
141   GNUNET_assert (future.abs_value == forever.abs_value);
142
143   rel.rel_value = (UINT64_MAX) - 1024;
144   now.abs_value = rel.rel_value;
145   future = GNUNET_TIME_absolute_add (now, rel);
146   GNUNET_assert (future.abs_value == forever.abs_value);
147
148   /* check zero */
149   future = GNUNET_TIME_absolute_add (now, GNUNET_TIME_UNIT_ZERO);
150   GNUNET_assert (future.abs_value == now.abs_value);
151
152   GNUNET_assert (forever.abs_value ==
153                  GNUNET_TIME_absolute_subtract (forever,
154                                                 GNUNET_TIME_UNIT_MINUTES).abs_value);
155   /*check absolute subtract*/
156   now.abs_value= 50000;
157   rel.rel_value = 100000;
158   GNUNET_assert (GNUNET_TIME_UNIT_ZERO_ABS.abs_value == 
159                  (GNUNET_TIME_absolute_subtract(now,rel)).abs_value);
160   rel.rel_value = 10000;
161   GNUNET_assert (40000 == 
162                  (GNUNET_TIME_absolute_subtract(now,rel)).abs_value);
163
164   /*check relative divide*/
165   GNUNET_assert(GNUNET_TIME_UNIT_FOREVER_REL.rel_value == 
166                 (GNUNET_TIME_relative_divide (rel,0)).rel_value);
167   
168   rel = GNUNET_TIME_UNIT_FOREVER_REL;
169   GNUNET_assert(GNUNET_TIME_UNIT_FOREVER_REL.rel_value == 
170                 (GNUNET_TIME_relative_divide (rel,2)).rel_value);
171   
172   rel = GNUNET_TIME_relative_divide (relUnit,2);
173   GNUNET_assert(rel.rel_value == relUnit.rel_value / 2);
174   
175
176   /* check Return absolute time of 0ms*/
177   zero = GNUNET_TIME_absolute_get_zero ();
178
179   /* check GNUNET_TIME_calculate_eta */
180   last.abs_value = GNUNET_TIME_absolute_get ().abs_value - 1024;
181   forever = GNUNET_TIME_absolute_get_forever ();
182   forever.abs_value = forever.abs_value - 1024;
183   GNUNET_assert(GNUNET_TIME_absolute_get_zero ().abs_value == 
184                 GNUNET_TIME_calculate_eta (forever, 50000, 100000).rel_value);
185   /* check zero */
186   GNUNET_log_skip (1, GNUNET_NO);
187   GNUNET_assert(GNUNET_TIME_UNIT_ZERO.rel_value ==
188                 (GNUNET_TIME_calculate_eta (last, 60000, 50000)).rel_value);
189   GNUNET_log_skip (0, GNUNET_YES);
190   /*check forever*/
191   GNUNET_assert(GNUNET_TIME_UNIT_FOREVER_REL.rel_value ==
192                 (GNUNET_TIME_calculate_eta (last, 0, 50000)).rel_value);
193
194   /*check relative subtract*/
195   now = GNUNET_TIME_absolute_get ();
196   rel.rel_value = now.abs_value;
197   relForever.rel_value = rel.rel_value + 1024;
198   GNUNET_assert(1024  ==
199                 GNUNET_TIME_relative_subtract(relForever,rel).rel_value);
200   /*check zero*/
201   GNUNET_assert(GNUNET_TIME_relative_get_zero ().rel_value  ==
202                 GNUNET_TIME_relative_subtract(rel,relForever).rel_value);
203   /*check forever*/
204   rel.rel_value = UINT64_MAX;
205   GNUNET_assert(GNUNET_TIME_relative_get_forever ().rel_value  ==
206                 GNUNET_TIME_relative_subtract(rel,relForever).rel_value);
207
208   /*check GNUNET_TIME_relative_min*/
209   now = GNUNET_TIME_absolute_get ();
210   rel.rel_value = now.abs_value;
211   relForever.rel_value = rel.rel_value - 1024;
212   GNUNET_assert(relForever.rel_value == GNUNET_TIME_relative_min(rel,relForever).rel_value);
213
214   /*check GNUNET_TIME_relative_max */
215   GNUNET_assert(rel.rel_value == GNUNET_TIME_relative_max(rel,relForever).rel_value);
216   
217   /*check GNUNET_TIME_absolute_min*/
218   now = GNUNET_TIME_absolute_get ();
219   last.abs_value = now.abs_value - 1024;
220   GNUNET_assert(last.abs_value == GNUNET_TIME_absolute_min(now,last).abs_value);
221
222   /*check  GNUNET_TIME_absolute_max*/
223   GNUNET_assert(now.abs_value == GNUNET_TIME_absolute_max(now,last).abs_value);
224
225   return 0;
226 }
227
228 int
229 main (int argc, char *argv[])
230 {
231   int ret;
232
233   GNUNET_log_setup ("test-time", "WARNING", NULL);
234   ret = check ();
235
236   return ret;
237 }
238
239 /* end of test_time.c */