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