Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers test_mdns.c Source File

test_mdns.c

00001 /*
00002  * Copyright (c) 2015 Verisure Innovation AB
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without modification,
00006  * are permitted provided that the following conditions are met:
00007  *
00008  * 1. Redistributions of source code must retain the above copyright notice,
00009  *    this list of conditions and the following disclaimer.
00010  * 2. Redistributions in binary form must reproduce the above copyright notice,
00011  *    this list of conditions and the following disclaimer in the documentation
00012  *    and/or other materials provided with the distribution.
00013  * 3. The name of the author may not be used to endorse or promote products
00014  *    derived from this software without specific prior written permission.
00015  *
00016  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
00017  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00018  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
00019  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00020  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
00021  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00022  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00023  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
00024  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
00025  * OF SUCH DAMAGE.
00026  *
00027  * This file is part of the lwIP TCP/IP stack.
00028  *
00029  * Author: Erik Ekman <erik@kryo.se>
00030  *
00031  */
00032 
00033 #include "test_mdns.h"
00034 
00035 #include "lwip/pbuf.h"
00036 #include "lwip/apps/mdns.h"
00037 #include "lwip/apps/mdns_priv.h"
00038 
00039 START_TEST(readname_basic)
00040 {
00041   static const u8_t data[] = { 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x00 };
00042   struct pbuf *p;
00043   struct mdns_domain domain;
00044   u16_t offset;
00045   LWIP_UNUSED_ARG(_i);
00046 
00047   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00048   p->payload = (void *)(size_t)data;
00049   fail_if(p == NULL);
00050   offset = mdns_readname(p, 0, &domain);
00051   pbuf_free(p);
00052   fail_unless(offset == sizeof(data));
00053   fail_unless(domain.length == sizeof(data));
00054   fail_if(memcmp(&domain.name, data, sizeof(data)));
00055 }
00056 END_TEST
00057 
00058 START_TEST(readname_anydata)
00059 {
00060   static const u8_t data[] = { 0x05, 0x00, 0xFF, 0x08, 0xc0, 0x0f, 0x04, 0x7f, 0x80, 0x82, 0x88, 0x00 };
00061   struct pbuf *p;
00062   struct mdns_domain domain;
00063   u16_t offset;
00064   LWIP_UNUSED_ARG(_i);
00065 
00066   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00067   p->payload = (void *)(size_t)data;
00068   fail_if(p == NULL);
00069   offset = mdns_readname(p, 0, &domain);
00070   pbuf_free(p);
00071   fail_unless(offset == sizeof(data));
00072   fail_unless(domain.length == sizeof(data));
00073   fail_if(memcmp(&domain.name, data, sizeof(data)));
00074 }
00075 END_TEST
00076 
00077 START_TEST(readname_short_buf)
00078 {
00079   static const u8_t data[] = { 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a' };
00080   struct pbuf *p;
00081   struct mdns_domain domain;
00082   u16_t offset;
00083   LWIP_UNUSED_ARG(_i);
00084 
00085   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00086   p->payload = (void *)(size_t)data;
00087   fail_if(p == NULL);
00088   offset = mdns_readname(p, 0, &domain);
00089   pbuf_free(p);
00090   fail_unless(offset == MDNS_READNAME_ERROR);
00091 }
00092 END_TEST
00093 
00094 START_TEST(readname_long_label)
00095 {
00096   static const u8_t data[] = {
00097       0x05, 'm', 'u', 'l', 't', 'i',
00098       0x52, 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
00099       'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
00100       'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
00101       'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
00102       'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',
00103       'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 0x00
00104   };
00105   struct pbuf *p;
00106   struct mdns_domain domain;
00107   u16_t offset;
00108   LWIP_UNUSED_ARG(_i);
00109 
00110   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00111   p->payload = (void *)(size_t)data;
00112   fail_if(p == NULL);
00113   offset = mdns_readname(p, 0, &domain);
00114   pbuf_free(p);
00115   fail_unless(offset == MDNS_READNAME_ERROR);
00116 }
00117 END_TEST
00118 
00119 START_TEST(readname_overflow)
00120 {
00121   static const u8_t data[] = {
00122       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00123       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00124       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00125       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00126       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00127       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00128       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00129       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00130       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00131       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00132       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00133       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00134       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00135       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00136       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00137       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00138       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00139       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00140       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00141       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00142       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00143       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00144       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00145       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00146       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00147       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00148       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00149       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00150       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00151       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00152       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00153       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00154       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00155       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00156       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00157       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00158       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00159       0x00
00160   };
00161   struct pbuf *p;
00162   struct mdns_domain domain;
00163   u16_t offset;
00164   LWIP_UNUSED_ARG(_i);
00165 
00166   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00167   p->payload = (void *)(size_t)data;
00168   fail_if(p == NULL);
00169   offset = mdns_readname(p, 0, &domain);
00170   pbuf_free(p);
00171   fail_unless(offset == MDNS_READNAME_ERROR);
00172 }
00173 END_TEST
00174 
00175 START_TEST(readname_jump_earlier)
00176 {
00177   static const u8_t data[] = {
00178       /* Some padding needed, not supported to jump to bytes containing dns header */
00179       /*  0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00180       /* 10 */ 0x0f, 0x0e, 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, 0xab,
00181       /* 20 */ 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0, 0x0c
00182   };
00183   static const u8_t fullname[] = {
00184       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00
00185   };
00186   struct pbuf *p;
00187   struct mdns_domain domain;
00188   u16_t offset;
00189   LWIP_UNUSED_ARG(_i);
00190 
00191   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00192   p->payload = (void *)(size_t)data;
00193   fail_if(p == NULL);
00194   offset = mdns_readname(p, 20, &domain);
00195   pbuf_free(p);
00196   fail_unless(offset == sizeof(data));
00197   fail_unless(domain.length == sizeof(fullname));
00198 
00199   fail_if(memcmp(&domain.name, fullname, sizeof(fullname)));
00200 }
00201 END_TEST
00202 
00203 START_TEST(readname_jump_earlier_jump)
00204 {
00205   static const u8_t data[] = {
00206       /* Some padding needed, not supported to jump to bytes containing dns header */
00207       /* 0x00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00208       /* 0x08 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x0b, 0x0a, 0xf2,
00209       /* 0x10 */ 0x04, 'c', 'a', 's', 't', 0x00, 0xc0, 0x10,
00210       /* 0x18 */ 0x05, 'm', 'u', 'l', 't', 'i', 0xc0, 0x16
00211   };
00212   static const u8_t fullname[] = {
00213       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x00
00214   };
00215   struct pbuf *p;
00216   struct mdns_domain domain;
00217   u16_t offset;
00218   LWIP_UNUSED_ARG(_i);
00219 
00220   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00221   p->payload = (void *)(size_t)data;
00222   fail_if(p == NULL);
00223   offset = mdns_readname(p, 0x18, &domain);
00224   pbuf_free(p);
00225   fail_unless(offset == sizeof(data));
00226   fail_unless(domain.length == sizeof(fullname));
00227 
00228   fail_if(memcmp(&domain.name, fullname, sizeof(fullname)));
00229 }
00230 END_TEST
00231 
00232 START_TEST(readname_jump_maxdepth)
00233 {
00234   static const u8_t data[] = {
00235       /* Some padding needed, not supported to jump to bytes containing dns header */
00236       /* 0x00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00237       /* 0x08 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x0b, 0x0a, 0xf2,
00238       /* 0x10 */ 0x04, 'n', 'a', 'm', 'e', 0xc0, 0x27, 0x03,
00239       /* 0x18 */ 0x03, 'd', 'n', 's', 0xc0, 0x10, 0xc0, 0x10,
00240       /* 0x20 */ 0x04, 'd', 'e', 'e', 'p', 0xc0, 0x18, 0x00,
00241       /* 0x28 */ 0x04, 'c', 'a', 's', 't', 0xc0, 0x20, 0xb0,
00242       /* 0x30 */ 0x05, 'm', 'u', 'l', 't', 'i', 0xc0, 0x28
00243   };
00244   static const u8_t fullname[] = {
00245       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',
00246       0x04, 'd', 'e', 'e', 'p', 0x03, 'd', 'n', 's',
00247       0x04, 'n', 'a', 'm', 'e', 0x00
00248   };
00249   struct pbuf *p;
00250   struct mdns_domain domain;
00251   u16_t offset;
00252   LWIP_UNUSED_ARG(_i);
00253 
00254   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00255   p->payload = (void *)(size_t)data;
00256   fail_if(p == NULL);
00257   offset = mdns_readname(p, 0x30, &domain);
00258   pbuf_free(p);
00259   fail_unless(offset == sizeof(data));
00260   fail_unless(domain.length == sizeof(fullname));
00261 
00262   fail_if(memcmp(&domain.name, fullname, sizeof(fullname)));
00263 }
00264 END_TEST
00265 
00266 START_TEST(readname_jump_later)
00267 {
00268   static const u8_t data[] = {
00269       /* 0x00 */ 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0, 0x10, 0x00, 0x01, 0x40,
00270       /* 0x10 */ 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, 0xab
00271   };
00272   static const u8_t fullname[] = {
00273       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00
00274   };
00275   struct pbuf *p;
00276   struct mdns_domain domain;
00277   u16_t offset;
00278   LWIP_UNUSED_ARG(_i);
00279 
00280   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00281   p->payload = (void *)(size_t)data;
00282   fail_if(p == NULL);
00283   offset = mdns_readname(p, 0, &domain);
00284   pbuf_free(p);
00285   fail_unless(offset == 13);
00286   fail_unless(domain.length == sizeof(fullname));
00287 
00288   fail_if(memcmp(&domain.name, fullname, sizeof(fullname)));
00289 }
00290 END_TEST
00291 
00292 START_TEST(readname_half_jump)
00293 {
00294   static const u8_t data[] = {
00295       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0
00296   };
00297   struct pbuf *p;
00298   struct mdns_domain domain;
00299   u16_t offset;
00300   LWIP_UNUSED_ARG(_i);
00301 
00302   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00303   p->payload = (void *)(size_t)data;
00304   fail_if(p == NULL);
00305   offset = mdns_readname(p, 0, &domain);
00306   pbuf_free(p);
00307   fail_unless(offset == MDNS_READNAME_ERROR);
00308 }
00309 END_TEST
00310 
00311 START_TEST(readname_jump_toolong)
00312 {
00313   static const u8_t data[] = {
00314       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc2, 0x10, 0x00, 0x01, 0x40
00315   };
00316   struct pbuf *p;
00317   struct mdns_domain domain;
00318   u16_t offset;
00319   LWIP_UNUSED_ARG(_i);
00320 
00321   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00322   p->payload = (void *)(size_t)data;
00323   fail_if(p == NULL);
00324   offset = mdns_readname(p, 0, &domain);
00325   pbuf_free(p);
00326   fail_unless(offset == MDNS_READNAME_ERROR);
00327 }
00328 END_TEST
00329 
00330 START_TEST(readname_jump_loop_label)
00331 {
00332   static const u8_t data[] = {
00333       /*  0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00334       /* 10 */ 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0, 0x10
00335   };
00336   struct pbuf *p;
00337   struct mdns_domain domain;
00338   u16_t offset;
00339   LWIP_UNUSED_ARG(_i);
00340 
00341   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00342   p->payload = (void *)(size_t)data;
00343   fail_if(p == NULL);
00344   offset = mdns_readname(p, 10, &domain);
00345   pbuf_free(p);
00346   fail_unless(offset == MDNS_READNAME_ERROR);
00347 }
00348 END_TEST
00349 
00350 START_TEST(readname_jump_loop_jump)
00351 {
00352   static const u8_t data[] = {
00353       /*  0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00354       /* 10 */ 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0, 0x15
00355   };
00356   struct pbuf *p;
00357   struct mdns_domain domain;
00358   u16_t offset;
00359   LWIP_UNUSED_ARG(_i);
00360 
00361   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00362   p->payload = (void *)(size_t)data;
00363   fail_if(p == NULL);
00364   offset = mdns_readname(p, 10, &domain);
00365   pbuf_free(p);
00366   fail_unless(offset == MDNS_READNAME_ERROR);
00367 }
00368 END_TEST
00369 
00370 START_TEST(add_label_basic)
00371 {
00372   static const u8_t data[] = { 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x00 };
00373   struct mdns_domain domain;
00374   err_t res;
00375   LWIP_UNUSED_ARG(_i);
00376 
00377   memset(&domain, 0, sizeof(domain));
00378   res = mdns_domain_add_label(&domain, "multi", 5);
00379   fail_unless(res == ERR_OK);
00380   res = mdns_domain_add_label(&domain, "cast", 4);
00381   fail_unless(res == ERR_OK);
00382   res = mdns_domain_add_label(&domain, NULL, 0);
00383   fail_unless(res == ERR_OK);
00384   fail_unless(domain.length == sizeof(data));
00385   fail_if(memcmp(&domain.name, data, sizeof(data)));
00386 }
00387 END_TEST
00388 
00389 START_TEST(add_label_long_label)
00390 {
00391   static const char *toolong = "abcdefghijklmnopqrstuvwxyz0123456789-abcdefghijklmnopqrstuvwxyz0123456789-abcdefghijklmnopqrstuvwxyz0123456789-";
00392   struct mdns_domain domain;
00393   err_t res;
00394   LWIP_UNUSED_ARG(_i);
00395 
00396   memset(&domain, 0, sizeof(domain));
00397   res = mdns_domain_add_label(&domain, "multi", 5);
00398   fail_unless(res == ERR_OK);
00399   res = mdns_domain_add_label(&domain, toolong, (u8_t)strlen(toolong));
00400   fail_unless(res == ERR_VAL);
00401 }
00402 END_TEST
00403 
00404 START_TEST(add_label_full)
00405 {
00406   static const char *label = "0123456789abcdef0123456789abcdef";
00407   struct mdns_domain domain;
00408   err_t res;
00409   LWIP_UNUSED_ARG(_i);
00410 
00411   memset(&domain, 0, sizeof(domain));
00412   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
00413   fail_unless(res == ERR_OK);
00414   fail_unless(domain.length == 33);
00415   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
00416   fail_unless(res == ERR_OK);
00417   fail_unless(domain.length == 66);
00418   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
00419   fail_unless(res == ERR_OK);
00420   fail_unless(domain.length == 99);
00421   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
00422   fail_unless(res == ERR_OK);
00423   fail_unless(domain.length == 132);
00424   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
00425   fail_unless(res == ERR_OK);
00426   fail_unless(domain.length == 165);
00427   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
00428   fail_unless(res == ERR_OK);
00429   fail_unless(domain.length == 198);
00430   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
00431   fail_unless(res == ERR_OK);
00432   fail_unless(domain.length == 231);
00433   res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));
00434   fail_unless(res == ERR_VAL);
00435   fail_unless(domain.length == 231);
00436   res = mdns_domain_add_label(&domain, label, 25);
00437   fail_unless(res == ERR_VAL);
00438   fail_unless(domain.length == 231);
00439   res = mdns_domain_add_label(&domain, label, 24);
00440   fail_unless(res == ERR_VAL);
00441   fail_unless(domain.length == 231);
00442   res = mdns_domain_add_label(&domain, label, 23);
00443   fail_unless(res == ERR_OK);
00444   fail_unless(domain.length == 255);
00445   res = mdns_domain_add_label(&domain, NULL, 0);
00446   fail_unless(res == ERR_OK);
00447   fail_unless(domain.length == 256);
00448   res = mdns_domain_add_label(&domain, NULL, 0);
00449   fail_unless(res == ERR_VAL);
00450   fail_unless(domain.length == 256);
00451 }
00452 END_TEST
00453 
00454 START_TEST(domain_eq_basic)
00455 {
00456   static const u8_t data[] = {
00457       0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x00
00458   };
00459   struct mdns_domain domain1, domain2;
00460   err_t res;
00461   LWIP_UNUSED_ARG(_i);
00462 
00463   memset(&domain1, 0, sizeof(domain1));
00464   res = mdns_domain_add_label(&domain1, "multi", 5);
00465   fail_unless(res == ERR_OK);
00466   res = mdns_domain_add_label(&domain1, "cast", 4);
00467   fail_unless(res == ERR_OK);
00468   res = mdns_domain_add_label(&domain1, NULL, 0);
00469   fail_unless(res == ERR_OK);
00470   fail_unless(domain1.length == sizeof(data));
00471 
00472   memset(&domain2, 0, sizeof(domain2));
00473   res = mdns_domain_add_label(&domain2, "multi", 5);
00474   fail_unless(res == ERR_OK);
00475   res = mdns_domain_add_label(&domain2, "cast", 4);
00476   fail_unless(res == ERR_OK);
00477   res = mdns_domain_add_label(&domain2, NULL, 0);
00478   fail_unless(res == ERR_OK);
00479 
00480   fail_unless(mdns_domain_eq(&domain1, &domain2));
00481 }
00482 END_TEST
00483 
00484 START_TEST(domain_eq_diff)
00485 {
00486   struct mdns_domain domain1, domain2;
00487   err_t res;
00488   LWIP_UNUSED_ARG(_i);
00489 
00490   memset(&domain1, 0, sizeof(domain1));
00491   res = mdns_domain_add_label(&domain1, "multi", 5);
00492   fail_unless(res == ERR_OK);
00493   res = mdns_domain_add_label(&domain1, "base", 4);
00494   fail_unless(res == ERR_OK);
00495   res = mdns_domain_add_label(&domain1, NULL, 0);
00496   fail_unless(res == ERR_OK);
00497 
00498   memset(&domain2, 0, sizeof(domain2));
00499   res = mdns_domain_add_label(&domain2, "multi", 5);
00500   fail_unless(res == ERR_OK);
00501   res = mdns_domain_add_label(&domain2, "cast", 4);
00502   fail_unless(res == ERR_OK);
00503   res = mdns_domain_add_label(&domain2, NULL, 0);
00504   fail_unless(res == ERR_OK);
00505 
00506   fail_if(mdns_domain_eq(&domain1, &domain2));
00507 }
00508 END_TEST
00509 
00510 START_TEST(domain_eq_case)
00511 {
00512   struct mdns_domain domain1, domain2;
00513   err_t res;
00514   LWIP_UNUSED_ARG(_i);
00515 
00516   memset(&domain1, 0, sizeof(domain1));
00517   res = mdns_domain_add_label(&domain1, "multi", 5);
00518   fail_unless(res == ERR_OK);
00519   res = mdns_domain_add_label(&domain1, "cast", 4);
00520   fail_unless(res == ERR_OK);
00521   res = mdns_domain_add_label(&domain1, NULL, 0);
00522   fail_unless(res == ERR_OK);
00523 
00524   memset(&domain2, 0, sizeof(domain2));
00525   res = mdns_domain_add_label(&domain2, "MulTI", 5);
00526   fail_unless(res == ERR_OK);
00527   res = mdns_domain_add_label(&domain2, "casT", 4);
00528   fail_unless(res == ERR_OK);
00529   res = mdns_domain_add_label(&domain2, NULL, 0);
00530   fail_unless(res == ERR_OK);
00531 
00532   fail_unless(mdns_domain_eq(&domain1, &domain2));
00533 }
00534 END_TEST
00535 
00536 START_TEST(domain_eq_anydata)
00537 {
00538   static const u8_t data1[] = { 0x05, 0xcc, 0xdc, 0x00, 0xa0 };
00539   static const u8_t data2[] = { 0x7f, 0x8c, 0x01, 0xff, 0xcf };
00540   struct mdns_domain domain1, domain2;
00541   err_t res;
00542   LWIP_UNUSED_ARG(_i);
00543 
00544   memset(&domain1, 0, sizeof(domain1));
00545   res = mdns_domain_add_label(&domain1, (const char*)data1, sizeof(data1));
00546   fail_unless(res == ERR_OK);
00547   res = mdns_domain_add_label(&domain1, "cast", 4);
00548   fail_unless(res == ERR_OK);
00549   res = mdns_domain_add_label(&domain1, (const char*)data2, sizeof(data2));
00550   fail_unless(res == ERR_OK);
00551   res = mdns_domain_add_label(&domain1, NULL, 0);
00552   fail_unless(res == ERR_OK);
00553 
00554   memset(&domain2, 0, sizeof(domain2));
00555   res = mdns_domain_add_label(&domain2, (const char*)data1, sizeof(data1));
00556   fail_unless(res == ERR_OK);
00557   res = mdns_domain_add_label(&domain2, "casT", 4);
00558   fail_unless(res == ERR_OK);
00559   res = mdns_domain_add_label(&domain2, (const char*)data2, sizeof(data2));
00560   fail_unless(res == ERR_OK);
00561   res = mdns_domain_add_label(&domain2, NULL, 0);
00562   fail_unless(res == ERR_OK);
00563 
00564   fail_unless(mdns_domain_eq(&domain1, &domain2));
00565 }
00566 END_TEST
00567 
00568 START_TEST(domain_eq_length)
00569 {
00570   struct mdns_domain domain1, domain2;
00571   err_t res;
00572   LWIP_UNUSED_ARG(_i);
00573 
00574   memset(&domain1, 0, sizeof(domain1));
00575   memset(domain1.name, 0xAA, sizeof(MDNS_DOMAIN_MAXLEN));
00576   res = mdns_domain_add_label(&domain1, "multi", 5);
00577   fail_unless(res == ERR_OK);
00578   res = mdns_domain_add_label(&domain1, "cast", 4);
00579   fail_unless(res == ERR_OK);
00580 
00581   memset(&domain2, 0, sizeof(domain2));
00582   memset(domain2.name, 0xBB, sizeof(MDNS_DOMAIN_MAXLEN));
00583   res = mdns_domain_add_label(&domain2, "multi", 5);
00584   fail_unless(res == ERR_OK);
00585   res = mdns_domain_add_label(&domain2, "cast", 4);
00586   fail_unless(res == ERR_OK);
00587 
00588   fail_unless(mdns_domain_eq(&domain1, &domain2));
00589 }
00590 END_TEST
00591 
00592 START_TEST(compress_full_match)
00593 {
00594   static const u8_t data[] = {
00595       0x00, 0x00,
00596       0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00
00597   };
00598   struct pbuf *p;
00599   struct mdns_domain domain;
00600   u16_t offset;
00601   u16_t length;
00602   err_t res;
00603   LWIP_UNUSED_ARG(_i);
00604 
00605   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00606   p->payload = (void *)(size_t)data;
00607   fail_if(p == NULL);
00608 
00609   memset(&domain, 0, sizeof(domain));
00610   res = mdns_domain_add_label(&domain, "foobar", 6);
00611   fail_unless(res == ERR_OK);
00612   res = mdns_domain_add_label(&domain, "local", 5);
00613   fail_unless(res == ERR_OK);
00614   res = mdns_domain_add_label(&domain, NULL, 0);
00615   fail_unless(res == ERR_OK);
00616 
00617   offset = 2;
00618   length = mdns_compress_domain(p, &offset, &domain);
00619   /* Write 0 bytes, then a jump to addr 2 */
00620   fail_unless(length == 0);
00621   fail_unless(offset == 2);
00622 
00623   pbuf_free(p);
00624 }
00625 END_TEST
00626 
00627 START_TEST(compress_full_match_subset)
00628 {
00629   static const u8_t data[] = {
00630       0x00, 0x00,
00631       0x02, 'g', 'o', 0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00
00632   };
00633   struct pbuf *p;
00634   struct mdns_domain domain;
00635   u16_t offset;
00636   u16_t length;
00637   err_t res;
00638   LWIP_UNUSED_ARG(_i);
00639 
00640   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00641   p->payload = (void *)(size_t)data;
00642   fail_if(p == NULL);
00643 
00644   memset(&domain, 0, sizeof(domain));
00645   res = mdns_domain_add_label(&domain, "foobar", 6);
00646   fail_unless(res == ERR_OK);
00647   res = mdns_domain_add_label(&domain, "local", 5);
00648   fail_unless(res == ERR_OK);
00649   res = mdns_domain_add_label(&domain, NULL, 0);
00650   fail_unless(res == ERR_OK);
00651 
00652   offset = 2;
00653   length = mdns_compress_domain(p, &offset, &domain);
00654   /* Write 0 bytes, then a jump to addr 5 */
00655   fail_unless(length == 0);
00656   fail_unless(offset == 5);
00657 
00658   pbuf_free(p);
00659 }
00660 END_TEST
00661 
00662 START_TEST(compress_full_match_jump)
00663 {
00664   static const u8_t data[] = {
00665     /* 0x00 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
00666                0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
00667     /* 0x10 */ 0x04, 'l', 'w', 'i', 'p', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, 0xc0, 0x00, 0x02, 0x00,
00668     /* 0x20 */ 0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0xc0, 0x15
00669   };
00670   struct pbuf *p;
00671   struct mdns_domain domain;
00672   u16_t offset;
00673   u16_t length;
00674   err_t res;
00675   LWIP_UNUSED_ARG(_i);
00676 
00677   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00678   p->payload = (void *)(size_t)data;
00679   fail_if(p == NULL);
00680 
00681   memset(&domain, 0, sizeof(domain));
00682   res = mdns_domain_add_label(&domain, "foobar", 6);
00683   fail_unless(res == ERR_OK);
00684   res = mdns_domain_add_label(&domain, "local", 5);
00685   fail_unless(res == ERR_OK);
00686   res = mdns_domain_add_label(&domain, NULL, 0);
00687   fail_unless(res == ERR_OK);
00688 
00689   offset = 0x20;
00690   length = mdns_compress_domain(p, &offset, &domain);
00691   /* Write 0 bytes, then a jump to addr 0x20 */
00692   fail_unless(length == 0);
00693   fail_unless(offset == 0x20);
00694 
00695   pbuf_free(p);
00696 }
00697 END_TEST
00698 
00699 START_TEST(compress_no_match)
00700 {
00701   static const u8_t data[] = {
00702       0x00, 0x00,
00703       0x04, 'l', 'w', 'i', 'p', 0x05, 'w', 'i', 'k', 'i', 'a', 0x03, 'c', 'o', 'm', 0x00
00704   };
00705   struct pbuf *p;
00706   struct mdns_domain domain;
00707   u16_t offset;
00708   u16_t length;
00709   err_t res;
00710   LWIP_UNUSED_ARG(_i);
00711 
00712   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00713   p->payload = (void *)(size_t)data;
00714   fail_if(p == NULL);
00715 
00716   memset(&domain, 0, sizeof(domain));
00717   res = mdns_domain_add_label(&domain, "foobar", 6);
00718   fail_unless(res == ERR_OK);
00719   res = mdns_domain_add_label(&domain, "local", 5);
00720   fail_unless(res == ERR_OK);
00721   res = mdns_domain_add_label(&domain, NULL, 0);
00722   fail_unless(res == ERR_OK);
00723 
00724   offset = 2;
00725   length = mdns_compress_domain(p, &offset, &domain);
00726   /* Write all bytes, no jump */
00727   fail_unless(length == domain.length);
00728 
00729   pbuf_free(p);
00730 }
00731 END_TEST
00732 
00733 START_TEST(compress_2nd_label)
00734 {
00735   static const u8_t data[] = {
00736       0x00, 0x00,
00737       0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00
00738   };
00739   struct pbuf *p;
00740   struct mdns_domain domain;
00741   u16_t offset;
00742   u16_t length;
00743   err_t res;
00744   LWIP_UNUSED_ARG(_i);
00745 
00746   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00747   p->payload = (void *)(size_t)data;
00748   fail_if(p == NULL);
00749 
00750   memset(&domain, 0, sizeof(domain));
00751   res = mdns_domain_add_label(&domain, "lwip", 4);
00752   fail_unless(res == ERR_OK);
00753   res = mdns_domain_add_label(&domain, "local", 5);
00754   fail_unless(res == ERR_OK);
00755   res = mdns_domain_add_label(&domain, NULL, 0);
00756   fail_unless(res == ERR_OK);
00757 
00758   offset = 2;
00759   length = mdns_compress_domain(p, &offset, &domain);
00760   /* Write 5 bytes, then a jump to addr 9 */
00761   fail_unless(length == 5);
00762   fail_unless(offset == 9);
00763 
00764   pbuf_free(p);
00765 }
00766 END_TEST
00767 
00768 START_TEST(compress_2nd_label_short)
00769 {
00770   static const u8_t data[] = {
00771       0x00, 0x00,
00772       0x04, 'l', 'w', 'i', 'p', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00
00773   };
00774   struct pbuf *p;
00775   struct mdns_domain domain;
00776   u16_t offset;
00777   u16_t length;
00778   err_t res;
00779   LWIP_UNUSED_ARG(_i);
00780 
00781   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00782   p->payload = (void *)(size_t)data;
00783   fail_if(p == NULL);
00784 
00785   memset(&domain, 0, sizeof(domain));
00786   res = mdns_domain_add_label(&domain, "foobar", 6);
00787   fail_unless(res == ERR_OK);
00788   res = mdns_domain_add_label(&domain, "local", 5);
00789   fail_unless(res == ERR_OK);
00790   res = mdns_domain_add_label(&domain, NULL, 0);
00791   fail_unless(res == ERR_OK);
00792 
00793   offset = 2;
00794   length = mdns_compress_domain(p, &offset, &domain);
00795   /* Write 5 bytes, then a jump to addr 7 */
00796   fail_unless(length == 7);
00797   fail_unless(offset == 7);
00798 
00799   pbuf_free(p);
00800 }
00801 END_TEST
00802 
00803 START_TEST(compress_jump_to_jump)
00804 {
00805   static const u8_t data[] = {
00806       /* 0x00 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
00807                  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
00808       /* 0x10 */ 0x04, 'l', 'w', 'i', 'p', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, 0xc0, 0x00, 0x02, 0x00,
00809       /* 0x20 */ 0x07, 'b', 'a', 'n', 'a', 'n', 'a', 's', 0xc0, 0x15
00810   };
00811   struct pbuf *p;
00812   struct mdns_domain domain;
00813   u16_t offset;
00814   u16_t length;
00815   err_t res;
00816   LWIP_UNUSED_ARG(_i);
00817 
00818   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00819   p->payload = (void *)(size_t)data;
00820   fail_if(p == NULL);
00821 
00822   memset(&domain, 0, sizeof(domain));
00823   res = mdns_domain_add_label(&domain, "foobar", 6);
00824   fail_unless(res == ERR_OK);
00825   res = mdns_domain_add_label(&domain, "local", 5);
00826   fail_unless(res == ERR_OK);
00827   res = mdns_domain_add_label(&domain, NULL, 0);
00828   fail_unless(res == ERR_OK);
00829 
00830   offset = 0x20;
00831   length = mdns_compress_domain(p, &offset, &domain);
00832   /* Dont compress if jump would be to a jump */
00833   fail_unless(length == domain.length);
00834 
00835   offset = 0x10;
00836   length = mdns_compress_domain(p, &offset, &domain);
00837   /* Write 7 bytes, then a jump to addr 0x15 */
00838   fail_unless(length == 7);
00839   fail_unless(offset == 0x15);
00840 
00841   pbuf_free(p);
00842 }
00843 END_TEST
00844 
00845 START_TEST(compress_long_match)
00846 {
00847   static const u8_t data[] = {
00848       0x00, 0x00,
00849       0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l', 0x03, 'c', 'o', 'm', 0x00
00850   };
00851   struct pbuf *p;
00852   struct mdns_domain domain;
00853   u16_t offset;
00854   u16_t length;
00855   err_t res;
00856   LWIP_UNUSED_ARG(_i);
00857 
00858   p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);
00859   p->payload = (void *)(size_t)data;
00860   fail_if(p == NULL);
00861 
00862   memset(&domain, 0, sizeof(domain));
00863   res = mdns_domain_add_label(&domain, "foobar", 6);
00864   fail_unless(res == ERR_OK);
00865   res = mdns_domain_add_label(&domain, "local", 5);
00866   fail_unless(res == ERR_OK);
00867   res = mdns_domain_add_label(&domain, NULL, 0);
00868   fail_unless(res == ERR_OK);
00869 
00870   offset = 2;
00871   length = mdns_compress_domain(p, &offset, &domain);
00872   fail_unless(length == domain.length);
00873 
00874   pbuf_free(p);
00875 }
00876 END_TEST
00877 
00878 Suite* mdns_suite(void)
00879 {
00880   testfunc tests[] = {
00881     TESTFUNC(readname_basic),
00882     TESTFUNC(readname_anydata),
00883     TESTFUNC(readname_short_buf),
00884     TESTFUNC(readname_long_label),
00885     TESTFUNC(readname_overflow),
00886     TESTFUNC(readname_jump_earlier),
00887     TESTFUNC(readname_jump_earlier_jump),
00888     TESTFUNC(readname_jump_maxdepth),
00889     TESTFUNC(readname_jump_later),
00890     TESTFUNC(readname_half_jump),
00891     TESTFUNC(readname_jump_toolong),
00892     TESTFUNC(readname_jump_loop_label),
00893     TESTFUNC(readname_jump_loop_jump),
00894 
00895     TESTFUNC(add_label_basic),
00896     TESTFUNC(add_label_long_label),
00897     TESTFUNC(add_label_full),
00898 
00899     TESTFUNC(domain_eq_basic),
00900     TESTFUNC(domain_eq_diff),
00901     TESTFUNC(domain_eq_case),
00902     TESTFUNC(domain_eq_anydata),
00903     TESTFUNC(domain_eq_length),
00904 
00905     TESTFUNC(compress_full_match),
00906     TESTFUNC(compress_full_match_subset),
00907     TESTFUNC(compress_full_match_jump),
00908     TESTFUNC(compress_no_match),
00909     TESTFUNC(compress_2nd_label),
00910     TESTFUNC(compress_2nd_label_short),
00911     TESTFUNC(compress_jump_to_jump),
00912     TESTFUNC(compress_long_match),
00913   };
00914   return create_suite("MDNS", tests, sizeof(tests)/sizeof(testfunc), NULL, NULL);
00915 }