xref: /freebsd/tests/sys/netgraph/basic.c (revision 8cc087a1eee9ec1ca9f7ac1e63ad51bdb5a682eb)
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright 2021 Lutz Donnerhacke
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above
13  *    copyright notice, this list of conditions and the following
14  *    disclaimer in the documentation and/or other materials provided
15  *    with the distribution.
16  * 3. Neither the name of the copyright holder nor the names of its
17  *    contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
21  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
22  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
29  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
30  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
31  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34 #include <atf-c.h>
35 #include <errno.h>
36 #include <stdio.h>
37 
38 #include "util.h"
39 
40 ATF_TC(send_recv);
41 ATF_TC_HEAD(send_recv, conf)
42 {
43 	atf_tc_set_md_var(conf, "require.user", "root");
44 }
45 
46 ATF_TC_BODY(send_recv, dummy)
47 {
48 	char		msg[] = "test";
49 	ng_counter_t	r;
50 
51 	ng_init();
52 	ng_connect(".", "a", ".", "b");
53 	ng_register_data("b", get_data0);
54 	ng_send_data("a", msg, sizeof(msg));
55 
56 	ng_counter_clear(r);
57 	ng_handle_events(50, &r);
58 	ATF_CHECK(r[0] == 1);
59 }
60 
61 ATF_TC(node);
62 ATF_TC_HEAD(node, conf)
63 {
64 	atf_tc_set_md_var(conf, "require.user", "root");
65 }
66 
67 ATF_TC_BODY(node, dummy)
68 {
69 	char		msg[] = "test";
70 	ng_counter_t	r;
71 
72 	ng_init();
73 	ng_mkpeer(".", "a", "hub", "a");
74 	ng_name("a", "test hub");
75 
76 	ng_errors(PASS);
77 	ng_name("a", "test hub");
78 	ng_errors(FAIL);
79 	if (errno == EADDRINUSE)
80 		atf_tc_expect_fail("PR241954");
81 	ATF_CHECK_ERRNO(0, 1);
82 	atf_tc_expect_pass();
83 
84 	ng_connect(".", "b", "test hub:", "b");
85 	ng_connect(".", "c", "test hub:", "c");
86 	ng_register_data("a", get_data0);
87 	ng_register_data("b", get_data1);
88 	ng_register_data("c", get_data2);
89 
90 	ng_counter_clear(r);
91 	ng_send_data("a", msg, sizeof(msg));
92 	ng_handle_events(50, &r);
93 	ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1);
94 
95 	ng_rmhook(".", "b");
96 	ng_counter_clear(r);
97 	ng_send_data("a", msg, sizeof(msg));
98 	ng_handle_events(50, &r);
99 	ATF_CHECK(r[0] == 0 && r[1] == 0 && r[2] == 1);
100 
101 	ng_shutdown("test hub:");
102 }
103 
104 ATF_TC(message);
105 ATF_TC_HEAD(message, conf)
106 {
107 	atf_tc_set_md_var(conf, "require.user", "root");
108 }
109 
110 ATF_TC_BODY(message, dummy)
111 {
112 	ng_init();
113 	ng_mkpeer(".", "a", "hub", "a");
114 	ng_name("a", "test hub");
115 
116 	ng_send_msg("test hub:", "setpersistent");
117 	ng_rmhook(".", "a");
118 
119 	ng_shutdown("test hub:");
120 }
121 
122 ATF_TC(same_name);
123 ATF_TC_HEAD(same_name, conf)
124 {
125 	atf_tc_set_md_var(conf, "require.user", "root");
126 }
127 
128 ATF_TC_BODY(same_name, dummy)
129 {
130 	ng_init();
131 	ng_mkpeer(".", "a", "hub", "a");
132 	ng_name("a", "test");
133 
134 	ng_errors(PASS);
135 	ng_connect(".", "a", ".", "b");
136 	ATF_CHECK_ERRNO(EEXIST, 1);
137 	ng_connect(".", "b", ".", "b");
138 	ATF_CHECK_ERRNO(EEXIST, 1);
139 	ng_name(".", "test");
140 	ATF_CHECK_ERRNO(EADDRINUSE, 1);
141 
142 	ng_errors(FAIL);
143 	ng_shutdown("test:");
144 }
145 
146 ATF_TC(queuelimit);
147 ATF_TC_HEAD(queuelimit, conf)
148 {
149 	atf_tc_set_md_var(conf, "require.user", "root");
150 }
151 
152 ATF_TC_BODY(queuelimit, dummy)
153 {
154 	ng_counter_t	r;
155 	int		i;
156 	char		msg[] = "test";
157 	const int	MAX = 1000;
158 
159 	ng_init();
160 	ng_connect(".", "a", ".", "b");
161 	ng_register_data("b", get_data0);
162 
163 	ng_errors(PASS);
164 	for (i = 0; i < MAX; i++)
165 	{
166 		ng_send_data("a", msg, sizeof(msg));
167 		if (errno != 0)
168 			break;
169 		/* no ng_handle_events -> messages stall */
170 	}
171 	ng_errors(FAIL);
172 
173 	ng_counter_clear(r);
174 	ng_handle_events(50, &r);
175 	ATF_CHECK(r[0] > 100);
176 	ATF_CHECK(r[0] == i);
177 	atf_tc_expect_fail("Queue full (%d)", i);
178 	ATF_CHECK(r[0] == MAX);
179 	atf_tc_expect_pass();
180 }
181 
182 ATF_TP_ADD_TCS(basic)
183 {
184 	ATF_TP_ADD_TC(basic, send_recv);
185 	ATF_TP_ADD_TC(basic, node);
186 	ATF_TP_ADD_TC(basic, message);
187 	ATF_TP_ADD_TC(basic, same_name);
188 	ATF_TP_ADD_TC(basic, queuelimit);
189 
190 	return atf_no_error();
191 }
192