xref: /freebsd/tests/sys/netgraph/basic.c (revision 43e4821315c31db067e23564b9bfafb519e77b2b)
1a664ade9SLutz Donnerhacke /*-
224ea1dbfSLutz Donnerhacke  * SPDX-License-Identifier: BSD-3-Clause
324ea1dbfSLutz Donnerhacke  *
424ea1dbfSLutz Donnerhacke  * Copyright 2021 Lutz Donnerhacke
524ea1dbfSLutz Donnerhacke  *
624ea1dbfSLutz Donnerhacke  * Redistribution and use in source and binary forms, with or without
724ea1dbfSLutz Donnerhacke  * modification, are permitted provided that the following conditions
824ea1dbfSLutz Donnerhacke  * are met:
924ea1dbfSLutz Donnerhacke  *
1024ea1dbfSLutz Donnerhacke  * 1. Redistributions of source code must retain the above copyright
1124ea1dbfSLutz Donnerhacke  *    notice, this list of conditions and the following disclaimer.
1224ea1dbfSLutz Donnerhacke  * 2. Redistributions in binary form must reproduce the above
1324ea1dbfSLutz Donnerhacke  *    copyright notice, this list of conditions and the following
1424ea1dbfSLutz Donnerhacke  *    disclaimer in the documentation and/or other materials provided
1524ea1dbfSLutz Donnerhacke  *    with the distribution.
1624ea1dbfSLutz Donnerhacke  * 3. Neither the name of the copyright holder nor the names of its
1724ea1dbfSLutz Donnerhacke  *    contributors may be used to endorse or promote products derived
1824ea1dbfSLutz Donnerhacke  *    from this software without specific prior written permission.
1924ea1dbfSLutz Donnerhacke  *
2024ea1dbfSLutz Donnerhacke  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
2124ea1dbfSLutz Donnerhacke  * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
2224ea1dbfSLutz Donnerhacke  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
2324ea1dbfSLutz Donnerhacke  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
2424ea1dbfSLutz Donnerhacke  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
2524ea1dbfSLutz Donnerhacke  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2624ea1dbfSLutz Donnerhacke  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
2724ea1dbfSLutz Donnerhacke  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2824ea1dbfSLutz Donnerhacke  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
2924ea1dbfSLutz Donnerhacke  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
3024ea1dbfSLutz Donnerhacke  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
3124ea1dbfSLutz Donnerhacke  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3224ea1dbfSLutz Donnerhacke  * SUCH DAMAGE.
3324ea1dbfSLutz Donnerhacke  */
3424ea1dbfSLutz Donnerhacke #include <atf-c.h>
3524ea1dbfSLutz Donnerhacke #include <errno.h>
3624ea1dbfSLutz Donnerhacke #include <stdio.h>
3724ea1dbfSLutz Donnerhacke 
3824ea1dbfSLutz Donnerhacke #include "util.h"
3924ea1dbfSLutz Donnerhacke 
4024ea1dbfSLutz Donnerhacke ATF_TC(send_recv);
ATF_TC_HEAD(send_recv,conf)4124ea1dbfSLutz Donnerhacke ATF_TC_HEAD(send_recv, conf)
4224ea1dbfSLutz Donnerhacke {
4324ea1dbfSLutz Donnerhacke 	atf_tc_set_md_var(conf, "require.user", "root");
4424ea1dbfSLutz Donnerhacke }
45a664ade9SLutz Donnerhacke 
ATF_TC_BODY(send_recv,dummy)4624ea1dbfSLutz Donnerhacke ATF_TC_BODY(send_recv, dummy)
4724ea1dbfSLutz Donnerhacke {
4824ea1dbfSLutz Donnerhacke 	char		msg[] = "test";
490afa9be0SLutz Donnerhacke 	ng_counter_t	r;
5024ea1dbfSLutz Donnerhacke 
5124ea1dbfSLutz Donnerhacke 	ng_init();
5224ea1dbfSLutz Donnerhacke 	ng_connect(".", "a", ".", "b");
530afa9be0SLutz Donnerhacke 	ng_register_data("b", get_data0);
5424ea1dbfSLutz Donnerhacke 	ng_send_data("a", msg, sizeof(msg));
5524ea1dbfSLutz Donnerhacke 
560afa9be0SLutz Donnerhacke 	ng_counter_clear(r);
570afa9be0SLutz Donnerhacke 	ng_handle_events(50, &r);
580afa9be0SLutz Donnerhacke 	ATF_CHECK(r[0] == 1);
5924ea1dbfSLutz Donnerhacke }
6024ea1dbfSLutz Donnerhacke 
6124ea1dbfSLutz Donnerhacke ATF_TC(node);
ATF_TC_HEAD(node,conf)6224ea1dbfSLutz Donnerhacke ATF_TC_HEAD(node, conf)
6324ea1dbfSLutz Donnerhacke {
6424ea1dbfSLutz Donnerhacke 	atf_tc_set_md_var(conf, "require.user", "root");
6524ea1dbfSLutz Donnerhacke }
66a664ade9SLutz Donnerhacke 
ATF_TC_BODY(node,dummy)6724ea1dbfSLutz Donnerhacke ATF_TC_BODY(node, dummy)
6824ea1dbfSLutz Donnerhacke {
6924ea1dbfSLutz Donnerhacke 	char		msg[] = "test";
700afa9be0SLutz Donnerhacke 	ng_counter_t	r;
7124ea1dbfSLutz Donnerhacke 
7224ea1dbfSLutz Donnerhacke 	ng_init();
7324ea1dbfSLutz Donnerhacke 	ng_mkpeer(".", "a", "hub", "a");
7424ea1dbfSLutz Donnerhacke 	ng_name("a", "test hub");
7524ea1dbfSLutz Donnerhacke 
76*43e48213SLutz Donnerhacke 	ng_errors(PASS);
77*43e48213SLutz Donnerhacke 	ng_name("a", "test hub");
78*43e48213SLutz Donnerhacke 	ng_errors(FAIL);
79*43e48213SLutz Donnerhacke 	if (errno == EADDRINUSE)
80*43e48213SLutz Donnerhacke 		atf_tc_expect_fail("PR241954");
81*43e48213SLutz Donnerhacke 	ATF_CHECK_ERRNO(0, 1);
82*43e48213SLutz Donnerhacke 	atf_tc_expect_pass();
8324ea1dbfSLutz Donnerhacke 
8424ea1dbfSLutz Donnerhacke 	ng_connect(".", "b", "test hub:", "b");
8524ea1dbfSLutz Donnerhacke 	ng_connect(".", "c", "test hub:", "c");
860afa9be0SLutz Donnerhacke 	ng_register_data("a", get_data0);
870afa9be0SLutz Donnerhacke 	ng_register_data("b", get_data1);
880afa9be0SLutz Donnerhacke 	ng_register_data("c", get_data2);
8924ea1dbfSLutz Donnerhacke 
900afa9be0SLutz Donnerhacke 	ng_counter_clear(r);
9124ea1dbfSLutz Donnerhacke 	ng_send_data("a", msg, sizeof(msg));
920afa9be0SLutz Donnerhacke 	ng_handle_events(50, &r);
930afa9be0SLutz Donnerhacke 	ATF_CHECK(r[0] == 0 && r[1] == 1 && r[2] == 1);
9424ea1dbfSLutz Donnerhacke 
9524ea1dbfSLutz Donnerhacke 	ng_rmhook(".", "b");
960afa9be0SLutz Donnerhacke 	ng_counter_clear(r);
9724ea1dbfSLutz Donnerhacke 	ng_send_data("a", msg, sizeof(msg));
980afa9be0SLutz Donnerhacke 	ng_handle_events(50, &r);
990afa9be0SLutz Donnerhacke 	ATF_CHECK(r[0] == 0 && r[1] == 0 && r[2] == 1);
10024ea1dbfSLutz Donnerhacke 
10124ea1dbfSLutz Donnerhacke 	ng_shutdown("test hub:");
10224ea1dbfSLutz Donnerhacke }
10324ea1dbfSLutz Donnerhacke 
10424ea1dbfSLutz Donnerhacke ATF_TC(message);
ATF_TC_HEAD(message,conf)10524ea1dbfSLutz Donnerhacke ATF_TC_HEAD(message, conf)
10624ea1dbfSLutz Donnerhacke {
10724ea1dbfSLutz Donnerhacke 	atf_tc_set_md_var(conf, "require.user", "root");
10824ea1dbfSLutz Donnerhacke }
109a664ade9SLutz Donnerhacke 
ATF_TC_BODY(message,dummy)11024ea1dbfSLutz Donnerhacke ATF_TC_BODY(message, dummy)
11124ea1dbfSLutz Donnerhacke {
11224ea1dbfSLutz Donnerhacke 	ng_init();
11324ea1dbfSLutz Donnerhacke 	ng_mkpeer(".", "a", "hub", "a");
11424ea1dbfSLutz Donnerhacke 	ng_name("a", "test hub");
11524ea1dbfSLutz Donnerhacke 
11624ea1dbfSLutz Donnerhacke 	ng_send_msg("test hub:", "setpersistent");
11724ea1dbfSLutz Donnerhacke 	ng_rmhook(".", "a");
11824ea1dbfSLutz Donnerhacke 
11924ea1dbfSLutz Donnerhacke 	ng_shutdown("test hub:");
12024ea1dbfSLutz Donnerhacke }
12124ea1dbfSLutz Donnerhacke 
12224ea1dbfSLutz Donnerhacke ATF_TC(same_name);
ATF_TC_HEAD(same_name,conf)12324ea1dbfSLutz Donnerhacke ATF_TC_HEAD(same_name, conf)
12424ea1dbfSLutz Donnerhacke {
12524ea1dbfSLutz Donnerhacke 	atf_tc_set_md_var(conf, "require.user", "root");
12624ea1dbfSLutz Donnerhacke }
127a664ade9SLutz Donnerhacke 
ATF_TC_BODY(same_name,dummy)12824ea1dbfSLutz Donnerhacke ATF_TC_BODY(same_name, dummy)
12924ea1dbfSLutz Donnerhacke {
13024ea1dbfSLutz Donnerhacke 	ng_init();
13124ea1dbfSLutz Donnerhacke 	ng_mkpeer(".", "a", "hub", "a");
13224ea1dbfSLutz Donnerhacke 	ng_name("a", "test");
13324ea1dbfSLutz Donnerhacke 
13424ea1dbfSLutz Donnerhacke 	ng_errors(PASS);
13524ea1dbfSLutz Donnerhacke 	ng_connect(".", "a", ".", "b");
13624ea1dbfSLutz Donnerhacke 	ATF_CHECK_ERRNO(EEXIST, 1);
13724ea1dbfSLutz Donnerhacke 	ng_connect(".", "b", ".", "b");
13824ea1dbfSLutz Donnerhacke 	ATF_CHECK_ERRNO(EEXIST, 1);
13924ea1dbfSLutz Donnerhacke 	ng_name(".", "test");
14024ea1dbfSLutz Donnerhacke 	ATF_CHECK_ERRNO(EADDRINUSE, 1);
14124ea1dbfSLutz Donnerhacke 
14224ea1dbfSLutz Donnerhacke 	ng_errors(FAIL);
14324ea1dbfSLutz Donnerhacke 	ng_shutdown("test:");
14424ea1dbfSLutz Donnerhacke }
14524ea1dbfSLutz Donnerhacke 
14624ea1dbfSLutz Donnerhacke ATF_TC(queuelimit);
ATF_TC_HEAD(queuelimit,conf)14724ea1dbfSLutz Donnerhacke ATF_TC_HEAD(queuelimit, conf)
14824ea1dbfSLutz Donnerhacke {
14924ea1dbfSLutz Donnerhacke 	atf_tc_set_md_var(conf, "require.user", "root");
15024ea1dbfSLutz Donnerhacke }
151a664ade9SLutz Donnerhacke 
ATF_TC_BODY(queuelimit,dummy)15224ea1dbfSLutz Donnerhacke ATF_TC_BODY(queuelimit, dummy)
15324ea1dbfSLutz Donnerhacke {
1540afa9be0SLutz Donnerhacke 	ng_counter_t	r;
1550afa9be0SLutz Donnerhacke 	int		i;
15624ea1dbfSLutz Donnerhacke 	char		msg[] = "test";
15724ea1dbfSLutz Donnerhacke 	const int	MAX = 1000;
15824ea1dbfSLutz Donnerhacke 
15924ea1dbfSLutz Donnerhacke 	ng_init();
16024ea1dbfSLutz Donnerhacke 	ng_connect(".", "a", ".", "b");
1610afa9be0SLutz Donnerhacke 	ng_register_data("b", get_data0);
16224ea1dbfSLutz Donnerhacke 
16324ea1dbfSLutz Donnerhacke 	ng_errors(PASS);
164a664ade9SLutz Donnerhacke 	for (i = 0; i < MAX; i++)
165a664ade9SLutz Donnerhacke 	{
16624ea1dbfSLutz Donnerhacke 		ng_send_data("a", msg, sizeof(msg));
16724ea1dbfSLutz Donnerhacke 		if (errno != 0)
16824ea1dbfSLutz Donnerhacke 			break;
16924ea1dbfSLutz Donnerhacke 		/* no ng_handle_events -> messages stall */
17024ea1dbfSLutz Donnerhacke 	}
17124ea1dbfSLutz Donnerhacke 	ng_errors(FAIL);
17224ea1dbfSLutz Donnerhacke 
1730afa9be0SLutz Donnerhacke 	ng_counter_clear(r);
1740afa9be0SLutz Donnerhacke 	ng_handle_events(50, &r);
1750afa9be0SLutz Donnerhacke 	ATF_CHECK(r[0] > 100);
1760afa9be0SLutz Donnerhacke 	ATF_CHECK(r[0] == i);
17724ea1dbfSLutz Donnerhacke 	atf_tc_expect_fail("Queue full (%d)", i);
1780afa9be0SLutz Donnerhacke 	ATF_CHECK(r[0] == MAX);
17924ea1dbfSLutz Donnerhacke 	atf_tc_expect_pass();
18024ea1dbfSLutz Donnerhacke }
18124ea1dbfSLutz Donnerhacke 
ATF_TP_ADD_TCS(basic)18224ea1dbfSLutz Donnerhacke ATF_TP_ADD_TCS(basic)
18324ea1dbfSLutz Donnerhacke {
18424ea1dbfSLutz Donnerhacke 	ATF_TP_ADD_TC(basic, send_recv);
18524ea1dbfSLutz Donnerhacke 	ATF_TP_ADD_TC(basic, node);
18624ea1dbfSLutz Donnerhacke 	ATF_TP_ADD_TC(basic, message);
18724ea1dbfSLutz Donnerhacke 	ATF_TP_ADD_TC(basic, same_name);
18824ea1dbfSLutz Donnerhacke 	ATF_TP_ADD_TC(basic, queuelimit);
18924ea1dbfSLutz Donnerhacke 
19024ea1dbfSLutz Donnerhacke 	return atf_no_error();
19124ea1dbfSLutz Donnerhacke }
192