1 //----------------------------------------------------------------------
2 // Copyright (C) 2006 - 2007 by the FRESCOR consortium:
4 // Universidad de Cantabria, SPAIN
5 // University of York, UK
6 // Scuola Superiore Sant'Anna, ITALY
7 // Kaiserslautern University, GERMANY
8 // Univ. Politecnica Valencia, SPAIN
9 // Czech Technical University in Prague, CZECH REPUBLIC
11 // Thales Communication S.A. FRANCE
12 // Visual Tools S.A. SPAIN
13 // Rapita Systems Ltd UK
16 // See http://www.frescor.org
18 // The FRESCOR project (FP6/2005/IST/5-034026) is funded
19 // in part by the European Union Sixth Framework Programme
20 // The European Union is not liable of any use that may be
24 // based on previous work (FSF) done in the FIRST project
26 // Copyright (C) 2005 Mälardalen University, SWEDEN
27 // Scuola Superiore S.Anna, ITALY
28 // Universidad de Cantabria, SPAIN
29 // University of York, UK
31 // This file is part of FRSH (FRescor ScHeduler)
33 // FRSH is free software; you can redistribute it and/or modify it
34 // under terms of the GNU General Public License as published by the
35 // Free Software Foundation; either version 2, or (at your option) any
36 // later version. FRSH is distributed in the hope that it will be
37 // useful, but WITHOUT ANY WARRANTY; without even the implied warranty
38 // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
39 // General Public License for more details. You should have received a
40 // copy of the GNU General Public License along with FRSH; see file
41 // COPYING. If not, write to the Free Software Foundation, 675 Mass Ave,
42 // Cambridge, MA 02139, USA.
44 // As a special exception, including FRSH header files in a file,
45 // instantiating FRSH generics or templates, or linking other files
46 // with FRSH objects to produce an executable application, does not
47 // by itself cause the resulting executable application to be covered
48 // by the GNU General Public License. This exception does not
49 // however invalidate any other reasons why the executable file might be
50 // covered by the GNU Public License.
51 // -----------------------------------------------------------------------
54 #include <time.h> /* for timespec */
55 #include <stdio.h> /* for printf */
56 #include <string.h> /* for memcmp */
58 static int check_exact_abs_msec(fosa_abs_time_t abs_time, long msec);
59 static int check_exact_rel_msec(fosa_rel_time_t rel_time, long msec);
64 struct timespec tspec1 = {1, 500000000};
65 struct timespec tspec2 = {0, 400000000};
66 struct timespec tspec_result;
68 fosa_rel_time_t rel_time1 = fosa_msec_to_rel_time(1500);
69 fosa_rel_time_t rel_time2 = fosa_msec_to_rel_time(400);
70 fosa_rel_time_t rel_time_aux = fosa_msec_to_rel_time(1500);
71 fosa_rel_time_t rel_time_result;
73 fosa_abs_time_t abs_time1 = fosa_msec_to_abs_time(1500);
74 fosa_abs_time_t abs_time2 = fosa_msec_to_abs_time(400);
75 fosa_abs_time_t abs_time_aux = fosa_msec_to_abs_time(1500);
76 fosa_abs_time_t abs_time_result;
81 /* fosa_abs_time_incr */
82 abs_time_result = fosa_abs_time_incr(abs_time1, rel_time2);
83 assert( check_exact_abs_msec(abs_time_result, 1900) );
85 /* fosa_abs_time_decr */
86 abs_time_result = fosa_abs_time_decr(abs_time1, rel_time2);
87 assert( check_exact_abs_msec(abs_time_result, 1100) );
89 /* fosa_abs_time_decr (negative) */
90 abs_time_result = fosa_abs_time_decr(abs_time2, rel_time1);
91 // assert( check_exact_abs_msec(abs_time_result, -1100) );
93 /* fosa_abs_time_extract_interval */
94 rel_time_result = fosa_abs_time_extract_interval(abs_time2, abs_time1);
95 assert( check_exact_rel_msec(rel_time_result, 1100) );
97 /* fosa_abs_time_extract_interval (negative) */
98 rel_time_result = fosa_abs_time_extract_interval(abs_time1, abs_time2);
99 // assert( check_exact_rel_msec(rel_time_result, -1100) );
101 /* fosa_rel_time_add */
102 rel_time_result = fosa_rel_time_add(rel_time1, rel_time2);
103 assert( check_exact_rel_msec(rel_time_result, 1900) );
105 /* fosa_rel_time_decr */
106 rel_time_result = fosa_rel_time_decr(rel_time1, rel_time2);
107 assert( check_exact_rel_msec(rel_time_result, 1100) );
109 /* fosa_rel_time_decr (negative) */
110 rel_time_result = fosa_rel_time_decr(rel_time2, rel_time1);
111 // assert( check_exact_rel_msec(rel_time_result, 1100) );
114 struct timespec t1 = {0, 876352172};
115 fosa_rel_time_t t1_rel = fosa_timespec_to_rel_time(t1);
116 long factor = 573102543;
117 struct timespec product = {502239658, 336773396};
118 fosa_rel_time_t product_rel = fosa_timespec_to_rel_time(product);
121 struct timespec t1 = {0, 876352172};
122 struct timespec product = {50223965, 570771688};
123 long factor = 57310254;
124 struct timespec product_divided_by_17 = {2954350, 915927746}; // inexact division
125 struct timespec product_divided_by_3 = {16741321, 856923896}; // exact division
127 fosa_rel_time_t t1_rel = fosa_timespec_to_rel_time(t1);
128 fosa_rel_time_t product_rel = fosa_timespec_to_rel_time(product);
129 fosa_rel_time_t product_17_rel = fosa_timespec_to_rel_time(product_divided_by_17);
130 fosa_rel_time_t product_3_rel = fosa_timespec_to_rel_time(product_divided_by_3);
132 /* fosa_rel_time_times_integer */
133 /* fosa_rel_time_divided_by_integer */
134 rel_time_result = fosa_rel_time_times_integer(rel_time2, 4);
135 assert( check_exact_rel_msec(rel_time_result, 1600) );
137 rel_time_result = fosa_rel_time_divided_by_integer(rel_time_result, 4);
138 assert( check_exact_rel_msec(rel_time_result, 400) );
140 rel_time_result = fosa_rel_time_times_integer(t1_rel, factor);
141 assert( fosa_rel_time_equal(rel_time_result, product_rel) );
143 rel_time_result = fosa_rel_time_divided_by_integer(product_rel, factor);
144 assert( fosa_rel_time_equal(rel_time_result, t1_rel) );
146 rel_time_result = fosa_rel_time_divided_by_integer(product_rel, 17);
147 assert( fosa_rel_time_equal(rel_time_result, product_17_rel) );
149 rel_time_result = fosa_rel_time_divided_by_integer(product_rel, 3);
150 assert( fosa_rel_time_equal(rel_time_result, product_3_rel) );
152 /* fosa_abs_time_smaller */
153 test = fosa_abs_time_smaller(abs_time1, abs_time2);
154 assert(test == false);
156 test = fosa_abs_time_smaller(abs_time1, abs_time_aux);
157 assert(test == false);
159 test = fosa_abs_time_smaller(abs_time2, abs_time1);
162 /* fosa_rel_time_smaller */
163 test = fosa_rel_time_smaller(rel_time1, rel_time2);
164 assert(test == false);
166 test = fosa_rel_time_smaller(rel_time1, rel_time_aux);
167 assert(test == false);
169 test = fosa_rel_time_smaller(rel_time2, rel_time1);
172 /* fosa_abs_time_smaller_or_equal */
173 test = fosa_abs_time_smaller_or_equal(abs_time1, abs_time2);
174 assert(test == false);
176 test = fosa_abs_time_smaller_or_equal(abs_time1, abs_time_aux);
179 test = fosa_abs_time_smaller_or_equal(abs_time2, abs_time1);
182 /* fosa_rel_time_smaller_or_equal */
183 test = fosa_rel_time_smaller_or_equal(rel_time1, rel_time2);
184 assert(test == false);
186 test = fosa_rel_time_smaller_or_equal(rel_time1, rel_time_aux);
189 test = fosa_rel_time_smaller_or_equal(rel_time2, rel_time1);
192 /* fosa_msec_to_rel_time */
193 rel_time_result = fosa_msec_to_rel_time(1850);
194 assert( check_exact_rel_msec(rel_time_result, 1850) );
196 /* fosa_rel_time_to_msec */
197 numeric = fosa_rel_time_to_msec(rel_time1);
198 assert(numeric == 1500);
200 /* fosa_msec_to_abs_time */
201 abs_time_result = fosa_msec_to_rel_time(1320);
202 assert( check_exact_abs_msec(abs_time_result, 1320) );
204 /* fosa_abs_time_to_msec */
205 numeric = fosa_abs_time_to_msec(abs_time2);
206 assert(numeric == 400);
208 /* fosa_usec_to_rel_time */
209 rel_time_result = fosa_usec_to_rel_time(1850000);
210 assert( check_exact_rel_msec(rel_time_result, 1850) );
212 /* fosa_rel_time_to_usec */
213 numeric = fosa_rel_time_to_usec(rel_time1);
214 assert(numeric == 1500000);
216 /* fosa_msec_to_abs_time */
217 abs_time_result = fosa_usec_to_rel_time(1320000);
218 assert( check_exact_abs_msec(abs_time_result, 1320) );
220 /* fosa_abs_time_to_msec */
221 numeric = fosa_abs_time_to_usec(abs_time2);
222 assert(numeric == 400000);
224 /* fosa_timespec_to_rel_time */
225 struct timespec tspec_aux = {1, 750000000};
226 rel_time_result = fosa_timespec_to_rel_time(tspec_aux);
227 assert( check_exact_rel_msec(rel_time_result, 1750) );
229 /* fosa_rel_time_to_timespec */
230 tspec_result = fosa_rel_time_to_timespec(rel_time1);
231 test = memcmp(&tspec_result, &tspec1, sizeof(tspec_result) );
234 /* fosa_timespec_to_abs_time */
235 struct timespec tspec_aux_extra = {1, 200000000};
236 abs_time_result = fosa_timespec_to_abs_time(tspec_aux_extra);
237 assert( check_exact_abs_msec(abs_time_result, 1200) );
239 /* fosa_abs_time_to_timespec */
240 tspec_result = fosa_abs_time_to_timespec(abs_time2);
241 test = memcmp(&tspec_result, &tspec2, sizeof(tspec_result) );
246 printf("End of test OK!!\n");
251 // -------------------------------------------------------------
253 static int check_exact_abs_msec(fosa_abs_time_t abs_time, long msec)
255 fosa_abs_time_t time_check;
258 time_check = fosa_msec_to_abs_time(msec);
259 cmp = memcmp(&time_check, &abs_time, sizeof(time_check) );
271 // -------------------------------------------------------------
273 static int check_exact_rel_msec(fosa_rel_time_t rel_time, long msec)
275 fosa_rel_time_t time_check;
278 time_check = fosa_msec_to_rel_time(msec);
279 cmp = memcmp(&time_check, &rel_time, sizeof(time_check) );