Parcourir la source

More ZoneEntry tests

git-svn-id: svn://bind10.isc.org/svn/bind10/branches/trac408@3635 e5f2f494-b856-4b98-b285-d166d9295462
Michal Vaner il y a 14 ans
Parent
commit
64656dbfaa
2 fichiers modifiés avec 96 ajouts et 3 suppressions
  1. 5 2
      src/lib/nsas/tests/nsas_test.h
  2. 91 1
      src/lib/nsas/tests/zone_entry_unittest.cc

+ 5 - 2
src/lib/nsas/tests/nsas_test.h

@@ -294,11 +294,13 @@ protected:
             RRTTL(1200)),
             RRTTL(1200)),
         rrch_(Name(EXAMPLE_CO_UK), RRClass::CH(), RRType::A(), RRTTL(1200)),
         rrch_(Name(EXAMPLE_CO_UK), RRClass::CH(), RRType::A(), RRTTL(1200)),
         rrns_(Name(EXAMPLE_CO_UK), RRClass::IN(), RRType::NS(), RRTTL(1200)),
         rrns_(Name(EXAMPLE_CO_UK), RRClass::IN(), RRType::NS(), RRTTL(1200)),
-        rr_single_(Name(EXAMPLE_CO_UK), RRClass::IN(), RRType::NS(), RRTTL(0)),
+        rr_single_(Name(EXAMPLE_CO_UK), RRClass::IN(), RRType::NS(),
+            RRTTL(600)),
         rr_empty_(Name(EXAMPLE_CO_UK), RRClass::IN(), RRType::NS(),
         rr_empty_(Name(EXAMPLE_CO_UK), RRClass::IN(), RRType::NS(),
             RRTTL(600)),
             RRTTL(600)),
         rrv6_(Name(EXAMPLE_CO_UK), RRClass::IN(), RRType::AAAA(), RRTTL(900)),
         rrv6_(Name(EXAMPLE_CO_UK), RRClass::IN(), RRType::AAAA(), RRTTL(900)),
-        rrnet_(Name(EXAMPLE_NET), RRClass::IN(), RRType::A(), RRTTL(600))
+        rrnet_(Name(EXAMPLE_NET), RRClass::IN(), RRType::A(), RRTTL(600)),
+        ns_name_(ns_name_)
     {}
     {}
 
 
     /// \brief Add Rdata to RRsets
     /// \brief Add Rdata to RRsets
@@ -344,6 +346,7 @@ protected:
     BasicRRset rr_empty_;       ///< NS RRset without any nameservers
     BasicRRset rr_empty_;       ///< NS RRset without any nameservers
     BasicRRset rrv6_;           ///< Standard RRset, IN, AAAA, lowercase name
     BasicRRset rrv6_;           ///< Standard RRset, IN, AAAA, lowercase name
     BasicRRset rrnet_;          ///< example.net A RRset
     BasicRRset rrnet_;          ///< example.net A RRset
+    Name ns_name_;  ///< Nameserver name of ns.example.net
 };
 };
 
 
 } // Empty namespace
 } // Empty namespace

+ 91 - 1
src/lib/nsas/tests/zone_entry_unittest.cc

@@ -18,6 +18,7 @@
 #include <boost/shared_ptr.hpp>
 #include <boost/shared_ptr.hpp>
 
 
 #include <dns/rrclass.h>
 #include <dns/rrclass.h>
+#include <dns/rdataclass.h>
 
 
 #include "../asiolink.h"
 #include "../asiolink.h"
 #include "../zone_entry.h"
 #include "../zone_entry.h"
