]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
Tests can handle multiple hosts. Tests for chaos and iterator.
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 25 Jul 2007 12:31:04 +0000 (12:31 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 25 Jul 2007 12:31:04 +0000 (12:31 +0000)
git-svn-id: file:///svn/unbound/trunk@450 be551aaa-1e26-0410-a405-d3ace91eadb9

doc/Changelog
testcode/fake_event.c
testcode/ldns-testpkts.c
testcode/replay.c
testcode/replay.h
testdata/iter_recurse.rpl [new file with mode: 0644]
testdata/iter_resolve.rpl [new file with mode: 0644]
testdata/version_bind.rpl [new file with mode: 0644]
testdata/version_bind_hide.rpl [new file with mode: 0644]

index 943b5bbd8e95c1e252573e59d3ca3c921b11bec8..88c2bb5d4d333d844b42d1d46b44208b49fbf647 100644 (file)
@@ -1,3 +1,8 @@
+25 July 2007: Wouter
+       - testbound read ADDRESS and check it.
+       - test for version.bind and friends.
+       - test for iterator chaining through several referrals.
+
 24 July 2007: Wouter
        - Example section in config manual.
        - Addr stored for range and moment in replay.
index 83c477edf93d4f625269ab6e7317b2bcc7cdd8db..341328d2d91e5adeac73fc86f5ba2fe1013d6935 100644 (file)
@@ -143,6 +143,10 @@ pending_matches_current(struct replay_runtime* runtime,
                return 0;
        /* see if any of the pending queries matches */
        for(p = runtime->pending_list; p; p = p->next) {
+               if(runtime->now->addrlen != 0 &&
+                       sockaddr_cmp(&p->addr, p->addrlen, &runtime->now->addr,
+                       runtime->now->addrlen) != 0)
+                       continue;
                if((e=find_match(runtime->now->match, p->pkt, p->transport))) {
                        *entry = e;
                        *pend = p;
@@ -167,10 +171,14 @@ pending_find_match(struct replay_runtime* runtime, struct entry** entry,
        struct replay_range* p = runtime->scenario->range_list;
        while(p) {
                if(p->start_step <= timenow && timenow <= p->end_step &&
+                 (p->addrlen == 0 || sockaddr_cmp(&p->addr, p->addrlen,
+                       &pend->addr, pend->addrlen) == 0) &&
                  (*entry = find_match(p->match, pend->pkt, pend->transport))) {
                        log_info("matched query time %d in range [%d, %d] "
                                "with entry line %d", timenow, 
                                p->start_step, p->end_step, (*entry)->lineno);
+                       if(p->addrlen != 0)
+                               log_addr("matched ip", &p->addr, p->addrlen);
                        return 1;
                }
                p = p->next_range;
@@ -192,6 +200,7 @@ pending_matches_range(struct replay_runtime* runtime,
        struct fake_pending* p = runtime->pending_list;
        /* slow, O(N*N), but it works as advertised with weird matching */
        while(p) {
+               log_info("check of pending");
                if(pending_find_match(runtime, entry, p)) {
                        *pend = p;
                        return 1;
@@ -266,6 +275,9 @@ answer_callback_from_entry(struct replay_runtime* runtime,
 {
        struct comm_point c;
        struct comm_reply repinfo;
+       void* cb_arg = pend->cb_arg;
+       comm_point_callback_t* cb = pend->callback;
+
        memset(&c, 0, sizeof(c));
        c.fd = -1;
        c.buffer = ldns_buffer_new(runtime->bufsize);
@@ -276,11 +288,12 @@ answer_callback_from_entry(struct replay_runtime* runtime,
        repinfo.c = &c;
        repinfo.addrlen = pend->addrlen;
        memcpy(&repinfo.addr, &pend->addr, pend->addrlen);
-       if((*pend->callback)(&c, pend->cb_arg, NETEVENT_NOERROR, &repinfo)) {
+       if(!pend->serviced)
+               pending_list_delete(runtime, pend);
+       if((*cb)(&c, cb_arg, NETEVENT_NOERROR, &repinfo)) {
                fatal_exit("testbound: unexpected: callback returned 1");
        }
        ldns_buffer_free(c.buffer);
-       pending_list_delete(runtime, pend);
 }
 
 /** Check the now moment answer check event */
@@ -295,7 +308,10 @@ answer_check_it(struct replay_runtime* runtime)
                enum transport_type tr = transport_tcp;
                if(ans->repinfo.c->type == comm_udp)
                        tr = transport_udp;
-               if(find_match(runtime->now->match, ans->pkt, tr)) {
+               if((runtime->now->addrlen == 0 || sockaddr_cmp(
+                       &runtime->now->addr, runtime->now->addrlen,
+                       &ans->repinfo.addr, ans->repinfo.addrlen) == 0) &&
+                       find_match(runtime->now->match, ans->pkt, tr)) {
                        struct replay_answer *n = ans->next;
                        log_info("testbound matched event entry from line %d",
                                runtime->now->match->lineno);
@@ -330,6 +346,10 @@ fake_front_query(struct replay_runtime* runtime, struct replay_moment *todo)
        memset(&repinfo, 0, sizeof(repinfo));
        repinfo.c = (struct comm_point*)calloc(1, sizeof(struct comm_point));
        repinfo.addrlen = (socklen_t)sizeof(struct sockaddr_in);
+       if(todo->addrlen != 0) {
+               repinfo.addrlen = todo->addrlen;
+               memcpy(&repinfo.addr, &todo->addr, todo->addrlen);
+       }
        repinfo.c->fd = -1;
        repinfo.c->ev = (struct internal_event*)runtime;
        repinfo.c->buffer = ldns_buffer_new(runtime->bufsize);
@@ -484,6 +504,10 @@ run_scenario(struct replay_runtime* runtime)
        } while(runtime->now);
 
        if(runtime->pending_list) {
+               struct fake_pending* p;
+               log_err("testbound: there are still messages pending.");
+               for(p = runtime->pending_list; p; p=p->next)
+                       log_pkt("pending msg", p->pkt);
                fatal_exit("testbound: there are still messages pending.");
        }
        if(runtime->answer_list) {
@@ -698,6 +722,7 @@ pending_udp_query(struct outside_network* outnet, ldns_buffer* packet,
        pend->timeout = timeout/1000;
        pend->transport = transport_udp;
        pend->pkt = NULL;
+       pend->serviced = 0;
        pend->runtime = runtime;
        status = ldns_buffer2pkt_wire(&pend->pkt, packet);
        if(status != LDNS_STATUS_OK) {
@@ -709,6 +734,9 @@ pending_udp_query(struct outside_network* outnet, ldns_buffer* packet,
 
        /* see if it matches the current moment */
        if(runtime->now && runtime->now->evt_type == repevt_back_query &&
+               (runtime->now->addrlen == 0 || sockaddr_cmp(
+                       &runtime->now->addr, runtime->now->addrlen,
+                       &pend->addr, pend->addrlen) == 0) &&
                find_match(runtime->now->match, pend->pkt, pend->transport)) {
                log_info("testbound: matched pending to event. "
                        "advance time between events.");
@@ -748,6 +776,7 @@ pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet,
        pend->transport = transport_tcp;
        pend->pkt = NULL;
        pend->runtime = runtime;
+       pend->serviced = 0;
        status = ldns_buffer2pkt_wire(&pend->pkt, packet);
        if(status != LDNS_STATUS_OK) {
                log_err("ldns error parsing tcp output packet: %s",
@@ -758,6 +787,9 @@ pending_tcp_query(struct outside_network* outnet, ldns_buffer* packet,
 
        /* see if it matches the current moment */
        if(runtime->now && runtime->now->evt_type == repevt_back_query &&
+               (runtime->now->addrlen == 0 || sockaddr_cmp(
+                       &runtime->now->addr, runtime->now->addrlen,
+                       &pend->addr, pend->addrlen) == 0) &&
                find_match(runtime->now->match, pend->pkt, pend->transport)) {
                log_info("testbound: matched pending to event. "
                        "advance time between events.");
@@ -820,6 +852,7 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
        pend->transport = transport_udp; /* pretend UDP */
        pend->pkt = NULL;
        pend->runtime = runtime;
+       pend->serviced = 1;
        status = ldns_buffer2pkt_wire(&pend->pkt, pend->buffer);
        if(status != LDNS_STATUS_OK) {
                log_err("ldns error parsing serviced output packet: %s",
@@ -830,6 +863,9 @@ struct serviced_query* outnet_serviced_query(struct outside_network* outnet,
 
        /* see if it matches the current moment */
        if(runtime->now && runtime->now->evt_type == repevt_back_query &&
+               (runtime->now->addrlen == 0 || sockaddr_cmp(
+                       &runtime->now->addr, runtime->now->addrlen,
+                       &pend->addr, pend->addrlen) == 0) &&
                find_match(runtime->now->match, pend->pkt, pend->transport)) {
                log_info("testbound: matched pending to event. "
                        "advance time between events.");
@@ -854,10 +890,10 @@ void outnet_serviced_query_stop(struct serviced_query* sq, void* cb_arg)
        while(p) {
                if(p == pend) {
                        log_assert(p->cb_arg == cb_arg);
+                       log_info("serviced pending delete");
                        if(prev)
                                prev->next = p->next;
                        else    runtime->pending_list = p->next;
-                       log_pkt("deleted pending serviced query.", p->pkt);
                        ldns_buffer_free(p->buffer);
                        ldns_pkt_free(p->pkt);
                        free(p);
@@ -866,7 +902,7 @@ void outnet_serviced_query_stop(struct serviced_query* sq, void* cb_arg)
                prev = p;
                p = p->next;
        }
-       log_pkt("double delet of pending serviced query", p->pkt);
+       log_info("double delete of pending serviced query");
 }
 
 struct listen_port* listening_ports_open(struct config_file* ATTR_UNUSED(cfg))
index 39a18376957019299bb2978e4993930de7e82e4f..ce52160493b97be10464dbd88ebb153ec7d6953a 100644 (file)
@@ -157,6 +157,8 @@ static void replyline(const char* line, ldns_pkt *reply)
                        ldns_pkt_set_rcode(reply, LDNS_RCODE_NXDOMAIN);
                } else if(str_keyword(&parse, "NOTIMPL")) {
                        ldns_pkt_set_rcode(reply, LDNS_RCODE_NOTIMPL);
+               } else if(str_keyword(&parse, "REFUSED")) {
+                       ldns_pkt_set_rcode(reply, LDNS_RCODE_REFUSED);
                } else if(str_keyword(&parse, "YXDOMAIN")) {
                        ldns_pkt_set_rcode(reply, LDNS_RCODE_YXDOMAIN);
                } else if(str_keyword(&parse, "YXRRSET")) {
index 4ba20dd39100fb0babcb65da6e89313c1b696e87..34eb9208d1474282b30b2e2dd14962e6b19accae 100644 (file)
@@ -41,6 +41,7 @@
 
 #include "config.h"
 #include "util/log.h"
+#include "util/net_help.h"
 #include "testcode/replay.h"
 #include "testcode/ldns-testpkts.h"
 
@@ -85,6 +86,18 @@ replay_range_delete(struct replay_range* rng)
        free(rng);
 }
 
+/** strip whitespace from end of string */
+static void
+strip_end_white(char* p)
+{
+       size_t i;
+       for(i = strlen(p); i > 0; i--) {
+               if(isspace(p[i-1]))
+                       p[i-1] = 0;
+               else return;
+       }
+}
+
 /** 
  * Read a range from file. 
  * @param remain: Rest of line (after RANGE keyword).
@@ -124,6 +137,19 @@ replay_range_read(char* remain, FILE* in, const char* name, int* lineno,
                        parse++;
                if(!*parse || *parse == ';')
                        continue;
+               if(parse_keyword(&parse, "ADDRESS")) {
+                       while(isspace(*parse))
+                               parse++;
+                       strip_end_white(parse);
+                       if(!extstrtoaddr(parse, &rng->addr, &rng->addrlen)) {
+                               log_err("Line %d: could not read ADDRESS: %s", 
+                                       *lineno, parse);
+                               free(rng);
+                               return NULL;
+                       }
+                       pos = ftello(in);
+                       continue;
+               }
                if(parse_keyword(&parse, "RANGE_END")) {
                        return rng;
                }
@@ -198,6 +224,16 @@ replay_moment_read(char* remain, FILE* in, const char* name, int* lineno,
                free(mom);
                return NULL;
        }
+       while(isspace(*remain))
+               remain++;
+       if(parse_keyword(&remain, "ADDRESS")) {
+               if(!extstrtoaddr(remain, &mom->addr, &mom->addrlen)) {
+                       log_err("line %d: could not parse ADDRESS: %s", 
+                               *lineno, remain);
+                       free(mom);
+                       return NULL;
+               }
+       }
 
        if(readentry) {
                mom->match = read_entry(in, name, lineno, ttl, or, prev);
index 62f31cfb169e4ecc784d6a7bca2289df6542f09a..ca68c885f34763b3744a1cc4de6781f18e9eb6be 100644 (file)
  * ; comment line.
  * SCENARIO_BEGIN name_of_scenario
  * RANGE_BEGIN start_time end_time
+ *    ; give ip of the virtual server, it matches any ip if not present.
+ *    ADDRESS ip_address 
  *    match_entries
  * RANGE_END
  * ; more RANGE items.
  * ; go to the next moment
- * STEP time_step event_type
+ * STEP time_step event_type [ADDRESS ip_address]
  * ; event_type can be:
  *     o NOTHING - nothing
  *     o QUERY - followed by entry
@@ -254,6 +256,8 @@ struct fake_pending {
        ldns_pkt* pkt;
        /** by what transport was the query sent out */
        enum transport_type transport;
+       /** if this is a serviced query */
+       int serviced;
        /** the runtime structure this is part of */
        struct replay_runtime* runtime;
 };
diff --git a/testdata/iter_recurse.rpl b/testdata/iter_recurse.rpl
new file mode 100644 (file)
index 0000000..a822b41
--- /dev/null
@@ -0,0 +1,178 @@
+; config options
+stub-zone:
+       name: "."
+       stub-addr: 193.0.14.129         # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN Test resolution with recursion for NS target.
+
+; K.ROOT-SERVERS.NET.
+RANGE_BEGIN 0 100
+       ADDRESS 193.0.14.129 
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS        K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+K.ROOT-SERVERS.NET.    IN      A       193.0.14.129
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION AUTHORITY
+com.   IN NS   a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net.    IN      A       192.5.6.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ns.example.net. IN A
+SECTION AUTHORITY
+net.   IN NS   e.gtld-servers.net.
+SECTION ADDITIONAL
+e.gtld-servers.net.    IN      A       192.12.94.30
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ns.example.net. IN AAAA
+SECTION AUTHORITY
+net.   IN NS   e.gtld-servers.net.
+SECTION ADDITIONAL
+e.gtld-servers.net.    IN      A       192.12.94.30
+ENTRY_END
+RANGE_END
+
+; a.gtld-servers.net.
+RANGE_BEGIN 0 100
+       ADDRESS 192.5.6.30
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION AUTHORITY
+example.com.   IN NS   ns.example.net.
+ENTRY_END
+RANGE_END
+
+; e.gtld-servers.net.
+RANGE_BEGIN 0 100
+       ADDRESS 192.12.94.30
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ns.example.net. IN A
+SECTION AUTHORITY
+example.net.   IN NS   ns.example.net.
+SECTION ADDITIONAL
+ns.example.net.                IN      A       1.2.3.44
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ns.example.net. IN AAAA
+SECTION AUTHORITY
+example.net.   IN NS   ns.example.net.
+SECTION ADDITIONAL
+ns.example.net.                IN      A       1.2.3.44
+ENTRY_END
+RANGE_END
+
+; ns.example.net.
+RANGE_BEGIN 0 100
+       ADDRESS 1.2.3.44
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ns.example.net. IN A
+SECTION ANSWER
+ns.example.net. IN A   1.2.3.44
+SECTION AUTHORITY
+example.net.   IN NS   ns.example.net.
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+ns.example.net. IN AAAA
+SECTION AUTHORITY
+example.net.   IN NS   ns.example.net.
+SECTION ADDITIONAL
+www.example.net. IN A  1.2.3.44
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A  10.20.30.40
+SECTION AUTHORITY
+example.com.   IN NS   ns.example.net.
+SECTION ADDITIONAL
+ns.example.net         IN A    1.2.3.44
+ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 20 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A  10.20.30.40
+SECTION AUTHORITY
+example.com.   IN NS   ns.example.net.
+; scrubbed off
+;SECTION ADDITIONAL
+;ns.example.net        IN A    1.2.3.44
+ENTRY_END
+
+; due to ordering of answer packets, this is still outstanding, remove it
+STEP 21 CHECK_OUT_QUERY
+ENTRY_BEGIN
+ADJUST copy_id
+MATCH qname qtype
+REPLY QR
+SECTION QUESTION
+ns.example.net IN AAAA
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/iter_resolve.rpl b/testdata/iter_resolve.rpl
new file mode 100644 (file)
index 0000000..7dfe848
--- /dev/null
@@ -0,0 +1,93 @@
+; config options
+stub-zone:
+       name: "."
+       stub-addr: 193.0.14.129         # K.ROOT-SERVERS.NET.
+CONFIG_END
+
+SCENARIO_BEGIN Test basic iterative resolve of www.example.com.
+
+; K.ROOT-SERVERS.NET.
+RANGE_BEGIN 0 100
+       ADDRESS 193.0.14.129 
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+. IN NS
+SECTION ANSWER
+. IN NS        K.ROOT-SERVERS.NET.
+SECTION ADDITIONAL
+K.ROOT-SERVERS.NET.    IN      A       193.0.14.129
+ENTRY_END
+
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION AUTHORITY
+com.   IN NS   a.gtld-servers.net.
+SECTION ADDITIONAL
+a.gtld-servers.net.    IN      A       192.5.6.30
+ENTRY_END
+RANGE_END
+
+; a.gtld-servers.net.
+RANGE_BEGIN 0 100
+       ADDRESS 192.5.6.30
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION AUTHORITY
+example.com.   IN NS   ns.example.com.
+SECTION ADDITIONAL
+ns.example.com.                IN      A       1.2.3.4
+ENTRY_END
+RANGE_END
+
+; ns.example.com.
+RANGE_BEGIN 0 100
+       ADDRESS 1.2.3.4
+ENTRY_BEGIN
+MATCH opcode qtype qname
+ADJUST copy_id
+REPLY QR NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A  10.20.30.40
+SECTION AUTHORITY
+example.com.   IN NS   ns.example.com.
+SECTION ADDITIONAL
+ns.example.com.                IN      A       1.2.3.4
+ENTRY_END
+RANGE_END
+
+STEP 1 QUERY
+ENTRY_BEGIN
+REPLY RD
+SECTION QUESTION
+www.example.com. IN A
+ENTRY_END
+
+; recursion happens here.
+STEP 10 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RD RA NOERROR
+SECTION QUESTION
+www.example.com. IN A
+SECTION ANSWER
+www.example.com. IN A  10.20.30.40
+SECTION AUTHORITY
+example.com.   IN NS   ns.example.com.
+SECTION ADDITIONAL
+ns.example.com.                IN      A       1.2.3.4
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/version_bind.rpl b/testdata/version_bind.rpl
new file mode 100644 (file)
index 0000000..1c5b914
--- /dev/null
@@ -0,0 +1,74 @@
+; config options
+server:
+       hide-identity: no
+       hide-version: no
+       identity: "test-identity"
+       version: "test-version"
+CONFIG_END
+SCENARIO_BEGIN Test version.bind identity and version queries
+
+; version.bind.
+STEP 1 QUERY
+ENTRY_BEGIN
+SECTION QUESTION
+version.bind. CH TXT
+ENTRY_END
+STEP 2 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA
+SECTION QUESTION
+version.bind. CH TXT
+SECTION ANSWER
+version.bind. 0 CH TXT "test-version"
+ENTRY_END
+
+; version.server.
+STEP 3 QUERY
+ENTRY_BEGIN
+SECTION QUESTION
+version.server. CH TXT
+ENTRY_END
+STEP 4 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA
+SECTION QUESTION
+version.server. CH TXT
+SECTION ANSWER
+version.server. 0 CH TXT       "test-version"
+ENTRY_END
+
+; hostname.bind.
+STEP 5 QUERY
+ENTRY_BEGIN
+SECTION QUESTION
+hostname.bind. CH TXT
+ENTRY_END
+STEP 6 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA
+SECTION QUESTION
+hostname.bind. CH TXT
+SECTION ANSWER
+hostname.bind. 0 CH TXT        "test-identity"
+ENTRY_END
+
+; id.server.
+STEP 7 QUERY
+ENTRY_BEGIN
+SECTION QUESTION
+id.server. CH TXT
+ENTRY_END
+STEP 8 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA
+SECTION QUESTION
+id.server. CH TXT
+SECTION ANSWER
+id.server. 0 CH TXT    "test-identity"
+ENTRY_END
+
+SCENARIO_END
diff --git a/testdata/version_bind_hide.rpl b/testdata/version_bind_hide.rpl
new file mode 100644 (file)
index 0000000..08ba86a
--- /dev/null
@@ -0,0 +1,67 @@
+; config options
+server:
+       hide-identity: yes
+       hide-version: yes
+       identity: "test-identity"
+       version: "test-version"
+; we rely on the fact that there are no builtin stubs for class CH.
+CONFIG_END
+SCENARIO_BEGIN Test config hide options for identity and version queries
+
+; version.bind.
+STEP 1 QUERY
+ENTRY_BEGIN
+SECTION QUESTION
+version.bind. CH TXT
+ENTRY_END
+STEP 2 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA REFUSED
+SECTION QUESTION
+version.bind. CH TXT
+ENTRY_END
+
+; version.server.
+STEP 3 QUERY
+ENTRY_BEGIN
+SECTION QUESTION
+version.server. CH TXT
+ENTRY_END
+STEP 4 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA REFUSED
+SECTION QUESTION
+version.server. CH TXT
+ENTRY_END
+
+; hostname.bind.
+STEP 5 QUERY
+ENTRY_BEGIN
+SECTION QUESTION
+hostname.bind. CH TXT
+ENTRY_END
+STEP 6 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA REFUSED
+SECTION QUESTION
+hostname.bind. CH TXT
+ENTRY_END
+
+; id.server.
+STEP 7 QUERY
+ENTRY_BEGIN
+SECTION QUESTION
+id.server. CH TXT
+ENTRY_END
+STEP 8 CHECK_ANSWER
+ENTRY_BEGIN
+MATCH all
+REPLY QR RA REFUSED
+SECTION QUESTION
+id.server. CH TXT
+ENTRY_END
+
+SCENARIO_END