2228 lines
87 KiB
C
2228 lines
87 KiB
C
#include "pico_config.h"
|
|
#include "pico_stack.h"
|
|
#include "pico_addressing.h"
|
|
#include "pico_socket.h"
|
|
#include "pico_ipv4.h"
|
|
#include "pico_ipv6.h"
|
|
#include "pico_dns_client.h"
|
|
#include "pico_dns_common.h"
|
|
#include "pico_mdns.h"
|
|
#include "pico_tree.h"
|
|
#include "pico_dev_mock.c"
|
|
#include "modules/pico_mdns.c"
|
|
#include "check.h"
|
|
|
|
Suite *pico_suite(void);
|
|
void add_records(void); /* MARK: helper to add records to MyRecords s*/
|
|
int mdns_init(void); /* MARK: Initialise mDNS module */
|
|
|
|
static int amount_callback_executed = 0;
|
|
void callback( pico_mdns_rtree *tree, char *str, void *arg);
|
|
void callback( pico_mdns_rtree *tree,
|
|
char *str,
|
|
void *arg ) /* MARK: Generic callback */
|
|
{
|
|
IGNORE_PARAMETER(tree);
|
|
IGNORE_PARAMETER(str);
|
|
IGNORE_PARAMETER(arg);
|
|
/* Do nothing, because fail_unless and fail_if don't work here */
|
|
amount_callback_executed++;
|
|
}
|
|
|
|
int mdns_init() /* MARK: Initialise mDNS module */
|
|
{
|
|
struct mock_device *mock = NULL;
|
|
|
|
struct pico_ip4 local = {
|
|
.addr = long_be(0x0a280064)
|
|
};
|
|
struct pico_ip4 netmask = {
|
|
.addr = long_be(0xffffff00)
|
|
};
|
|
|
|
mock = pico_mock_create(NULL);
|
|
if (!mock) {
|
|
return -1;
|
|
}
|
|
|
|
pico_ipv4_link_add(mock->dev, local, netmask);
|
|
|
|
/* Try to initialise the mDNS module right */
|
|
return pico_mdns_init("host.local", local, callback, NULL);
|
|
}
|
|
|
|
#define PICO_MDNS_COOKIE_DECLARE(name) \
|
|
struct pico_mdns_cookie (name) = \
|
|
{ \
|
|
{&LEAF, pico_dns_question_cmp}, \
|
|
{&LEAF, pico_mdns_record_cmp}, \
|
|
{&LEAF, pico_mdns_record_cmp}, \
|
|
0, 0, 0, 0, 0, NULL, NULL \
|
|
}
|
|
|
|
START_TEST(tc_mdns_init) /* MARK: mdns_init */
|
|
{
|
|
int ret = 0;
|
|
struct pico_ip4 local = {
|
|
0
|
|
};
|
|
char hostname[] = "host.local";
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
pico_stack_init();
|
|
|
|
/* Try to initialise the mDNS module wrong */
|
|
ret = pico_mdns_init(NULL, local, callback, NULL);
|
|
fail_unless(ret, "mdns_init failed checking params!\n");
|
|
|
|
/* Try to initialise the mDNS module wrong */
|
|
ret = pico_mdns_init(hostname, local, callback, NULL);
|
|
fail_unless(ret, "mdns_init failed checking params!\n");
|
|
|
|
/* Try to initialise the mDNS module wrong */
|
|
ret = pico_mdns_init(hostname, local, NULL, NULL);
|
|
fail_unless(ret, "mdns_init failed checking params!\n");
|
|
|
|
ret = mdns_init();
|
|
fail_unless(0 == ret, "mdns_init failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_record_cmp_name_type) /* MARK: mdns_record_cmp_name_type*/
|
|
{
|
|
struct pico_mdns_record a = {
|
|
0
|
|
};
|
|
struct pico_mdns_record b = {
|
|
0
|
|
};
|
|
char url1[] = "foo.local";
|
|
char url3[] = "a.local";
|
|
struct pico_ip4 rdata = {
|
|
0
|
|
};
|
|
uint16_t len = 0;
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
/* Create different test records */
|
|
a.record = pico_dns_record_create(url1, &rdata, 4, &len, PICO_DNS_TYPE_AAAA,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!a.record, "Record A could not be created!\n");
|
|
b.record = pico_dns_record_create(url1, &rdata, 4, &len, PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!b.record, "Record B could not be created!\n");
|
|
|
|
/* Try to compare records with equal rname but different type */
|
|
ret = pico_mdns_record_cmp_name_type((void *) &a, (void *) &b);
|
|
fail_unless(ret > 0, "mdns_record_cmp_name_type failed with different types!\n");
|
|
pico_dns_record_delete((void**)(void **)&(a.record));
|
|
pico_dns_record_delete((void**)(void **)&(b.record));
|
|
|
|
/* Create different test records */
|
|
a.record = pico_dns_record_create(url3, (uint8_t *)url1, (uint16_t) strlen(url1), &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!a.record, "Record A could not be created!\n");
|
|
b.record = pico_dns_record_create(url3, (uint8_t *)url1, (uint16_t) strlen(url1), &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!b.record, "Record B could not be created!\n");
|
|
|
|
/* Try to compare records with different rname but equal type */
|
|
ret = pico_mdns_record_cmp_name_type((void *) &a, (void *) &b);
|
|
fail_unless(!ret, "mdns_record_cmp_name_type failed!\n");
|
|
pico_dns_record_delete((void**)(void **)&(a.record));
|
|
pico_dns_record_delete((void**)(void **)&(b.record));
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_record_cmp) /* MARK: mdns_record_cmp */
|
|
{
|
|
struct pico_mdns_record a = {
|
|
0
|
|
};
|
|
struct pico_mdns_record b = {
|
|
0
|
|
};
|
|
char url1[] = "foo.local";
|
|
char url3[] = "a.local";
|
|
struct pico_ip4 rdata = {
|
|
0
|
|
};
|
|
uint16_t len = 0;
|
|
int ret = 0;
|
|
struct pico_ip4 firstIP = {
|
|
.addr = 0x7778797A
|
|
};
|
|
struct pico_ip4 secondIP = {
|
|
.addr = 0x5758595A
|
|
};
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
/* Create test records */
|
|
a.record = pico_dns_record_create(url1, &rdata, 4, &len, PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!(a.record), "Record A could not be created!\n");
|
|
b.record = pico_dns_record_create(url1, &rdata, 4, &len, PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!(b.record), "Record B could not be created!\n");
|
|
|
|
/* Try to compare equal records */
|
|
ret = pico_mdns_record_cmp((void *) &a, (void *) &b);
|
|
fail_unless(!ret, "mdns_record_cmp failed with equal records!\n");
|
|
pico_dns_record_delete((void**)(void **)&(a.record));
|
|
pico_dns_record_delete((void**)(void **)&(b.record));
|
|
|
|
/* Create different test records */
|
|
a.record = pico_dns_record_create(url1, &rdata, 4, &len, PICO_DNS_TYPE_AAAA,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!a.record, "Record A could not be created!\n");
|
|
b.record = pico_dns_record_create(url1, &rdata, 4, &len, PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!b.record, "Record B could not be created!\n");
|
|
|
|
/* Try to compare records with equal rname but different type */
|
|
ret = pico_mdns_record_cmp((void *) &a, (void *) &b);
|
|
fail_unless(ret > 0, "mdns_record_cmp failed with same name, different types!\n");
|
|
pico_dns_record_delete((void**)(void **)&(a.record));
|
|
pico_dns_record_delete((void**)(void **)&(b.record));
|
|
|
|
/* Create different test records */
|
|
a.record = pico_dns_record_create(url3, &rdata, 4, &len, PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!a.record, "Record A could not be created!\n");
|
|
b.record = pico_dns_record_create(url1, &rdata, 4, &len, PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!b.record, "Record B could not be created!\n");
|
|
|
|
/* Try to compare records with different rname but equal type */
|
|
ret = pico_mdns_record_cmp((void *) &a, (void *) &b);
|
|
fail_unless(ret < 0, "mdns_record_cmp failed with different name, same types!\n");
|
|
pico_dns_record_delete((void**)(void **)&(a.record));
|
|
pico_dns_record_delete((void**)(void **)&(b.record));
|
|
|
|
|
|
/* Create different test records */
|
|
a.record = pico_dns_record_create(url1, &firstIP, 4, &len, PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!a.record, "Record A could not be created!\n");
|
|
b.record = pico_dns_record_create(url1, &secondIP, 4, &len, PICO_DNS_TYPE_A, PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!b.record, "Record B could not be created!\n");
|
|
|
|
/* Try to compare records with equal rname but equal type different IP address (testing the effect of pico_tolower) */
|
|
ret = pico_mdns_record_cmp((void *) &a, (void *) &b);
|
|
fail_unless(ret > 0, "mdns_record_cmp failed with same name, same types, tolower separated different rdata!\n");
|
|
pico_dns_record_delete((void**)(void **)&(a.record));
|
|
pico_dns_record_delete((void**)(void **)&(b.record));
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_cookie_cmp) /* MARK: mdns_cookie_cmp */
|
|
{
|
|
PICO_MDNS_COOKIE_DECLARE(a);
|
|
PICO_MDNS_COOKIE_DECLARE(b);
|
|
struct pico_dns_question *question1 = NULL;
|
|
struct pico_dns_question *question2 = NULL;
|
|
struct pico_dns_question *question3 = NULL;
|
|
struct pico_dns_question *question4 = NULL;
|
|
struct pico_dns_question *question5 = NULL;
|
|
struct pico_mdns_record record1 = {
|
|
0
|
|
}, record2 = {
|
|
0
|
|
}, record3 = {
|
|
0
|
|
},
|
|
record4 = {
|
|
0
|
|
};
|
|
char url1[] = "foo.local";
|
|
char url2[] = "bar.local";
|
|
char url3[] = "pi.local";
|
|
char url4[] = "ab.local";
|
|
struct pico_ip4 rdata = {
|
|
0
|
|
};
|
|
uint16_t len = 0;
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
/* Create some questions */
|
|
question1 = pico_dns_question_create(url1, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!question1, "Could not create question 1!\n");
|
|
question2 = pico_dns_question_create(url1, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_PTR,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!question2, "Could not create question 2!\n");
|
|
question3 = pico_dns_question_create(url3, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!question3, "Could not create question 3!\n");
|
|
question4 = pico_dns_question_create(url4, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_AAAA,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!question4, "Could not create question 4!\n");
|
|
question5 = pico_dns_question_create(url2, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_TYPE_AAAA, 0);
|
|
fail_if(!question5, "Could not create question 5!\n");
|
|
|
|
/* Create test records */
|
|
record1.record = pico_dns_record_create(url1, &rdata, 4, &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!record1.record, "Record 1 could not be created!\n");
|
|
record2.record = pico_dns_record_create(url1, &rdata, 4, &len,
|
|
PICO_DNS_TYPE_AAAA,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!record2.record, "Record 2 could not be created!\n");
|
|
record3.record = pico_dns_record_create(url2, &rdata, 4, &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!record3.record, "Record 3 could not be created!\n");
|
|
record4.record = pico_dns_record_create(url4, &rdata, 4, &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!record4.record, "Record 3 could not be created!\n");
|
|
|
|
/* Create 2 exactly the same cookies */
|
|
pico_tree_insert(&(a.qtree), question1);
|
|
pico_tree_insert(&(a.qtree), question2);
|
|
pico_tree_insert(&(a.qtree), question3);
|
|
pico_tree_insert(&(a.qtree), question4);
|
|
pico_tree_insert(&(a.qtree), question5);
|
|
pico_tree_insert(&(a.antree), &record1);
|
|
pico_tree_insert(&(a.antree), &record2);
|
|
pico_tree_insert(&(a.antree), &record3);
|
|
pico_tree_insert(&(a.antree), &record4);
|
|
|
|
pico_tree_insert(&(b.qtree), question1);
|
|
pico_tree_insert(&(b.qtree), question2);
|
|
pico_tree_insert(&(b.qtree), question3);
|
|
pico_tree_insert(&(b.qtree), question4);
|
|
pico_tree_insert(&(b.qtree), question5);
|
|
pico_tree_insert(&(b.antree), &record1);
|
|
pico_tree_insert(&(b.antree), &record2);
|
|
pico_tree_insert(&(b.antree), &record3);
|
|
pico_tree_insert(&(b.antree), &record4);
|
|
|
|
/* Try to compare exactly the same cookies*/
|
|
ret = pico_mdns_cookie_cmp((void *) &a, (void *) &b);
|
|
fail_unless(0 == ret, "mdns_cookie_cmp failed with equal cookies!\n");
|
|
|
|
/* Try to compare cookies but B a larger question than A*/
|
|
pico_tree_delete(&(a.qtree), question2);
|
|
ret = pico_mdns_cookie_cmp((void *) &a, (void *) &b);
|
|
fail_unless(ret > 0, "mdns_cookie_cmp failed with larger question A!\n");
|
|
|
|
/* Insert more possibilities here.. */
|
|
|
|
PICO_DNS_QTREE_DESTROY(&(b.qtree));
|
|
pico_dns_record_delete((void **)&(record1.record));
|
|
pico_dns_record_delete((void **)&(record2.record));
|
|
pico_dns_record_delete((void **)&(record3.record));
|
|
pico_dns_record_delete((void **)&(record4.record));
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_suffix_to_uint16) /* MARK: mdns_suffix_to_uint16 */
|
|
{
|
|
char url[10] = "-2";
|
|
char url2[10] = "-10";
|
|
char url3[10] = "-500000";
|
|
char *o = NULL, *c = NULL;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
o = url;
|
|
c = url + 2;
|
|
fail_unless(2 == pico_mdns_suffix_to_uint16(o, c),
|
|
"mdns_suffix_to_uint16 failed with correct suffix 2!\n");
|
|
|
|
o = url2;
|
|
c = url2 + 3;
|
|
fail_unless(10 == pico_mdns_suffix_to_uint16(o, c),
|
|
"mdns_suffix_to_uint16 failed with correct suffix 10!\n");
|
|
|
|
o = url3;
|
|
c = url3 + 7;
|
|
fail_unless(0 == pico_mdns_suffix_to_uint16(o, c),
|
|
"mdns_suffix_to_uint16 failed with wrong suffix 500000\n");
|
|
|
|
fail_unless(0 == pico_mdns_suffix_to_uint16(NULL, NULL),
|
|
"mdns_suffix_to_uint16 failed with NULL-pointers given\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_cookie_delete) /* MARK: mdns_cookie_delete */
|
|
{
|
|
struct pico_mdns_cookie *a = NULL;
|
|
PICO_DNS_QTREE_DECLARE(qtree);
|
|
PICO_MDNS_RTREE_DECLARE(antree);
|
|
PICO_MDNS_RTREE_DECLARE(artree);
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
fail_unless(pico_mdns_cookie_delete((void **)&a),
|
|
"mdns_cookie_delete failed checking params!\n");
|
|
a = pico_mdns_cookie_create(qtree, antree, artree, 0, 0, NULL, NULL);
|
|
fail_unless(!pico_mdns_cookie_delete((void **)&a),
|
|
"mdns_cookie_delete failed!\n");
|
|
|
|
fail_unless(pico_mdns_cookie_delete(NULL),
|
|
"mdns_cookie_delete failed checking NULL-pointer");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_cookie_create) /* MARK: mdns_cookie_create */
|
|
{
|
|
struct pico_mdns_cookie *a = NULL;
|
|
PICO_DNS_QTREE_DECLARE(qtree);
|
|
PICO_MDNS_RTREE_DECLARE(antree);
|
|
PICO_MDNS_RTREE_DECLARE(artree);
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
a = pico_mdns_cookie_create(qtree, antree, artree, 0, 0, NULL, NULL);
|
|
fail_if(!a, "mdns_cookie_create failed!\n");
|
|
|
|
pico_mdns_cookie_delete((void **)&a);
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_cookie_tree_find_query_cookie) /* MARK: mdns_ctree_find_cookie */
|
|
{
|
|
struct pico_mdns_cookie *a = NULL, *b = NULL;
|
|
PICO_DNS_QTREE_DECLARE(qtree_a);
|
|
PICO_DNS_QTREE_DECLARE(qtree_b);
|
|
PICO_MDNS_RTREE_DECLARE(antree);
|
|
PICO_MDNS_RTREE_DECLARE(artree);
|
|
struct pico_dns_question *question1 = NULL;
|
|
struct pico_dns_question *question2 = NULL;
|
|
struct pico_dns_question *question3 = NULL;
|
|
struct pico_dns_question *question4 = NULL;
|
|
struct pico_dns_question *question5 = NULL;
|
|
char url1[] = "foo.local";
|
|
char url2[] = "bar.local";
|
|
char url3[] = "pi.local";
|
|
char url4[] = "ab.local";
|
|
char url5[] = "t.local";
|
|
uint16_t len = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
/* Create some questions */
|
|
question1 = pico_dns_question_create(url1, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!question1, "Could not create question 1!\n");
|
|
question2 = pico_dns_question_create(url5, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_PTR,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!question2, "Could not create question 2!\n");
|
|
question3 = pico_dns_question_create(url3, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!question3, "Could not create question 3!\n");
|
|
question4 = pico_dns_question_create(url4, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_AAAA,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!question4, "Could not create question 4!\n");
|
|
question5 = pico_dns_question_create(url2, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!question5, "Could not create question 5!\n");
|
|
|
|
pico_tree_insert(&qtree_a, question3);
|
|
pico_tree_insert(&qtree_a, question4);
|
|
|
|
pico_tree_insert(&qtree_b, question1);
|
|
pico_tree_insert(&qtree_b, question2);
|
|
pico_tree_insert(&qtree_b, question5);
|
|
|
|
a = pico_mdns_cookie_create(qtree_a, antree, artree, 1,
|
|
PICO_MDNS_PACKET_TYPE_QUERY, NULL, NULL);
|
|
fail_if(!a, "mdns_cookie_create failed!\n");
|
|
b = pico_mdns_cookie_create(qtree_b, antree, artree, 1,
|
|
PICO_MDNS_PACKET_TYPE_QUERY, NULL, NULL);
|
|
fail_if(!b, "mdns_cookie_create failed!\n");
|
|
|
|
pico_tree_insert(&Cookies, a);
|
|
pico_tree_insert(&Cookies, b);
|
|
|
|
fail_unless(b == pico_mdns_ctree_find_cookie("\3foo\5local", PICO_MDNS_PACKET_TYPE_QUERY),
|
|
"mdns_cookie_tree_find_query_cookie failed with foo.local\n");
|
|
|
|
fail_unless(a == pico_mdns_ctree_find_cookie("\2pi\5local", PICO_MDNS_PACKET_TYPE_QUERY),
|
|
"mdns_cookie_tree_find_query_cookie failed with pi.local\n");
|
|
|
|
fail_unless(NULL == pico_mdns_ctree_find_cookie("bla.local", PICO_MDNS_PACKET_TYPE_QUERY),
|
|
"mdns_cookie_tree_find_query_cookie failed with foo.local\n");
|
|
|
|
pico_tree_delete(&Cookies, a);
|
|
pico_tree_delete(&Cookies, b);
|
|
pico_mdns_cookie_delete((void **)&a);
|
|
pico_mdns_cookie_delete((void **)&b);
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_cookie_apply_spt) /* MARK: mdns_cookie_apply_spt */
|
|
{
|
|
PICO_MDNS_COOKIE_DECLARE(a);
|
|
struct pico_mdns_record record1 = {
|
|
0
|
|
}, record2 = {
|
|
0
|
|
}, record3 = {
|
|
0
|
|
},
|
|
record4 = {
|
|
0
|
|
};
|
|
char url1[] = "foo.local";
|
|
char url2[] = "bar.local";
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
struct pico_ip4 rdata2 = {
|
|
long_be(0xFFFFFFFF)
|
|
};
|
|
int ret = 0;
|
|
uint16_t len = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
/* Create test records */
|
|
record1.record = pico_dns_record_create(url1, &rdata, 4, &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!record1.record, "Record 1 could not be created!\n");
|
|
record2.record = pico_dns_record_create(url2, &rdata2, 4, &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!record2.record, "Record 2 could not be created!\n");
|
|
record3.record = pico_dns_record_create(url1, &rdata2, 4, &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!record3.record, "Record 3 could not be created!\n");
|
|
record4.record = pico_dns_record_create(url2, &rdata, 4, &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!record4.record, "Record 4 could not be created!\n");
|
|
|
|
/* Make it a probe cookie otherwise it will just return -1 */
|
|
a.type = PICO_MDNS_PACKET_TYPE_PROBE;
|
|
|
|
/* Need to initialise the stack to allow timer scheduling IMPORTANT! */
|
|
pico_stack_init();
|
|
|
|
/* Create 2 exactly the same cookies */
|
|
pico_tree_insert(&(a.antree), &record1);
|
|
pico_tree_insert(&(a.antree), &record2);
|
|
pico_tree_insert(&MyRecords, &record1);
|
|
pico_tree_insert(&MyRecords, &record2);
|
|
|
|
ret = pico_mdns_cookie_apply_spt(&a, record3.record);
|
|
fail_unless(ret, "mdns_cookie_apply_spt failed checking parms!\n");
|
|
|
|
PICO_MDNS_SET_FLAG(record1.flags, PICO_MDNS_RECORD_CURRENTLY_PROBING);
|
|
PICO_MDNS_SET_FLAG(record2.flags, PICO_MDNS_RECORD_CURRENTLY_PROBING);
|
|
|
|
/* Check with peer record which is lexicographically later */
|
|
ret = pico_mdns_cookie_apply_spt(&a, record3.record);
|
|
fail_unless(0 == ret, "mdns_cookie_apply_spt failed!\n");
|
|
|
|
/* Check with peer record which is lexicographically earlier */
|
|
ret = pico_mdns_cookie_apply_spt(&a, record4.record);
|
|
fail_unless(0 == ret, "mdns_cookie_apply_spt failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_is_suffix_present) /* MARK: mdns_is_suffix_present */
|
|
{
|
|
char name1[16] = {
|
|
5, 'v', 'l', 'e', 'e', 's', 5, 'l', 'o', 'c', 'a', 'l', 0
|
|
};
|
|
char name2[17] = {
|
|
8, 'v', 'l', 'e', 'e', 's', ' ', '-', '2', 5, 'l', 'o', 'c', 'a', 'l', '\0'
|
|
};
|
|
char name6[20] = {
|
|
10, 'v', 'l', 'e', 'e', 's', ' ', '-', 'a', '-', '2', 5, 'l', 'o', 'c', 'a', 'l', '\0'
|
|
};
|
|
char name7[18] = {
|
|
9, 'v', 'l', 'e', 'e', 's', ' ', '-', '9', 'a', 5, 'l', 'o', 'c', 'a', 'l', '\0'
|
|
};
|
|
char name9[17] = {
|
|
7, 'v', 'l', 'e', 'e', 's', ' ', '-', '0', 5, 'l', 'o', 'c', 'a', 'l', '\0'
|
|
};
|
|
char *o_index = NULL;
|
|
char *c_index = NULL;
|
|
uint16_t present = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
present = pico_mdns_is_suffix_present(name1, &o_index, &c_index);
|
|
fail_unless(!present,
|
|
"There is no suffix present!\n");
|
|
fail_unless(NULL == o_index && NULL == c_index,
|
|
"There should be no indexes!\n");
|
|
|
|
present = pico_mdns_is_suffix_present(name2, &o_index, &c_index);
|
|
fail_unless(present,
|
|
"is_suffix_present failed with suffix!\n");
|
|
fail_unless((name2 + 7) == o_index && (name2 + 9) == c_index,
|
|
"is_suffix_pressent failed!\n");
|
|
fail_unless(present == 2, "Suffix should be 2!\n");
|
|
|
|
present = pico_mdns_is_suffix_present(name7, &o_index, &c_index);
|
|
fail_unless(!present,
|
|
"There is no suffix present!\n");
|
|
fail_unless(NULL == o_index && NULL == c_index,
|
|
"There should be no indexes!\n");
|
|
|
|
present = pico_mdns_is_suffix_present(name6, &o_index, &c_index);
|
|
fail_unless(present,
|
|
"is_suffix_present failed with suffix!\n");
|
|
fail_unless((name6 + 9) == o_index && (name6 + 11) == c_index,
|
|
"is_suffix_present failed!\n");
|
|
fail_unless(present == 2, "Suffix should be 2!\n");
|
|
|
|
present = pico_mdns_is_suffix_present(name9, &o_index, &c_index);
|
|
fail_unless(!present,
|
|
"is_suffix_present failed with suffix 0!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
#pragma GCC diagnostic push /* require GCC 4.6 */
|
|
#pragma GCC diagnostic ignored "-Woverflow"
|
|
START_TEST(tc_pico_itoa) /* MARK: itoa */
|
|
{
|
|
char num[10] = {
|
|
0
|
|
};
|
|
|
|
uint16_t t1 = 10;
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
pico_itoa(t1, num);
|
|
fail_unless(0 == strcmp(num, "10"), "ITOA with %d failed: %s\n", t1, num);
|
|
memcpy(num, "\0\0\0\0\0\0\0\0\0\0", 10);
|
|
pico_itoa(65535, num);
|
|
fail_unless(0 == strcmp(num, "65535"), "ITOA with %d failed: %s\n", 65535, num);
|
|
memcpy(num, "\0\0\0\0\0\0\0\0\0\0", 10);
|
|
pico_itoa(0, num);
|
|
fail_unless(0 == strcmp(num, "0"), "ITOA with %d failed: %s\n", 0, num);
|
|
memcpy(num, "\0\0\0\0\0\0\0\0\0\0", 10);
|
|
pico_itoa(65536, num);
|
|
fail_unless(0 == strcmp(num, "0"), "ITOA with %d failed: %s\n", 65536, num);
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
#pragma GCC diagnostic pop /* require GCC 4.6 */
|
|
START_TEST(tc_mdns_resolve_name_conflict) /* MARK: mdns_resolve_name_conflict */
|
|
{
|
|
char name1[13] = {
|
|
5, 'v', 'l', 'e', 'e', 's', 5, 'l', 'o', 'c', 'a', 'l', 0
|
|
};
|
|
char name2[17] = {
|
|
7, 'v', 'l', 'e', 'e', 's', '-', '2', 5, 'l', 'o', 'c', 'a', 'l', '\0'
|
|
};
|
|
char name3[18] = {
|
|
8, 'v', 'l', 'e', 'e', 's', '-', '1', '0', 5, 'l', 'o', 'c', 'a', 'l', '\0'
|
|
};
|
|
char name4[17] = {
|
|
7, 'v', 'l', 'e', 'e', 's', '-', '9', 5, 'l', 'o', 'c', 'a', 'l', '\0'
|
|
};
|
|
char name5[16] = {
|
|
6, 'v', 'l', 'e', 'e', 's', '-', 5, 'l', 'o', 'c', 'a', 'l', '\0'
|
|
};
|
|
char name6[17] = {
|
|
7, 'v', 'l', 'e', 'e', 's', '-', 'a', 5, 'l', 'o', 'c', 'a', 'l', '\0'
|
|
};
|
|
char name7[18] = {
|
|
8, 'v', 'l', 'e', 'e', 's', '-', '9', 'a', 5, 'l', 'o', 'c', 'a', 'l', '\0'
|
|
};
|
|
char *ret = NULL;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
ret = pico_mdns_resolve_name_conflict(name1);
|
|
fail_unless(0 == strcmp(ret, "\x7vlees-2\5local"),
|
|
"mdns_conflict_resolve_name failed 'vlees.local' to %s!\n",
|
|
ret);
|
|
PICO_FREE(ret);
|
|
ret = pico_mdns_resolve_name_conflict(name2);
|
|
fail_unless(0 == strcmp(ret, "\x7vlees-3\5local"),
|
|
"mdns_conflict_resolve_name failed 'vlees-2.local' to %s!\n",
|
|
ret);
|
|
PICO_FREE(ret);
|
|
ret = pico_mdns_resolve_name_conflict(name3);
|
|
fail_unless(0 == strcmp(ret, "\x8vlees-11\5local"),
|
|
"mdns_conflict_resolve_name failed 'vlees-10.local' to %s!\n",
|
|
ret);
|
|
PICO_FREE(ret);
|
|
ret = pico_mdns_resolve_name_conflict(name4);
|
|
fail_unless(0 == strcmp(ret, "\x8vlees-10\5local"),
|
|
"mdns_conflict_resolve_name failed 'vlees-9.local' to %s!\n",
|
|
ret);
|
|
PICO_FREE(ret);
|
|
ret = pico_mdns_resolve_name_conflict(name5);
|
|
fail_unless(0 == strcmp(ret, "\x8vlees--2\5local"),
|
|
"mdns_conflict_resolve_name failed 'vlees--2.local' to %s!\n",
|
|
ret);
|
|
PICO_FREE(ret);
|
|
ret = pico_mdns_resolve_name_conflict(name6);
|
|
fail_unless(0 == strcmp(ret, "\x9vlees-a-2\5local"),
|
|
"mdns_conflict_resolve_name failed 'vlees-a-2.local' to %s!\n",
|
|
ret);
|
|
PICO_FREE(ret);
|
|
ret = pico_mdns_resolve_name_conflict(name7);
|
|
fail_unless(0 == strcmp(ret, "\xavlees-9a-2\5local"),
|
|
"mdns_conflict_resolve_name failed 'vlees-9a-2.local' to %s!\n",
|
|
ret);
|
|
PICO_FREE(ret);
|
|
|
|
fail_unless(NULL == pico_mdns_resolve_name_conflict(NULL),
|
|
"mdns_conflict_resolvE_name failed checking params!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_generate_new_records) /* MARK: mdns_generate_new_records */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(ctree);
|
|
PICO_MDNS_RTREE_DECLARE(ntree);
|
|
struct pico_mdns_record *record = NULL;
|
|
char url[] = "foo.local";
|
|
char url2[] = "\3foo\5local";
|
|
char url3[] = "\7foo (2)\5local";
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!(record->record), "Record could not be created!\n");
|
|
pico_tree_insert(&ctree, record);
|
|
|
|
ntree = pico_mdns_generate_new_records(&ctree, url2,
|
|
url3);
|
|
|
|
fail_unless(1 == pico_tree_count(&ntree), "new_tree has wrong count!\n");
|
|
record = pico_tree_firstNode(ntree.root)->keyValue;
|
|
fail_unless(strcmp(record->record->rname, url3) == 0,
|
|
"New name isn't correctly copied %s!\n", record->record->rname);
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_cookie_resolve_conflict) /* MARK: mdns_cookie_resolve_conflict */
|
|
{
|
|
struct pico_mdns_cookie *a = NULL;
|
|
PICO_DNS_QTREE_DECLARE(qtree);
|
|
PICO_MDNS_RTREE_DECLARE(antree);
|
|
PICO_MDNS_RTREE_DECLARE(artree);
|
|
struct pico_dns_question *question = NULL;
|
|
struct pico_mdns_record *record = NULL;
|
|
char url[] = "foo.local";
|
|
char url2[] = "\3foo\5local";
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
int ret = 0;
|
|
uint16_t len = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
question = pico_dns_question_create(url, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!question, "Question could not be created!\n");
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!(record->record), "Record could not be created!\n");
|
|
|
|
/* Create 2 exactly the same cookies */
|
|
pico_tree_insert(&antree, record);
|
|
pico_tree_insert(&qtree, question);
|
|
|
|
/* Make it a probe cookie otherwise it will just return -1 */
|
|
a = pico_mdns_cookie_create(qtree, antree, artree, 1,
|
|
PICO_MDNS_PACKET_TYPE_PROBE,
|
|
callback, NULL);
|
|
|
|
/* Need to initialise the stack to allow timer scheduling IMPORTANT! */
|
|
pico_stack_init();
|
|
ret = mdns_init();
|
|
fail_unless(0 == ret, "mdns_init failed!\n");
|
|
|
|
/* Cookie needs to be removed from cookie tree so we need to add it first */
|
|
pico_tree_insert(&Cookies, a);
|
|
|
|
ret = pico_mdns_cookie_resolve_conflict(a, url2);
|
|
fail_unless(0 == ret, "mdns_cookie_resolve_conflict failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_question_create) /* MARK: mdns_question_create */
|
|
{
|
|
struct pico_dns_question *question = NULL;
|
|
char url[] = "1.2.3.4";
|
|
char cmpbuf[22] = {
|
|
0x01u, '4',
|
|
0x01u, '3',
|
|
0x01u, '2',
|
|
0x01u, '1',
|
|
0x07u, 'i', 'n', '-', 'a', 'd', 'd', 'r',
|
|
0x04u, 'a', 'r', 'p', 'a',
|
|
0x00u
|
|
};
|
|
uint16_t len = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
question = pico_mdns_question_create("foo.local",
|
|
&len,
|
|
PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_MDNS_QUESTION_FLAG_UNICAST_RES,
|
|
0);
|
|
fail_if(!question, "mdns_question_create returned NULL!\n");
|
|
fail_unless(0 == strcmp(question->qname, "\3foo\5local"),
|
|
"mdns_question_create failed!\n");
|
|
fail_unless(0x8001 == short_be(question->qsuffix->qclass),
|
|
"mdns_quesiton_create failed setting QU bit!\n");
|
|
pico_dns_question_delete((void**)&question);
|
|
|
|
question = pico_mdns_question_create("foo.local",
|
|
&len,
|
|
PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_MDNS_QUESTION_FLAG_PROBE,
|
|
0);
|
|
fail_if(!question, "mdns_question_create returned NULL!\n");
|
|
fail_unless(0 == strcmp(question->qname, "\3foo\5local"),
|
|
"mdns_question_create failed!\n");
|
|
fail_unless(PICO_DNS_TYPE_ANY == short_be(question->qsuffix->qtype),
|
|
"mdns_quesiton_create failed setting type to ANY!\n");
|
|
pico_dns_question_delete((void**)&question);
|
|
|
|
question = pico_mdns_question_create(url,
|
|
&len,
|
|
PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_PTR,
|
|
0, 1);
|
|
fail_if(!question, "mdns_question_create returned NULL!\n");
|
|
fail_unless(0 == strcmp(question->qname, cmpbuf),
|
|
"mdns_question_create failed!\n");
|
|
pico_dns_question_delete((void**)&question);
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_record_resolve_conflict) /* MARK: mdns_record_resolve_conflict */
|
|
{
|
|
struct pico_mdns_record *record = NULL;
|
|
char url[] = "foo.local";
|
|
char url2[] = "\3foo\5local";
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!(record->record), "Record could not be created!\n");
|
|
/* Need to initialise the stack to allow timer scheduling IMPORTANT! */
|
|
pico_stack_init();
|
|
|
|
ret = mdns_init();
|
|
fail_unless(0 == ret, "mdns_init failed!\n");
|
|
|
|
ret = pico_mdns_record_resolve_conflict(record, url2);
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_record_am_i_lexi_later) /* MARK: mdns_record_am_i_lexi_later */
|
|
{
|
|
struct pico_mdns_record record1 = {
|
|
0
|
|
}, record2 = {
|
|
0
|
|
}, record3 = {
|
|
0
|
|
},
|
|
record4 = {
|
|
0
|
|
};
|
|
char url1[] = "foo.local";
|
|
char url2[] = "bar.local";
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
struct pico_ip4 rdata2 = {
|
|
long_be(0xFFFFFFFF)
|
|
};
|
|
uint16_t len = 0;
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
/* Create test records */
|
|
record1.record = pico_dns_record_create(url1, &rdata, 4, &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!record1.record, "Record 1 could not be created!\n");
|
|
record2.record = pico_dns_record_create(url2, &rdata2, 4, &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!record2.record, "Record 2 could not be created!\n");
|
|
record3.record = pico_dns_record_create(url1, &rdata2, 4, &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!record3.record, "Record 3 could not be created!\n");
|
|
record4.record = pico_dns_record_create(url2, &rdata, 4, &len,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!record4.record, "Record 4 could not be created!\n");
|
|
|
|
ret = pico_mdns_record_am_i_lexi_later(&record1, &record3);
|
|
fail_unless(ret < 0, "mdns_record_am_i_lexi_later failed!\n");
|
|
|
|
ret = pico_mdns_record_am_i_lexi_later(&record2, &record4);
|
|
fail_unless(ret > 0, "mdns_record_am_i_lexi_later failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_record_copy_with_new_name) /* MARK: copy_with_new_name */
|
|
{
|
|
struct pico_mdns_record *record = NULL, *copy = NULL;
|
|
char url[] = "foo.local";
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
/* Create a record */
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!(record->record), "Record could not be created!\n");
|
|
|
|
/* Try to create a copy with a new name */
|
|
copy = pico_mdns_record_copy_with_new_name(record, "\4test\5local");
|
|
fail_if(!copy, "mdns_record_copy_with_new_name returned NULL!\n");
|
|
fail_unless(0 == strcmp(copy->record->rname, "\4test\5local"),
|
|
"mdns_record_copy_with_new_name didn't copy name right!\n");
|
|
fail_unless(strlen("\4test\5local") + 1 == copy->record->rname_length,
|
|
"mdns_record_copy_with_new_name didn't update namelength!\n");
|
|
|
|
pico_mdns_record_delete((void **)&record);
|
|
pico_mdns_record_delete((void **)©);
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_record_copy) /* MARK: mdns_record_copy */
|
|
{
|
|
struct pico_mdns_record *record = NULL, *copy = NULL;
|
|
char url[] = "foo.local";
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
/* Create a record */
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!(record->record), "Record could not be created!\n");
|
|
|
|
/* Try to copy */
|
|
copy = pico_mdns_record_copy(record);
|
|
fail_if(!copy, "mdns_record_copy returned NULL!\n");
|
|
fail_if(record == copy, "Pointers point to same struct!\n");
|
|
fail_unless(0 == strcmp(copy->record->rname, record->record->rname),
|
|
"mdns_record_copy didn't copy names right!\n");
|
|
fail_unless(copy->claim_id == record->claim_id,
|
|
"mdns_record_copy didn't copy claim_id right!\n");
|
|
fail_unless(copy->current_ttl == record->current_ttl,
|
|
"mdns_record_copy didn't copy current_ttl right!\n");
|
|
fail_unless(copy->flags == record->flags,
|
|
"mdns_record_copy didn't copy flags right!\n");
|
|
|
|
pico_mdns_record_delete((void **)&record);
|
|
pico_mdns_record_delete((void **)©);
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_record_create) /* MARK: mdns_record_create */
|
|
{
|
|
struct pico_mdns_record *record = NULL;
|
|
char url[] = "foo.local";
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
printf("*********************** starting %s * \n", __func__);
|
|
/* Create a record */
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!(record->record), "Record could not be created!\n");
|
|
fail_unless(0 == strcmp(record->record->rname, "\3foo\5local"),
|
|
"mdns_record_create didn't convert rname properly!\n");
|
|
fail_unless(0x8001 == short_be(record->record->rsuffix->rclass),
|
|
"mdns_record_create didn't set QU flag correctly!\n");
|
|
pico_mdns_record_delete((void **)&record);
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_record_delete) /* MARK: mdns_record_delete */
|
|
{
|
|
struct pico_mdns_record *record = NULL;
|
|
char url[] = "foo.local";
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
/* Create a record */
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!(record->record), "Record could not be created!\n");
|
|
|
|
/* Try to delete the record */
|
|
ret = pico_mdns_record_delete((void **)&record);
|
|
fail_unless(0 == ret, "mdns_record_delete returned error!\n");
|
|
fail_unless(!record, "mdns_record_delete didn't delete properly");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
void add_records( void ) /* MARK: helper to add records to MyRecords s*/
|
|
{
|
|
struct pico_mdns_record *record = NULL, *record1 = NULL, *record2 = NULL,
|
|
*record3 = NULL;
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
struct pico_ip4 rdata1 = {
|
|
long_be(0xFFFFFFFF)
|
|
};
|
|
char url[] = "foo.local";
|
|
char url1[] = "bar.local";
|
|
|
|
/* Create an A record with URL */
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
(PICO_MDNS_RECORD_UNIQUE |
|
|
PICO_MDNS_RECORD_PROBED |
|
|
PICO_MDNS_RECORD_HOSTNAME));
|
|
fail_if(!record, "Record could not be created!\n");
|
|
printf("Is hostname record: %d\n", IS_HOSTNAME_RECORD(record));
|
|
|
|
/* Create 2 PTR records to URL */
|
|
record1 = pico_mdns_record_create(url, url, (uint16_t) strlen(url),
|
|
PICO_DNS_TYPE_PTR, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record1, "Record could not be created!\n");
|
|
|
|
/* Simulate that this record is probed */
|
|
record1->flags |= PICO_MDNS_RECORD_PROBED;
|
|
|
|
record2 = pico_mdns_record_create(url, url1, (uint16_t) strlen(url1),
|
|
PICO_DNS_TYPE_PTR, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record2, "Record could not be created!\n");
|
|
|
|
/* Create a totally different record */
|
|
record3 = pico_mdns_record_create(url1, &rdata1, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record2, "Record could not be created!\n");
|
|
|
|
/* Add the records to the tree */
|
|
pico_tree_insert(&MyRecords, record);
|
|
pico_tree_insert(&MyRecords, record1);
|
|
pico_tree_insert(&MyRecords, record2);
|
|
pico_tree_insert(&MyRecords, record3);
|
|
}
|
|
START_TEST(tc_mdns_record_tree_find_name) /* MARK: mdns_record_find_name */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(hits);
|
|
struct pico_tree_node *node = NULL;
|
|
struct pico_mdns_record *record = NULL;
|
|
int found = 1;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
add_records();
|
|
|
|
hits = pico_mdns_rtree_find_name(&MyRecords, "\3foo\5local", 0);
|
|
fail_unless(2 == pico_tree_count(&hits),
|
|
"mdns_record_tree_find_name should find 2 records here!\n");
|
|
pico_tree_foreach(node, &hits) {
|
|
if ((record = node->keyValue)) {
|
|
if (strcmp(record->record->rname, "\3foo\5local"))
|
|
found = 0;
|
|
}
|
|
}
|
|
fail_unless(1 == found,
|
|
"mdns_record_tree_find_name returned records with other name!\n");
|
|
|
|
hits = pico_mdns_rtree_find_name(&MyRecords, "\3bar\5local", 0);
|
|
fail_unless(1 == pico_tree_count(&hits),
|
|
"mdns_record_tree_find_name should find 1 record here!\n");
|
|
record = pico_tree_firstNode(hits.root)->keyValue;
|
|
fail_unless(0 == strcmp(record->record->rname,
|
|
"\3bar\5local"),
|
|
"mdns_record_tree_find_name returned record with other name!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_record_tree_find_name_type) /* MARK: mdns_record_find_name_type */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(hits);
|
|
struct pico_tree_node *node = NULL;
|
|
struct pico_mdns_record *record = NULL;
|
|
int found = 1;
|
|
char url[] = "\3foo\5local";
|
|
char url2[] = "\3bar\5local";
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
add_records();
|
|
|
|
/* Try to find the first A record */
|
|
hits = pico_mdns_rtree_find_name_type(&MyRecords, url, PICO_DNS_TYPE_A, 0);
|
|
fail_unless(1 == pico_tree_count(&hits),
|
|
"mdns_record_tree_find_name should find 1 record here!\n");
|
|
record = pico_tree_firstNode(hits.root)->keyValue;
|
|
fail_unless(0 == strcmp(record->record->rname, url),
|
|
"mdns_record_tree_find_name returned record with other name!\n");
|
|
|
|
/* Try to find the 2 PTR records */
|
|
hits = pico_mdns_rtree_find_name_type(&MyRecords, url, PICO_DNS_TYPE_PTR, 0);
|
|
pico_tree_foreach(node, &hits) {
|
|
if ((record = node->keyValue)) {
|
|
if (strcmp(record->record->rname, url))
|
|
found = 0;
|
|
}
|
|
}
|
|
fail_unless(1 == found,
|
|
"mdns_record_tree_find_name returned records with other name!\n");
|
|
|
|
/* Try to find the last A record */
|
|
hits = pico_mdns_rtree_find_name_type(&MyRecords, url2, PICO_DNS_TYPE_A, 0);
|
|
fail_unless(1 == pico_tree_count(&hits),
|
|
"mdns_record_tree_find_name should find 1 record here!\n");
|
|
record = pico_tree_firstNode(hits.root)->keyValue;
|
|
fail_unless(0 == strcmp(record->record->rname, url2),
|
|
"mdns_record_tree_find_name returned record with other name!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_record_tree_del_name) /* MARK: mdns_record_tree_del_name */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(hits);
|
|
struct pico_mdns_record *record = NULL, *record1 = NULL, *record2 = NULL,
|
|
*record3 = NULL;
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
struct pico_ip4 rdata1 = {
|
|
long_be(0xFFFFFFFF)
|
|
};
|
|
char url[] = "foo.local";
|
|
char url1[] = "bar.local";
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
/* Create an A record with URL */
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record, "Record could not be created!\n");
|
|
|
|
/* Create 2 PTR records to URL */
|
|
record1 = pico_mdns_record_create(url, url, (uint16_t) strlen(url),
|
|
PICO_DNS_TYPE_PTR, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record1, "Record could not be created!\n");
|
|
record2 = pico_mdns_record_create(url, url1, (uint16_t) strlen(url1),
|
|
PICO_DNS_TYPE_PTR, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record2, "Record could not be created!\n");
|
|
|
|
/* Create a totally different record */
|
|
record3 = pico_mdns_record_create(url1, &rdata1, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record2, "Record could not be created!\n");
|
|
|
|
/* Add the records to the tree */
|
|
pico_tree_insert(&MyRecords, record);
|
|
pico_tree_insert(&MyRecords, record1);
|
|
pico_tree_insert(&MyRecords, record2);
|
|
pico_tree_insert(&MyRecords, record3);
|
|
|
|
/* Try to del the first tree records */
|
|
ret = pico_mdns_rtree_del_name(&MyRecords, "\3foo\5local");
|
|
fail_unless(0 == ret,
|
|
"mdns_record_tree_del_name failed!\n");
|
|
hits = pico_mdns_rtree_find_name(&MyRecords, "\3foo\5local", 0);
|
|
fail_unless(0 == pico_tree_count(&hits),
|
|
"mdns_record_tree_find_name should find 3 records here!\n");
|
|
|
|
hits = pico_mdns_rtree_find_name( &MyRecords, "\3bar\5local", 0);
|
|
fail_unless(1 == pico_tree_count(&hits),
|
|
"mdns_record_tree_find_name should find 1 record here!\n");
|
|
record = pico_tree_first(&hits);
|
|
fail_unless(0 == strcmp(record->record->rname, "\3bar\5local"),
|
|
"mdns_record_tree_del_name failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_record_tree_del_name_type) /* MARK: mdns_record_tree_del_name_type */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(hits);
|
|
int ret = 0;
|
|
char url[] = "\3foo\5local";
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
add_records();
|
|
|
|
/* Try to del the two PTR records */
|
|
ret = pico_mdns_rtree_del_name_type(&MyRecords, url,
|
|
PICO_DNS_TYPE_PTR);
|
|
fail_unless(0 == ret, "mdns_record_tree_del_name_type returned error!\n");
|
|
|
|
/* Try to find the 2 PTR records */
|
|
hits = pico_mdns_rtree_find_name_type(&MyRecords, url,
|
|
PICO_DNS_TYPE_PTR, 0);
|
|
fail_unless(0 == pico_tree_count(&hits),
|
|
"mdns_record_tree_find_name_type returned PTR records!\n");
|
|
|
|
|
|
/* Try to find the first A record */
|
|
hits = pico_mdns_rtree_find_name_type(&MyRecords, url,
|
|
PICO_DNS_TYPE_A, 0);
|
|
fail_unless(1 == pico_tree_count(&hits),
|
|
"mdns_record_tree_del_name_type failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_my_records_add) /* MARK: mdns_my_records_add */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(rtree);
|
|
struct pico_mdns_record *record = NULL, *record1 = NULL, *record2 = NULL,
|
|
*record3 = NULL;
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
struct pico_ip4 rdata1 = {
|
|
long_be(0xFFFFFFFF)
|
|
};
|
|
char url[] = "foo.local";
|
|
char url1[] = "bar.local";
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
/* Create an A record with URL */
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record, "Record could not be created!\n");
|
|
|
|
/* Create 2 PTR records to URL */
|
|
record1 = pico_mdns_record_create(url, url, (uint16_t) strlen(url),
|
|
PICO_DNS_TYPE_PTR, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record1, "Record could not be created!\n");
|
|
|
|
/* Simulate that this record is not added again */
|
|
record2 = pico_mdns_record_create(url, url1, (uint16_t) strlen(url1),
|
|
PICO_DNS_TYPE_PTR, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record2, "Record could not be created!\n");
|
|
|
|
/* Create a totally different record */
|
|
record3 = pico_mdns_record_create(url1, &rdata1, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record2, "Record could not be created!\n");
|
|
|
|
/* Add the records to the tree */
|
|
pico_tree_insert(&rtree, record);
|
|
pico_tree_insert(&rtree, record1);
|
|
pico_tree_insert(&rtree, record2);
|
|
pico_tree_insert(&rtree, record3);
|
|
|
|
pico_mdns_my_records_add(&rtree, 0);
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_my_records_find_probed) /* MARK: mdns_my_records_find_probed */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(hits);
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
add_records();
|
|
|
|
hits = pico_mdns_my_records_find_probed();
|
|
fail_unless(2 == pico_tree_count(&hits),
|
|
"mdns_my_records_find_probed failed %d!\n",
|
|
pico_tree_count(&hits));
|
|
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_my_records_find_to_probe) /* MARK: mdns_my_records_find_to_probe */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(hits);
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
add_records();
|
|
|
|
hits = pico_mdns_my_records_find_to_probe();
|
|
fail_unless(1 == pico_tree_count(&hits),
|
|
"mdns_my_records_find_to_probe failed! %d\n", pico_tree_count(&hits));
|
|
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_my_records_claimed_id) /* MARK: mnds_my_records_claimed_id */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(hits);
|
|
struct pico_mdns_record *record = NULL, *record1 = NULL, *record2 = NULL,
|
|
*record3 = NULL;
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
struct pico_ip4 rdata1 = {
|
|
long_be(0xFFFFFFFF)
|
|
};
|
|
char url[] = "foo.local";
|
|
char url1[] = "bar.local";
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
/* Create an A record with URL */
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
record->claim_id = 1;
|
|
record->flags |= PICO_MDNS_RECORD_PROBED;
|
|
fail_if(!record, "Record could not be created!\n");
|
|
|
|
/* Create 2 PTR records to URL */
|
|
record1 = pico_mdns_record_create(url, url, (uint16_t) strlen(url),
|
|
PICO_DNS_TYPE_PTR, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
record1->claim_id = 1;
|
|
record1->flags |= PICO_MDNS_RECORD_PROBED;
|
|
fail_if(!record1, "Record could not be created!\n");
|
|
|
|
/* Simulate that this record is not added again */
|
|
record2 = pico_mdns_record_create(url, url1, (uint16_t)strlen(url1),
|
|
PICO_DNS_TYPE_PTR, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record2, "Record could not be created!\n");
|
|
|
|
/* Create a totally different record */
|
|
record3 = pico_mdns_record_create(url1, &rdata1, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record2, "Record could not be created!\n");
|
|
|
|
/* Add the records to the tree */
|
|
pico_tree_insert(&MyRecords, record);
|
|
pico_tree_insert(&MyRecords, record1);
|
|
pico_tree_insert(&MyRecords, record2);
|
|
pico_tree_insert(&MyRecords, record3);
|
|
|
|
fail_unless(1 == pico_mdns_my_records_claimed_id(1, &hits),
|
|
"mdns_my_records_claimed_id_failed!\n");
|
|
fail_unless(2 == pico_tree_count(&hits),
|
|
"Vector count should be 2!\n");
|
|
|
|
fail_unless(0 == pico_mdns_my_records_claimed_id(0, &hits),
|
|
"Claim ID '0' isn't claimed yet..");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_my_records_claimed) /* MARK: mdns_my_records_claimed */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(rtree);
|
|
struct pico_mdns_record *record = NULL, *record1 = NULL, *record2 = NULL,
|
|
*record3 = NULL;
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
struct pico_ip4 rdata1 = {
|
|
long_be(0xFFFFFFFF)
|
|
};
|
|
char url[] = "foo.local";
|
|
char url1[] = "bar.local";
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
/* Create an A record with URL */
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record, "Record could not be created!\n");
|
|
|
|
/* Create 2 PTR records to URL */
|
|
record1 = pico_mdns_record_create(url, url, (uint16_t) strlen(url),
|
|
PICO_DNS_TYPE_PTR, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record1, "Record could not be created!\n");
|
|
record2 = pico_mdns_record_create(url, url1, (uint16_t) strlen(url1),
|
|
PICO_DNS_TYPE_PTR, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record2, "Record could not be created!\n");
|
|
|
|
/* Create a totally different record */
|
|
record3 = pico_mdns_record_create(url1, &rdata1, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record2, "Record could not be created!\n");
|
|
|
|
/* Add the records to the tree */
|
|
pico_tree_insert(&MyRecords, record);
|
|
pico_tree_insert(&MyRecords, record1);
|
|
pico_tree_insert(&MyRecords, record2);
|
|
pico_tree_insert(&MyRecords, record3);
|
|
|
|
pico_tree_insert(&rtree, record);
|
|
pico_tree_insert(&rtree, record1);
|
|
pico_tree_insert(&rtree, record2);
|
|
pico_tree_insert(&rtree, record3);
|
|
|
|
ret = pico_mdns_my_records_claimed(rtree, callback, NULL);
|
|
fail_unless(0 == ret, "mdns_my_records_claimed failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
#if PICO_MDNS_ALLOW_CACHING == 1
|
|
START_TEST(tc_mdns_cache_add_record) /* MARK: mdns_cache_add_record */
|
|
{
|
|
struct pico_mdns_record *record = NULL, *found = NULL;
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
char url[] = "foo.local";
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
/* Create an A record with URL */
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 80,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record, "Record could not be created!\n");
|
|
|
|
ret = pico_mdns_cache_add_record(record);
|
|
fail_unless(0 == ret,
|
|
"mdns_cache_add_record returned error!\n");
|
|
found = pico_tree_findKey(&Cache, record);
|
|
fail_if(found == NULL, "mdns_cache_add_record failed!\n");
|
|
ret = pico_mdns_cache_add_record(record);
|
|
fail_unless(0 == ret,
|
|
"mdns_cache_add_record returned error!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
#endif
|
|
START_TEST(tc_pico_tree_merge)
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(src);
|
|
PICO_MDNS_RTREE_DECLARE(dst);
|
|
fail_unless(pico_tree_merge(NULL, NULL) == -1);
|
|
fail_unless(pico_tree_merge(&dst, NULL) == -1);
|
|
fail_unless(pico_tree_merge(NULL, &src) == -1);
|
|
fail_unless(pico_tree_merge(&dst, &src) == 0);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_populate_answer_vector) /* MARK: mdns_popolate_antree */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(rtree);
|
|
char value[] = "\3foo\5local";
|
|
printf("*********************** starting %s * \n", __func__);
|
|
add_records();
|
|
|
|
rtree = pico_mdns_populate_antree(value, PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN);
|
|
|
|
fail_unless(1 == pico_tree_count(&rtree), "mdns_populate_answer_vector failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_handle_data_as_questions) /* MARK: handle_data_as_questions */
|
|
{
|
|
pico_dns_packet *packet = NULL;
|
|
PICO_MDNS_RTREE_DECLARE(antree);
|
|
PICO_DNS_QTREE_DECLARE(qtree);
|
|
char qurl[] = "picotcp.com";
|
|
char qurl2[] = "google.com";
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
struct pico_ip4 rdata1 = {
|
|
long_be(0xFFFFFFFF)
|
|
};
|
|
uint16_t len = 0;
|
|
uint8_t *ptr = NULL;
|
|
int ret = 0;
|
|
struct pico_dns_question *a = NULL, *b = NULL;
|
|
struct pico_mdns_record *record1 = NULL, *record2 = NULL;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
/* Create a DNS query packet */
|
|
a = pico_mdns_question_create(qurl, &len, PICO_PROTO_IPV4, PICO_DNS_TYPE_A,
|
|
PICO_MDNS_QUESTION_FLAG_UNICAST_RES, 0);
|
|
fail_if(!a, "dns_question_create failed!\n");
|
|
pico_tree_insert(&qtree, a);
|
|
fail_unless(ret == 0, "dns_question_vector_add returned error!\n");
|
|
b = pico_mdns_question_create(qurl2, &len, PICO_PROTO_IPV4, PICO_DNS_TYPE_A,
|
|
0, 0);
|
|
fail_if(!b, "dns_question_create failed!\n");
|
|
pico_tree_insert(&qtree, b);
|
|
packet = pico_dns_query_create(&qtree, NULL, NULL, NULL, &len);
|
|
fail_if(packet == NULL, "mdns_query_create returned NULL!\n");
|
|
|
|
/* Create records for answers */
|
|
record1 = pico_mdns_record_create(qurl, &rdata, 4, PICO_DNS_TYPE_A, 120,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record1, "mdns_record_create returned NULL!\n");
|
|
record1->flags |= 0xC0;
|
|
record2 = pico_mdns_record_create(qurl2, &rdata1, 4, PICO_DNS_TYPE_A, 120,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record2, "mdns_record_created returned NULL!\n");
|
|
record2->flags |= 0xC0;
|
|
|
|
/* Add them to my records */
|
|
pico_tree_insert(&MyRecords, record1);
|
|
pico_tree_insert(&MyRecords, record2);
|
|
|
|
ptr = ((uint8_t *)packet + 12);
|
|
|
|
antree = pico_mdns_handle_data_as_questions(&ptr, 2, packet);
|
|
fail_unless(2 == pico_tree_count(&antree),
|
|
"pico_mdns_handle_data_as_questions returned error!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_handle_data_as_answers) /* MARK: handle_data_as_answers */
|
|
{
|
|
pico_dns_packet *packet = NULL;
|
|
PICO_DNS_RTREE_DECLARE(rtree);
|
|
struct pico_mdns_record *a = NULL, *b = NULL;
|
|
char url[] = "picotcp.com";
|
|
char url2[] = "google.com";
|
|
uint8_t rdata[4] = {
|
|
10, 10, 0, 1
|
|
};
|
|
uint8_t *ptr = NULL;
|
|
uint16_t len = 0;
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
a = pico_mdns_record_create(url, (void *)rdata, 4, PICO_DNS_TYPE_A, 120,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!a, "dns_record_create returned NULL!\n");
|
|
b = pico_mdns_record_create(url2, (void *)rdata, 4, PICO_DNS_TYPE_A, 120,
|
|
PICO_MDNS_RECORD_SHARED);
|
|
fail_if(!a, "dns_record_create returned NULL!\n");
|
|
pico_tree_insert(&rtree, a->record);
|
|
pico_tree_insert(&rtree, b->record);
|
|
|
|
/* Try to create an answer packet */
|
|
packet = pico_dns_answer_create(&rtree, NULL, NULL, &len);
|
|
fail_if (packet == NULL, "mdns_answer_create returned NULL!\n");
|
|
|
|
ptr = ((uint8_t *)packet + 12);
|
|
|
|
ret = pico_mdns_handle_data_as_answers_generic(&ptr, 2, packet, 0);
|
|
fail_unless(0 == ret, "mdns_handle_data_as_answers failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_handle_data_as_authorities) /* MARK: handle_data_as_authorities */
|
|
{
|
|
pico_dns_packet *packet = NULL;
|
|
PICO_DNS_RTREE_DECLARE(rtree);
|
|
struct pico_mdns_record *a = NULL, *b = NULL;
|
|
char url[] = "picotcp.com";
|
|
char url2[] = "google.com";
|
|
uint16_t len = 0;
|
|
uint8_t *ptr = NULL;
|
|
uint8_t rdata[4] = {
|
|
10, 10, 0, 1
|
|
};
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
a = pico_mdns_record_create(url, (void *)rdata, 4, PICO_DNS_TYPE_A, 120,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!a, "dns_record_create returned NULL!\n");
|
|
b = pico_mdns_record_create(url2, (void *)rdata, 4, PICO_DNS_TYPE_A, 120,
|
|
PICO_MDNS_RECORD_SHARED);
|
|
fail_if(!a, "dns_record_create returned NULL!\n");
|
|
pico_tree_insert(&rtree, a->record);
|
|
pico_tree_insert(&rtree, b->record);
|
|
|
|
/* Try to create an answer packet */
|
|
packet = pico_dns_answer_create(&rtree, NULL, NULL, &len);
|
|
fail_if (packet == NULL, "mdns_answer_create returned NULL!\n");
|
|
|
|
ptr = ((uint8_t *)packet + 12);
|
|
|
|
ret = pico_mdns_handle_data_as_answers_generic(&ptr, 2, packet, 1);
|
|
fail_unless(0 == ret, "mdns_handle_data_as_answers failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_handle_data_as_additionals) /* MARK: handle_data_as_additionals */
|
|
{
|
|
printf("*********************** starting %s * \n", __func__);
|
|
/* Insert code here... */
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_sort_unicast_multicast) /* MARK: sort_unicast_multicast */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(antree);
|
|
PICO_DNS_RTREE_DECLARE(antree_u);
|
|
PICO_DNS_RTREE_DECLARE(antree_m);
|
|
struct pico_mdns_record *a = NULL, *b = NULL;
|
|
char url[] = "picotcp.com";
|
|
char url2[] = "google.com";
|
|
uint8_t rdata[4] = {
|
|
10, 10, 0, 1
|
|
};
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
a = pico_mdns_record_create(url, (void *)rdata, 4, PICO_DNS_TYPE_A, 120,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!a, "mdns_record_create returned NULL!\n");
|
|
b = pico_mdns_record_create(url2, (void *)rdata, 4, PICO_DNS_TYPE_A, 120,
|
|
(PICO_MDNS_RECORD_SHARED | PICO_MDNS_RECORD_SEND_UNICAST));
|
|
fail_if(!a, "mdns_record_create returned NULL!\n");
|
|
pico_tree_insert(&antree, a);
|
|
pico_tree_insert(&antree, b);
|
|
|
|
ret = pico_mdns_sort_unicast_multicast(&antree, &antree_u, &antree_m);
|
|
fail_unless(0 == ret, "mdns_sort_unicast_multicast returned error!\n");
|
|
fail_unless(1 == pico_tree_count(&antree_u), "mdns_sort_unicast_multicast failed!\n");
|
|
fail_unless(1 == pico_tree_count(&antree_m), "mdns_sort_unicast_multicast failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_gather_additionals) /* MARK: gather_additionals */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(antree);
|
|
PICO_MDNS_RTREE_DECLARE(artree);
|
|
struct pico_mdns_record *srv_record = NULL, *record = NULL;
|
|
struct pico_tree_node *node = NULL;
|
|
int ret = 0;
|
|
char value[] = "\0\0\0\0\0\x50\4host\5local";
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
add_records();
|
|
|
|
srv_record = pico_mdns_record_create("test._http._tcp.local",
|
|
value, 17,
|
|
PICO_DNS_TYPE_SRV, 120,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!srv_record, "Could not create SRV record!\n");
|
|
pico_tree_insert(&antree, srv_record);
|
|
|
|
ret = pico_mdns_gather_additionals(&antree, &artree);
|
|
fail_if(ret, "Gather Additionals returned error!\n");
|
|
fail_unless(pico_tree_count(&antree) == 3, "ANtree should contain 3: %d",
|
|
pico_tree_count(&antree));
|
|
|
|
printf("Answers: \n");
|
|
pico_tree_foreach(node, &antree) {
|
|
if ((record = node->keyValue)) {
|
|
printf("%d - %s\n", short_be(record->record->rsuffix->rtype),
|
|
record->record->rname);
|
|
}
|
|
}
|
|
|
|
printf("Additionals: \n");
|
|
pico_tree_foreach(node, &artree) {
|
|
if ((record = node->keyValue)) {
|
|
printf("%d - %s\n", short_be(record->record->rsuffix->rtype),
|
|
record->record->rname);
|
|
}
|
|
}
|
|
|
|
fail_unless(pico_tree_count(&artree) == 3, "ARtree should contine 3: %d",
|
|
pico_tree_count(&artree));
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_apply_known_answer_suppression) /* MARK: apply_k_a_s */
|
|
{
|
|
pico_dns_packet *packet = NULL;
|
|
PICO_DNS_RTREE_DECLARE(antree);
|
|
PICO_MDNS_RTREE_DECLARE(rtree);
|
|
struct pico_mdns_record *a = NULL, *b = NULL;
|
|
char url[] = "picotcp.com";
|
|
char url2[] = "google.com";
|
|
uint8_t rdata[4] = {
|
|
10, 10, 0, 1
|
|
};
|
|
uint8_t *ptr = NULL;
|
|
uint16_t len = 0;
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
a = pico_mdns_record_create(url, (void *)rdata, 4, PICO_DNS_TYPE_A, 120,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!a, "dns_record_create returned NULL!\n");
|
|
b = pico_mdns_record_create(url2, (void *)rdata, 4, PICO_DNS_TYPE_A, 120,
|
|
PICO_MDNS_RECORD_SHARED);
|
|
fail_if(!a, "dns_record_create returned NULL!\n");
|
|
|
|
pico_tree_insert(&antree, a->record);
|
|
pico_tree_insert(&antree, b->record);
|
|
pico_tree_insert(&rtree, a);
|
|
pico_tree_insert(&rtree, b);
|
|
|
|
/* Try to create an answer packet */
|
|
packet = pico_dns_answer_create(&antree, NULL, NULL, &len);
|
|
fail_if (packet == NULL, "mdns_answer_create returned NULL!\n");
|
|
|
|
ptr = ((uint8_t *)packet + 12);
|
|
|
|
printf("Applying Known answer suppression...\n");
|
|
|
|
ret = pico_mdns_apply_k_a_s(&rtree, packet, 1, &ptr);
|
|
fail_unless(0 == ret, "mdns_apply_known_answer_suppression returned error!\n");
|
|
|
|
fail_unless(1 == pico_tree_count(&rtree),
|
|
"mdns_apply_known_answer_suppression failed %d!\n", pico_tree_count(&rtree));
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_send_query_packet) /* MARK: send_query_packet */
|
|
{
|
|
struct pico_mdns_cookie cookie;
|
|
PICO_DNS_QTREE_DECLARE(qtree);
|
|
PICO_MDNS_COOKIE_DECLARE(a);
|
|
|
|
struct pico_dns_question *question1 = NULL;
|
|
struct pico_dns_question *question2 = NULL;
|
|
char url1[] = "foo.local";
|
|
uint16_t len;
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
/* Create some questions */
|
|
question1 = pico_dns_question_create(url1, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_A,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
fail_if(!question1, "Could not create question 1!\n");
|
|
question2 = pico_dns_question_create(url1, &len, PICO_PROTO_IPV4,
|
|
PICO_DNS_TYPE_PTR,
|
|
PICO_DNS_CLASS_IN, 0);
|
|
pico_tree_insert(&(a.qtree), question1);
|
|
pico_tree_insert(&(a.qtree), question2);
|
|
cookie.count = 2;
|
|
|
|
pico_stack_init();
|
|
mdns_init();
|
|
|
|
pico_mdns_send_query_packet(0, &cookie);
|
|
cookie.type = PICO_MDNS_PACKET_TYPE_QUERY;
|
|
cookie.qtree = qtree;
|
|
pico_mdns_send_query_packet(0, &cookie);
|
|
cookie.type++;
|
|
cookie.status = PICO_MDNS_COOKIE_STATUS_CANCELLED;
|
|
pico_mdns_send_query_packet(0, &cookie);
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_getrecord) /* MARK: getrecord */
|
|
{
|
|
#if PICO_MDNS_ALLOW_CACHING == 1
|
|
struct pico_mdns_record *record = NULL, *found = NULL;
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
char url[] = "foo.local";
|
|
#endif
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
/*
|
|
If caching is enabled:
|
|
If the record is cached:
|
|
getrecord should get the record from the cache, execute the callback and return 0 when the callback is finished.
|
|
Else:
|
|
getrecord should send a query and return 0 when the query is sent.
|
|
Else:
|
|
getrecord should send a query and return 0 when the query is sent.
|
|
*/
|
|
|
|
/* Init */
|
|
pico_stack_init();
|
|
mdns_init();
|
|
|
|
#if PICO_MDNS_ALLOW_CACHING == 1
|
|
/* Create an A record with URL */
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 80,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record, "Record could not be created!\n");
|
|
|
|
ret = pico_mdns_cache_add_record(record);
|
|
fail_unless(0 == ret,
|
|
"mdns_cache_add_record returned error!\n");
|
|
found = pico_tree_findKey(&Cache, record);
|
|
fail_if(found == NULL, "mdns_cache_add_record failed!\n");
|
|
#endif
|
|
|
|
#if PICO_MDNS_ALLOW_CACHING == 1
|
|
amount_callback_executed = 0;
|
|
ret = pico_mdns_getrecord("foo.local", PICO_DNS_TYPE_A, callback, NULL);
|
|
fail_unless(1 == amount_callback_executed, "mdns_getrecord failed with cache record, callback not executed (%d) !\n", amount_callback_executed);
|
|
fail_unless(0 == ret, "mdns_getrecord failed with cache record!\n");
|
|
#endif
|
|
|
|
ret = pico_mdns_getrecord("bar.local", PICO_DNS_TYPE_A, callback, NULL);
|
|
fail_unless(0 == ret, "mdns_getrecord failed!\n");
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_send_announcement_packet) /* MARK: send_announcement_packet */
|
|
{
|
|
struct pico_mdns_cookie *cookie = NULL;
|
|
PICO_DNS_QTREE_DECLARE(qtree);
|
|
PICO_MDNS_RTREE_DECLARE(antree);
|
|
PICO_MDNS_RTREE_DECLARE(artree);
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
cookie = pico_mdns_cookie_create(qtree, antree, artree, 2,
|
|
PICO_MDNS_PACKET_TYPE_ANNOUNCEMENT,
|
|
callback, NULL);
|
|
|
|
pico_stack_init();
|
|
mdns_init();
|
|
|
|
pico_mdns_send_announcement_packet(0, cookie);
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_announce) /* MARK: annonce */
|
|
{
|
|
printf("*********************** starting %s * \n", __func__);
|
|
add_records();
|
|
pico_stack_init();
|
|
mdns_init();
|
|
|
|
fail_unless(0 == pico_mdns_announce(callback, NULL),
|
|
"mdns_announce failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_send_probe_packet) /* MARK: send_probe_packet */
|
|
{
|
|
struct pico_mdns_cookie *cookie = NULL;
|
|
PICO_DNS_QTREE_DECLARE(qtree);
|
|
PICO_MDNS_RTREE_DECLARE(antree);
|
|
PICO_MDNS_RTREE_DECLARE(artree);
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
|
|
cookie = pico_mdns_cookie_create(qtree, antree, artree, 2,
|
|
PICO_MDNS_PACKET_TYPE_PROBE,
|
|
callback, NULL);
|
|
|
|
pico_stack_init();
|
|
mdns_init();
|
|
|
|
pico_mdns_send_probe_packet(0, cookie);
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_add_probe_question) /* MARK: add_probe_question */
|
|
{
|
|
PICO_DNS_QTREE_DECLARE(qtree);
|
|
int ret = 0;
|
|
char arg[] = "\4host\5local";
|
|
char arg1[] = "\4tree\5local";
|
|
char arg2[] = "\x8host (2)\5local";
|
|
printf("*********************** starting %s * \n", __func__);
|
|
ret = pico_mdns_add_probe_question(&qtree, arg);
|
|
fail_unless(0 == ret, "mdns_add_probe_question returned error!\n");
|
|
fail_unless(1 == pico_tree_count(&qtree),
|
|
"New probe question didn't create!\n");
|
|
ret = pico_mdns_add_probe_question(&qtree, arg);
|
|
fail_unless(0 == ret, "mdns_add_probe_question returned error!\n");
|
|
fail_unless(1 == pico_tree_count(&qtree),
|
|
"Count should be 1, is: %d!\n", pico_tree_count(&qtree));
|
|
ret = pico_mdns_add_probe_question(&qtree, arg1);
|
|
fail_unless(0 == ret, "mdns_add_probe_question returned error!\n");
|
|
fail_unless(2 == pico_tree_count(&qtree),
|
|
"New probe question didn't create!\n");
|
|
ret = pico_mdns_add_probe_question(&qtree, arg2);
|
|
fail_unless(0 == ret, "mdns_add_probe_question returned error!\n");
|
|
fail_unless(3 == pico_tree_count(&qtree),
|
|
"New probe question didn't create!\n");
|
|
PICO_DNS_QTREE_DESTROY(&qtree);
|
|
fail_unless(0 == pico_tree_count(&qtree),
|
|
"Tree isn't properly destroyed %d!\n", pico_tree_count(&qtree));
|
|
ret = pico_mdns_add_probe_question(&qtree, arg2);
|
|
fail_unless(0 == ret, "mdns_add_probe_question returned error!\n");
|
|
fail_unless(1 == pico_tree_count(&qtree),
|
|
"New probe question didn't create!\n");
|
|
PICO_DNS_QTREE_DESTROY(&qtree);
|
|
fail_unless(0 == pico_tree_count(&qtree),
|
|
"Tree isn't properly destroyed the second time!\n");
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_probe) /* MARK: probe */
|
|
{
|
|
printf("*********************** starting %s * \n", __func__);
|
|
add_records();
|
|
pico_stack_init();
|
|
mdns_init();
|
|
|
|
fail_unless(0 == pico_mdns_probe(callback, NULL),
|
|
"mdns_announce failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_claim) /* MARK: mdns_claim */
|
|
{
|
|
PICO_MDNS_RTREE_DECLARE(rtree);
|
|
struct pico_mdns_record *record = NULL, *record1 = NULL;
|
|
char url[] = "foo.local";
|
|
char url2[] = "bar.local";
|
|
struct pico_ip4 rdata = {
|
|
long_be(0x00FFFFFF)
|
|
};
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
/* Create a record */
|
|
record = pico_mdns_record_create(url, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record, "Record could not be created!\n");
|
|
record1 = pico_mdns_record_create(url2, &rdata, 4, PICO_DNS_TYPE_A, 0,
|
|
PICO_MDNS_RECORD_UNIQUE);
|
|
fail_if(!record1, "Record could not be created!\n");
|
|
|
|
/* Some tests */
|
|
pico_tree_insert(&rtree, record);
|
|
pico_tree_insert(&rtree, record1);
|
|
|
|
pico_stack_init();
|
|
mdns_init();
|
|
|
|
ret = pico_mdns_claim(rtree, callback, NULL);
|
|
fail_unless(0 == ret, "mdns_claimed failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_tryclaim_hostname) /* MARK: tryclaim_hostname */
|
|
{
|
|
int ret = 0;
|
|
|
|
printf("*********************** starting %s * \n", __func__);
|
|
pico_stack_init();
|
|
mdns_init();
|
|
|
|
ret = pico_mdns_tryclaim_hostname("test.local", NULL);
|
|
fail_unless(0 == ret, "mdns_tryclaim_hostname failed!\n");
|
|
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
START_TEST(tc_mdns_get_hostname) /* MARK: get_hostname */
|
|
{
|
|
const char *c_hostname;
|
|
printf("*********************** starting %s * \n", __func__);
|
|
pico_stack_init();
|
|
mdns_init();
|
|
|
|
c_hostname = pico_mdns_get_hostname();
|
|
printf(" hostname %s\n", c_hostname);
|
|
printf("*********************** ending %s * \n", __func__);
|
|
}
|
|
END_TEST
|
|
|
|
Suite *pico_suite(void)
|
|
{
|
|
Suite *s = suite_create("PicoTCP");
|
|
|
|
TCase *TCase_mdns_init = tcase_create("Unit test for mdns_init");
|
|
|
|
/* Comparing functions */
|
|
TCase *TCase_mdns_record_cmp = tcase_create("Unit test for mdns_record_cmp");
|
|
TCase *TCase_mdns_record_cmp_name_type = tcase_create("Unit test for mdns_record_cmp_name_type");
|
|
TCase *TCase_mdns_cookie_cmp = tcase_create("Unit test for mdns_cookie_cmp");
|
|
|
|
TCase *TCase_mdns_suffix_to_uint16 = tcase_create("Unit test for mdns_suffix_to_uint16");
|
|
|
|
/* Cookie functions */
|
|
TCase *TCase_mdns_cookie_delete = tcase_create("Unit test for mdns_cookie_delete");
|
|
TCase *TCase_mdns_cookie_create = tcase_create("Unit test for mdns_cookie_create");
|
|
TCase *TCase_mdns_cookie_tree_find_query_cookie = tcase_create("Unit test for mdns_cookie_tree_find_query_cookie");
|
|
TCase *TCase_mdns_cookie_apply_spt = tcase_create("Unit test for mdns_cookie_apply_spt");
|
|
TCase *TCase_mdns_is_suffix_present = tcase_create("Unit test for mdns_is_suffix_present");
|
|
TCase *TCase_pico_itoa = tcase_create("Unit test for pico_itoa");
|
|
TCase *TCase_mdns_resolve_name_conflict = tcase_create("Unit test for mdns_resolve_name_conflict");
|
|
TCase *TCase_mdns_generate_new_records = tcase_create("Unit test for mdns_generate_new_records");
|
|
TCase *TCase_mdns_cookie_resolve_conflict = tcase_create("Unit test for mdns_cookie_resolve_conflict");
|
|
|
|
/* Question functions */
|
|
TCase *TCase_mdns_question_create = tcase_create("Unit test for mdns_question_create");
|
|
|
|
/* Record functions */
|
|
TCase *TCase_mdns_record_resolve_conflict = tcase_create("Unit test for mdns_record_resolve_conflict");
|
|
TCase *TCase_mdns_record_am_i_lexi_later = tcase_create("Unit test for mdns_record_am_i_lexi_later");
|
|
TCase *TCase_mdns_record_copy_with_new_name = tcase_create("Unit test for mdns_record_copy");
|
|
TCase *TCase_mdns_record_copy = tcase_create("Unit test for mdns_record_copy");
|
|
TCase *TCase_mdns_record_create = tcase_create("Unit test for mdns_record_create");
|
|
TCase *TCase_mdns_record_delete = tcase_create("Unit test for mdns_record_delete");
|
|
|
|
|
|
/* Record tree functions */
|
|
TCase *TCase_mdns_record_tree_find_name = tcase_create("Unit test for mdns_record_tree_find_name");
|
|
TCase *TCase_mdns_record_tree_find_name_type = tcase_create("Unit test for mdns_record_tree_find_name_type");
|
|
TCase *TCase_mdns_record_tree_del_name = tcase_create("Unit test for mdns_record_tree_del_name");
|
|
TCase *TCase_mdns_record_tree_del_name_type = tcase_create("Unit test for mdns_record_tree_del_name_type");
|
|
|
|
/* My record functions */
|
|
TCase *TCase_mdns_my_records_add = tcase_create("Unit test for mdns_my_records_add");
|
|
TCase *TCase_mdns_my_records_find_probed = tcase_create("Unit test for mdns_my_records_find_probed");
|
|
TCase *TCase_mdns_my_records_find_to_probe = tcase_create("Unit test for mdns_my_records_find_to_probe");
|
|
TCase *TCase_mdns_my_records_claimed_id = tcase_create("Unit test for mdns_my_records_claimed_id");
|
|
TCase *TCase_mdns_my_records_claimed = tcase_create("Unit test for mdns_my_records_claimed");
|
|
|
|
/* Cache functions */
|
|
TCase *TCase_mdns_cache_add_record = tcase_create("Unit test for mdns_cache_add_record");
|
|
|
|
/* Handling receptions */
|
|
TCase *TCase_mdns_populate_answer_vector = tcase_create("Unit test for mdns_populate_answer_vector");
|
|
TCase *TCase_mdns_handle_data_as_questions = tcase_create("Unit test for mdns_handle_data_as_questions");
|
|
TCase *TCase_mdns_handle_data_as_answers = tcase_create("Unit test for mdns_handle_data_as_answers");
|
|
TCase *TCase_mdns_handle_data_as_authorities = tcase_create("Unit test for mdns_handle_data_as_authorities");
|
|
TCase *TCase_mdns_handle_data_as_additionals = tcase_create("Unit test for mdns_handle_data_as_additionals");
|
|
|
|
/* Handling query packets */
|
|
TCase *TCase_mdns_sort_unicast_multicast = tcase_create("Unit test for mdns_sort_unicast_multicast");
|
|
TCase *TCase_mdns_gather_additionals = tcase_create("Unit test for mdns_gather_additionals");
|
|
TCase *TCase_mdns_apply_known_answer_suppression = tcase_create("Unit test for mdns_apply_known_answer_suppression");
|
|
|
|
/* Address resolving functions */
|
|
TCase *TCase_mdns_send_query_packet = tcase_create("Unit test for mdns_send_query_packet");
|
|
TCase *TCase_mdns_getrecord = tcase_create("Unit test for mdns_getrecord");
|
|
|
|
/* Probe & Announcement functions */
|
|
TCase *TCase_mdns_send_announcement_packet = tcase_create("Unit test for mdns_send_announcement_packet");
|
|
TCase *TCase_mdns_announce = tcase_create("Unit test for mdns_announce");
|
|
TCase *TCase_mdns_send_probe_packet = tcase_create("Unit test for mdns_send_probe_packet");
|
|
TCase *TCase_mdns_add_probe_question = tcase_create("Unit test for mdns_add_probe_question");
|
|
TCase *TCase_mdns_probe = tcase_create("Unit test for mdns_probe");
|
|
|
|
/* Claiming functions */
|
|
TCase *TCase_mdns_claim = tcase_create("Unit test for mnds_claim");
|
|
|
|
/* API functions */
|
|
TCase *TCase_mdns_tryclaim_hostname = tcase_create("Unit test for mdns_tryclaim_hostname");
|
|
TCase *TCase_mdns_get_hostname = tcase_create("Unit test for mdns_get_hostname");
|
|
|
|
TCase *TCase_pico_tree_merge = tcase_create("Unit test for pico_tree_merge");
|
|
|
|
tcase_add_test(TCase_mdns_init, tc_mdns_init);
|
|
suite_add_tcase(s, TCase_mdns_init);
|
|
|
|
/* Comparing functions */
|
|
tcase_add_test(TCase_mdns_record_cmp, tc_mdns_record_cmp);
|
|
suite_add_tcase(s, TCase_mdns_record_cmp);
|
|
tcase_add_test(TCase_mdns_record_cmp_name_type, tc_mdns_record_cmp_name_type);
|
|
suite_add_tcase(s, TCase_mdns_record_cmp_name_type);
|
|
tcase_add_test(TCase_mdns_cookie_cmp, tc_mdns_cookie_cmp);
|
|
suite_add_tcase(s, TCase_mdns_cookie_cmp);
|
|
|
|
tcase_add_test(TCase_mdns_suffix_to_uint16, tc_mdns_suffix_to_uint16);
|
|
suite_add_tcase(s, TCase_mdns_suffix_to_uint16);
|
|
|
|
/* Cookie functions */
|
|
tcase_add_test(TCase_mdns_cookie_delete, tc_mdns_cookie_delete);
|
|
suite_add_tcase(s, TCase_mdns_cookie_delete);
|
|
tcase_add_test(TCase_mdns_cookie_create, tc_mdns_cookie_create);
|
|
suite_add_tcase(s, TCase_mdns_cookie_create);
|
|
tcase_add_test(TCase_mdns_cookie_tree_find_query_cookie, tc_mdns_cookie_tree_find_query_cookie);
|
|
suite_add_tcase(s, TCase_mdns_cookie_tree_find_query_cookie);
|
|
tcase_add_test(TCase_mdns_cookie_apply_spt, tc_mdns_cookie_apply_spt);
|
|
suite_add_tcase(s, TCase_mdns_cookie_apply_spt);
|
|
tcase_add_test(TCase_mdns_is_suffix_present, tc_mdns_is_suffix_present);
|
|
suite_add_tcase(s, TCase_mdns_is_suffix_present);
|
|
tcase_add_test(TCase_pico_itoa, tc_pico_itoa);
|
|
suite_add_tcase(s, TCase_pico_itoa);
|
|
tcase_add_test(TCase_mdns_resolve_name_conflict, tc_mdns_resolve_name_conflict);
|
|
suite_add_tcase(s, TCase_mdns_resolve_name_conflict);
|
|
tcase_add_test(TCase_mdns_generate_new_records, tc_mdns_generate_new_records);
|
|
suite_add_tcase(s, TCase_mdns_generate_new_records);
|
|
tcase_add_test(TCase_mdns_cookie_resolve_conflict, tc_mdns_cookie_resolve_conflict);
|
|
suite_add_tcase(s, TCase_mdns_cookie_resolve_conflict);
|
|
|
|
/* Question functions */
|
|
tcase_add_test(TCase_mdns_question_create, tc_mdns_question_create);
|
|
suite_add_tcase(s, TCase_mdns_question_create);
|
|
|
|
/* Record functions */
|
|
tcase_add_test(TCase_mdns_record_resolve_conflict, tc_mdns_record_resolve_conflict);
|
|
suite_add_tcase(s, TCase_mdns_record_resolve_conflict);
|
|
tcase_add_test(TCase_mdns_record_am_i_lexi_later, tc_mdns_record_am_i_lexi_later);
|
|
suite_add_tcase(s, TCase_mdns_record_am_i_lexi_later);
|
|
tcase_add_test(TCase_mdns_record_copy_with_new_name, tc_mdns_record_copy_with_new_name);
|
|
suite_add_tcase(s, TCase_mdns_record_copy_with_new_name);
|
|
tcase_add_test(TCase_mdns_record_copy, tc_mdns_record_copy);
|
|
suite_add_tcase(s, TCase_mdns_record_copy);
|
|
tcase_add_test(TCase_mdns_record_create, tc_mdns_record_create);
|
|
suite_add_tcase(s, TCase_mdns_record_create);
|
|
tcase_add_test(TCase_mdns_record_delete, tc_mdns_record_delete);
|
|
suite_add_tcase(s, TCase_mdns_record_delete);
|
|
|
|
/* Record tree functions */
|
|
tcase_add_test(TCase_mdns_record_tree_find_name, tc_mdns_record_tree_find_name);
|
|
suite_add_tcase(s, TCase_mdns_record_tree_find_name);
|
|
tcase_add_test(TCase_mdns_record_tree_find_name_type, tc_mdns_record_tree_find_name_type);
|
|
suite_add_tcase(s, TCase_mdns_record_tree_find_name_type);
|
|
tcase_add_test(TCase_mdns_record_tree_del_name, tc_mdns_record_tree_del_name);
|
|
suite_add_tcase(s, TCase_mdns_record_tree_del_name);
|
|
tcase_add_test(TCase_mdns_record_tree_del_name_type, tc_mdns_record_tree_del_name_type);
|
|
suite_add_tcase(s, TCase_mdns_record_tree_del_name_type);
|
|
|
|
/* My records functions */
|
|
tcase_add_test(TCase_mdns_my_records_add, tc_mdns_my_records_add);
|
|
suite_add_tcase(s, TCase_mdns_my_records_add);
|
|
tcase_add_test(TCase_mdns_my_records_find_probed, tc_mdns_my_records_find_probed);
|
|
suite_add_tcase(s, TCase_mdns_my_records_find_probed);
|
|
tcase_add_test(TCase_mdns_my_records_find_to_probe, tc_mdns_my_records_find_to_probe);
|
|
suite_add_tcase(s, TCase_mdns_my_records_find_to_probe);
|
|
tcase_add_test(TCase_mdns_my_records_claimed_id, tc_mdns_my_records_claimed_id);
|
|
suite_add_tcase(s, TCase_mdns_my_records_claimed_id);
|
|
tcase_add_test(TCase_mdns_my_records_claimed, tc_mdns_my_records_claimed);
|
|
suite_add_tcase(s, TCase_mdns_my_records_claimed);
|
|
|
|
/* Cache functions */
|
|
tcase_add_test(TCase_mdns_cache_add_record, tc_mdns_cache_add_record);
|
|
suite_add_tcase(s, TCase_mdns_cache_add_record);
|
|
tcase_add_test(TCase_mdns_populate_answer_vector, tc_mdns_populate_answer_vector);
|
|
suite_add_tcase(s, TCase_mdns_populate_answer_vector);
|
|
|
|
/* Handling receptions */
|
|
tcase_add_test(TCase_mdns_handle_data_as_questions, tc_mdns_handle_data_as_questions);
|
|
suite_add_tcase(s, TCase_mdns_handle_data_as_questions);
|
|
tcase_add_test(TCase_mdns_handle_data_as_answers, tc_mdns_handle_data_as_answers);
|
|
suite_add_tcase(s, TCase_mdns_handle_data_as_answers);
|
|
tcase_add_test(TCase_mdns_handle_data_as_authorities, tc_mdns_handle_data_as_authorities);
|
|
suite_add_tcase(s, TCase_mdns_handle_data_as_authorities);
|
|
tcase_add_test(TCase_mdns_handle_data_as_additionals, tc_mdns_handle_data_as_additionals);
|
|
suite_add_tcase(s, TCase_mdns_handle_data_as_additionals);
|
|
|
|
/* Handling query packets */
|
|
tcase_add_test(TCase_mdns_sort_unicast_multicast, tc_mdns_sort_unicast_multicast);
|
|
suite_add_tcase(s, TCase_mdns_sort_unicast_multicast);
|
|
tcase_add_test(TCase_mdns_gather_additionals, tc_mdns_gather_additionals);
|
|
suite_add_tcase(s, TCase_mdns_gather_additionals);
|
|
tcase_add_test(TCase_mdns_apply_known_answer_suppression, tc_mdns_apply_known_answer_suppression);
|
|
suite_add_tcase(s, TCase_mdns_apply_known_answer_suppression);
|
|
|
|
/* Address resolving functions */
|
|
tcase_add_test(TCase_mdns_send_query_packet, tc_mdns_send_query_packet);
|
|
suite_add_tcase(s, TCase_mdns_send_query_packet);
|
|
tcase_add_test(TCase_mdns_getrecord, tc_mdns_getrecord);
|
|
suite_add_tcase(s, TCase_mdns_getrecord);
|
|
|
|
/* Probe & Announcement functions */
|
|
tcase_add_test(TCase_mdns_send_announcement_packet, tc_mdns_send_announcement_packet);
|
|
suite_add_tcase(s, TCase_mdns_send_announcement_packet);
|
|
tcase_add_test(TCase_mdns_announce, tc_mdns_announce);
|
|
suite_add_tcase(s, TCase_mdns_announce);
|
|
tcase_add_test(TCase_mdns_send_probe_packet, tc_mdns_send_probe_packet);
|
|
suite_add_tcase(s, TCase_mdns_send_probe_packet);
|
|
tcase_add_test(TCase_mdns_add_probe_question, tc_mdns_add_probe_question);
|
|
suite_add_tcase(s, TCase_mdns_add_probe_question);
|
|
tcase_add_test(TCase_mdns_probe, tc_mdns_probe);
|
|
suite_add_tcase(s, TCase_mdns_probe);
|
|
|
|
/* Claiming functions */
|
|
tcase_add_test(TCase_mdns_claim, tc_mdns_claim);
|
|
suite_add_tcase(s, TCase_mdns_claim);
|
|
|
|
/* API functions */
|
|
tcase_add_test(TCase_mdns_tryclaim_hostname, tc_mdns_tryclaim_hostname);
|
|
suite_add_tcase(s, TCase_mdns_tryclaim_hostname);
|
|
tcase_add_test(TCase_mdns_get_hostname, tc_mdns_get_hostname);
|
|
suite_add_tcase(s, TCase_mdns_get_hostname);
|
|
|
|
tcase_add_test(TCase_pico_tree_merge, tc_pico_tree_merge);
|
|
suite_add_tcase(s, TCase_pico_tree_merge);
|
|
return s;
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
int fails;
|
|
Suite *s = pico_suite();
|
|
SRunner *sr = srunner_create(s);
|
|
srunner_run_all(sr, CK_NORMAL);
|
|
fails = srunner_ntests_failed(sr);
|
|
srunner_free(sr);
|
|
return fails;
|
|
}
|
|
|