3 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
5 * Licensed under the Apache License, Version 2.0 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 #include "utility/sync_util.h"
20 #include "unit_test_common.h"
21 #include "utility/fw_sequential_id_provider.h"
22 #include "utility/fw_sequential_id_provider_internal.h"
23 #include "suites/unit_test_fw_sequential_id_provider_suite.h"
25 #ifndef SYNC_AGENT_LOG
27 #define LOG_TAG "AF_TEST"
30 START_TEST(provide_id_without_delete_id_test1)
34 unsigned int max_id = 100;
35 util_id_provider_s *pId_provider = util_create_id_provider(max_id, 12, true);
37 fail_unless(pId_provider->total_free_cnt == max_id + 1);
41 util_id_provider_error_e error = UTIL_ID_PROVIDER_OK;
43 for (i = 0; i <= max_id; i++) {
44 error = util_provide_id(pId_provider, &id);
45 fail_unless(error == UTIL_ID_PROVIDER_OK);
47 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
50 error = util_provide_id(pId_provider, &id);
51 fail_unless(error == UTIL_ID_PROVIDER_NOT_ENOUGH_ID);
52 fail_unless(pId_provider->total_free_cnt == 0);
54 util_destroy_id_provider(pId_provider);
55 fprintf(stderr, "%s\n", "provide_id_without_delete_id_test1 done");
60 END_TEST START_TEST(provide_id_without_delete_id_test2)
64 unsigned int max_id = (1024 * 4) * 8;
65 util_id_provider_s *pId_provider = util_create_id_provider(max_id, 12, true);
67 fail_unless(pId_provider->total_free_cnt == max_id + 1);
71 util_id_provider_error_e error = UTIL_ID_PROVIDER_OK;
72 for (i = 0; i <= max_id; i++) {
73 error = util_provide_id(pId_provider, &id);
74 fail_unless(error == UTIL_ID_PROVIDER_OK);
77 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
80 error = util_provide_id(pId_provider, &id);
81 fail_unless(error == UTIL_ID_PROVIDER_NOT_ENOUGH_ID);
82 fail_unless(pId_provider->total_free_cnt == 0);
84 util_destroy_id_provider(pId_provider);
86 fprintf(stderr, "%s\n", "provide_id_without_delete_id_test2 done");
91 END_TEST START_TEST(provide_id_without_delete_id_test3)
95 unsigned int max_id = (1024 * 4) * 8 * 2;
96 util_id_provider_s *pId_provider = util_create_id_provider(max_id, 12, true);
98 fail_unless(pId_provider->total_free_cnt == max_id + 1);
102 util_id_provider_error_e error = UTIL_ID_PROVIDER_OK;
103 for (i = 0; i <= max_id; i++) {
104 error = util_provide_id(pId_provider, &id);
105 fail_unless(error == UTIL_ID_PROVIDER_OK);
106 fail_unless(i == id);
108 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
111 error = util_provide_id(pId_provider, &id);
112 fail_unless(error == UTIL_ID_PROVIDER_NOT_ENOUGH_ID);
113 fail_unless(pId_provider->total_free_cnt == 0);
115 util_destroy_id_provider(pId_provider);
116 fprintf(stderr, "%s\n", "provide_id_without_delete_id_test3 done");
121 END_TEST START_TEST(provide_id_with_delete_id_test1)
125 unsigned int max_id = 100;
126 util_id_provider_s *pId_provider = util_create_id_provider(max_id, 12, true);
128 fail_unless(pId_provider->total_free_cnt == max_id + 1);
133 util_id_provider_error_e error = UTIL_ID_PROVIDER_OK;
135 for (i = 0; i <= max_id / 10; i++) {
136 error = util_provide_id(pId_provider, &id);
137 fail_unless(error == UTIL_ID_PROVIDER_OK);
138 fail_unless(i == id);
140 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
143 for (j = 0; j <= max_id / 20; j++) {
144 fail_unless(UTIL_ID_PROVIDER_OK == util_delete_id(pId_provider, j));
145 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (max_id / 10 + 1)) + j + 1);
148 for (i = max_id / 10 + 1; i <= max_id; i++) {
149 error = util_provide_id(pId_provider, &id);
150 fail_unless(error == UTIL_ID_PROVIDER_OK);
151 fail_unless(i == id);
153 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)) + max_id / 20 + 1);
156 for (j = 0; j <= max_id / 20; j++) {
157 error = util_provide_id(pId_provider, &id);
158 fail_unless(error == UTIL_ID_PROVIDER_OK);
159 fail_unless(j == id);
161 fail_unless(pId_provider->total_free_cnt == (max_id / 20 - j));
164 error = util_provide_id(pId_provider, &id);
165 fail_unless(error == UTIL_ID_PROVIDER_NOT_ENOUGH_ID);
166 fail_unless(pId_provider->total_free_cnt == 0);
168 fail_unless(UTIL_ID_PROVIDER_OK == util_delete_id(pId_provider, 50));
169 fail_unless(pId_provider->total_free_cnt == 1);
171 fail_unless(UTIL_ID_PROVIDER_NOT_EXIST_ID == util_delete_id(pId_provider, 50));
172 fail_unless(pId_provider->total_free_cnt == 1);
174 fail_unless(UTIL_ID_PROVIDER_OUT_OF_ID_RANGE == util_delete_id(pId_provider, 101));
175 fail_unless(UTIL_ID_PROVIDER_OUT_OF_ID_RANGE == util_delete_id(pId_provider, 102));
176 fail_unless(UTIL_ID_PROVIDER_OUT_OF_ID_RANGE == util_delete_id(pId_provider, 2000));
178 util_destroy_id_provider(pId_provider);
179 fprintf(stderr, "%s\n", "provide_id_with_delete_id_test1 done");
184 END_TEST START_TEST(provide_id_with_delete_id_test2)
188 unsigned int max_id = (1024 * 4) * 8;
189 util_id_provider_s *pId_provider = util_create_id_provider(max_id, 12, true);
191 fail_unless(pId_provider->total_free_cnt == max_id + 1);
196 util_id_provider_error_e error = UTIL_ID_PROVIDER_OK;
198 for (i = 0; i <= max_id / 10; i++) {
199 error = util_provide_id(pId_provider, &id);
200 fail_unless(error == UTIL_ID_PROVIDER_OK);
201 fail_unless(i == id);
203 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
206 for (j = 0; j <= max_id / 20; j++) {
207 fail_unless(UTIL_ID_PROVIDER_OK == util_delete_id(pId_provider, j));
208 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (max_id / 10 + 1)) + j + 1);
211 for (i = max_id / 10 + 1; i <= max_id; i++) {
212 error = util_provide_id(pId_provider, &id);
213 fail_unless(error == UTIL_ID_PROVIDER_OK);
214 fail_unless(i == id);
216 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)) + max_id / 20 + 1);
219 for (j = max_id / 2; j <= max_id; j++) {
220 fail_unless(UTIL_ID_PROVIDER_OK == util_delete_id(pId_provider, j));
221 fail_unless(pId_provider->total_free_cnt == max_id / 20 + 1 + (j - max_id / 2) + 1);
224 for (j = 0; j <= max_id / 20; j++) {
225 error = util_provide_id(pId_provider, &id);
226 fail_unless(error == UTIL_ID_PROVIDER_OK);
227 fail_unless(j == id);
229 fail_unless(pId_provider->total_free_cnt == max_id / 20 + 1 + (max_id - max_id / 2) + 1 - (j + 1));
232 for (j = max_id / 2; j <= max_id; j++) {
233 error = util_provide_id(pId_provider, &id);
234 fail_unless(error == UTIL_ID_PROVIDER_OK);
235 fail_unless(j == id);
237 fail_unless(pId_provider->total_free_cnt == max_id / 20 + 1 + (max_id - max_id / 2) + 1 - (max_id / 20 + 1) - (j - max_id / 2 + 1));
240 error = util_provide_id(pId_provider, &id);
241 fail_unless(error == UTIL_ID_PROVIDER_NOT_ENOUGH_ID);
242 fail_unless(pId_provider->total_free_cnt == 0);
244 fail_unless(UTIL_ID_PROVIDER_OK == util_delete_id(pId_provider, 50));
245 fail_unless(pId_provider->total_free_cnt == 1);
247 fail_unless(UTIL_ID_PROVIDER_NOT_EXIST_ID == util_delete_id(pId_provider, 50));
248 fail_unless(pId_provider->total_free_cnt == 1);
250 fail_unless(UTIL_ID_PROVIDER_OUT_OF_ID_RANGE == util_delete_id(pId_provider, max_id + 1));
251 fail_unless(UTIL_ID_PROVIDER_OUT_OF_ID_RANGE == util_delete_id(pId_provider, max_id + 2));
252 fail_unless(UTIL_ID_PROVIDER_OUT_OF_ID_RANGE == util_delete_id(pId_provider, max_id + 1000));
254 util_destroy_id_provider(pId_provider);
255 fprintf(stderr, "%s\n", "provide_id_with_delete_id_test2 done");
260 END_TEST START_TEST(provide_id_without_unchanged_list)
264 unsigned int page_bit_cnt = (1024 * 4) * 8;
265 unsigned int max_id = 3 * page_bit_cnt - 1;
266 util_id_provider_s *pId_provider = util_create_id_provider(max_id, 12, true);
271 util_id_provider_error_e error = UTIL_ID_PROVIDER_OK;
272 fail_unless(pId_provider->total_free_cnt == max_id + 1);
274 for (i = 0; i < page_bit_cnt; i++) {
275 error = util_provide_id(pId_provider, &id);
276 fail_unless(error == UTIL_ID_PROVIDER_OK);
277 fail_unless(i == id);
278 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
280 fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 1);
281 fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
282 fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
283 fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
286 for (i = page_bit_cnt; i < 2 * page_bit_cnt; i++) {
287 error = util_provide_id(pId_provider, &id);
288 fail_unless(error == UTIL_ID_PROVIDER_OK);
289 fail_unless(i == id);
290 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
292 fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 2);
293 fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
294 fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
295 fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
298 for (i = 2 * page_bit_cnt; i < 3 * page_bit_cnt; i++) {
299 error = util_provide_id(pId_provider, &id);
300 fail_unless(error == UTIL_ID_PROVIDER_OK);
301 fail_unless(i == id);
302 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
304 fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 3);
305 fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
306 fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
307 fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
310 for (i = 0; i < page_bit_cnt - 1; i++) {
311 error = util_delete_id(pId_provider, i);
312 fail_unless(error == UTIL_ID_PROVIDER_OK);
313 fail_unless(pId_provider->total_free_cnt == (i + 1));
315 fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 3);
316 fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
317 fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
318 fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
321 error = util_delete_id(pId_provider, page_bit_cnt - 1);
322 fail_unless(error == UTIL_ID_PROVIDER_OK);
323 fail_unless(pId_provider->total_free_cnt == page_bit_cnt);
325 fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 2);
326 fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
327 fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
328 fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
330 util_destroy_id_provider(pId_provider);
335 END_TEST START_TEST(provide_id_with_unchanged_list)
339 unsigned int page_bit_cnt = (1024 * 4) * 8;
340 unsigned int max_id = 4 * page_bit_cnt - 1;
341 util_id_provider_s *pId_provider = util_create_id_provider(max_id, 12, true);
346 util_id_provider_error_e error = UTIL_ID_PROVIDER_OK;
347 fail_unless(pId_provider->total_free_cnt == max_id + 1);
350 for (i = 0; i < page_bit_cnt; i++) {
351 error = util_provide_id(pId_provider, &id);
352 fail_unless(error == UTIL_ID_PROVIDER_OK);
353 fail_unless(i == id);
354 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
356 fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 1);
357 fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
358 fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
359 fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
362 for (i = page_bit_cnt; i < 2 * page_bit_cnt; i++) {
363 error = util_provide_id(pId_provider, &id);
364 fail_unless(error == UTIL_ID_PROVIDER_OK);
365 fail_unless(i == id);
366 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
368 fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 2);
369 fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
370 fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
371 fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
374 for (i = 2 * page_bit_cnt; i < 3 * page_bit_cnt; i++) {
375 error = util_provide_id(pId_provider, &id);
376 fail_unless(error == UTIL_ID_PROVIDER_OK);
377 fail_unless(i == id);
378 fail_unless(pId_provider->total_free_cnt == (max_id + 1 - (i + 1)));
380 fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 3);
381 fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
382 fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
383 fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 0);
386 /* move all add list to unchaged list for test */
387 util_id_provider_move_id_page(pId_provider, pId_provider->id_page_array[0], UTIL_ID_PAGE_FLAG_UNCHANGED);
388 util_id_provider_move_id_page(pId_provider, pId_provider->id_page_array[1], UTIL_ID_PAGE_FLAG_UNCHANGED);
389 util_id_provider_move_id_page(pId_provider, pId_provider->id_page_array[2], UTIL_ID_PAGE_FLAG_UNCHANGED);
391 fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 0);
392 fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
393 fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
394 fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 3);
396 /* test started from here */
397 for (i = 0; i < page_bit_cnt - 1; i++) {
398 error = util_delete_id(pId_provider, i);
399 fail_unless(error == UTIL_ID_PROVIDER_OK);
400 fail_unless(pId_provider->total_free_cnt == page_bit_cnt + (i + 1));
402 fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 0);
403 fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 1);
404 fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 0);
405 fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 2);
408 error = util_delete_id(pId_provider, page_bit_cnt - 1);
409 fail_unless(error == UTIL_ID_PROVIDER_OK);
410 fail_unless(pId_provider->total_free_cnt == 2 * page_bit_cnt);
412 fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 0);
413 fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
414 fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 1);
415 fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 2);
417 for (i = 3 * page_bit_cnt; i < 4 * page_bit_cnt; i++) {
418 error = util_provide_id(pId_provider, &id);
419 fail_unless(error == UTIL_ID_PROVIDER_OK);
420 fail_unless(i == id);
421 fail_unless(pId_provider->total_free_cnt == (2 * page_bit_cnt - (i - 3 * page_bit_cnt + 1)));
423 fail_unless(list_count(&(pId_provider->pTracking->id_page_add_list_head)) == 1);
424 fail_unless(list_count(&(pId_provider->pTracking->id_page_update_list_head)) == 0);
425 fail_unless(list_count(&(pId_provider->pTracking->id_page_delete_list_head)) == 1);
426 fail_unless(list_count(&(pId_provider->pTracking->id_page_unchanged_list_head)) == 2);
429 util_destroy_id_provider(pId_provider);
434 END_TEST Suite *fw_sequential_id_provider_suite(void)
438 /* create test suite */
439 Suite *s = suite_create("fw_sequential_id_provider_suite");
441 /* test case create and add in suite */
443 TCase *tcase = tcase_create("provide_id_without_delete_id");
445 tcase_add_test(tcase, provide_id_without_delete_id_test1);
446 tcase_add_test(tcase, provide_id_without_delete_id_test2);
447 tcase_add_test(tcase, provide_id_without_delete_id_test3);
449 tcase_set_timeout(tcase, 1);
451 suite_add_tcase(s, tcase);
454 /* create another test case and add to test suite just like above code */
456 TCase *tcase = tcase_create("provide_id_with_delete_id");
457 tcase_add_test(tcase, provide_id_with_delete_id_test1);
458 tcase_add_test(tcase, provide_id_with_delete_id_test2);
459 tcase_set_timeout(tcase, 1);
460 suite_add_tcase(s, tcase);
463 /* create another test case and add to test suite just like above code */
465 TCase *tcase = tcase_create("provide_id_tracking_mode");
466 tcase_add_test(tcase, provide_id_without_unchanged_list);
467 tcase_add_test(tcase, provide_id_with_unchanged_list);
468 tcase_set_timeout(tcase, 1);
469 suite_add_tcase(s, tcase);