1
/* vim:ts=8:sts=8:sw=4:noai:noexpandtab
3
* unit tests for concurrency operations.
5
* Copyright (c) 2011 Miru Limited.
7
* This library is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
12
* This library is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with this library; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33
/* mock functions for external references */
49
pgm_thread_shutdown ();
61
* pgm_thread_init (void)
64
START_TEST (test_init_pass_001)
67
#ifdef PGM_CHECK_NOFORK
68
pgm_thread_shutdown ();
75
* pgm_thread_shutdown (void)
78
START_TEST (test_shutdown_pass_001)
80
/* unreferences are emitted as warnings */
81
pgm_thread_shutdown ();
82
pgm_thread_shutdown ();
85
pgm_thread_shutdown ();
91
* pgm_mutex_init (pgm_mutex_t* mutex)
94
START_TEST (test_mutex_init_pass_001)
97
pgm_mutex_init (&mutex);
98
#ifdef PGM_CHECK_NOFORK
99
pgm_mutex_free (&mutex);
106
* pgm_mutex_free (pgm_mutex_t* mutex)
109
START_TEST (test_mutex_free_pass_001)
112
pgm_mutex_init (&mutex);
113
pgm_mutex_free (&mutex);
119
* pgm_mutex_lock (pgm_mutex_t* mutex)
122
START_TEST (test_mutex_lock_pass_001)
125
pgm_mutex_init (&mutex);
126
pgm_mutex_lock (&mutex);
127
#ifdef PGM_CHECK_NOFORK
128
pgm_mutex_unlock (&mutex);
129
pgm_mutex_free (&mutex);
136
* pgm_mutex_unlock (pgm_mutex_t* mutex)
139
START_TEST (test_mutex_unlock_pass_001)
142
pgm_mutex_init (&mutex);
143
pgm_mutex_lock (&mutex);
144
pgm_mutex_unlock (&mutex);
145
pgm_mutex_free (&mutex);
151
* pgm_mutex_trylock (pgm_mutex_t* mutex)
154
START_TEST (test_mutex_trylock_pass_001)
157
pgm_mutex_init (&mutex);
158
fail_unless (TRUE == pgm_mutex_trylock (&mutex), "initial state lock");
160
fail_unless (FALSE == pgm_mutex_trylock (&mutex), "locked mutex");
162
/* only works in separate threads */
163
fail_unless (TRUE == pgm_mutex_trylock (&mutex), "locked mutex");
165
pgm_mutex_unlock (&mutex);
166
fail_unless (TRUE == pgm_mutex_trylock (&mutex), "unlocked mutex");
167
pgm_mutex_unlock (&mutex);
168
pgm_mutex_free (&mutex);
174
* pgm_spinlock_init (pgm_spinlock_t* spinlock)
177
START_TEST (test_spinlock_init_pass_001)
179
pgm_spinlock_t spinlock;
180
pgm_spinlock_init (&spinlock);
181
#ifdef PGM_CHECK_NOFORK
182
pgm_spinlock_free (&spinlock);
189
* pgm_spinlock_free (pgm_spinlock_t* spinlock)
192
START_TEST (test_spinlock_free_pass_001)
194
pgm_spinlock_t spinlock;
195
pgm_spinlock_init (&spinlock);
196
pgm_spinlock_free (&spinlock);
202
* pgm_spinlock_lock (pgm_spinlock_t* spinlock)
205
START_TEST (test_spinlock_lock_pass_001)
207
pgm_spinlock_t spinlock;
208
pgm_spinlock_init (&spinlock);
209
pgm_spinlock_lock (&spinlock);
210
#ifdef PGM_CHECK_NOFORK
211
pgm_spinlock_unlock (&spinlock);
212
pgm_spinlock_free (&spinlock);
219
* pgm_spinlock_unlock (pgm_spinlock_t* spinlock)
222
START_TEST (test_spinlock_unlock_pass_001)
224
pgm_spinlock_t spinlock;
225
pgm_spinlock_init (&spinlock);
226
pgm_spinlock_lock (&spinlock);
227
pgm_spinlock_unlock (&spinlock);
228
pgm_spinlock_free (&spinlock);
234
* pgm_spinlock_trylock (pgm_spinlock_t* spinlock)
237
START_TEST (test_spinlock_trylock_pass_001)
239
pgm_spinlock_t spinlock;
240
pgm_spinlock_init (&spinlock);
241
fail_unless (TRUE == pgm_spinlock_trylock (&spinlock), "initial state lock");
242
fail_unless (FALSE == pgm_spinlock_trylock (&spinlock), "locked spinlock");
243
pgm_spinlock_unlock (&spinlock);
244
fail_unless (TRUE == pgm_spinlock_trylock (&spinlock), "unlocked spinlock");
245
pgm_spinlock_unlock (&spinlock);
246
pgm_spinlock_free (&spinlock);
252
* pgm_rwlock_init (pgm_rwlock_t* rwlock)
255
START_TEST (test_rwlock_init_pass_001)
258
pgm_rwlock_init (&rwlock);
259
#ifdef PGM_CHECK_NOFORK
260
pgm_rwlock_free (&rwlock);
267
* pgm_rwlock_free (pgm_rwlock_t* rwlock)
270
START_TEST (test_rwlock_free_pass_001)
273
pgm_rwlock_init (&rwlock);
274
pgm_rwlock_free (&rwlock);
280
* pgm_rwlock_reader_lock (pgm_rwlock_t* rwlock)
283
START_TEST (test_rwlock_reader_lock_pass_001)
286
pgm_rwlock_init (&rwlock);
287
/* multiple readers permitted */
288
pgm_rwlock_reader_lock (&rwlock);
289
pgm_rwlock_reader_lock (&rwlock);
290
#ifdef PGM_CHECK_NOFORK
291
pgm_rwlock_reader_unlock (&rwlock);
292
pgm_rwlock_reader_unlock (&rwlock);
293
pgm_rwlock_free (&rwlock);
300
* pgm_rwlock_reader_unlock (pgm_rwlock_t* rwlock)
303
START_TEST (test_rwlock_reader_unlock_pass_001)
306
pgm_rwlock_init (&rwlock);
308
pgm_rwlock_reader_lock (&rwlock);
309
pgm_rwlock_reader_unlock (&rwlock);
311
pgm_rwlock_reader_lock (&rwlock);
312
pgm_rwlock_reader_lock (&rwlock);
313
pgm_rwlock_reader_unlock (&rwlock);
314
pgm_rwlock_reader_unlock (&rwlock);
315
pgm_rwlock_free (&rwlock);
321
* pgm_rwlock_reader_trylock (pgm_rwlock_t* rwlock)
324
START_TEST (test_rwlock_reader_trylock_pass_001)
327
pgm_rwlock_init (&rwlock);
328
fail_unless (TRUE == pgm_rwlock_reader_trylock (&rwlock), "initial state lock");
329
fail_unless (TRUE == pgm_rwlock_reader_trylock (&rwlock), "reader locked");
330
pgm_rwlock_reader_unlock (&rwlock);
331
fail_unless (TRUE == pgm_rwlock_reader_trylock (&rwlock), "reader unlocked");
332
pgm_rwlock_reader_unlock (&rwlock);
333
pgm_rwlock_reader_unlock (&rwlock);
334
pgm_rwlock_free (&rwlock);
340
* pgm_rwlock_writer_lock (pgm_rwlock_t* rwlock)
343
START_TEST (test_rwlock_writer_lock_pass_001)
346
pgm_rwlock_init (&rwlock);
347
/* only single writer permitted */
348
fail_unless (TRUE == pgm_rwlock_reader_trylock (&rwlock), "initial state lock");
349
pgm_rwlock_reader_unlock (&rwlock);
350
pgm_rwlock_writer_lock (&rwlock);
351
fail_unless (FALSE == pgm_rwlock_reader_trylock (&rwlock), "writer locked");
352
#ifdef PGM_CHECK_NOFORK
353
pgm_rwlock_writer_unlock (&rwlock);
354
pgm_rwlock_free (&rwlock);
361
* pgm_rwlock_writer_unlock (pgm_rwlock_t* rwlock)
364
START_TEST (test_rwlock_writer_unlock_pass_001)
367
pgm_rwlock_init (&rwlock);
369
pgm_rwlock_writer_lock (&rwlock);
370
fail_unless (FALSE == pgm_rwlock_reader_trylock (&rwlock), "writer locked");
371
pgm_rwlock_writer_unlock (&rwlock);
372
fail_unless (TRUE == pgm_rwlock_reader_trylock (&rwlock), "writer unlocked");
373
pgm_rwlock_reader_unlock (&rwlock);
374
pgm_rwlock_writer_lock (&rwlock);
375
fail_unless (FALSE == pgm_rwlock_reader_trylock (&rwlock), "writer locked");
376
pgm_rwlock_writer_unlock (&rwlock);
377
pgm_rwlock_free (&rwlock);
383
* pgm_rwlock_writer_trylock (pgm_rwlock_t* rwlock)
386
START_TEST (test_rwlock_writer_trylock_pass_001)
389
pgm_rwlock_init (&rwlock);
391
fail_unless (TRUE == pgm_rwlock_writer_trylock (&rwlock), "writer lock");
392
pgm_rwlock_writer_unlock (&rwlock);
394
fail_unless (TRUE == pgm_rwlock_reader_trylock (&rwlock), "reader lock");
395
fail_unless (FALSE == pgm_rwlock_writer_trylock (&rwlock), "writer on reader locked");
396
fail_unless (TRUE == pgm_rwlock_reader_trylock (&rwlock), "reader lock");
397
fail_unless (FALSE == pgm_rwlock_writer_trylock (&rwlock), "writer on reader locked");
398
pgm_rwlock_reader_unlock (&rwlock);
399
fail_unless (FALSE == pgm_rwlock_writer_trylock (&rwlock), "writer on reader locked");
400
pgm_rwlock_reader_unlock (&rwlock);
402
fail_unless (TRUE == pgm_rwlock_writer_trylock (&rwlock), "writer lock");
403
fail_unless (FALSE == pgm_rwlock_reader_trylock (&rwlock), "reader on writer locked");
404
fail_unless (FALSE == pgm_rwlock_reader_trylock (&rwlock), "reader on writer locked");
405
pgm_rwlock_writer_unlock (&rwlock);
406
fail_unless (TRUE == pgm_rwlock_reader_trylock (&rwlock), "reader lock");
407
pgm_rwlock_reader_unlock (&rwlock);
409
fail_unless (TRUE == pgm_rwlock_reader_trylock (&rwlock), "reader lock");
410
fail_unless (TRUE == pgm_rwlock_reader_trylock (&rwlock), "reader lock");
411
pgm_rwlock_reader_unlock (&rwlock);
412
fail_unless (TRUE == pgm_rwlock_reader_trylock (&rwlock), "reader lock");
413
pgm_rwlock_reader_unlock (&rwlock);
414
pgm_rwlock_reader_unlock (&rwlock);
415
/* wrapped around regular reader locks */
416
pgm_rwlock_reader_lock (&rwlock);
417
fail_unless (FALSE == pgm_rwlock_writer_trylock (&rwlock), "writer on reader locked");
418
pgm_rwlock_reader_lock (&rwlock);
419
fail_unless (FALSE == pgm_rwlock_writer_trylock (&rwlock), "writer on reader locked");
420
pgm_rwlock_reader_unlock (&rwlock);
421
fail_unless (FALSE == pgm_rwlock_writer_trylock (&rwlock), "writer on reader locked");
422
pgm_rwlock_reader_unlock (&rwlock);
423
fail_unless (TRUE == pgm_rwlock_writer_trylock (&rwlock), "writer lock");
424
pgm_rwlock_writer_unlock (&rwlock);
426
pgm_rwlock_free (&rwlock);
432
make_test_suite (void)
436
s = suite_create (__FILE__);
438
TCase* tc_init = tcase_create ("init");
439
suite_add_tcase (s, tc_init);
440
tcase_add_test (tc_init, test_init_pass_001);
442
TCase* tc_shutdown = tcase_create ("shutdown");
443
suite_add_tcase (s, tc_shutdown);
444
tcase_add_test (tc_shutdown, test_shutdown_pass_001);
451
make_mutex_suite (void)
455
s = suite_create ("mutex");
457
TCase* tc_init = tcase_create ("init");
458
tcase_add_checked_fixture (tc_init, mock_setup, mock_teardown);
459
suite_add_tcase (s, tc_init);
460
tcase_add_test (tc_init, test_mutex_init_pass_001);
462
TCase* tc_free = tcase_create ("free");
463
tcase_add_checked_fixture (tc_free, mock_setup, mock_teardown);
464
suite_add_tcase (s, tc_free);
465
tcase_add_test (tc_free, test_mutex_free_pass_001);
467
TCase* tc_lock = tcase_create ("lock");
468
tcase_add_checked_fixture (tc_lock, mock_setup, mock_teardown);
469
suite_add_tcase (s, tc_lock);
470
tcase_add_test (tc_lock, test_mutex_lock_pass_001);
472
TCase* tc_unlock = tcase_create ("unlock");
473
tcase_add_checked_fixture (tc_unlock, mock_setup, mock_teardown);
474
suite_add_tcase (s, tc_unlock);
475
tcase_add_test (tc_unlock, test_mutex_unlock_pass_001);
477
TCase* tc_trylock = tcase_create ("trylock");
478
tcase_add_checked_fixture (tc_trylock, mock_setup, mock_teardown);
479
suite_add_tcase (s, tc_trylock);
480
tcase_add_test (tc_trylock, test_mutex_trylock_pass_001);
487
make_spinlock_suite (void)
491
s = suite_create ("spinlock");
493
TCase* tc_init = tcase_create ("init");
494
tcase_add_checked_fixture (tc_init, mock_setup, mock_teardown);
495
suite_add_tcase (s, tc_init);
496
tcase_add_test (tc_init, test_spinlock_init_pass_001);
498
TCase* tc_free = tcase_create ("free");
499
tcase_add_checked_fixture (tc_free, mock_setup, mock_teardown);
500
suite_add_tcase (s, tc_free);
501
tcase_add_test (tc_free, test_spinlock_free_pass_001);
503
TCase* tc_lock = tcase_create ("lock");
504
tcase_add_checked_fixture (tc_lock, mock_setup, mock_teardown);
505
suite_add_tcase (s, tc_lock);
506
tcase_add_test (tc_lock, test_spinlock_lock_pass_001);
508
TCase* tc_unlock = tcase_create ("unlock");
509
tcase_add_checked_fixture (tc_unlock, mock_setup, mock_teardown);
510
suite_add_tcase (s, tc_unlock);
511
tcase_add_test (tc_unlock, test_spinlock_unlock_pass_001);
513
TCase* tc_trylock = tcase_create ("trylock");
514
tcase_add_checked_fixture (tc_trylock, mock_setup, mock_teardown);
515
suite_add_tcase (s, tc_trylock);
516
tcase_add_test (tc_trylock, test_spinlock_trylock_pass_001);
523
make_rwlock_suite (void)
527
s = suite_create ("rwlock");
529
TCase* tc_init = tcase_create ("init");
530
tcase_add_checked_fixture (tc_init, mock_setup, mock_teardown);
531
suite_add_tcase (s, tc_init);
532
tcase_add_test (tc_init, test_rwlock_init_pass_001);
534
TCase* tc_free = tcase_create ("free");
535
tcase_add_checked_fixture (tc_free, mock_setup, mock_teardown);
536
suite_add_tcase (s, tc_free);
537
tcase_add_test (tc_free, test_rwlock_free_pass_001);
539
TCase* tc_reader_lock = tcase_create ("reader: lock");
540
tcase_add_checked_fixture (tc_reader_lock, mock_setup, mock_teardown);
541
suite_add_tcase (s, tc_reader_lock);
542
tcase_add_test (tc_reader_lock, test_rwlock_reader_lock_pass_001);
544
TCase* tc_reader_unlock = tcase_create ("reader: unlock");
545
tcase_add_checked_fixture (tc_reader_unlock, mock_setup, mock_teardown);
546
suite_add_tcase (s, tc_reader_unlock);
547
tcase_add_test (tc_reader_unlock, test_rwlock_reader_unlock_pass_001);
549
TCase* tc_reader_trylock = tcase_create ("reader: trylock");
550
tcase_add_checked_fixture (tc_reader_trylock, mock_setup, mock_teardown);
551
suite_add_tcase (s, tc_reader_trylock);
552
tcase_add_test (tc_reader_trylock, test_rwlock_reader_trylock_pass_001);
554
TCase* tc_writer_lock = tcase_create ("writer: lock");
555
tcase_add_checked_fixture (tc_writer_lock, mock_setup, mock_teardown);
556
suite_add_tcase (s, tc_writer_lock);
557
tcase_add_test (tc_writer_lock, test_rwlock_writer_lock_pass_001);
559
TCase* tc_writer_unlock = tcase_create ("writer: unlock");
560
tcase_add_checked_fixture (tc_writer_unlock, mock_setup, mock_teardown);
561
suite_add_tcase (s, tc_writer_unlock);
562
tcase_add_test (tc_writer_unlock, test_rwlock_writer_unlock_pass_001);
564
TCase* tc_writer_trylock = tcase_create ("writer: trylock");
565
tcase_add_checked_fixture (tc_writer_trylock, mock_setup, mock_teardown);
566
suite_add_tcase (s, tc_writer_trylock);
567
tcase_add_test (tc_writer_trylock, test_rwlock_writer_trylock_pass_001);
574
make_master_suite (void)
576
Suite* s = suite_create ("Master");
584
SRunner* sr = srunner_create (make_master_suite ());
585
srunner_add_suite (sr, make_test_suite ());
586
srunner_add_suite (sr, make_mutex_suite ());
587
srunner_add_suite (sr, make_spinlock_suite ());
588
srunner_add_suite (sr, make_rwlock_suite ());
589
srunner_run_all (sr, CK_ENV);
590
int number_failed = srunner_ntests_failed (sr);
592
pgm_messages_shutdown();
593
return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;