xref: /minix3/minix/lib/liblwip/dist/test/unit/mdns/test_mdns.c (revision 5d5fbe79c1b60734f34c69330aec5496644e8651)
1*5d5fbe79SDavid van Moolenbroek /*
2*5d5fbe79SDavid van Moolenbroek  * Copyright (c) 2015 Verisure Innovation AB
3*5d5fbe79SDavid van Moolenbroek  * All rights reserved.
4*5d5fbe79SDavid van Moolenbroek  *
5*5d5fbe79SDavid van Moolenbroek  * Redistribution and use in source and binary forms, with or without modification,
6*5d5fbe79SDavid van Moolenbroek  * are permitted provided that the following conditions are met:
7*5d5fbe79SDavid van Moolenbroek  *
8*5d5fbe79SDavid van Moolenbroek  * 1. Redistributions of source code must retain the above copyright notice,
9*5d5fbe79SDavid van Moolenbroek  *    this list of conditions and the following disclaimer.
10*5d5fbe79SDavid van Moolenbroek  * 2. Redistributions in binary form must reproduce the above copyright notice,
11*5d5fbe79SDavid van Moolenbroek  *    this list of conditions and the following disclaimer in the documentation
12*5d5fbe79SDavid van Moolenbroek  *    and/or other materials provided with the distribution.
13*5d5fbe79SDavid van Moolenbroek  * 3. The name of the author may not be used to endorse or promote products
14*5d5fbe79SDavid van Moolenbroek  *    derived from this software without specific prior written permission.
15*5d5fbe79SDavid van Moolenbroek  *
16*5d5fbe79SDavid van Moolenbroek  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17*5d5fbe79SDavid van Moolenbroek  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18*5d5fbe79SDavid van Moolenbroek  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
19*5d5fbe79SDavid van Moolenbroek  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20*5d5fbe79SDavid van Moolenbroek  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
21*5d5fbe79SDavid van Moolenbroek  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*5d5fbe79SDavid van Moolenbroek  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*5d5fbe79SDavid van Moolenbroek  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
24*5d5fbe79SDavid van Moolenbroek  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
25*5d5fbe79SDavid van Moolenbroek  * OF SUCH DAMAGE.
26*5d5fbe79SDavid van Moolenbroek  *
27*5d5fbe79SDavid van Moolenbroek  * This file is part of the lwIP TCP/IP stack.
28*5d5fbe79SDavid van Moolenbroek  *
29*5d5fbe79SDavid van Moolenbroek  * Author: Erik Ekman <erik@kryo.se>
30*5d5fbe79SDavid van Moolenbroek  *
31*5d5fbe79SDavid van Moolenbroek  */
32*5d5fbe79SDavid van Moolenbroek 
33*5d5fbe79SDavid van Moolenbroek #include "test_mdns.h"
34*5d5fbe79SDavid van Moolenbroek 
35*5d5fbe79SDavid van Moolenbroek #include "lwip/pbuf.h"
36*5d5fbe79SDavid van Moolenbroek #include "lwip/apps/mdns.h"
37*5d5fbe79SDavid van Moolenbroek #include "lwip/apps/mdns_priv.h"
38*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_basic)39*5d5fbe79SDavid van Moolenbroek START_TEST(readname_basic)
40*5d5fbe79SDavid van Moolenbroek {
41*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = { 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x00 };
42*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
43*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
44*5d5fbe79SDavid van Moolenbroek   u16_t offset;
45*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
46*5d5fbe79SDavid van Moolenbroek 
47*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
48*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
49*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
50*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 0, &domain);
51*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
52*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == sizeof(data));
53*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == sizeof(data));
54*5d5fbe79SDavid van Moolenbroek   fail_if(memcmp(&domain.name, data, sizeof(data)));
55*5d5fbe79SDavid van Moolenbroek }
56*5d5fbe79SDavid van Moolenbroek END_TEST
57*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_anydata)58*5d5fbe79SDavid van Moolenbroek START_TEST(readname_anydata)
59*5d5fbe79SDavid van Moolenbroek {
60*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = { 0x05, 0x00, 0xFF, 0x08, 0xc0, 0x0f, 0x04, 0x7f, 0x80, 0x82, 0x88, 0x00 };
61*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
62*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
63*5d5fbe79SDavid van Moolenbroek   u16_t offset;
64*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
65*5d5fbe79SDavid van Moolenbroek 
66*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
67*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
68*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
69*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 0, &domain);
70*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
71*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == sizeof(data));
72*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == sizeof(data));
73*5d5fbe79SDavid van Moolenbroek   fail_if(memcmp(&domain.name, data, sizeof(data)));
74*5d5fbe79SDavid van Moolenbroek }
75*5d5fbe79SDavid van Moolenbroek END_TEST
76*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_short_buf)77*5d5fbe79SDavid van Moolenbroek START_TEST(readname_short_buf)
78*5d5fbe79SDavid van Moolenbroek {
79*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = { 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a' };
80*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
81*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
82*5d5fbe79SDavid van Moolenbroek   u16_t offset;
83*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
84*5d5fbe79SDavid van Moolenbroek 
85*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
86*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
87*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
88*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 0, &domain);
89*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
90*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == MDNS_READNAME_ERROR);
91*5d5fbe79SDavid van Moolenbroek }
92*5d5fbe79SDavid van Moolenbroek END_TEST
93*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_long_label)94*5d5fbe79SDavid van Moolenbroek START_TEST(readname_long_label)
95*5d5fbe79SDavid van Moolenbroek {
96*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
97*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i',
98*5d5fbe79SDavid van Moolenbroek       0x52, 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
99*5d5fbe79SDavid van Moolenbroek       'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
100*5d5fbe79SDavid van Moolenbroek       'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
101*5d5fbe79SDavid van Moolenbroek       'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
102*5d5fbe79SDavid van Moolenbroek       'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
103*5d5fbe79SDavid van Moolenbroek       'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 0x00
104*5d5fbe79SDavid van Moolenbroek   };
105*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
106*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
107*5d5fbe79SDavid van Moolenbroek   u16_t offset;
108*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
109*5d5fbe79SDavid van Moolenbroek 
110*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
111*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
112*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
113*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 0, &domain);
114*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
115*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == MDNS_READNAME_ERROR);
116*5d5fbe79SDavid van Moolenbroek }
117*5d5fbe79SDavid van Moolenbroek END_TEST
118*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_overflow)119*5d5fbe79SDavid van Moolenbroek START_TEST(readname_overflow)
120*5d5fbe79SDavid van Moolenbroek {
121*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
122*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
123*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
124*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
125*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
126*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
127*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
128*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
129*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
130*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
131*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
132*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
133*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
134*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
135*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
136*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
137*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
138*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
139*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
140*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
141*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
142*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
143*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
144*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
145*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
146*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
147*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
148*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
149*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
150*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
151*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
152*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
153*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
154*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
155*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
156*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
157*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
158*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
159*5d5fbe79SDavid van Moolenbroek       0x00
160*5d5fbe79SDavid van Moolenbroek   };
161*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
162*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
163*5d5fbe79SDavid van Moolenbroek   u16_t offset;
164*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
165*5d5fbe79SDavid van Moolenbroek 
166*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
167*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
168*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
169*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 0, &domain);
170*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
171*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == MDNS_READNAME_ERROR);
172*5d5fbe79SDavid van Moolenbroek }
173*5d5fbe79SDavid van Moolenbroek END_TEST
174*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_jump_earlier)175*5d5fbe79SDavid van Moolenbroek START_TEST(readname_jump_earlier)
176*5d5fbe79SDavid van Moolenbroek {
177*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
178*5d5fbe79SDavid van Moolenbroek       /* Some padding needed, not supported to jump to bytes containing dns header */
179*5d5fbe79SDavid van Moolenbroek       /*  0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
180*5d5fbe79SDavid van Moolenbroek       /* 10 */ 0x0f, 0x0e, 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, 0xab,
181*5d5fbe79SDavid van Moolenbroek       /* 20 */ 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0, 0x0c
182*5d5fbe79SDavid van Moolenbroek   };
183*5d5fbe79SDavid van Moolenbroek   static const u8_t fullname[] = {
184*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00
185*5d5fbe79SDavid van Moolenbroek   };
186*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
187*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
188*5d5fbe79SDavid van Moolenbroek   u16_t offset;
189*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
190*5d5fbe79SDavid van Moolenbroek 
191*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
192*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
193*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
194*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 20, &domain);
195*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
196*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == sizeof(data));
197*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == sizeof(fullname));
198*5d5fbe79SDavid van Moolenbroek 
199*5d5fbe79SDavid van Moolenbroek   fail_if(memcmp(&domain.name, fullname, sizeof(fullname)));
200*5d5fbe79SDavid van Moolenbroek }
201*5d5fbe79SDavid van Moolenbroek END_TEST
202*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_jump_earlier_jump)203*5d5fbe79SDavid van Moolenbroek START_TEST(readname_jump_earlier_jump)
204*5d5fbe79SDavid van Moolenbroek {
205*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
206*5d5fbe79SDavid van Moolenbroek       /* Some padding needed, not supported to jump to bytes containing dns header */
207*5d5fbe79SDavid van Moolenbroek       /* 0x00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208*5d5fbe79SDavid van Moolenbroek       /* 0x08 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x0b, 0x0a, 0xf2,
209*5d5fbe79SDavid van Moolenbroek       /* 0x10 */ 0x04, 'c', 'a', 's', 't', 0x00, 0xc0, 0x10,
210*5d5fbe79SDavid van Moolenbroek       /* 0x18 */ 0x05, 'm', 'u', 'l', 't', 'i', 0xc0, 0x16
211*5d5fbe79SDavid van Moolenbroek   };
212*5d5fbe79SDavid van Moolenbroek   static const u8_t fullname[] = {
213*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x00
214*5d5fbe79SDavid van Moolenbroek   };
215*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
216*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
217*5d5fbe79SDavid van Moolenbroek   u16_t offset;
218*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
219*5d5fbe79SDavid van Moolenbroek 
220*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
221*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
222*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
223*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 0x18, &domain);
224*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
225*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == sizeof(data));
226*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == sizeof(fullname));
227*5d5fbe79SDavid van Moolenbroek 
228*5d5fbe79SDavid van Moolenbroek   fail_if(memcmp(&domain.name, fullname, sizeof(fullname)));
229*5d5fbe79SDavid van Moolenbroek }
230*5d5fbe79SDavid van Moolenbroek END_TEST
231*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_jump_maxdepth)232*5d5fbe79SDavid van Moolenbroek START_TEST(readname_jump_maxdepth)
233*5d5fbe79SDavid van Moolenbroek {
234*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
235*5d5fbe79SDavid van Moolenbroek       /* Some padding needed, not supported to jump to bytes containing dns header */
236*5d5fbe79SDavid van Moolenbroek       /* 0x00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237*5d5fbe79SDavid van Moolenbroek       /* 0x08 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x0b, 0x0a, 0xf2,
238*5d5fbe79SDavid van Moolenbroek       /* 0x10 */ 0x04, 'n', 'a', 'm', 'e', 0xc0, 0x27, 0x03,
239*5d5fbe79SDavid van Moolenbroek       /* 0x18 */ 0x03, 'd', 'n', 's', 0xc0, 0x10, 0xc0, 0x10,
240*5d5fbe79SDavid van Moolenbroek       /* 0x20 */ 0x04, 'd', 'e', 'e', 'p', 0xc0, 0x18, 0x00,
241*5d5fbe79SDavid van Moolenbroek       /* 0x28 */ 0x04, 'c', 'a', 's', 't', 0xc0, 0x20, 0xb0,
242*5d5fbe79SDavid van Moolenbroek       /* 0x30 */ 0x05, 'm', 'u', 'l', 't', 'i', 0xc0, 0x28
243*5d5fbe79SDavid van Moolenbroek   };
244*5d5fbe79SDavid van Moolenbroek   static const u8_t fullname[] = {
245*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
246*5d5fbe79SDavid van Moolenbroek       0x04, 'd', 'e', 'e', 'p', 0x03, 'd', 'n', 's',
247*5d5fbe79SDavid van Moolenbroek       0x04, 'n', 'a', 'm', 'e', 0x00
248*5d5fbe79SDavid van Moolenbroek   };
249*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
250*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
251*5d5fbe79SDavid van Moolenbroek   u16_t offset;
252*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
253*5d5fbe79SDavid van Moolenbroek 
254*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
255*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
256*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
257*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 0x30, &domain);
258*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
259*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == sizeof(data));
260*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == sizeof(fullname));
261*5d5fbe79SDavid van Moolenbroek 
262*5d5fbe79SDavid van Moolenbroek   fail_if(memcmp(&domain.name, fullname, sizeof(fullname)));
263*5d5fbe79SDavid van Moolenbroek }
264*5d5fbe79SDavid van Moolenbroek END_TEST
265*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_jump_later)266*5d5fbe79SDavid van Moolenbroek START_TEST(readname_jump_later)
267*5d5fbe79SDavid van Moolenbroek {
268*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
269*5d5fbe79SDavid van Moolenbroek       /* 0x00 */ 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0, 0x10, 0x00, 0x01, 0x40,
270*5d5fbe79SDavid van Moolenbroek       /* 0x10 */ 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, 0xab
271*5d5fbe79SDavid van Moolenbroek   };
272*5d5fbe79SDavid van Moolenbroek   static const u8_t fullname[] = {
273*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00
274*5d5fbe79SDavid van Moolenbroek   };
275*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
276*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
277*5d5fbe79SDavid van Moolenbroek   u16_t offset;
278*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
279*5d5fbe79SDavid van Moolenbroek 
280*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
281*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
282*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
283*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 0, &domain);
284*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
285*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == 13);
286*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == sizeof(fullname));
287*5d5fbe79SDavid van Moolenbroek 
288*5d5fbe79SDavid van Moolenbroek   fail_if(memcmp(&domain.name, fullname, sizeof(fullname)));
289*5d5fbe79SDavid van Moolenbroek }
290*5d5fbe79SDavid van Moolenbroek END_TEST
291*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_half_jump)292*5d5fbe79SDavid van Moolenbroek START_TEST(readname_half_jump)
293*5d5fbe79SDavid van Moolenbroek {
294*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
295*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0
296*5d5fbe79SDavid van Moolenbroek   };
297*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
298*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
299*5d5fbe79SDavid van Moolenbroek   u16_t offset;
300*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
301*5d5fbe79SDavid van Moolenbroek 
302*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
303*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
304*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
305*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 0, &domain);
306*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
307*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == MDNS_READNAME_ERROR);
308*5d5fbe79SDavid van Moolenbroek }
309*5d5fbe79SDavid van Moolenbroek END_TEST
310*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_jump_toolong)311*5d5fbe79SDavid van Moolenbroek START_TEST(readname_jump_toolong)
312*5d5fbe79SDavid van Moolenbroek {
313*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
314*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc2, 0x10, 0x00, 0x01, 0x40
315*5d5fbe79SDavid van Moolenbroek   };
316*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
317*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
318*5d5fbe79SDavid van Moolenbroek   u16_t offset;
319*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
320*5d5fbe79SDavid van Moolenbroek 
321*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
322*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
323*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
324*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 0, &domain);
325*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
326*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == MDNS_READNAME_ERROR);
327*5d5fbe79SDavid van Moolenbroek }
328*5d5fbe79SDavid van Moolenbroek END_TEST
329*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_jump_loop_label)330*5d5fbe79SDavid van Moolenbroek START_TEST(readname_jump_loop_label)
331*5d5fbe79SDavid van Moolenbroek {
332*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
333*5d5fbe79SDavid van Moolenbroek       /*  0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
334*5d5fbe79SDavid van Moolenbroek       /* 10 */ 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0, 0x10
335*5d5fbe79SDavid van Moolenbroek   };
336*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
337*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
338*5d5fbe79SDavid van Moolenbroek   u16_t offset;
339*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
340*5d5fbe79SDavid van Moolenbroek 
341*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
342*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
343*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
344*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 10, &domain);
345*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
346*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == MDNS_READNAME_ERROR);
347*5d5fbe79SDavid van Moolenbroek }
348*5d5fbe79SDavid van Moolenbroek END_TEST
349*5d5fbe79SDavid van Moolenbroek 
START_TEST(readname_jump_loop_jump)350*5d5fbe79SDavid van Moolenbroek START_TEST(readname_jump_loop_jump)
351*5d5fbe79SDavid van Moolenbroek {
352*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
353*5d5fbe79SDavid van Moolenbroek       /*  0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
354*5d5fbe79SDavid van Moolenbroek       /* 10 */ 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0, 0x15
355*5d5fbe79SDavid van Moolenbroek   };
356*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
357*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
358*5d5fbe79SDavid van Moolenbroek   u16_t offset;
359*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
360*5d5fbe79SDavid van Moolenbroek 
361*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
362*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
363*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
364*5d5fbe79SDavid van Moolenbroek   offset = mdns_readname(p, 10, &domain);
365*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
366*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == MDNS_READNAME_ERROR);
367*5d5fbe79SDavid van Moolenbroek }
368*5d5fbe79SDavid van Moolenbroek END_TEST
369*5d5fbe79SDavid van Moolenbroek 
START_TEST(add_label_basic)370*5d5fbe79SDavid van Moolenbroek START_TEST(add_label_basic)
371*5d5fbe79SDavid van Moolenbroek {
372*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = { 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x00 };
373*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
374*5d5fbe79SDavid van Moolenbroek   err_t res;
375*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
376*5d5fbe79SDavid van Moolenbroek 
377*5d5fbe79SDavid van Moolenbroek   memset(&domain, 0, sizeof(domain));
378*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "multi", 5);
379*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
380*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "cast", 4);
381*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
382*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, NULL, 0);
383*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
384*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == sizeof(data));
385*5d5fbe79SDavid van Moolenbroek   fail_if(memcmp(&domain.name, data, sizeof(data)));
386*5d5fbe79SDavid van Moolenbroek }
387*5d5fbe79SDavid van Moolenbroek END_TEST
388*5d5fbe79SDavid van Moolenbroek 
START_TEST(add_label_long_label)389*5d5fbe79SDavid van Moolenbroek START_TEST(add_label_long_label)
390*5d5fbe79SDavid van Moolenbroek {
391*5d5fbe79SDavid van Moolenbroek   static const char *toolong = "abcdefghijklmnopqrstuvwxyz0123456789-abcdefghijklmnopqrstuvwxyz0123456789-abcdefghijklmnopqrstuvwxyz0123456789-";
392*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
393*5d5fbe79SDavid van Moolenbroek   err_t res;
394*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
395*5d5fbe79SDavid van Moolenbroek 
396*5d5fbe79SDavid van Moolenbroek   memset(&domain, 0, sizeof(domain));
397*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "multi", 5);
398*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
399*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, toolong, (u8_t)strlen(toolong));
400*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_VAL);
401*5d5fbe79SDavid van Moolenbroek }
402*5d5fbe79SDavid van Moolenbroek END_TEST
403*5d5fbe79SDavid van Moolenbroek 
START_TEST(add_label_full)404*5d5fbe79SDavid van Moolenbroek START_TEST(add_label_full)
405*5d5fbe79SDavid van Moolenbroek {
406*5d5fbe79SDavid van Moolenbroek   static const char *label = "0123456789abcdef0123456789abcdef";
407*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
408*5d5fbe79SDavid van Moolenbroek   err_t res;
409*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
410*5d5fbe79SDavid van Moolenbroek 
411*5d5fbe79SDavid van Moolenbroek   memset(&domain, 0, sizeof(domain));
412*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
413*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
414*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 33);
415*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
416*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
417*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 66);
418*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
419*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
420*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 99);
421*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
422*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
423*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 132);
424*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
425*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
426*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 165);
427*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
428*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
429*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 198);
430*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
431*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
432*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 231);
433*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
434*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_VAL);
435*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 231);
436*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, label, 25);
437*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_VAL);
438*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 231);
439*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, label, 24);
440*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_VAL);
441*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 231);
442*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, label, 23);
443*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
444*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 255);
445*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, NULL, 0);
446*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
447*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 256);
448*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, NULL, 0);
449*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_VAL);
450*5d5fbe79SDavid van Moolenbroek   fail_unless(domain.length == 256);
451*5d5fbe79SDavid van Moolenbroek }
452*5d5fbe79SDavid van Moolenbroek END_TEST
453*5d5fbe79SDavid van Moolenbroek 
START_TEST(domain_eq_basic)454*5d5fbe79SDavid van Moolenbroek START_TEST(domain_eq_basic)
455*5d5fbe79SDavid van Moolenbroek {
456*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
457*5d5fbe79SDavid van Moolenbroek       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x00
458*5d5fbe79SDavid van Moolenbroek   };
459*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain1, domain2;
460*5d5fbe79SDavid van Moolenbroek   err_t res;
461*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
462*5d5fbe79SDavid van Moolenbroek 
463*5d5fbe79SDavid van Moolenbroek   memset(&domain1, 0, sizeof(domain1));
464*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, "multi", 5);
465*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
466*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, "cast", 4);
467*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
468*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, NULL, 0);
469*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
470*5d5fbe79SDavid van Moolenbroek   fail_unless(domain1.length == sizeof(data));
471*5d5fbe79SDavid van Moolenbroek 
472*5d5fbe79SDavid van Moolenbroek   memset(&domain2, 0, sizeof(domain2));
473*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, "multi", 5);
474*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
475*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, "cast", 4);
476*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
477*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, NULL, 0);
478*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
479*5d5fbe79SDavid van Moolenbroek 
480*5d5fbe79SDavid van Moolenbroek   fail_unless(mdns_domain_eq(&domain1, &domain2));
481*5d5fbe79SDavid van Moolenbroek }
482*5d5fbe79SDavid van Moolenbroek END_TEST
483*5d5fbe79SDavid van Moolenbroek 
START_TEST(domain_eq_diff)484*5d5fbe79SDavid van Moolenbroek START_TEST(domain_eq_diff)
485*5d5fbe79SDavid van Moolenbroek {
486*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain1, domain2;
487*5d5fbe79SDavid van Moolenbroek   err_t res;
488*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
489*5d5fbe79SDavid van Moolenbroek 
490*5d5fbe79SDavid van Moolenbroek   memset(&domain1, 0, sizeof(domain1));
491*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, "multi", 5);
492*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
493*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, "base", 4);
494*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
495*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, NULL, 0);
496*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
497*5d5fbe79SDavid van Moolenbroek 
498*5d5fbe79SDavid van Moolenbroek   memset(&domain2, 0, sizeof(domain2));
499*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, "multi", 5);
500*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
501*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, "cast", 4);
502*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
503*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, NULL, 0);
504*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
505*5d5fbe79SDavid van Moolenbroek 
506*5d5fbe79SDavid van Moolenbroek   fail_if(mdns_domain_eq(&domain1, &domain2));
507*5d5fbe79SDavid van Moolenbroek }
508*5d5fbe79SDavid van Moolenbroek END_TEST
509*5d5fbe79SDavid van Moolenbroek 
START_TEST(domain_eq_case)510*5d5fbe79SDavid van Moolenbroek START_TEST(domain_eq_case)
511*5d5fbe79SDavid van Moolenbroek {
512*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain1, domain2;
513*5d5fbe79SDavid van Moolenbroek   err_t res;
514*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
515*5d5fbe79SDavid van Moolenbroek 
516*5d5fbe79SDavid van Moolenbroek   memset(&domain1, 0, sizeof(domain1));
517*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, "multi", 5);
518*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
519*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, "cast", 4);
520*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
521*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, NULL, 0);
522*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
523*5d5fbe79SDavid van Moolenbroek 
524*5d5fbe79SDavid van Moolenbroek   memset(&domain2, 0, sizeof(domain2));
525*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, "MulTI", 5);
526*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
527*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, "casT", 4);
528*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
529*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, NULL, 0);
530*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
531*5d5fbe79SDavid van Moolenbroek 
532*5d5fbe79SDavid van Moolenbroek   fail_unless(mdns_domain_eq(&domain1, &domain2));
533*5d5fbe79SDavid van Moolenbroek }
534*5d5fbe79SDavid van Moolenbroek END_TEST
535*5d5fbe79SDavid van Moolenbroek 
START_TEST(domain_eq_anydata)536*5d5fbe79SDavid van Moolenbroek START_TEST(domain_eq_anydata)
537*5d5fbe79SDavid van Moolenbroek {
538*5d5fbe79SDavid van Moolenbroek   static const u8_t data1[] = { 0x05, 0xcc, 0xdc, 0x00, 0xa0 };
539*5d5fbe79SDavid van Moolenbroek   static const u8_t data2[] = { 0x7f, 0x8c, 0x01, 0xff, 0xcf };
540*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain1, domain2;
541*5d5fbe79SDavid van Moolenbroek   err_t res;
542*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
543*5d5fbe79SDavid van Moolenbroek 
544*5d5fbe79SDavid van Moolenbroek   memset(&domain1, 0, sizeof(domain1));
545*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, (const char*)data1, sizeof(data1));
546*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
547*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, "cast", 4);
548*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
549*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, (const char*)data2, sizeof(data2));
550*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
551*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, NULL, 0);
552*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
553*5d5fbe79SDavid van Moolenbroek 
554*5d5fbe79SDavid van Moolenbroek   memset(&domain2, 0, sizeof(domain2));
555*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, (const char*)data1, sizeof(data1));
556*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
557*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, "casT", 4);
558*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
559*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, (const char*)data2, sizeof(data2));
560*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
561*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, NULL, 0);
562*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
563*5d5fbe79SDavid van Moolenbroek 
564*5d5fbe79SDavid van Moolenbroek   fail_unless(mdns_domain_eq(&domain1, &domain2));
565*5d5fbe79SDavid van Moolenbroek }
566*5d5fbe79SDavid van Moolenbroek END_TEST
567*5d5fbe79SDavid van Moolenbroek 
START_TEST(domain_eq_length)568*5d5fbe79SDavid van Moolenbroek START_TEST(domain_eq_length)
569*5d5fbe79SDavid van Moolenbroek {
570*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain1, domain2;
571*5d5fbe79SDavid van Moolenbroek   err_t res;
572*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
573*5d5fbe79SDavid van Moolenbroek 
574*5d5fbe79SDavid van Moolenbroek   memset(&domain1, 0, sizeof(domain1));
575*5d5fbe79SDavid van Moolenbroek   memset(domain1.name, 0xAA, sizeof(MDNS_DOMAIN_MAXLEN));
576*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, "multi", 5);
577*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
578*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain1, "cast", 4);
579*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
580*5d5fbe79SDavid van Moolenbroek 
581*5d5fbe79SDavid van Moolenbroek   memset(&domain2, 0, sizeof(domain2));
582*5d5fbe79SDavid van Moolenbroek   memset(domain2.name, 0xBB, sizeof(MDNS_DOMAIN_MAXLEN));
583*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, "multi", 5);
584*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
585*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain2, "cast", 4);
586*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
587*5d5fbe79SDavid van Moolenbroek 
588*5d5fbe79SDavid van Moolenbroek   fail_unless(mdns_domain_eq(&domain1, &domain2));
589*5d5fbe79SDavid van Moolenbroek }
590*5d5fbe79SDavid van Moolenbroek END_TEST
591*5d5fbe79SDavid van Moolenbroek 
START_TEST(compress_full_match)592*5d5fbe79SDavid van Moolenbroek START_TEST(compress_full_match)
593*5d5fbe79SDavid van Moolenbroek {
594*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
595*5d5fbe79SDavid van Moolenbroek       0x00, 0x00,
596*5d5fbe79SDavid van Moolenbroek       0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00
597*5d5fbe79SDavid van Moolenbroek   };
598*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
599*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
600*5d5fbe79SDavid van Moolenbroek   u16_t offset;
601*5d5fbe79SDavid van Moolenbroek   u16_t length;
602*5d5fbe79SDavid van Moolenbroek   err_t res;
603*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
604*5d5fbe79SDavid van Moolenbroek 
605*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
606*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
607*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
608*5d5fbe79SDavid van Moolenbroek 
609*5d5fbe79SDavid van Moolenbroek   memset(&domain, 0, sizeof(domain));
610*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "foobar", 6);
611*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
612*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "local", 5);
613*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
614*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, NULL, 0);
615*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
616*5d5fbe79SDavid van Moolenbroek 
617*5d5fbe79SDavid van Moolenbroek   offset = 2;
618*5d5fbe79SDavid van Moolenbroek   length = mdns_compress_domain(p, &offset, &domain);
619*5d5fbe79SDavid van Moolenbroek   /* Write 0 bytes, then a jump to addr 2 */
620*5d5fbe79SDavid van Moolenbroek   fail_unless(length == 0);
621*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == 2);
622*5d5fbe79SDavid van Moolenbroek 
623*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
624*5d5fbe79SDavid van Moolenbroek }
625*5d5fbe79SDavid van Moolenbroek END_TEST
626*5d5fbe79SDavid van Moolenbroek 
START_TEST(compress_full_match_subset)627*5d5fbe79SDavid van Moolenbroek START_TEST(compress_full_match_subset)
628*5d5fbe79SDavid van Moolenbroek {
629*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
630*5d5fbe79SDavid van Moolenbroek       0x00, 0x00,
631*5d5fbe79SDavid van Moolenbroek       0x02, 'g', 'o', 0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00
632*5d5fbe79SDavid van Moolenbroek   };
633*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
634*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
635*5d5fbe79SDavid van Moolenbroek   u16_t offset;
636*5d5fbe79SDavid van Moolenbroek   u16_t length;
637*5d5fbe79SDavid van Moolenbroek   err_t res;
638*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
639*5d5fbe79SDavid van Moolenbroek 
640*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
641*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
642*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
643*5d5fbe79SDavid van Moolenbroek 
644*5d5fbe79SDavid van Moolenbroek   memset(&domain, 0, sizeof(domain));
645*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "foobar", 6);
646*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
647*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "local", 5);
648*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
649*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, NULL, 0);
650*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
651*5d5fbe79SDavid van Moolenbroek 
652*5d5fbe79SDavid van Moolenbroek   offset = 2;
653*5d5fbe79SDavid van Moolenbroek   length = mdns_compress_domain(p, &offset, &domain);
654*5d5fbe79SDavid van Moolenbroek   /* Write 0 bytes, then a jump to addr 5 */
655*5d5fbe79SDavid van Moolenbroek   fail_unless(length == 0);
656*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == 5);
657*5d5fbe79SDavid van Moolenbroek 
658*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
659*5d5fbe79SDavid van Moolenbroek }
660*5d5fbe79SDavid van Moolenbroek END_TEST
661*5d5fbe79SDavid van Moolenbroek 
START_TEST(compress_full_match_jump)662*5d5fbe79SDavid van Moolenbroek START_TEST(compress_full_match_jump)
663*5d5fbe79SDavid van Moolenbroek {
664*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
665*5d5fbe79SDavid van Moolenbroek     /* 0x00 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
666*5d5fbe79SDavid van Moolenbroek                0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
667*5d5fbe79SDavid van Moolenbroek     /* 0x10 */ 0x04, 'l', 'w', 'i', 'p', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, 0xc0, 0x00, 0x02, 0x00,
668*5d5fbe79SDavid van Moolenbroek     /* 0x20 */ 0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0xc0, 0x15
669*5d5fbe79SDavid van Moolenbroek   };
670*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
671*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
672*5d5fbe79SDavid van Moolenbroek   u16_t offset;
673*5d5fbe79SDavid van Moolenbroek   u16_t length;
674*5d5fbe79SDavid van Moolenbroek   err_t res;
675*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
676*5d5fbe79SDavid van Moolenbroek 
677*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
678*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
679*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
680*5d5fbe79SDavid van Moolenbroek 
681*5d5fbe79SDavid van Moolenbroek   memset(&domain, 0, sizeof(domain));
682*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "foobar", 6);
683*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
684*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "local", 5);
685*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
686*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, NULL, 0);
687*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
688*5d5fbe79SDavid van Moolenbroek 
689*5d5fbe79SDavid van Moolenbroek   offset = 0x20;
690*5d5fbe79SDavid van Moolenbroek   length = mdns_compress_domain(p, &offset, &domain);
691*5d5fbe79SDavid van Moolenbroek   /* Write 0 bytes, then a jump to addr 0x20 */
692*5d5fbe79SDavid van Moolenbroek   fail_unless(length == 0);
693*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == 0x20);
694*5d5fbe79SDavid van Moolenbroek 
695*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
696*5d5fbe79SDavid van Moolenbroek }
697*5d5fbe79SDavid van Moolenbroek END_TEST
698*5d5fbe79SDavid van Moolenbroek 
START_TEST(compress_no_match)699*5d5fbe79SDavid van Moolenbroek START_TEST(compress_no_match)
700*5d5fbe79SDavid van Moolenbroek {
701*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
702*5d5fbe79SDavid van Moolenbroek       0x00, 0x00,
703*5d5fbe79SDavid van Moolenbroek       0x04, 'l', 'w', 'i', 'p', 0x05, 'w', 'i', 'k', 'i', 'a', 0x03, 'c', 'o', 'm', 0x00
704*5d5fbe79SDavid van Moolenbroek   };
705*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
706*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
707*5d5fbe79SDavid van Moolenbroek   u16_t offset;
708*5d5fbe79SDavid van Moolenbroek   u16_t length;
709*5d5fbe79SDavid van Moolenbroek   err_t res;
710*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
711*5d5fbe79SDavid van Moolenbroek 
712*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
713*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
714*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
715*5d5fbe79SDavid van Moolenbroek 
716*5d5fbe79SDavid van Moolenbroek   memset(&domain, 0, sizeof(domain));
717*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "foobar", 6);
718*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
719*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "local", 5);
720*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
721*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, NULL, 0);
722*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
723*5d5fbe79SDavid van Moolenbroek 
724*5d5fbe79SDavid van Moolenbroek   offset = 2;
725*5d5fbe79SDavid van Moolenbroek   length = mdns_compress_domain(p, &offset, &domain);
726*5d5fbe79SDavid van Moolenbroek   /* Write all bytes, no jump */
727*5d5fbe79SDavid van Moolenbroek   fail_unless(length == domain.length);
728*5d5fbe79SDavid van Moolenbroek 
729*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
730*5d5fbe79SDavid van Moolenbroek }
731*5d5fbe79SDavid van Moolenbroek END_TEST
732*5d5fbe79SDavid van Moolenbroek 
START_TEST(compress_2nd_label)733*5d5fbe79SDavid van Moolenbroek START_TEST(compress_2nd_label)
734*5d5fbe79SDavid van Moolenbroek {
735*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
736*5d5fbe79SDavid van Moolenbroek       0x00, 0x00,
737*5d5fbe79SDavid van Moolenbroek       0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00
738*5d5fbe79SDavid van Moolenbroek   };
739*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
740*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
741*5d5fbe79SDavid van Moolenbroek   u16_t offset;
742*5d5fbe79SDavid van Moolenbroek   u16_t length;
743*5d5fbe79SDavid van Moolenbroek   err_t res;
744*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
745*5d5fbe79SDavid van Moolenbroek 
746*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
747*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
748*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
749*5d5fbe79SDavid van Moolenbroek 
750*5d5fbe79SDavid van Moolenbroek   memset(&domain, 0, sizeof(domain));
751*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "lwip", 4);
752*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
753*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "local", 5);
754*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
755*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, NULL, 0);
756*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
757*5d5fbe79SDavid van Moolenbroek 
758*5d5fbe79SDavid van Moolenbroek   offset = 2;
759*5d5fbe79SDavid van Moolenbroek   length = mdns_compress_domain(p, &offset, &domain);
760*5d5fbe79SDavid van Moolenbroek   /* Write 5 bytes, then a jump to addr 9 */
761*5d5fbe79SDavid van Moolenbroek   fail_unless(length == 5);
762*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == 9);
763*5d5fbe79SDavid van Moolenbroek 
764*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
765*5d5fbe79SDavid van Moolenbroek }
766*5d5fbe79SDavid van Moolenbroek END_TEST
767*5d5fbe79SDavid van Moolenbroek 
START_TEST(compress_2nd_label_short)768*5d5fbe79SDavid van Moolenbroek START_TEST(compress_2nd_label_short)
769*5d5fbe79SDavid van Moolenbroek {
770*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
771*5d5fbe79SDavid van Moolenbroek       0x00, 0x00,
772*5d5fbe79SDavid van Moolenbroek       0x04, 'l', 'w', 'i', 'p', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00
773*5d5fbe79SDavid van Moolenbroek   };
774*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
775*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
776*5d5fbe79SDavid van Moolenbroek   u16_t offset;
777*5d5fbe79SDavid van Moolenbroek   u16_t length;
778*5d5fbe79SDavid van Moolenbroek   err_t res;
779*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
780*5d5fbe79SDavid van Moolenbroek 
781*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
782*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
783*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
784*5d5fbe79SDavid van Moolenbroek 
785*5d5fbe79SDavid van Moolenbroek   memset(&domain, 0, sizeof(domain));
786*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "foobar", 6);
787*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
788*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "local", 5);
789*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
790*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, NULL, 0);
791*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
792*5d5fbe79SDavid van Moolenbroek 
793*5d5fbe79SDavid van Moolenbroek   offset = 2;
794*5d5fbe79SDavid van Moolenbroek   length = mdns_compress_domain(p, &offset, &domain);
795*5d5fbe79SDavid van Moolenbroek   /* Write 5 bytes, then a jump to addr 7 */
796*5d5fbe79SDavid van Moolenbroek   fail_unless(length == 7);
797*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == 7);
798*5d5fbe79SDavid van Moolenbroek 
799*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
800*5d5fbe79SDavid van Moolenbroek }
801*5d5fbe79SDavid van Moolenbroek END_TEST
802*5d5fbe79SDavid van Moolenbroek 
START_TEST(compress_jump_to_jump)803*5d5fbe79SDavid van Moolenbroek START_TEST(compress_jump_to_jump)
804*5d5fbe79SDavid van Moolenbroek {
805*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
806*5d5fbe79SDavid van Moolenbroek       /* 0x00 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
807*5d5fbe79SDavid van Moolenbroek                  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
808*5d5fbe79SDavid van Moolenbroek       /* 0x10 */ 0x04, 'l', 'w', 'i', 'p', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, 0xc0, 0x00, 0x02, 0x00,
809*5d5fbe79SDavid van Moolenbroek       /* 0x20 */ 0x07, 'b', 'a', 'n', 'a', 'n', 'a', 's', 0xc0, 0x15
810*5d5fbe79SDavid van Moolenbroek   };
811*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
812*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
813*5d5fbe79SDavid van Moolenbroek   u16_t offset;
814*5d5fbe79SDavid van Moolenbroek   u16_t length;
815*5d5fbe79SDavid van Moolenbroek   err_t res;
816*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
817*5d5fbe79SDavid van Moolenbroek 
818*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
819*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
820*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
821*5d5fbe79SDavid van Moolenbroek 
822*5d5fbe79SDavid van Moolenbroek   memset(&domain, 0, sizeof(domain));
823*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "foobar", 6);
824*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
825*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "local", 5);
826*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
827*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, NULL, 0);
828*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
829*5d5fbe79SDavid van Moolenbroek 
830*5d5fbe79SDavid van Moolenbroek   offset = 0x20;
831*5d5fbe79SDavid van Moolenbroek   length = mdns_compress_domain(p, &offset, &domain);
832*5d5fbe79SDavid van Moolenbroek   /* Dont compress if jump would be to a jump */
833*5d5fbe79SDavid van Moolenbroek   fail_unless(length == domain.length);
834*5d5fbe79SDavid van Moolenbroek 
835*5d5fbe79SDavid van Moolenbroek   offset = 0x10;
836*5d5fbe79SDavid van Moolenbroek   length = mdns_compress_domain(p, &offset, &domain);
837*5d5fbe79SDavid van Moolenbroek   /* Write 7 bytes, then a jump to addr 0x15 */
838*5d5fbe79SDavid van Moolenbroek   fail_unless(length == 7);
839*5d5fbe79SDavid van Moolenbroek   fail_unless(offset == 0x15);
840*5d5fbe79SDavid van Moolenbroek 
841*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
842*5d5fbe79SDavid van Moolenbroek }
843*5d5fbe79SDavid van Moolenbroek END_TEST
844*5d5fbe79SDavid van Moolenbroek 
START_TEST(compress_long_match)845*5d5fbe79SDavid van Moolenbroek START_TEST(compress_long_match)
846*5d5fbe79SDavid van Moolenbroek {
847*5d5fbe79SDavid van Moolenbroek   static const u8_t data[] = {
848*5d5fbe79SDavid van Moolenbroek       0x00, 0x00,
849*5d5fbe79SDavid van Moolenbroek       0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l', 0x03, 'c', 'o', 'm', 0x00
850*5d5fbe79SDavid van Moolenbroek   };
851*5d5fbe79SDavid van Moolenbroek   struct pbuf *p;
852*5d5fbe79SDavid van Moolenbroek   struct mdns_domain domain;
853*5d5fbe79SDavid van Moolenbroek   u16_t offset;
854*5d5fbe79SDavid van Moolenbroek   u16_t length;
855*5d5fbe79SDavid van Moolenbroek   err_t res;
856*5d5fbe79SDavid van Moolenbroek   LWIP_UNUSED_ARG(_i);
857*5d5fbe79SDavid van Moolenbroek 
858*5d5fbe79SDavid van Moolenbroek   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
859*5d5fbe79SDavid van Moolenbroek   p->payload = (void *)(size_t)data;
860*5d5fbe79SDavid van Moolenbroek   fail_if(p == NULL);
861*5d5fbe79SDavid van Moolenbroek 
862*5d5fbe79SDavid van Moolenbroek   memset(&domain, 0, sizeof(domain));
863*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "foobar", 6);
864*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
865*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, "local", 5);
866*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
867*5d5fbe79SDavid van Moolenbroek   res = mdns_domain_add_label(&domain, NULL, 0);
868*5d5fbe79SDavid van Moolenbroek   fail_unless(res == ERR_OK);
869*5d5fbe79SDavid van Moolenbroek 
870*5d5fbe79SDavid van Moolenbroek   offset = 2;
871*5d5fbe79SDavid van Moolenbroek   length = mdns_compress_domain(p, &offset, &domain);
872*5d5fbe79SDavid van Moolenbroek   fail_unless(length == domain.length);
873*5d5fbe79SDavid van Moolenbroek 
874*5d5fbe79SDavid van Moolenbroek   pbuf_free(p);
875*5d5fbe79SDavid van Moolenbroek }
876*5d5fbe79SDavid van Moolenbroek END_TEST
877*5d5fbe79SDavid van Moolenbroek 
mdns_suite(void)878*5d5fbe79SDavid van Moolenbroek Suite* mdns_suite(void)
879*5d5fbe79SDavid van Moolenbroek {
880*5d5fbe79SDavid van Moolenbroek   testfunc tests[] = {
881*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_basic),
882*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_anydata),
883*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_short_buf),
884*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_long_label),
885*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_overflow),
886*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_jump_earlier),
887*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_jump_earlier_jump),
888*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_jump_maxdepth),
889*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_jump_later),
890*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_half_jump),
891*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_jump_toolong),
892*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_jump_loop_label),
893*5d5fbe79SDavid van Moolenbroek     TESTFUNC(readname_jump_loop_jump),
894*5d5fbe79SDavid van Moolenbroek 
895*5d5fbe79SDavid van Moolenbroek     TESTFUNC(add_label_basic),
896*5d5fbe79SDavid van Moolenbroek     TESTFUNC(add_label_long_label),
897*5d5fbe79SDavid van Moolenbroek     TESTFUNC(add_label_full),
898*5d5fbe79SDavid van Moolenbroek 
899*5d5fbe79SDavid van Moolenbroek     TESTFUNC(domain_eq_basic),
900*5d5fbe79SDavid van Moolenbroek     TESTFUNC(domain_eq_diff),
901*5d5fbe79SDavid van Moolenbroek     TESTFUNC(domain_eq_case),
902*5d5fbe79SDavid van Moolenbroek     TESTFUNC(domain_eq_anydata),
903*5d5fbe79SDavid van Moolenbroek     TESTFUNC(domain_eq_length),
904*5d5fbe79SDavid van Moolenbroek 
905*5d5fbe79SDavid van Moolenbroek     TESTFUNC(compress_full_match),
906*5d5fbe79SDavid van Moolenbroek     TESTFUNC(compress_full_match_subset),
907*5d5fbe79SDavid van Moolenbroek     TESTFUNC(compress_full_match_jump),
908*5d5fbe79SDavid van Moolenbroek     TESTFUNC(compress_no_match),
909*5d5fbe79SDavid van Moolenbroek     TESTFUNC(compress_2nd_label),
910*5d5fbe79SDavid van Moolenbroek     TESTFUNC(compress_2nd_label_short),
911*5d5fbe79SDavid van Moolenbroek     TESTFUNC(compress_jump_to_jump),
912*5d5fbe79SDavid van Moolenbroek     TESTFUNC(compress_long_match),
913*5d5fbe79SDavid van Moolenbroek   };
914*5d5fbe79SDavid van Moolenbroek   return create_suite("MDNS", tests, sizeof(tests)/sizeof(testfunc), NULL, NULL);
915*5d5fbe79SDavid van Moolenbroek }
916