|
@@ -22,6 +22,8 @@
|
|
|
#include <dns/name.h>
|
|
|
#include <dns/message.h>
|
|
|
#include <dns/messagerenderer.h>
|
|
|
+#include <dns/opcode.h>
|
|
|
+#include <dns/rcode.h>
|
|
|
#include <dns/rrclass.h>
|
|
|
#include <dns/rrtype.h>
|
|
|
|
|
@@ -114,7 +116,7 @@ protected:
|
|
|
AuthSrvTest() : server(true, xfrout),
|
|
|
request_message(Message::RENDER),
|
|
|
parse_message(Message::PARSE), default_qid(0x1035),
|
|
|
- opcode(Opcode(Opcode::QUERY())), qname("www.example.com"),
|
|
|
+ opcode(Opcode::QUERY()), qname("www.example.com"),
|
|
|
qclass(RRClass::IN()), qtype(RRType::A()),
|
|
|
io_message(NULL), endpoint(NULL), request_obuffer(0),
|
|
|
request_renderer(request_obuffer),
|
|
@@ -280,6 +282,7 @@ AuthSrvTest::createRequestMessage(const Opcode& opcode,
|
|
|
{
|
|
|
request_message.clear(Message::RENDER);
|
|
|
request_message.setOpcode(opcode);
|
|
|
+ request_message.setRcode(Rcode::NOERROR());
|
|
|
request_message.setQid(default_qid);
|
|
|
request_message.addQuestion(Question(request_name, rrclass, rrtype));
|
|
|
}
|
|
@@ -341,7 +344,7 @@ TEST_F(AuthSrvTest, unsupportedRequest) {
|
|
|
i == Opcode::NOTIFY().getCode()) {
|
|
|
continue;
|
|
|
}
|
|
|
- createDataFromFile("simplequery_fromWire");
|
|
|
+ createDataFromFile("simplequery_fromWire.wire");
|
|
|
data[2] = ((i << 3) & 0xff);
|
|
|
|
|
|
parse_message.clear(Message::PARSE);
|
|
@@ -363,7 +366,7 @@ TEST_F(AuthSrvTest, verbose) {
|
|
|
|
|
|
// Multiple questions. Should result in FORMERR.
|
|
|
TEST_F(AuthSrvTest, multiQuestion) {
|
|
|
- createDataFromFile("multiquestion_fromWire");
|
|
|
+ createDataFromFile("multiquestion_fromWire.wire");
|
|
|
EXPECT_EQ(true, server.processMessage(*io_message, parse_message,
|
|
|
response_renderer));
|
|
|
headerCheck(parse_message, default_qid, Rcode::FORMERR(), opcode.getCode(),
|
|
@@ -393,7 +396,7 @@ TEST_F(AuthSrvTest, shortMessage) {
|
|
|
// or malformed or could otherwise cause a protocol error.
|
|
|
TEST_F(AuthSrvTest, response) {
|
|
|
// A valid (although unusual) response
|
|
|
- createDataFromFile("simpleresponse_fromWire");
|
|
|
+ createDataFromFile("simpleresponse_fromWire.wire");
|
|
|
EXPECT_EQ(false, server.processMessage(*io_message, parse_message,
|
|
|
response_renderer));
|
|
|
|
|
@@ -404,7 +407,7 @@ TEST_F(AuthSrvTest, response) {
|
|
|
response_renderer));
|
|
|
|
|
|
// A response to iquery. must be dropped rather than returning NOTIMP.
|
|
|
- createDataFromFile("iqueryresponse_fromWire");
|
|
|
+ createDataFromFile("iqueryresponse_fromWire.wire");
|
|
|
EXPECT_EQ(false, server.processMessage(*io_message, parse_message,
|
|
|
response_renderer));
|
|
|
}
|
|
@@ -422,7 +425,7 @@ TEST_F(AuthSrvTest, shortQuestion) {
|
|
|
|
|
|
// Query with a broken answer section
|
|
|
TEST_F(AuthSrvTest, shortAnswer) {
|
|
|
- createDataFromFile("shortanswer_fromWire");
|
|
|
+ createDataFromFile("shortanswer_fromWire.wire");
|
|
|
EXPECT_EQ(true, server.processMessage(*io_message, parse_message,
|
|
|
response_renderer));
|
|
|
|
|
@@ -441,17 +444,24 @@ TEST_F(AuthSrvTest, shortAnswer) {
|
|
|
|
|
|
// Query with unsupported version of EDNS.
|
|
|
TEST_F(AuthSrvTest, ednsBadVers) {
|
|
|
- createDataFromFile("queryBadEDNS_fromWire");
|
|
|
+ createDataFromFile("queryBadEDNS_fromWire.wire");
|
|
|
EXPECT_EQ(true, server.processMessage(*io_message, parse_message,
|
|
|
response_renderer));
|
|
|
|
|
|
- // The response must have an EDNS OPT RR in the additional section.
|
|
|
+ // The response must have an EDNS OPT RR in the additional section, but
|
|
|
+ // it will be added automatically at the render time.
|
|
|
// Note that the DNSSEC DO bit is cleared even if this bit in the query
|
|
|
// is set. This is a limitation of the current implementation.
|
|
|
headerCheck(parse_message, default_qid, Rcode::BADVERS(), opcode.getCode(),
|
|
|
QR_FLAG, 1, 0, 0, 1);
|
|
|
- EXPECT_EQ(4096, parse_message.getUDPSize());
|
|
|
- EXPECT_FALSE(parse_message.isDNSSECSupported());
|
|
|
+ EXPECT_FALSE(parse_message.getEDNS()); // EDNS isn't added at this point
|
|
|
+
|
|
|
+ parse_message.clear(Message::PARSE);
|
|
|
+ InputBuffer ib(response_renderer.getData(), response_renderer.getLength());
|
|
|
+ parse_message.fromWire(ib);
|
|
|
+ EXPECT_EQ(Rcode::BADVERS(), parse_message.getRcode());
|
|
|
+ EXPECT_TRUE(parse_message.getEDNS());
|
|
|
+ EXPECT_FALSE(parse_message.getEDNS()->getDNSSECAwareness());
|
|
|
}
|
|
|
|
|
|
TEST_F(AuthSrvTest, AXFROverUDP) {
|
|
@@ -577,6 +587,7 @@ TEST_F(AuthSrvTest, notifyForCHClass) {
|
|
|
TEST_F(AuthSrvTest, notifyEmptyQuestion) {
|
|
|
request_message.clear(Message::RENDER);
|
|
|
request_message.setOpcode(Opcode::NOTIFY());
|
|
|
+ request_message.setRcode(Rcode::NOERROR());
|
|
|
request_message.setHeaderFlag(MessageFlag::AA());
|
|
|
request_message.setQid(default_qid);
|
|
|
request_message.toWire(request_renderer);
|
|
@@ -715,7 +726,7 @@ TEST_F(AuthSrvTest, updateConfig) {
|
|
|
// query for existent data in the installed data source. The resulting
|
|
|
// response should have the AA flag on, and have an RR in each answer
|
|
|
// and authority section.
|
|
|
- createDataFromFile("examplequery_fromWire");
|
|
|
+ createDataFromFile("examplequery_fromWire.wire");
|
|
|
EXPECT_EQ(true, server.processMessage(*io_message, parse_message,
|
|
|
response_renderer));
|
|
|
headerCheck(parse_message, default_qid, Rcode::NOERROR(), opcode.getCode(),
|
|
@@ -729,7 +740,7 @@ TEST_F(AuthSrvTest, datasourceFail) {
|
|
|
// tool and the data source itself naively accept it). This will result
|
|
|
// in a SERVFAIL response, and the answer and authority sections should
|
|
|
// be empty.
|
|
|
- createDataFromFile("badExampleQuery_fromWire");
|
|
|
+ createDataFromFile("badExampleQuery_fromWire.wire");
|
|
|
EXPECT_EQ(true, server.processMessage(*io_message, parse_message,
|
|
|
response_renderer));
|
|
|
headerCheck(parse_message, default_qid, Rcode::SERVFAIL(),
|
|
@@ -744,10 +755,20 @@ TEST_F(AuthSrvTest, updateConfigFail) {
|
|
|
updateConfig(&server, BADCONFIG_TESTDB, false);
|
|
|
|
|
|
// The original data source should still exist.
|
|
|
- createDataFromFile("examplequery_fromWire");
|
|
|
+ createDataFromFile("examplequery_fromWire.wire");
|
|
|
EXPECT_EQ(true, server.processMessage(*io_message, parse_message,
|
|
|
response_renderer));
|
|
|
headerCheck(parse_message, default_qid, Rcode::NOERROR(), opcode.getCode(),
|
|
|
QR_FLAG | AA_FLAG, 1, 1, 1, 0);
|
|
|
}
|
|
|
+
|
|
|
+TEST_F(AuthSrvTest, cacheSlots) {
|
|
|
+ // simple check for the get/set operations
|
|
|
+ server.setCacheSlots(10); // 10 = arbitrary choice
|
|
|
+ EXPECT_EQ(10, server.getCacheSlots());
|
|
|
+
|
|
|
+ // 0 is a valid size
|
|
|
+ server.setCacheSlots(0);
|
|
|
+ EXPECT_EQ(00, server.getCacheSlots());
|
|
|
+}
|
|
|
}
|