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