Browse Source

[trac910] refactored test code a bit to unify TSIG check tests

JINMEI Tatuya 13 years ago
parent
commit
56b188c6e4
1 changed files with 59 additions and 23 deletions
  1. 59 23
      src/lib/dns/tests/message_unittest.cc

+ 59 - 23
src/lib/dns/tests/message_unittest.cc

@@ -620,15 +620,47 @@ testGetTime() {
     return (NOW);
 }
 
+// bit-wise constant flags to configure DNS header flags for test
+// messages.
+const unsigned int QR_FLAG = 0x1;
+const unsigned int AA_FLAG = 0x2;
+const unsigned int RD_FLAG = 0x4;
+const unsigned int TC_FLAG = 0x8;
+
 void
 commonTSIGToWireCheck(Message& message, MessageRenderer& renderer,
-                      TSIGContext& tsig_ctx, const char* const expected_file)
+                      TSIGContext& tsig_ctx, const char* const expected_file,
+                      unsigned int message_flags = RD_FLAG,
+                      RRType qtype = RRType::A(),
+                      const vector<const char*>* answer_data = NULL)
 {
     message.setOpcode(Opcode::QUERY());
     message.setRcode(Rcode::NOERROR());
-    message.setHeaderFlag(Message::HEADERFLAG_RD);
+    if ((message_flags & QR_FLAG) != 0) {
+        message.setHeaderFlag(Message::HEADERFLAG_QR);
+    }
+    if ((message_flags & AA_FLAG) != 0) {
+        message.setHeaderFlag(Message::HEADERFLAG_AA);
+    }
+    if ((message_flags & RD_FLAG) != 0) {
+        message.setHeaderFlag(Message::HEADERFLAG_RD);
+    }
+    if ((message_flags & TC_FLAG) != 0) {
+        message.setHeaderFlag(Message::HEADERFLAG_TC);
+    }
     message.addQuestion(Question(Name("www.example.com"), RRClass::IN(),
-                                 RRType::A()));
+                                 qtype));
+
+    if (answer_data != NULL) {
+        RRsetPtr ans_rrset(new RRset(Name("www.example.com"), RRClass::IN(),
+                                     qtype, RRTTL(86400)));
+        for (vector<const char*>::const_iterator it = answer_data->begin();
+             it != answer_data->end();
+             ++it) {
+            ans_rrset->addRdata(createRdata(qtype, RRClass::IN(), *it));
+        }
+        message.addRRset(Message::SECTION_ANSWER, ans_rrset);
+    }
 
     message.toWire(renderer, tsig_ctx);
     vector<unsigned char> expected_data;
@@ -672,7 +704,18 @@ TEST_F(MessageTest, toWireWithEDNSAndTSIG) {
     }
 }
 
+// Some of the following tests involve truncation.  We use the query name
+// "www.example.com" and some TXT question/answers.  The length of the
+// header and question will be 33 bytes.  If we also try to include a
+// TSIG of the same key name (not compressed) with HMAC-MD5, the TSIG RR
+// will be 85 bytes.
+
+// A long TXT RDATA.  With a fully compressed owner name, the corresponding
+// RR will be 268 bytes.
 const char* const long_txt1 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde";
+
+// With a fully compressed owner name, the corresponding RR will be 212 bytes.
+// It should result in truncation even without TSIG (33 + 268 + 212 = 513)
 const char* const long_txt2 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456";
 
 // Example output generated by
@@ -684,32 +727,25 @@ const char* const long_txt2 = "0123456789abcdef0123456789abcdef0123456789abcdef0
 TEST_F(MessageTest, toWireTSIGTruncation) {
     isc::util::detail::gettimeFunction = testGetTime<0x4e179212>;
 
+    // Verify a validly signed query so that we can use the TSIG context
+    // in a response mode.
     factoryFromFile(message_parse, "message_fromWire17.wire");
     EXPECT_EQ(TSIGError::NOERROR(),
               tsig_ctx.verify(message_parse.getTSIGRecord(),
                               &received_data[0], received_data.size()));
 
-    // Note: the following should be merged to commonTSIGToWireCheck:
-    message_render.setQid(0x22c2);
-    message_render.setOpcode(Opcode::QUERY());
-    message_render.setRcode(Rcode::NOERROR());
-    message_render.setHeaderFlag(Message::HEADERFLAG_QR);
-    message_render.setHeaderFlag(Message::HEADERFLAG_RD);
-    message_render.setHeaderFlag(Message::HEADERFLAG_AA);
-    message_render.addQuestion(Question(Name("www.example.com"),
-                                        RRClass::IN(), RRType::TXT()));
-    RRsetPtr rrset(new RRset(Name("www.example.com"), RRClass::IN(),
-                             RRType::TXT(), RRTTL(86400)));
-    rrset->addRdata(generic::TXT(long_txt1));
-    rrset->addRdata(generic::TXT(long_txt2));
-    message_render.addRRset(Message::SECTION_ANSWER, rrset);
-    message_render.toWire(renderer, tsig_ctx);
 
-    vector<unsigned char> expected_data;
-    UnitTestUtil::readWireData("message_toWire4.wire", expected_data);
-    EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
-                        renderer.getLength(),
-                        &expected_data[0], expected_data.size());
+    message_render.setQid(0x22c2);
+    vector<const char*> answer_data;
+    answer_data.push_back(long_txt1);
+    answer_data.push_back(long_txt2);
+    {
+        SCOPED_TRACE("Message sign with TSIG and EDNS");
+        commonTSIGToWireCheck(message_render, renderer, tsig_ctx,
+                              "message_toWire4.wire",
+                              QR_FLAG|AA_FLAG|RD_FLAG|TC_FLAG,
+                              RRType::TXT(), &answer_data);
+    }
 }
 
 TEST_F(MessageTest, toWireWithoutOpcode) {