@@ -117,6 +118,8 @@ TEST_F(ZoneEntryTest, CallbackNoNS) {
 }
 }
 
 
 TEST_F(ZoneEntryTest, CallbackZeroTTL) {
 TEST_F(ZoneEntryTest, CallbackZeroTTL) {
+    // Make it zero TTL, so it expires right away
+    rr_single_.setTTL(RRTTL(0));
     shared_ptr<InheritedZoneEntry> zone(new InheritedZoneEntry(resolver_,
     shared_ptr<InheritedZoneEntry> zone(new InheritedZoneEntry(resolver_,
         rr_single_, vector<const AbstractRRset*>(), nameservers_hash_,
         rr_single_, vector<const AbstractRRset*>(), nameservers_hash_,
         nameservers_lru_));
         nameservers_lru_));
@@ -125,9 +128,96 @@ TEST_F(ZoneEntryTest, CallbackZeroTTL) {
     // It should not be answered yet, it should ask for the IP addresses
     // It should not be answered yet, it should ask for the IP addresses
     EXPECT_TRUE(callback_->successes_.empty());
     EXPECT_TRUE(callback_->successes_.empty());
     EXPECT_EQ(0, callback_->unreachable_count_);
     EXPECT_EQ(0, callback_->unreachable_count_);
-    resolver_->asksIPs(Name("ns.example.net."), 0, 1);
+    resolver_->asksIPs(ns_name_, 0, 1);
     // It should reject another one, as it has zero TTL
     // It should reject another one, as it has zero TTL
     EXPECT_FALSE(zone->addCallback(callback_, ANY_OK, zone));
     EXPECT_FALSE(zone->addCallback(callback_, ANY_OK, zone));
 }
 }
 
 
+TEST_F(ZoneEntryTest, CallbacksAnswered) {
+    shared_ptr<InheritedZoneEntry> zone(new InheritedZoneEntry(resolver_,
+        rr_single_, vector<const AbstractRRset*>(), nameservers_hash_,
+        nameservers_lru_));
+    // It should be in NOT_ASKED state
+    EXPECT_EQ(Fetchable::NOT_ASKED, zone->getState());
+    // It should accept the callback
+    EXPECT_TRUE(zone->addCallback(callback_, ANY_OK, zone));
+    // It should not be answered yet, it should ask for the IP addresses
+    EXPECT_TRUE(callback_->successes_.empty());
+    EXPECT_EQ(0, callback_->unreachable_count_);
+    resolver_->asksIPs(ns_name_, 0, 1);
+    // We should be IN_PROGRESS
+    EXPECT_EQ(Fetchable::IN_PROGRESS, zone->getState());
+    // Give two more callbacks, with different address families
+    EXPECT_TRUE(zone->addCallback(callback_, V4_ONLY, zone));
+    EXPECT_TRUE(zone->addCallback(callback_, V6_ONLY, zone));
+    // Nothing more is asked
+    EXPECT_EQ(2, resolver_->requests.size());
+    resolver_->answer(0, ns_name_, RRType::A(), rdata::in::A("192.0.2.1"));
+    // Two are answered (ANY and V4)
+    ASSERT_EQ(2, callback_->successes_.size());
+    EXPECT_TRUE(IOAddress("192.0.2.1").equal(callback_->successes_[0]));
+    EXPECT_TRUE(IOAddress("192.0.2.1").equal(callback_->successes_[1]));
+    // None are rejected
+    EXPECT_EQ(0, callback_->unreachable_count_);
+    // We are still in progress, not everything arrived
+    EXPECT_EQ(Fetchable::IN_PROGRESS, zone->getState());
+    resolver_->answer(1, ns_name_, RRType::AAAA(),
+        rdata::in::A("2001:db8::1"));
+    // This should answer the third callback
+    ASSERT_EQ(3, callback_->successes_.size());
+    EXPECT_TRUE(IOAddress("2001:db8::1").equal(callback_->successes_[2]));
+    EXPECT_EQ(0, callback_->unreachable_count_);
+    // It should think it is ready
+    EXPECT_EQ(Fetchable::READY, zone->getState());
+    // When we ask something more, it should be answered right away
+    EXPECT_TRUE(zone->addCallback(callback_, V4_ONLY, zone));
+    EXPECT_EQ(2, resolver_->requests.size());
+    ASSERT_EQ(4, callback_->successes_.size());
+    EXPECT_TRUE(IOAddress("192.0.2.1").equal(callback_->successes_[3]));
+    EXPECT_EQ(0, callback_->unreachable_count_);
+}
+
+TEST_F(ZoneEntryTest, CallbacksAOnly) {
+    shared_ptr<InheritedZoneEntry> zone(new InheritedZoneEntry(resolver_,
+        rr_single_, vector<const AbstractRRset*>(), nameservers_hash_,
+        nameservers_lru_));
+    // It should be in NOT_ASKED state
+    EXPECT_EQ(Fetchable::NOT_ASKED, zone->getState());
+    // It should accept the callback
+    EXPECT_TRUE(zone->addCallback(callback_, ANY_OK, zone));
+    // It should not be answered yet, it should ask for the IP addresses
+    EXPECT_TRUE(callback_->successes_.empty());
+    EXPECT_EQ(0, callback_->unreachable_count_);
+    resolver_->asksIPs(ns_name_, 0, 1);
+    // We should be IN_PROGRESS
+    EXPECT_EQ(Fetchable::IN_PROGRESS, zone->getState());
+    // Give two more callbacks, with different address families
+    EXPECT_TRUE(zone->addCallback(callback_, V4_ONLY, zone));
+    EXPECT_TRUE(zone->addCallback(callback_, V6_ONLY, zone));
+    resolver_->requests[1].second->failure();
+    // One should be rejected, but two still stay, they have chance
+    EXPECT_EQ(0, callback_->successes_.size());
+    EXPECT_EQ(1, callback_->unreachable_count_);
+    EXPECT_EQ(Fetchable::IN_PROGRESS, zone->getState());
+    // Answer the A one and see it answers what can be answered
+    ASSERT_EQ(2, callback_->successes_.size());
+    resolver_->answer(0, ns_name_, RRType::A(), rdata::in::A("192.0.2.1"));
+    EXPECT_TRUE(IOAddress("192.0.2.1").equal(callback_->successes_[0]));
+    EXPECT_TRUE(IOAddress("192.0.2.1").equal(callback_->successes_[1]));
+    EXPECT_EQ(1, callback_->unreachable_count_);
+    // Everything arriwed, so we are ready
+    EXPECT_EQ(Fetchable::READY, zone->getState());
+    // Try asking something more
+    EXPECT_TRUE(zone->addCallback(callback_, V4_ONLY, zone));
+    EXPECT_EQ(2, resolver_->requests.size());
+    ASSERT_EQ(3, callback_->successes_.size());
+    EXPECT_TRUE(IOAddress("192.0.2.1").equal(callback_->successes_[2]));
+    EXPECT_EQ(1, callback_->unreachable_count_);
+
+    EXPECT_TRUE(zone->addCallback(callback_, V6_ONLY, zone));
+    EXPECT_EQ(2, resolver_->requests.size());
+    EXPECT_EQ(3, callback_->successes_.size());
+    EXPECT_EQ(2, callback_->unreachable_count_);
+}
+
 }   // namespace
 }   // namespace