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