1 #include <atf-c.h> 2 #include <alias.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 static int randcmp(const void *a, const void *b) { 7 int res, r = rand(); 8 9 (void)a; 10 (void)b; 11 res = (r/4 < RAND_MAX/9) ? 1 12 : (r/5 < RAND_MAX/9) ? 0 13 : -1; 14 return (res); 15 } 16 17 ATF_TC(2_destroynull); 18 ATF_TC_HEAD(2_destroynull, env) 19 { 20 atf_tc_set_md_var(env, "descr", "Destroy the NULL instance"); 21 } 22 ATF_TC_BODY(2_destroynull, dummy) 23 { 24 atf_tc_expect_death("Code expects valid pointer."); 25 LibAliasUninit(NULL); 26 } 27 28 ATF_TC(1_singleinit); 29 ATF_TC_HEAD(1_singleinit, env) 30 { 31 atf_tc_set_md_var(env, "descr", "Create an instance"); 32 } 33 ATF_TC_BODY(1_singleinit, dummy) 34 { 35 struct libalias *la; 36 37 la = LibAliasInit(NULL); 38 ATF_CHECK_MSG(la != NULL, "Creating an instance failed."); 39 LibAliasUninit(la); 40 } 41 42 ATF_TC(3_multiinit); 43 ATF_TC_HEAD(3_multiinit, env) 44 { 45 atf_tc_set_md_var(env, "descr", "Recreate an instance multiple times"); 46 } 47 ATF_TC_BODY(3_multiinit, dummy) 48 { 49 struct libalias *la; 50 int i; 51 52 la = LibAliasInit(NULL); 53 for(i = 1; i < 30; i++) { 54 struct libalias *lo = la; 55 56 la = LibAliasInit(la); 57 ATF_CHECK_MSG(la == lo, "Recreating moved the instance around: %d", i); 58 } 59 LibAliasUninit(la); 60 } 61 62 ATF_TC(4_multiinstance); 63 ATF_TC_HEAD(4_multiinstance, env) 64 { 65 atf_tc_set_md_var(env, "descr", "Create and destoy multiple instances."); 66 } 67 ATF_TC_BODY(4_multiinstance, dummy) 68 { 69 struct libalias *la[300]; 70 int const num_instances = sizeof(la) / sizeof(*la); 71 int i; 72 73 for (i = 0; i < num_instances; i++) { 74 la[i] = LibAliasInit(NULL); 75 ATF_CHECK_MSG(la[i] != NULL, "Creating instance %d failed.", i); 76 } 77 78 qsort(la, num_instances, sizeof(*la), randcmp); 79 80 for (i = 0; i < num_instances; i++) 81 LibAliasUninit(la[i]); 82 } 83 84 ATF_TP_ADD_TCS(instance) 85 { 86 /* Use "dd if=/dev/random bs=2 count=1 | od -x" to reproduce */ 87 srand(0x5ac4); 88 89 ATF_TP_ADD_TC(instance, 2_destroynull); 90 ATF_TP_ADD_TC(instance, 1_singleinit); 91 ATF_TP_ADD_TC(instance, 3_multiinit); 92 ATF_TP_ADD_TC(instance, 4_multiinstance); 93 94 return atf_no_error(); 95 } 96