Branch data Line data Source code
1 : : #include <errno.h>
2 : :
3 : : #include "dhcp-lease-internal.h"
4 : : #include "macro.h"
5 : : #include "string-util.h"
6 : : #include "strv.h"
7 : :
8 : : /* According to RFC1035 section 4.1.4, a domain name in a message can be either:
9 : : * - a sequence of labels ending in a zero octet
10 : : * - a pointer
11 : : * - a sequence of labels ending with a pointer
12 : : */
13 : 4 : static void test_dhcp_lease_parse_search_domains_basic(void) {
14 : : int r;
15 : 4 : _cleanup_strv_free_ char **domains = NULL;
16 : : static const uint8_t optionbuf[] = {
17 : : 0x03, 'F', 'O', 'O', 0x03, 'B', 'A', 'R', 0x00,
18 : : 0x04, 'A', 'B', 'C', 'D', 0x03, 'E', 'F', 'G', 0x00,
19 : : };
20 : :
21 : 4 : r = dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains);
22 [ - + ]: 4 : assert_se(r == 2);
23 [ - + ]: 4 : assert_se(streq(domains[0], "FOO.BAR"));
24 [ - + ]: 4 : assert_se(streq(domains[1], "ABCD.EFG"));
25 : 4 : }
26 : :
27 : 4 : static void test_dhcp_lease_parse_search_domains_ptr(void) {
28 : : int r;
29 : 4 : _cleanup_strv_free_ char **domains = NULL;
30 : : static const uint8_t optionbuf[] = {
31 : : 0x03, 'F', 'O', 'O', 0x00, 0xC0, 0x00,
32 : : };
33 : :
34 : 4 : r = dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains);
35 [ - + ]: 4 : assert_se(r == 2);
36 [ - + ]: 4 : assert_se(streq(domains[0], "FOO"));
37 [ - + ]: 4 : assert_se(streq(domains[1], "FOO"));
38 : 4 : }
39 : :
40 : 4 : static void test_dhcp_lease_parse_search_domains_labels_and_ptr(void) {
41 : : int r;
42 : 4 : _cleanup_strv_free_ char **domains = NULL;
43 : : static const uint8_t optionbuf[] = {
44 : : 0x03, 'F', 'O', 'O', 0x03, 'B', 'A', 'R', 0x00,
45 : : 0x03, 'A', 'B', 'C', 0xC0, 0x04,
46 : : };
47 : :
48 : 4 : r = dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains);
49 [ - + ]: 4 : assert_se(r == 2);
50 [ - + ]: 4 : assert_se(streq(domains[0], "FOO.BAR"));
51 [ - + ]: 4 : assert_se(streq(domains[1], "ABC.BAR"));
52 : 4 : }
53 : :
54 : : /* Tests for exceptions. */
55 : :
56 : 4 : static void test_dhcp_lease_parse_search_domains_no_data(void) {
57 : 4 : _cleanup_strv_free_ char **domains = NULL;
58 : : static const uint8_t optionbuf[3] = {0, 0, 0};
59 : :
60 [ - + ]: 4 : assert_se(dhcp_lease_parse_search_domains(NULL, 0, &domains) == -ENODATA);
61 [ - + ]: 4 : assert_se(dhcp_lease_parse_search_domains(optionbuf, 0, &domains) == -ENODATA);
62 : 4 : }
63 : :
64 : 4 : static void test_dhcp_lease_parse_search_domains_loops(void) {
65 : 4 : _cleanup_strv_free_ char **domains = NULL;
66 : : static const uint8_t optionbuf[] = {
67 : : 0x03, 'F', 'O', 'O', 0x00, 0x03, 'B', 'A', 'R', 0xC0, 0x06,
68 : : };
69 : :
70 [ - + ]: 4 : assert_se(dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf), &domains) == -EBADMSG);
71 : 4 : }
72 : :
73 : 4 : static void test_dhcp_lease_parse_search_domains_wrong_len(void) {
74 : 4 : _cleanup_strv_free_ char **domains = NULL;
75 : : static const uint8_t optionbuf[] = {
76 : : 0x03, 'F', 'O', 'O', 0x03, 'B', 'A', 'R', 0x00,
77 : : 0x04, 'A', 'B', 'C', 'D', 0x03, 'E', 'F', 'G', 0x00,
78 : : };
79 : :
80 [ - + ]: 4 : assert_se(dhcp_lease_parse_search_domains(optionbuf, sizeof(optionbuf) - 5, &domains) == -EBADMSG);
81 : 4 : }
82 : :
83 : 4 : int main(int argc, char *argv[]) {
84 : 4 : test_dhcp_lease_parse_search_domains_basic();
85 : 4 : test_dhcp_lease_parse_search_domains_ptr();
86 : 4 : test_dhcp_lease_parse_search_domains_labels_and_ptr();
87 : 4 : test_dhcp_lease_parse_search_domains_no_data();
88 : 4 : test_dhcp_lease_parse_search_domains_loops();
89 : 4 : test_dhcp_lease_parse_search_domains_wrong_len();
90 : : }
|