xref: /minix3/external/bsd/dhcp/dist/server/tests/load_bal_unittest.c (revision 83ee113ee0d94f3844d44065af2311604e9a30ad)
1*83ee113eSDavid van Moolenbroek /*	$NetBSD: load_bal_unittest.c,v 1.1.1.2 2014/07/12 11:58:16 spz Exp $	*/
2*83ee113eSDavid van Moolenbroek /*
3*83ee113eSDavid van Moolenbroek  * Copyright (C) 2012 Internet Systems Consortium, Inc. ("ISC")
4*83ee113eSDavid van Moolenbroek  *
5*83ee113eSDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
6*83ee113eSDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
7*83ee113eSDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
8*83ee113eSDavid van Moolenbroek  *
9*83ee113eSDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10*83ee113eSDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11*83ee113eSDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12*83ee113eSDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13*83ee113eSDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14*83ee113eSDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15*83ee113eSDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
16*83ee113eSDavid van Moolenbroek  */
17*83ee113eSDavid van Moolenbroek 
18*83ee113eSDavid van Moolenbroek #include <config.h>
19*83ee113eSDavid van Moolenbroek 
20*83ee113eSDavid van Moolenbroek #include "dhcpd.h"
21*83ee113eSDavid van Moolenbroek 
22*83ee113eSDavid van Moolenbroek #include <atf-c.h>
23*83ee113eSDavid van Moolenbroek 
24*83ee113eSDavid van Moolenbroek /*
25*83ee113eSDavid van Moolenbroek  * Test the load balancing code.
26*83ee113eSDavid van Moolenbroek  *
27*83ee113eSDavid van Moolenbroek  * The two main variables are:
28*83ee113eSDavid van Moolenbroek  * packet => the "packet" being processed
29*83ee113eSDavid van Moolenbroek  * state  => the "state" of the failover peer
30*83ee113eSDavid van Moolenbroek  * We only fill in the fields necessary for our testing
31*83ee113eSDavid van Moolenbroek  * packet->raw->secs   => amount of time the client has been trying
32*83ee113eSDavid van Moolenbroek  * packet->raw->hlen   => the length of the mac address of the client
33*83ee113eSDavid van Moolenbroek  * packet->raw->chaddr => the mac address of the client
34*83ee113eSDavid van Moolenbroek  * To simplify the tests the mac address will be only 1 byte long and
35*83ee113eSDavid van Moolenbroek  * not really matter.  Instead the hba will be all 1s and the tests
36*83ee113eSDavid van Moolenbroek  * will use the primary/secondary flag to change the expected result.
37*83ee113eSDavid van Moolenbroek  *
38*83ee113eSDavid van Moolenbroek  * state->i_am => primary or secondary
39*83ee113eSDavid van Moolenbroek  * state->load_balance_max_secs => maxixum time for a client to be trying
40*83ee113eSDavid van Moolenbroek  *                                 before the other peer responds
41*83ee113eSDavid van Moolenbroek  *                                 set to 5 for these tests
42*83ee113eSDavid van Moolenbroek  * state->hba = array of hash buckets assigning the hash to primary or secondary
43*83ee113eSDavid van Moolenbroek  *              set to all ones (all primary) for theses tests
44*83ee113eSDavid van Moolenbroek  */
45*83ee113eSDavid van Moolenbroek 
46*83ee113eSDavid van Moolenbroek ATF_TC(load_balance);
47*83ee113eSDavid van Moolenbroek 
ATF_TC_HEAD(load_balance,tc)48*83ee113eSDavid van Moolenbroek ATF_TC_HEAD(load_balance, tc)
49*83ee113eSDavid van Moolenbroek {
50*83ee113eSDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "This test case checks that "
51*83ee113eSDavid van Moolenbroek 			  "load balancing works.");
52*83ee113eSDavid van Moolenbroek }
53*83ee113eSDavid van Moolenbroek 
ATF_TC_BODY(load_balance,tc)54*83ee113eSDavid van Moolenbroek ATF_TC_BODY(load_balance, tc)
55*83ee113eSDavid van Moolenbroek {
56*83ee113eSDavid van Moolenbroek 	struct packet packet;
57*83ee113eSDavid van Moolenbroek 	struct dhcp_packet raw;
58*83ee113eSDavid van Moolenbroek 	dhcp_failover_state_t pstate, sstate;
59*83ee113eSDavid van Moolenbroek 	u_int8_t hba[256];
60*83ee113eSDavid van Moolenbroek 
61*83ee113eSDavid van Moolenbroek 	memset(&packet, 0, sizeof(struct packet));
62*83ee113eSDavid van Moolenbroek 	memset(&raw, 0, sizeof(struct dhcp_packet));
63*83ee113eSDavid van Moolenbroek 	packet.raw = &raw;
64*83ee113eSDavid van Moolenbroek 	raw.hlen = 1;
65*83ee113eSDavid van Moolenbroek 	raw.chaddr[0] = 14;
66*83ee113eSDavid van Moolenbroek 
67*83ee113eSDavid van Moolenbroek 	memset(hba, 0xFF, 256);
68*83ee113eSDavid van Moolenbroek 
69*83ee113eSDavid van Moolenbroek 	/* primary state */
70*83ee113eSDavid van Moolenbroek 	memset(&pstate, 0, sizeof(dhcp_failover_state_t));
71*83ee113eSDavid van Moolenbroek 	pstate.i_am = primary;
72*83ee113eSDavid van Moolenbroek 	pstate.load_balance_max_secs = 5;
73*83ee113eSDavid van Moolenbroek 	pstate.hba = hba;
74*83ee113eSDavid van Moolenbroek 
75*83ee113eSDavid van Moolenbroek 	/* secondary state, we can reuse the hba as it doesn't change */
76*83ee113eSDavid van Moolenbroek 	memset(&sstate, 0, sizeof(dhcp_failover_state_t));
77*83ee113eSDavid van Moolenbroek 	sstate.i_am = secondary;
78*83ee113eSDavid van Moolenbroek 	sstate.load_balance_max_secs = 5;
79*83ee113eSDavid van Moolenbroek 	sstate.hba = hba;
80*83ee113eSDavid van Moolenbroek 
81*83ee113eSDavid van Moolenbroek 	/* Basic check, primary accepted, secondary not */
82*83ee113eSDavid van Moolenbroek 	raw.secs = htons(0);
83*83ee113eSDavid van Moolenbroek 	if (load_balance_mine(&packet, &pstate) != 1) {
84*83ee113eSDavid van Moolenbroek 		atf_tc_fail("ERROR: primary not accepted %s:%d", MDL);
85*83ee113eSDavid van Moolenbroek 	}
86*83ee113eSDavid van Moolenbroek 
87*83ee113eSDavid van Moolenbroek 	if (load_balance_mine(&packet, &sstate) != 0) {
88*83ee113eSDavid van Moolenbroek 		atf_tc_fail("ERROR: secondary accepted %s:%d", MDL);
89*83ee113eSDavid van Moolenbroek 	}
90*83ee113eSDavid van Moolenbroek 
91*83ee113eSDavid van Moolenbroek 
92*83ee113eSDavid van Moolenbroek 	/* Timeout not exceeded, primary accepted, secondary not */
93*83ee113eSDavid van Moolenbroek 	raw.secs = htons(2);
94*83ee113eSDavid van Moolenbroek 	if (load_balance_mine(&packet, &pstate) != 1) {
95*83ee113eSDavid van Moolenbroek 		atf_tc_fail("ERROR: primary not accepted %s:%d", MDL);
96*83ee113eSDavid van Moolenbroek 	}
97*83ee113eSDavid van Moolenbroek 
98*83ee113eSDavid van Moolenbroek 	if (load_balance_mine(&packet, &sstate) != 0) {
99*83ee113eSDavid van Moolenbroek 		atf_tc_fail("ERROR: secondary accepted %s:%d", MDL);
100*83ee113eSDavid van Moolenbroek 	}
101*83ee113eSDavid van Moolenbroek 
102*83ee113eSDavid van Moolenbroek 	/* Timeout exceeded, both accepted */
103*83ee113eSDavid van Moolenbroek 	raw.secs = htons(6);
104*83ee113eSDavid van Moolenbroek 	if (load_balance_mine(&packet, &pstate) != 1) {
105*83ee113eSDavid van Moolenbroek 		atf_tc_fail("ERROR: primary not accepted %s:%d", MDL);
106*83ee113eSDavid van Moolenbroek 	}
107*83ee113eSDavid van Moolenbroek 
108*83ee113eSDavid van Moolenbroek 	if (load_balance_mine(&packet, &sstate) != 1) {
109*83ee113eSDavid van Moolenbroek 		atf_tc_fail("ERROR: secondary not accepted %s:%d", MDL);
110*83ee113eSDavid van Moolenbroek 	}
111*83ee113eSDavid van Moolenbroek 
112*83ee113eSDavid van Moolenbroek 	/* Timeout exeeded with a large value, both accepted */
113*83ee113eSDavid van Moolenbroek 	raw.secs = htons(257);
114*83ee113eSDavid van Moolenbroek 	if (load_balance_mine(&packet, &pstate) != 1) {
115*83ee113eSDavid van Moolenbroek 		atf_tc_fail("ERROR: primary not accepted %s:%d", MDL);
116*83ee113eSDavid van Moolenbroek 	}
117*83ee113eSDavid van Moolenbroek 
118*83ee113eSDavid van Moolenbroek 	if (load_balance_mine(&packet, &sstate) != 1) {
119*83ee113eSDavid van Moolenbroek 		atf_tc_fail("ERROR: secondary not accepted %s:%d", MDL);
120*83ee113eSDavid van Moolenbroek 	}
121*83ee113eSDavid van Moolenbroek 
122*83ee113eSDavid van Moolenbroek }
123*83ee113eSDavid van Moolenbroek 
124*83ee113eSDavid van Moolenbroek ATF_TC(load_balance_swap);
125*83ee113eSDavid van Moolenbroek 
ATF_TC_HEAD(load_balance_swap,tc)126*83ee113eSDavid van Moolenbroek ATF_TC_HEAD(load_balance_swap, tc)
127*83ee113eSDavid van Moolenbroek {
128*83ee113eSDavid van Moolenbroek 	atf_tc_set_md_var(tc, "descr", "This test case checks that "
129*83ee113eSDavid van Moolenbroek 			  "load balancing works with byteswapping.");
130*83ee113eSDavid van Moolenbroek }
131*83ee113eSDavid van Moolenbroek 
ATF_TC_BODY(load_balance_swap,tc)132*83ee113eSDavid van Moolenbroek ATF_TC_BODY(load_balance_swap, tc)
133*83ee113eSDavid van Moolenbroek {
134*83ee113eSDavid van Moolenbroek #if defined(SECS_BYTEORDER)
135*83ee113eSDavid van Moolenbroek 	struct packet packet;
136*83ee113eSDavid van Moolenbroek 	struct dhcp_packet raw;
137*83ee113eSDavid van Moolenbroek 	dhcp_failover_state_t pstate, sstate;
138*83ee113eSDavid van Moolenbroek 	u_int8_t hba[256];
139*83ee113eSDavid van Moolenbroek 
140*83ee113eSDavid van Moolenbroek 	memset(&packet, 0, sizeof(struct packet));
141*83ee113eSDavid van Moolenbroek 	memset(&raw, 0, sizeof(struct dhcp_packet));
142*83ee113eSDavid van Moolenbroek 	packet.raw = &raw;
143*83ee113eSDavid van Moolenbroek 	raw.hlen = 1;
144*83ee113eSDavid van Moolenbroek 	raw.chaddr[0] = 14;
145*83ee113eSDavid van Moolenbroek 
146*83ee113eSDavid van Moolenbroek 	memset(hba, 0xFF, 256);
147*83ee113eSDavid van Moolenbroek 
148*83ee113eSDavid van Moolenbroek 	/* primary state */
149*83ee113eSDavid van Moolenbroek 	memset(&pstate, 0, sizeof(dhcp_failover_state_t));
150*83ee113eSDavid van Moolenbroek 	pstate.i_am = primary;
151*83ee113eSDavid van Moolenbroek 	pstate.load_balance_max_secs = 5;
152*83ee113eSDavid van Moolenbroek 	pstate.hba = hba;
153*83ee113eSDavid van Moolenbroek 
154*83ee113eSDavid van Moolenbroek 	/* secondary state, we can reuse the hba as it doesn't change */
155*83ee113eSDavid van Moolenbroek 	memset(&sstate, 0, sizeof(dhcp_failover_state_t));
156*83ee113eSDavid van Moolenbroek 	sstate.i_am = secondary;
157*83ee113eSDavid van Moolenbroek 	sstate.load_balance_max_secs = 5;
158*83ee113eSDavid van Moolenbroek 	sstate.hba = hba;
159*83ee113eSDavid van Moolenbroek 
160*83ee113eSDavid van Moolenbroek 	/* Small byteswapped timeout, primary accepted, secondary not*/
161*83ee113eSDavid van Moolenbroek 	raw.secs = htons(256);
162*83ee113eSDavid van Moolenbroek 	if (load_balance_mine(&packet, &pstate) != 1) {
163*83ee113eSDavid van Moolenbroek 		atf_tc_fail("ERROR: primary not accepted %s:%d", MDL);
164*83ee113eSDavid van Moolenbroek 	}
165*83ee113eSDavid van Moolenbroek 
166*83ee113eSDavid van Moolenbroek 	if (load_balance_mine(&packet, &sstate) != 0) {
167*83ee113eSDavid van Moolenbroek 		atf_tc_fail("ERROR: secondary accepted %s:%d", MDL);
168*83ee113eSDavid van Moolenbroek 	}
169*83ee113eSDavid van Moolenbroek 
170*83ee113eSDavid van Moolenbroek 	/* Large byteswapped timeout, both accepted*/
171*83ee113eSDavid van Moolenbroek 	raw.secs = htons(256 * 6);
172*83ee113eSDavid van Moolenbroek 	if (load_balance_mine(&packet, &pstate) != 1) {
173*83ee113eSDavid van Moolenbroek 		atf_tc_fail("ERROR: primary not accepted %s:%d", MDL);
174*83ee113eSDavid van Moolenbroek 	}
175*83ee113eSDavid van Moolenbroek 
176*83ee113eSDavid van Moolenbroek 	if (load_balance_mine(&packet, &sstate) != 1) {
177*83ee113eSDavid van Moolenbroek 		atf_tc_fail("ERROR: secondary not accepted %s:%d", MDL);
178*83ee113eSDavid van Moolenbroek 	}
179*83ee113eSDavid van Moolenbroek 
180*83ee113eSDavid van Moolenbroek #else
181*83ee113eSDavid van Moolenbroek 	atf_tc_skip("SECS_BYTEORDER not defined");
182*83ee113eSDavid van Moolenbroek #endif
183*83ee113eSDavid van Moolenbroek }
184*83ee113eSDavid van Moolenbroek 
185*83ee113eSDavid van Moolenbroek 
ATF_TP_ADD_TCS(tp)186*83ee113eSDavid van Moolenbroek ATF_TP_ADD_TCS(tp)
187*83ee113eSDavid van Moolenbroek {
188*83ee113eSDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, load_balance);
189*83ee113eSDavid van Moolenbroek 	ATF_TP_ADD_TC(tp, load_balance_swap);
190*83ee113eSDavid van Moolenbroek 
191*83ee113eSDavid van Moolenbroek 	return (atf_no_error());
192*83ee113eSDavid van Moolenbroek }
193