xref: /freebsd/tests/sys/netinet/libalias/1_instance.c (revision 45f57ce1224b5fdf05c0c68aee4d134436e0efba)
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