1*83ee113eSDavid van Moolenbroek /* $NetBSD: dns_unittest.c,v 1.1.1.1 2014/07/12 11:57:48 spz Exp $ */
2*83ee113eSDavid van Moolenbroek /*
3*83ee113eSDavid van Moolenbroek * Copyright (C) 2013 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 #include <atf-c.h>
20*83ee113eSDavid van Moolenbroek #include "dhcpd.h"
21*83ee113eSDavid van Moolenbroek
22*83ee113eSDavid van Moolenbroek /*
23*83ee113eSDavid van Moolenbroek * This file provides unit tests for the dns and ddns code.
24*83ee113eSDavid van Moolenbroek * Currently this is limited to verifying the dhcid code is
25*83ee113eSDavid van Moolenbroek * working properly. In time we may be able to expand the
26*83ee113eSDavid van Moolenbroek * tests to cover other areas.
27*83ee113eSDavid van Moolenbroek *
28*83ee113eSDavid van Moolenbroek * The tests for the interim txt records comapre to previous
29*83ee113eSDavid van Moolenbroek * internally generated values.
30*83ee113eSDavid van Moolenbroek *
31*83ee113eSDavid van Moolenbroek * The tests for the standard dhcid records compare to values
32*83ee113eSDavid van Moolenbroek * from rfc 4701
33*83ee113eSDavid van Moolenbroek */
34*83ee113eSDavid van Moolenbroek
35*83ee113eSDavid van Moolenbroek char *name_1 = "chi6.example.com";
36*83ee113eSDavid van Moolenbroek u_int8_t clid_1[] = {0x00, 0x01, 0x00, 0x06, 0x41, 0x2d, 0xf1, 0x66, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
37*83ee113eSDavid van Moolenbroek u_int8_t std_result_1[] = {0x00, 0x02, 0x01, 0x63, 0x6f, 0xc0, 0xb8, 0x27, 0x1c,
38*83ee113eSDavid van Moolenbroek 0x82, 0x82, 0x5b, 0xb1, 0xac, 0x5c, 0x41, 0xcf, 0x53,
39*83ee113eSDavid van Moolenbroek 0x51, 0xaa, 0x69, 0xb4, 0xfe, 0xbd, 0x94, 0xe8, 0xf1,
40*83ee113eSDavid van Moolenbroek 0x7c, 0xdb, 0x95, 0x00, 0x0d, 0xa4, 0x8c, 0x40};
41*83ee113eSDavid van Moolenbroek char *int_result_1 = "\"02abf8cd3753dc1847be40858becd77865";
42*83ee113eSDavid van Moolenbroek
43*83ee113eSDavid van Moolenbroek char *name_2 = "chi.example.com";
44*83ee113eSDavid van Moolenbroek u_int8_t clid_2[] = {0x01, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c};
45*83ee113eSDavid van Moolenbroek u_int8_t std_result_2[] = {0x00, 0x01, 0x01, 0x39, 0x20, 0xfe, 0x5d, 0x1d, 0xce,
46*83ee113eSDavid van Moolenbroek 0xb3, 0xfd, 0x0b, 0xa3, 0x37, 0x97, 0x56, 0xa7, 0x0d,
47*83ee113eSDavid van Moolenbroek 0x73, 0xb1, 0x70, 0x09, 0xf4, 0x1d, 0x58, 0xbd, 0xdb,
48*83ee113eSDavid van Moolenbroek 0xfc, 0xd6, 0xa2, 0x50, 0x39, 0x56, 0xd8, 0xda};
49*83ee113eSDavid van Moolenbroek char *int_result_2 = "\"31934ffa9344a3ab86c380505a671e5113";
50*83ee113eSDavid van Moolenbroek
51*83ee113eSDavid van Moolenbroek char *name_3 = "client.example.com";
52*83ee113eSDavid van Moolenbroek u_int8_t clid_3[] = {0x01, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
53*83ee113eSDavid van Moolenbroek u_int8_t std_result_3[] = {0x00, 0x00, 0x01, 0xc4, 0xb9, 0xa5, 0xb2, 0x49, 0x65,
54*83ee113eSDavid van Moolenbroek 0x13, 0x43, 0x15, 0x8d, 0xde, 0x7b, 0xcc, 0x77, 0x16,
55*83ee113eSDavid van Moolenbroek 0x98, 0x41, 0xf7, 0xa4, 0x24, 0x3a, 0x57, 0x2b, 0x5c,
56*83ee113eSDavid van Moolenbroek 0x28, 0x3f, 0xff, 0xed, 0xeb, 0x3f, 0x75, 0xe6};
57*83ee113eSDavid van Moolenbroek char *int_result_3 = "\"0046b6cacea62dc1d4567b068175d1f808";
58*83ee113eSDavid van Moolenbroek
call_get_std_dhcid(int test,int type,u_int8_t * clid,unsigned clidlen,char * name,unsigned namelen,u_int8_t * dhcid,unsigned dhcid_len)59*83ee113eSDavid van Moolenbroek void call_get_std_dhcid(int test, int type,
60*83ee113eSDavid van Moolenbroek u_int8_t *clid, unsigned clidlen,
61*83ee113eSDavid van Moolenbroek char *name, unsigned namelen,
62*83ee113eSDavid van Moolenbroek u_int8_t *dhcid, unsigned dhcid_len)
63*83ee113eSDavid van Moolenbroek {
64*83ee113eSDavid van Moolenbroek dhcp_ddns_cb_t ddns_cb;
65*83ee113eSDavid van Moolenbroek struct data_string *id;
66*83ee113eSDavid van Moolenbroek
67*83ee113eSDavid van Moolenbroek memset(&ddns_cb, 0, sizeof(ddns_cb));
68*83ee113eSDavid van Moolenbroek ddns_cb.dhcid_class = dns_rdatatype_dhcid;;
69*83ee113eSDavid van Moolenbroek
70*83ee113eSDavid van Moolenbroek id = &ddns_cb.fwd_name;
71*83ee113eSDavid van Moolenbroek if (!buffer_allocate(&id->buffer, namelen, MDL))
72*83ee113eSDavid van Moolenbroek atf_tc_fail("Unable to allocate buffer for std test %d", test);
73*83ee113eSDavid van Moolenbroek id->data = id->buffer->data;
74*83ee113eSDavid van Moolenbroek memcpy(id->buffer->data, name, namelen);
75*83ee113eSDavid van Moolenbroek id->len = namelen;
76*83ee113eSDavid van Moolenbroek
77*83ee113eSDavid van Moolenbroek if (get_dhcid(&ddns_cb, type, clid, clidlen) != 1) {
78*83ee113eSDavid van Moolenbroek atf_tc_fail("Unable to get std dhcid for %d", test);
79*83ee113eSDavid van Moolenbroek } else if (ddns_cb.dhcid_class != dns_rdatatype_dhcid) {
80*83ee113eSDavid van Moolenbroek atf_tc_fail("Wrong class for std dhcid for %d", test);
81*83ee113eSDavid van Moolenbroek } else if (ddns_cb.dhcid.len != dhcid_len) {
82*83ee113eSDavid van Moolenbroek atf_tc_fail("Wrong length for std dhcid for %d", test);
83*83ee113eSDavid van Moolenbroek } else if (memcmp(ddns_cb.dhcid.data, dhcid, dhcid_len) != 0) {
84*83ee113eSDavid van Moolenbroek atf_tc_fail("Wrong digest for std dhcid for %d", test);
85*83ee113eSDavid van Moolenbroek }
86*83ee113eSDavid van Moolenbroek
87*83ee113eSDavid van Moolenbroek /* clean up */
88*83ee113eSDavid van Moolenbroek data_string_forget(&ddns_cb.dhcid, MDL);
89*83ee113eSDavid van Moolenbroek
90*83ee113eSDavid van Moolenbroek return;
91*83ee113eSDavid van Moolenbroek }
92*83ee113eSDavid van Moolenbroek ATF_TC(standard_dhcid);
93*83ee113eSDavid van Moolenbroek
ATF_TC_HEAD(standard_dhcid,tc)94*83ee113eSDavid van Moolenbroek ATF_TC_HEAD(standard_dhcid, tc)
95*83ee113eSDavid van Moolenbroek {
96*83ee113eSDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "Verify standard dhcid construction.");
97*83ee113eSDavid van Moolenbroek }
98*83ee113eSDavid van Moolenbroek
99*83ee113eSDavid van Moolenbroek
ATF_TC_BODY(standard_dhcid,tc)100*83ee113eSDavid van Moolenbroek ATF_TC_BODY(standard_dhcid, tc)
101*83ee113eSDavid van Moolenbroek {
102*83ee113eSDavid van Moolenbroek
103*83ee113eSDavid van Moolenbroek call_get_std_dhcid(1, 2, clid_1, sizeof(clid_1),
104*83ee113eSDavid van Moolenbroek name_1, strlen(name_1),
105*83ee113eSDavid van Moolenbroek std_result_1, 35);
106*83ee113eSDavid van Moolenbroek
107*83ee113eSDavid van Moolenbroek
108*83ee113eSDavid van Moolenbroek call_get_std_dhcid(2, 1, clid_2, sizeof(clid_2),
109*83ee113eSDavid van Moolenbroek name_2, strlen(name_2),
110*83ee113eSDavid van Moolenbroek std_result_2, 35);
111*83ee113eSDavid van Moolenbroek
112*83ee113eSDavid van Moolenbroek
113*83ee113eSDavid van Moolenbroek call_get_std_dhcid(3, 0, clid_3, sizeof(clid_3),
114*83ee113eSDavid van Moolenbroek name_3, strlen(name_3),
115*83ee113eSDavid van Moolenbroek std_result_3, 35);
116*83ee113eSDavid van Moolenbroek }
117*83ee113eSDavid van Moolenbroek
call_get_int_dhcid(int test,int type,u_int8_t * clid,unsigned clidlen,char * dhcid,unsigned dhcid_len)118*83ee113eSDavid van Moolenbroek void call_get_int_dhcid(int test, int type,
119*83ee113eSDavid van Moolenbroek u_int8_t *clid, unsigned clidlen,
120*83ee113eSDavid van Moolenbroek char *dhcid, unsigned dhcid_len)
121*83ee113eSDavid van Moolenbroek {
122*83ee113eSDavid van Moolenbroek dhcp_ddns_cb_t ddns_cb;
123*83ee113eSDavid van Moolenbroek
124*83ee113eSDavid van Moolenbroek memset(&ddns_cb, 0, sizeof(ddns_cb));
125*83ee113eSDavid van Moolenbroek ddns_cb.dhcid_class = dns_rdatatype_txt;;
126*83ee113eSDavid van Moolenbroek
127*83ee113eSDavid van Moolenbroek if (get_dhcid(&ddns_cb, type, clid, clidlen) != 1) {
128*83ee113eSDavid van Moolenbroek atf_tc_fail("Unable to get txt dhcid for %d", test);
129*83ee113eSDavid van Moolenbroek } else if (ddns_cb.dhcid_class != dns_rdatatype_txt) {
130*83ee113eSDavid van Moolenbroek atf_tc_fail("Wrong class for txt dhcid for %d", test);
131*83ee113eSDavid van Moolenbroek } else if (ddns_cb.dhcid.len != dhcid_len) {
132*83ee113eSDavid van Moolenbroek atf_tc_fail("Wrong length for txt dhcid for %d", test);
133*83ee113eSDavid van Moolenbroek } else if (memcmp(ddns_cb.dhcid.data, dhcid, dhcid_len) != 0) {
134*83ee113eSDavid van Moolenbroek atf_tc_fail("Wrong digest for txt dhcid for %d", test);
135*83ee113eSDavid van Moolenbroek }
136*83ee113eSDavid van Moolenbroek
137*83ee113eSDavid van Moolenbroek /* clean up */
138*83ee113eSDavid van Moolenbroek data_string_forget(&ddns_cb.dhcid, MDL);
139*83ee113eSDavid van Moolenbroek
140*83ee113eSDavid van Moolenbroek return;
141*83ee113eSDavid van Moolenbroek }
142*83ee113eSDavid van Moolenbroek
143*83ee113eSDavid van Moolenbroek ATF_TC(interim_dhcid);
144*83ee113eSDavid van Moolenbroek
ATF_TC_HEAD(interim_dhcid,tc)145*83ee113eSDavid van Moolenbroek ATF_TC_HEAD(interim_dhcid, tc)
146*83ee113eSDavid van Moolenbroek {
147*83ee113eSDavid van Moolenbroek atf_tc_set_md_var(tc, "descr", "Verify interim dhcid construction.");
148*83ee113eSDavid van Moolenbroek }
149*83ee113eSDavid van Moolenbroek
ATF_TC_BODY(interim_dhcid,tc)150*83ee113eSDavid van Moolenbroek ATF_TC_BODY(interim_dhcid, tc)
151*83ee113eSDavid van Moolenbroek {
152*83ee113eSDavid van Moolenbroek
153*83ee113eSDavid van Moolenbroek call_get_int_dhcid(1, 2, clid_1, sizeof(clid_1),
154*83ee113eSDavid van Moolenbroek int_result_1, 35);
155*83ee113eSDavid van Moolenbroek
156*83ee113eSDavid van Moolenbroek
157*83ee113eSDavid van Moolenbroek call_get_int_dhcid(2, DHO_DHCP_CLIENT_IDENTIFIER,
158*83ee113eSDavid van Moolenbroek clid_2, sizeof(clid_2),
159*83ee113eSDavid van Moolenbroek int_result_2, 35);
160*83ee113eSDavid van Moolenbroek
161*83ee113eSDavid van Moolenbroek
162*83ee113eSDavid van Moolenbroek call_get_int_dhcid(3, 0, clid_3, sizeof(clid_3),
163*83ee113eSDavid van Moolenbroek int_result_3, 35);
164*83ee113eSDavid van Moolenbroek
165*83ee113eSDavid van Moolenbroek }
166*83ee113eSDavid van Moolenbroek
167*83ee113eSDavid van Moolenbroek /* This macro defines main() method that will call specified
168*83ee113eSDavid van Moolenbroek test cases. tp and simple_test_case names can be whatever you want
169*83ee113eSDavid van Moolenbroek as long as it is a valid variable identifier. */
ATF_TP_ADD_TCS(tp)170*83ee113eSDavid van Moolenbroek ATF_TP_ADD_TCS(tp)
171*83ee113eSDavid van Moolenbroek {
172*83ee113eSDavid van Moolenbroek ATF_TP_ADD_TC(tp, interim_dhcid);
173*83ee113eSDavid van Moolenbroek ATF_TP_ADD_TC(tp, standard_dhcid);
174*83ee113eSDavid van Moolenbroek
175*83ee113eSDavid van Moolenbroek return (atf_no_error());
176*83ee113eSDavid van Moolenbroek }
177