mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-20 23:00:56 -05:00
Fixups after initial unit test.
git-svn-id: file:///svn/unbound/trunk@251 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
561385c35a
commit
545feea82b
5 changed files with 103 additions and 27 deletions
|
|
@ -1,3 +1,12 @@
|
||||||
|
19 April 2007: Wouter
|
||||||
|
- fix unit test to actually to tests.
|
||||||
|
- fix write iov helper, and fakevent code.
|
||||||
|
- extra builtin testcase (small packet).
|
||||||
|
- ttl converted to network format in packets.
|
||||||
|
- flags converted correctly
|
||||||
|
- rdatalen off by 2 error fixup.
|
||||||
|
- uses less iov space for header.
|
||||||
|
|
||||||
18 April 2007: Wouter
|
18 April 2007: Wouter
|
||||||
- review of msgparse code.
|
- review of msgparse code.
|
||||||
- smaller test cases.
|
- smaller test cases.
|
||||||
|
|
|
||||||
|
|
@ -614,7 +614,8 @@ void
|
||||||
comm_point_send_reply_iov(struct comm_reply* repinfo, struct iovec* iov,
|
comm_point_send_reply_iov(struct comm_reply* repinfo, struct iovec* iov,
|
||||||
size_t iovlen)
|
size_t iovlen)
|
||||||
{
|
{
|
||||||
write_iov_buffer(repinfo->c->buffer, iov, iovlen);
|
/* skip tcp len at [0]. */
|
||||||
|
write_iov_buffer(repinfo->c->buffer, iov+1, iovlen-1);
|
||||||
comm_point_send_reply(repinfo);
|
comm_point_send_reply(repinfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,9 @@ static void hex_to_buf(ldns_buffer* pkt, const char* hex)
|
||||||
skip_whites(&p);
|
skip_whites(&p);
|
||||||
}
|
}
|
||||||
ldns_buffer_flip(pkt);
|
ldns_buffer_flip(pkt);
|
||||||
if(0) printf("packet size %u\n", (unsigned)ldns_buffer_limit(pkt));
|
if(0) {
|
||||||
|
printf("packet size %u\n", (unsigned)ldns_buffer_limit(pkt));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** match two rr lists */
|
/** match two rr lists */
|
||||||
|
|
@ -102,6 +104,13 @@ match_list(ldns_rr_list* q, ldns_rr_list *p)
|
||||||
verbose(3, "rr %d different", i);
|
verbose(3, "rr %d different", i);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
/* and check the ttl */
|
||||||
|
if(ldns_rr_ttl(ldns_rr_list_rr(q, i)) !=
|
||||||
|
ldns_rr_ttl(ldns_rr_list_rr(p, i))) {
|
||||||
|
verbose(3, "rr %d ttl different", i);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -168,11 +177,28 @@ test_buffers(ldns_buffer* pkt, ldns_buffer* out)
|
||||||
/* check binary same */
|
/* check binary same */
|
||||||
if(ldns_buffer_limit(pkt) == ldns_buffer_limit(out) &&
|
if(ldns_buffer_limit(pkt) == ldns_buffer_limit(out) &&
|
||||||
memcmp(ldns_buffer_begin(pkt), ldns_buffer_begin(out),
|
memcmp(ldns_buffer_begin(pkt), ldns_buffer_begin(out),
|
||||||
ldns_buffer_limit(pkt)) == 0)
|
ldns_buffer_limit(pkt)) == 0) {
|
||||||
|
if(1) printf("binary the same (length=%d)\n",
|
||||||
|
ldns_buffer_limit(pkt));
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
/* check if it 'means the same' */
|
/* check if it 'means the same' */
|
||||||
s1 = ldns_buffer2pkt_wire(&p1, pkt);
|
s1 = ldns_buffer2pkt_wire(&p1, pkt);
|
||||||
s2 = ldns_buffer2pkt_wire(&p2, pkt);
|
s2 = ldns_buffer2pkt_wire(&p2, out);
|
||||||
|
if(1) {
|
||||||
|
log_hex("orig in hex", ldns_buffer_begin(pkt),
|
||||||
|
ldns_buffer_limit(pkt));
|
||||||
|
log_hex("unbound out in hex", ldns_buffer_begin(out),
|
||||||
|
ldns_buffer_limit(out));
|
||||||
|
printf("\npacket from unbound (%d):\n",
|
||||||
|
(int)ldns_buffer_limit(out));
|
||||||
|
ldns_pkt_print(stdout, p2);
|
||||||
|
|
||||||
|
printf("\npacket original (%d):\n",
|
||||||
|
(int)ldns_buffer_limit(pkt));
|
||||||
|
ldns_pkt_print(stdout, p1);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
if(s1 != s2) {
|
if(s1 != s2) {
|
||||||
/* oops! */
|
/* oops! */
|
||||||
printf("input ldns parse: %s, output ldns parse: %s.\n",
|
printf("input ldns parse: %s, output ldns parse: %s.\n",
|
||||||
|
|
@ -193,7 +219,7 @@ checkformerr(ldns_buffer* pkt)
|
||||||
{
|
{
|
||||||
ldns_pkt* p;
|
ldns_pkt* p;
|
||||||
ldns_status status = ldns_buffer2pkt_wire(&p, pkt);
|
ldns_status status = ldns_buffer2pkt_wire(&p, pkt);
|
||||||
if(0) printf("formerr, ldns parse is: %s\n",
|
if(1) printf("formerr, ldns parse is: %s\n",
|
||||||
ldns_get_errorstr_by_id(status));
|
ldns_get_errorstr_by_id(status));
|
||||||
if(status == LDNS_STATUS_OK) {
|
if(status == LDNS_STATUS_OK) {
|
||||||
printf("Formerr, but ldns gives packet:\n");
|
printf("Formerr, but ldns gives packet:\n");
|
||||||
|
|
@ -222,9 +248,10 @@ testpkt(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out,
|
||||||
hex_to_buf(pkt, hex);
|
hex_to_buf(pkt, hex);
|
||||||
memmove(&id, ldns_buffer_begin(pkt), sizeof(id));
|
memmove(&id, ldns_buffer_begin(pkt), sizeof(id));
|
||||||
memmove(&flags, ldns_buffer_at(pkt, 2), sizeof(flags));
|
memmove(&flags, ldns_buffer_at(pkt, 2), sizeof(flags));
|
||||||
|
flags = ntohs(flags);
|
||||||
ret = reply_info_parse(pkt, alloc, &qi, &rep);
|
ret = reply_info_parse(pkt, alloc, &qi, &rep);
|
||||||
if(ret != 0) {
|
if(ret != 0) {
|
||||||
if(0) printf("parse code %d: %s\n", ret,
|
if(1) printf("parse code %d: %s\n", ret,
|
||||||
ldns_lookup_by_id(ldns_rcodes, ret)->name);
|
ldns_lookup_by_id(ldns_rcodes, ret)->name);
|
||||||
if(ret == LDNS_RCODE_FORMERR)
|
if(ret == LDNS_RCODE_FORMERR)
|
||||||
checkformerr(pkt);
|
checkformerr(pkt);
|
||||||
|
|
@ -234,6 +261,7 @@ testpkt(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out,
|
||||||
timenow, region);
|
timenow, region);
|
||||||
unit_assert(sz != 0); /* udp packets should fit in 1024 iov */
|
unit_assert(sz != 0); /* udp packets should fit in 1024 iov */
|
||||||
write_iov_buffer(out, iov, sz);
|
write_iov_buffer(out, iov, sz);
|
||||||
|
printf("iov len outlen %d %d\n", sz, ldns_buffer_limit(out));
|
||||||
test_buffers(pkt, out);
|
test_buffers(pkt, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -249,6 +277,18 @@ simpletest(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out)
|
||||||
/* a root query drill -q - */
|
/* a root query drill -q - */
|
||||||
testpkt(pkt, alloc, out,
|
testpkt(pkt, alloc, out,
|
||||||
" c5 40 01 00 00 01 00 00 00 00 00 00 00 00 02 00 01 ");
|
" c5 40 01 00 00 01 00 00 00 00 00 00 00 00 02 00 01 ");
|
||||||
|
|
||||||
|
/* very small packet */
|
||||||
|
testpkt(pkt, alloc, out,
|
||||||
|
"; 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19\n"
|
||||||
|
";-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
|
||||||
|
"74 0c 85 83 00 01 00 00 00 01 00 00 03 62 6c 61 09 6e 6c 6e ; 1- 20\n"
|
||||||
|
"65 74 6c 61 62 73 02 6e 6c 00 00 0f 00 01 09 6e 6c 6e 65 74 ; 21- 40\n"
|
||||||
|
"6c 61 62 73 02 6e 6c 00 00 06 00 01 00 00 46 50 00 40 04 6f ; 41- 60\n"
|
||||||
|
"70 65 6e 09 6e 6c 6e 65 74 6c 61 62 73 02 6e 6c 00 0a 68 6f ; 61- 80\n"
|
||||||
|
"73 74 6d 61 73 74 65 72 09 6e 6c 6e 65 74 6c 61 62 73 02 6e ; 81- 100\n"
|
||||||
|
"6c 00 77 a1 02 58 00 00 70 80 00 00 1c 20 00 09 3a 80 00 00 ; 101- 120\n"
|
||||||
|
"46 50\n");
|
||||||
|
|
||||||
/* a root reply drill -w - */
|
/* a root reply drill -w - */
|
||||||
testpkt(pkt, alloc, out,
|
testpkt(pkt, alloc, out,
|
||||||
|
|
@ -281,7 +321,7 @@ simpletest(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out)
|
||||||
" 64 b9 00 04 c0 3a 80 1e ");
|
" 64 b9 00 04 c0 3a 80 1e ");
|
||||||
}
|
}
|
||||||
|
|
||||||
/** simple test of parsing. */
|
/** simple test of parsing, pcat file. */
|
||||||
static void
|
static void
|
||||||
testfromfile(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out,
|
testfromfile(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out,
|
||||||
const char* fname)
|
const char* fname)
|
||||||
|
|
@ -308,6 +348,31 @@ testfromfile(ldns_buffer* pkt, struct alloc_cache* alloc, ldns_buffer* out,
|
||||||
fclose(in);
|
fclose(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** simple test of parsing, drill file. */
|
||||||
|
static void
|
||||||
|
testfromdrillfile(ldns_buffer* pkt, struct alloc_cache* alloc,
|
||||||
|
ldns_buffer* out, const char* fname)
|
||||||
|
{
|
||||||
|
FILE* in = fopen(fname, "r");
|
||||||
|
char buf[102400];
|
||||||
|
char *np = buf;
|
||||||
|
if(!in) {
|
||||||
|
perror("fname");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
while(fgets(np, (int)sizeof(buf) - (np-buf), in)) {
|
||||||
|
if(np[0] == ';') /* comment */
|
||||||
|
continue;
|
||||||
|
np = &np[strlen(np)];
|
||||||
|
}
|
||||||
|
if(0) {
|
||||||
|
printf("test %s", buf);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
testpkt(pkt, alloc, out, buf);
|
||||||
|
fclose(in);
|
||||||
|
}
|
||||||
|
|
||||||
void msgparse_test()
|
void msgparse_test()
|
||||||
{
|
{
|
||||||
ldns_buffer* pkt = ldns_buffer_new(65553);
|
ldns_buffer* pkt = ldns_buffer_new(65553);
|
||||||
|
|
@ -319,9 +384,10 @@ void msgparse_test()
|
||||||
|
|
||||||
printf("testmsgparse\n");
|
printf("testmsgparse\n");
|
||||||
simpletest(pkt, &alloc, out);
|
simpletest(pkt, &alloc, out);
|
||||||
testfromfile(pkt, &alloc, out, "testdata/test_packets.1");
|
if(0) testfromdrillfile(pkt, &alloc, out, "blabla");
|
||||||
testfromfile(pkt, &alloc, out, "testdata/test_packets.2");
|
if(0) testfromfile(pkt, &alloc, out, "testdata/test_packets.1");
|
||||||
testfromfile(pkt, &alloc, out, "testdata/test_packets.3");
|
if(0) testfromfile(pkt, &alloc, out, "testdata/test_packets.2");
|
||||||
|
if(0) testfromfile(pkt, &alloc, out, "testdata/test_packets.3");
|
||||||
|
|
||||||
/* cleanup */
|
/* cleanup */
|
||||||
alloc_clear(&alloc);
|
alloc_clear(&alloc);
|
||||||
|
|
|
||||||
|
|
@ -134,7 +134,8 @@ rdata_copy(ldns_buffer* pkt, struct rrset_parse* pset,
|
||||||
if(ttl < data->ttl)
|
if(ttl < data->ttl)
|
||||||
data->ttl = ttl;
|
data->ttl = ttl;
|
||||||
/* insert decompressed size into rdata len stored in memory */
|
/* insert decompressed size into rdata len stored in memory */
|
||||||
pkt_len = htons(rr->size);
|
/* -2 because rdatalen bytes are not included. */
|
||||||
|
pkt_len = htons(rr->size - 2);
|
||||||
memmove(to, &pkt_len, sizeof(uint16_t));
|
memmove(to, &pkt_len, sizeof(uint16_t));
|
||||||
to += 2;
|
to += 2;
|
||||||
/* read packet rdata len */
|
/* read packet rdata len */
|
||||||
|
|
@ -480,7 +481,7 @@ packed_rrset_iov(struct ub_packed_rrset_key* key, struct iovec* iov,
|
||||||
key->entry.data;
|
key->entry.data;
|
||||||
*num_rrs += data->count;
|
*num_rrs += data->count;
|
||||||
if(!ttl) return 0;
|
if(!ttl) return 0;
|
||||||
*ttl = data->ttl - timenow;
|
*ttl = htonl(data->ttl - timenow);
|
||||||
for(i=0; i<data->count; i++) {
|
for(i=0; i<data->count; i++) {
|
||||||
if(max - *used < 3) return 0;
|
if(max - *used < 3) return 0;
|
||||||
/* no compression of dnames yet */
|
/* no compression of dnames yet */
|
||||||
|
|
@ -518,18 +519,15 @@ size_t reply_info_iov_regen(struct query_info* qinfo, struct reply_info* rep,
|
||||||
uint32_t timenow, region_type* region)
|
uint32_t timenow, region_type* region)
|
||||||
{
|
{
|
||||||
size_t used;
|
size_t used;
|
||||||
uint16_t* hdr = (uint16_t*)region_alloc(region, sizeof(uint16_t)*4);
|
uint16_t* hdr = (uint16_t*)region_alloc(region, sizeof(uint16_t)*6);
|
||||||
if(!hdr) return 0;
|
if(!hdr) return 0;
|
||||||
if(max<3) return 0;
|
if(max<1) return 0;
|
||||||
flags = htons(flags);
|
hdr[0] = id;
|
||||||
iov[0].iov_base = (void*)&id;
|
hdr[1] = htons(flags);
|
||||||
iov[0].iov_len = sizeof(uint16_t);
|
iov[0].iov_base = (void*)&hdr[0];
|
||||||
iov[1].iov_base = (void*)&flags;
|
iov[0].iov_len = sizeof(uint16_t)*6;
|
||||||
iov[1].iov_len = sizeof(uint16_t);
|
hdr[2] = htons(rep->qdcount);
|
||||||
iov[2].iov_base = (void*)&hdr[0];
|
used=1;
|
||||||
iov[2].iov_len = sizeof(uint16_t)*4;
|
|
||||||
hdr[0] = htons(rep->qdcount);
|
|
||||||
used=3;
|
|
||||||
|
|
||||||
/* insert query section */
|
/* insert query section */
|
||||||
if(rep->qdcount) {
|
if(rep->qdcount) {
|
||||||
|
|
@ -549,17 +547,17 @@ size_t reply_info_iov_regen(struct query_info* qinfo, struct reply_info* rep,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* insert answer section */
|
/* insert answer section */
|
||||||
if(!insert_section(rep, rep->an_numrrsets, &hdr[1], iov, max,
|
if(!insert_section(rep, rep->an_numrrsets, &hdr[3], iov, max,
|
||||||
0, timenow, region, &used))
|
0, timenow, region, &used))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* insert auth section */
|
/* insert auth section */
|
||||||
if(!insert_section(rep, rep->ns_numrrsets, &hdr[2], iov, max,
|
if(!insert_section(rep, rep->ns_numrrsets, &hdr[4], iov, max,
|
||||||
rep->an_numrrsets, timenow, region, &used))
|
rep->an_numrrsets, timenow, region, &used))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* insert add section */
|
/* insert add section */
|
||||||
if(!insert_section(rep, rep->ar_numrrsets, &hdr[3], iov, max,
|
if(!insert_section(rep, rep->ar_numrrsets, &hdr[5], iov, max,
|
||||||
rep->an_numrrsets + rep->ns_numrrsets, timenow, region, &used))
|
rep->an_numrrsets + rep->ns_numrrsets, timenow, region, &used))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -99,10 +99,12 @@ void
|
||||||
write_iov_buffer(ldns_buffer* buffer, struct iovec* iov, size_t iovlen)
|
write_iov_buffer(ldns_buffer* buffer, struct iovec* iov, size_t iovlen)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
|
size_t s = 0;
|
||||||
ldns_buffer_clear(buffer);
|
ldns_buffer_clear(buffer);
|
||||||
for(i=1; i<iovlen; i++) {
|
for(i=0; i<iovlen; i++) {
|
||||||
log_assert(ldns_buffer_position(buffer)+iov[i].iov_len
|
log_assert(ldns_buffer_position(buffer)+iov[i].iov_len
|
||||||
<= ldns_buffer_capacity(buffer));
|
<= ldns_buffer_capacity(buffer));
|
||||||
|
s += iov[i].iov_len;
|
||||||
ldns_buffer_write(buffer, iov[i].iov_base, iov[i].iov_len);
|
ldns_buffer_write(buffer, iov[i].iov_base, iov[i].iov_len);
|
||||||
}
|
}
|
||||||
ldns_buffer_flip(buffer);
|
ldns_buffer_flip(buffer);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue