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