|
@@ -30,83 +30,143 @@ namespace {
|
|
|
class ResolveHelperFunctionsTest : public ::testing::Test {
|
|
|
public:
|
|
|
ResolveHelperFunctionsTest() :
|
|
|
- message_(new Message(Message::RENDER)),
|
|
|
+ message_a_(new Message(Message::RENDER)),
|
|
|
+ message_b_(new Message(Message::RENDER)),
|
|
|
question_(new Question(Name("www.example.com"), RRClass::IN(), RRType::A()))
|
|
|
{
|
|
|
- message_->setOpcode(Opcode::QUERY());
|
|
|
- message_->setRcode(Rcode::NOERROR());
|
|
|
- message_->addQuestion(question_);
|
|
|
+ createMessageA();
|
|
|
+ createMessageB();
|
|
|
};
|
|
|
|
|
|
- MessagePtr message_;
|
|
|
- QuestionPtr question_;
|
|
|
+ void createMessageA() {
|
|
|
+ message_a_->setOpcode(Opcode::QUERY());
|
|
|
+ message_a_->setRcode(Rcode::NOERROR());
|
|
|
+ message_a_->addQuestion(question_);
|
|
|
+ }
|
|
|
+
|
|
|
+ void createMessageB() {
|
|
|
+ message_b_->setOpcode(Opcode::QUERY());
|
|
|
+ message_b_->setRcode(Rcode::NOERROR());
|
|
|
+ message_b_->addQuestion(question_);
|
|
|
+
|
|
|
+ // We could reuse the same rrset in the different sections,
|
|
|
+ // but to be sure, we create separate ones
|
|
|
+ RRsetPtr answer_rrset(new RRset(Name("www.example.com"),
|
|
|
+ RRClass::IN(), RRType::TXT(),
|
|
|
+ RRTTL(3600)));
|
|
|
+ answer_rrset->addRdata(rdata::createRdata(RRType::TXT(),
|
|
|
+ RRClass::IN(),
|
|
|
+ "Answer"));
|
|
|
+ message_b_->addRRset(Message::SECTION_ANSWER, answer_rrset);
|
|
|
|
|
|
+ RRsetPtr auth_rrset(new RRset(Name("www.example.com"),
|
|
|
+ RRClass::IN(), RRType::TXT(),
|
|
|
+ RRTTL(3600)));
|
|
|
+ auth_rrset->addRdata(rdata::createRdata(RRType::TXT(),
|
|
|
+ RRClass::IN(),
|
|
|
+ "Authority"));
|
|
|
+ auth_rrset->addRdata(rdata::createRdata(RRType::TXT(),
|
|
|
+ RRClass::IN(),
|
|
|
+ "Rdata"));
|
|
|
+ message_b_->addRRset(Message::SECTION_AUTHORITY, auth_rrset);
|
|
|
+
|
|
|
+ RRsetPtr add_rrset(new RRset(Name("www.example.com"),
|
|
|
+ RRClass::IN(), RRType::TXT(),
|
|
|
+ RRTTL(3600)));
|
|
|
+ add_rrset->addRdata(rdata::createRdata(RRType::TXT(),
|
|
|
+ RRClass::IN(),
|
|
|
+ "Additional"));
|
|
|
+ add_rrset->addRdata(rdata::createRdata(RRType::TXT(),
|
|
|
+ RRClass::IN(),
|
|
|
+ "Rdata"));
|
|
|
+ add_rrset->addRdata(rdata::createRdata(RRType::TXT(),
|
|
|
+ RRClass::IN(),
|
|
|
+ "fields."));
|
|
|
+ message_b_->addRRset(Message::SECTION_ADDITIONAL, add_rrset);
|
|
|
+ };
|
|
|
+
|
|
|
+ MessagePtr message_a_;
|
|
|
+ MessagePtr message_b_;
|
|
|
+ QuestionPtr question_;
|
|
|
};
|
|
|
|
|
|
TEST_F(ResolveHelperFunctionsTest, makeErrorMessageEmptyMessage) {
|
|
|
- ASSERT_EQ(Rcode::NOERROR(), message_->getRcode());
|
|
|
- ASSERT_EQ(1, message_->getRRCount(Message::SECTION_QUESTION));
|
|
|
- ASSERT_EQ(0, message_->getRRCount(Message::SECTION_ANSWER));
|
|
|
- ASSERT_EQ(0, message_->getRRCount(Message::SECTION_AUTHORITY));
|
|
|
- ASSERT_EQ(0, message_->getRRCount(Message::SECTION_ADDITIONAL));
|
|
|
-
|
|
|
- isc::resolve::makeErrorMessage(message_, Rcode::SERVFAIL());
|
|
|
- EXPECT_EQ(Rcode::SERVFAIL(), message_->getRcode());
|
|
|
- EXPECT_EQ(1, message_->getRRCount(Message::SECTION_QUESTION));
|
|
|
- EXPECT_EQ(0, message_->getRRCount(Message::SECTION_ANSWER));
|
|
|
- EXPECT_EQ(0, message_->getRRCount(Message::SECTION_AUTHORITY));
|
|
|
- EXPECT_EQ(0, message_->getRRCount(Message::SECTION_ADDITIONAL));
|
|
|
+ ASSERT_EQ(Rcode::NOERROR(), message_a_->getRcode());
|
|
|
+ ASSERT_EQ(1, message_a_->getRRCount(Message::SECTION_QUESTION));
|
|
|
+ ASSERT_EQ(0, message_a_->getRRCount(Message::SECTION_ANSWER));
|
|
|
+ ASSERT_EQ(0, message_a_->getRRCount(Message::SECTION_AUTHORITY));
|
|
|
+ ASSERT_EQ(0, message_a_->getRRCount(Message::SECTION_ADDITIONAL));
|
|
|
+
|
|
|
+ isc::resolve::makeErrorMessage(message_a_, Rcode::SERVFAIL());
|
|
|
+ EXPECT_EQ(Rcode::SERVFAIL(), message_a_->getRcode());
|
|
|
+ EXPECT_EQ(1, message_a_->getRRCount(Message::SECTION_QUESTION));
|
|
|
+ EXPECT_EQ(0, message_a_->getRRCount(Message::SECTION_ANSWER));
|
|
|
+ EXPECT_EQ(0, message_a_->getRRCount(Message::SECTION_AUTHORITY));
|
|
|
+ EXPECT_EQ(0, message_a_->getRRCount(Message::SECTION_ADDITIONAL));
|
|
|
}
|
|
|
|
|
|
TEST_F(ResolveHelperFunctionsTest, makeErrorMessageNonEmptyMessage) {
|
|
|
- // We could reuse the same rrset in the different sections,
|
|
|
- // but to be sure, we create separate ones
|
|
|
- RRsetPtr answer_rrset(new RRset(Name("www.example.com"),
|
|
|
- RRClass::IN(), RRType::TXT(),
|
|
|
- RRTTL(3600)));
|
|
|
- answer_rrset->addRdata(rdata::createRdata(RRType::TXT(),
|
|
|
- RRClass::IN(),
|
|
|
- "Answer"));
|
|
|
- message_->addRRset(Message::SECTION_ANSWER, answer_rrset);
|
|
|
-
|
|
|
- RRsetPtr auth_rrset(new RRset(Name("www.example.com"),
|
|
|
- RRClass::IN(), RRType::TXT(),
|
|
|
- RRTTL(3600)));
|
|
|
- auth_rrset->addRdata(rdata::createRdata(RRType::TXT(),
|
|
|
- RRClass::IN(),
|
|
|
- "Authority"));
|
|
|
- auth_rrset->addRdata(rdata::createRdata(RRType::TXT(),
|
|
|
- RRClass::IN(),
|
|
|
- "Rdata"));
|
|
|
- message_->addRRset(Message::SECTION_AUTHORITY, auth_rrset);
|
|
|
-
|
|
|
- RRsetPtr add_rrset(new RRset(Name("www.example.com"),
|
|
|
- RRClass::IN(), RRType::TXT(),
|
|
|
- RRTTL(3600)));
|
|
|
- add_rrset->addRdata(rdata::createRdata(RRType::TXT(),
|
|
|
- RRClass::IN(),
|
|
|
- "Additional"));
|
|
|
- add_rrset->addRdata(rdata::createRdata(RRType::TXT(),
|
|
|
- RRClass::IN(),
|
|
|
- "Rdata"));
|
|
|
- add_rrset->addRdata(rdata::createRdata(RRType::TXT(),
|
|
|
- RRClass::IN(),
|
|
|
- "fields."));
|
|
|
- message_->addRRset(Message::SECTION_ADDITIONAL, add_rrset);
|
|
|
-
|
|
|
- ASSERT_EQ(Rcode::NOERROR(), message_->getRcode());
|
|
|
- ASSERT_EQ(1, message_->getRRCount(Message::SECTION_QUESTION));
|
|
|
- ASSERT_EQ(1, message_->getRRCount(Message::SECTION_ANSWER));
|
|
|
- ASSERT_EQ(2, message_->getRRCount(Message::SECTION_AUTHORITY));
|
|
|
- ASSERT_EQ(3, message_->getRRCount(Message::SECTION_ADDITIONAL));
|
|
|
-
|
|
|
- isc::resolve::makeErrorMessage(message_, Rcode::FORMERR());
|
|
|
- EXPECT_EQ(Rcode::FORMERR(), message_->getRcode());
|
|
|
- EXPECT_EQ(1, message_->getRRCount(Message::SECTION_QUESTION));
|
|
|
- EXPECT_EQ(0, message_->getRRCount(Message::SECTION_ANSWER));
|
|
|
- EXPECT_EQ(0, message_->getRRCount(Message::SECTION_AUTHORITY));
|
|
|
- EXPECT_EQ(0, message_->getRRCount(Message::SECTION_ADDITIONAL));
|
|
|
+
|
|
|
+ ASSERT_EQ(Rcode::NOERROR(), message_b_->getRcode());
|
|
|
+ ASSERT_EQ(1, message_b_->getRRCount(Message::SECTION_QUESTION));
|
|
|
+ ASSERT_EQ(1, message_b_->getRRCount(Message::SECTION_ANSWER));
|
|
|
+ ASSERT_EQ(2, message_b_->getRRCount(Message::SECTION_AUTHORITY));
|
|
|
+ ASSERT_EQ(3, message_b_->getRRCount(Message::SECTION_ADDITIONAL));
|
|
|
+
|
|
|
+ isc::resolve::makeErrorMessage(message_b_, Rcode::FORMERR());
|
|
|
+ EXPECT_EQ(Rcode::FORMERR(), message_b_->getRcode());
|
|
|
+ EXPECT_EQ(1, message_b_->getRRCount(Message::SECTION_QUESTION));
|
|
|
+ EXPECT_EQ(0, message_b_->getRRCount(Message::SECTION_ANSWER));
|
|
|
+ EXPECT_EQ(0, message_b_->getRRCount(Message::SECTION_AUTHORITY));
|
|
|
+ EXPECT_EQ(0, message_b_->getRRCount(Message::SECTION_ADDITIONAL));
|
|
|
+}
|
|
|
+
|
|
|
+void
|
|
|
+compareSections(const MessagePtr message_a, const MessagePtr message_b,
|
|
|
+ Message::Section section)
|
|
|
+{
|
|
|
+ RRsetIterator rrs_a = message_a->beginSection(section);
|
|
|
+ RRsetIterator rrs_b = message_b->beginSection(section);
|
|
|
+ while (rrs_a != message_a->endSection(section) &&
|
|
|
+ rrs_b != message_b->endSection(section)
|
|
|
+ ) {
|
|
|
+ EXPECT_EQ(*rrs_a, *rrs_b);
|
|
|
+ ++rrs_a;
|
|
|
+ ++rrs_b;
|
|
|
+ }
|
|
|
+ // can't use EXPECT_EQ here, no eqHelper for endsection comparison
|
|
|
+ EXPECT_TRUE(rrs_a == message_a->endSection(section));
|
|
|
+ EXPECT_TRUE(rrs_b == message_b->endSection(section));
|
|
|
}
|
|
|
|
|
|
+TEST_F(ResolveHelperFunctionsTest, copyAnswerMessage) {
|
|
|
+ message_b_->setRcode(Rcode::NXDOMAIN());
|
|
|
+
|
|
|
+ ASSERT_NE(message_b_->getRcode(), message_a_->getRcode());
|
|
|
+ ASSERT_NE(message_b_->getRRCount(Message::SECTION_ANSWER),
|
|
|
+ message_a_->getRRCount(Message::SECTION_ANSWER));
|
|
|
+ ASSERT_NE(message_b_->getRRCount(Message::SECTION_AUTHORITY),
|
|
|
+ message_a_->getRRCount(Message::SECTION_AUTHORITY));
|
|
|
+ ASSERT_NE(message_b_->getRRCount(Message::SECTION_ADDITIONAL),
|
|
|
+ message_a_->getRRCount(Message::SECTION_ADDITIONAL));
|
|
|
+ ASSERT_EQ(0, message_a_->getRRCount(Message::SECTION_ANSWER));
|
|
|
+ ASSERT_EQ(0, message_a_->getRRCount(Message::SECTION_AUTHORITY));
|
|
|
+ ASSERT_EQ(0, message_a_->getRRCount(Message::SECTION_ADDITIONAL));
|
|
|
+
|
|
|
+ isc::resolve::copyAnswerMessage(*message_b_, message_a_);
|
|
|
+
|
|
|
+ EXPECT_EQ(message_b_->getRcode(), message_a_->getRcode());
|
|
|
+ ASSERT_EQ(message_b_->getRRCount(Message::SECTION_ANSWER),
|
|
|
+ message_a_->getRRCount(Message::SECTION_ANSWER));
|
|
|
+ ASSERT_EQ(message_b_->getRRCount(Message::SECTION_AUTHORITY),
|
|
|
+ message_a_->getRRCount(Message::SECTION_AUTHORITY));
|
|
|
+ ASSERT_EQ(message_b_->getRRCount(Message::SECTION_ADDITIONAL),
|
|
|
+ message_a_->getRRCount(Message::SECTION_ADDITIONAL));
|
|
|
+
|
|
|
+
|
|
|
+ compareSections(message_a_, message_b_, Message::SECTION_ANSWER);
|
|
|
+ compareSections(message_a_, message_b_, Message::SECTION_AUTHORITY);
|
|
|
+ compareSections(message_a_, message_b_, Message::SECTION_ADDITIONAL);
|
|
|
+}
|
|
|
|
|
|
} // Anonymous namespace
|