[svn] commit: r3763 - in /branches/trac408/src/lib/nsas/tests: Makefile.am nameserver_address_unittest.cc nameserver_entry_unittest.cc random_number_generator_unittest.cc
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Dec 8 11:32:05 UTC 2010
Author: vorner
Date: Wed Dec 8 11:32:05 2010
New Revision: 3763
Log:
First part of sync with #356
It compiles, but 2 tests are commented out because of API changes, the tests do not run
and there are many places where the code must be examined (locking, code removed from constructor,
differently stored addresses).
Added:
branches/trac408/src/lib/nsas/tests/random_number_generator_unittest.cc
- copied unchanged from r3761, branches/trac356/src/lib/nsas/tests/random_number_generator_unittest.cc
Modified:
branches/trac408/src/lib/nsas/tests/Makefile.am
branches/trac408/src/lib/nsas/tests/nameserver_address_unittest.cc
branches/trac408/src/lib/nsas/tests/nameserver_entry_unittest.cc
Modified: branches/trac408/src/lib/nsas/tests/Makefile.am
==============================================================================
--- branches/trac408/src/lib/nsas/tests/Makefile.am (original)
+++ branches/trac408/src/lib/nsas/tests/Makefile.am Wed Dec 8 11:32:05 2010
@@ -30,6 +30,7 @@
run_unittests_SOURCES += nsas_test.h
run_unittests_SOURCES += zone_entry_unittest.cc
run_unittests_SOURCES += fetchable_unittest.cc
+run_unittests_SOURCES += random_number_generator_unittest.cc
run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES)
run_unittests_LDFLAGS = $(AM_LDFLAGS) $(GTEST_LDFLAGS)
Modified: branches/trac408/src/lib/nsas/tests/nameserver_address_unittest.cc
==============================================================================
--- branches/trac408/src/lib/nsas/tests/nameserver_address_unittest.cc (original)
+++ branches/trac408/src/lib/nsas/tests/nameserver_address_unittest.cc Wed Dec 8 11:32:05 2010
@@ -58,8 +58,11 @@
// Return the IOAddress corresponding to the index in rrv4_
asiolink::IOAddress getAddressAtIndex(uint32_t index) {
- return ns_.get()->getAddressAtIndex(index);
+ return ns_.get()->getAddressAtIndex(index, AF_INET);
}
+
+ // Return the addresses count stored in RRset
+ unsigned int getAddressesCount() const { return rrv4_->getRdataCount(); }
// Return the RTT of the address
uint32_t getAddressRTTAtIndex(uint32_t index) {
@@ -84,27 +87,49 @@
protected:
// Constructor
NameserverAddressTest():
- ns_address_(ns_sample_.getNameserverEntry(), TEST_ADDRESS_INDEX)
+ ns_address_(ns_sample_.getNameserverEntry(), TEST_ADDRESS_INDEX, AF_INET),
+ invalid_ns_address_(ns_sample_.getNameserverEntry(), ns_sample_.getAddressesCount(), AF_INET)
{
}
NameserverEntrySample ns_sample_;
+ // Valid NameserverAddress object
NameserverAddress ns_address_;
+
+ // NameserverAddress object that constructed with invalid index
+ NameserverAddress invalid_ns_address_;
};
// Test that the address is equal to the address in NameserverEntry
TEST_F(NameserverAddressTest, Address) {
EXPECT_TRUE(ns_address_.getAddress().equal( ns_sample_.getAddressAtIndex(TEST_ADDRESS_INDEX)));
+
+ // It will trigger an assert with the invalid index
+ ASSERT_DEATH(invalid_ns_address_.getAddress(), "");
+
+ boost::shared_ptr<NameserverEntry> empty_ne((NameserverEntry*)NULL);
+ // It will throw an NullNameserverEntryPointer exception with the empty NameserverEntry shared pointer
+ ASSERT_THROW({NameserverAddress empty_ns_address(empty_ne, 0, AF_INET);}, NullNameserverEntryPointer);
}
// Test that the RTT is updated
TEST_F(NameserverAddressTest, UpdateRTT) {
uint32_t old_rtt = ns_sample_.getAddressRTTAtIndex(TEST_ADDRESS_INDEX);
- uint32_t new_rtt = old_rtt + 1;
+ uint32_t new_rtt = old_rtt + 10;
- ns_address_.updateRTT(new_rtt);
+ uint32_t old_rtt0 = ns_sample_.getAddressRTTAtIndex(0);
+ uint32_t old_rtt2 = ns_sample_.getAddressRTTAtIndex(2);
- EXPECT_EQ(new_rtt, ns_sample_.getAddressRTTAtIndex(TEST_ADDRESS_INDEX));
+ for(int i = 0; i < 10000; ++i){
+ ns_address_.updateRTT(new_rtt);
+ }
+
+ //The RTT should have been updated
+ EXPECT_NE(new_rtt, ns_sample_.getAddressRTTAtIndex(TEST_ADDRESS_INDEX));
+
+ //The RTTs not been updated should remain unchanged
+ EXPECT_EQ(old_rtt0, ns_sample_.getAddressRTTAtIndex(0));
+ EXPECT_EQ(old_rtt2, ns_sample_.getAddressRTTAtIndex(2));
}
} // namespace nsas
Modified: branches/trac408/src/lib/nsas/tests/nameserver_entry_unittest.cc
==============================================================================
--- branches/trac408/src/lib/nsas/tests/nameserver_entry_unittest.cc (original)
+++ branches/trac408/src/lib/nsas/tests/nameserver_entry_unittest.cc Wed Dec 8 11:32:05 2010
@@ -111,7 +111,7 @@
// Check they are not 0 and they are all small, they should be some kind
// of randomish numbers, so we can't expect much more here
- BOOST_FOREACH(const AddressEntry& entry, vec) {
+ BOOST_FOREACH(AddressEntry& entry, vec) {
EXPECT_GT(entry.getRTT(), 0);
// 20 is some arbitrary small value
EXPECT_LT(entry.getRTT(), 20);
@@ -464,9 +464,123 @@
ASSERT_EQ(2, addresses.size());
EXPECT_EQ("2001:db8::1", addresses[1].getAddress().toText());
// They should have the RTT we set to them
- BOOST_FOREACH(const AddressEntry& address, addresses) {
+ BOOST_FOREACH(AddressEntry& address, addresses) {
EXPECT_EQ(123, address.getRTT());
}
}
+// TODO This test must be updated, the rrsets are not passed trough constructor
+#if 0
+// Select one address from the address list
+TEST_F(NameserverEntryTest, AddressSelection) {
+ boost::shared_ptr<NameserverEntry> ns(new NameserverEntry(&rrv4_, &rrv6_));
+ NameserverEntry::AddressVector v4Addresses;
+ NameserverEntry::AddressVector v6Addresses;
+ ns->getAddresses(v4Addresses, AF_INET);
+ ns->getAddresses(v6Addresses, AF_INET6);
+
+ int c1 = 0;
+ int c2 = 0;
+ int c3 = 0;
+ NameserverAddress ns_address;
+ for(int i = 0; i < 10000; ++i){
+ ns.get()->getAddress(ns_address, AF_INET);
+ asiolink::IOAddress io_address = ns_address.getAddress();
+ if(io_address.toText() == v4Addresses[0].getAddress().toText()) ++c1;
+ else if(io_address.toText() == v4Addresses[1].getAddress().toText()) ++c2;
+ else if(io_address.toText() == v4Addresses[2].getAddress().toText()) ++c3;
+ }
+ // c1, c2 and c3 should almost be equal
+ ASSERT_EQ(1, (int)(c1*1.0/c2 + 0.5));
+ ASSERT_EQ(1, (int)(c2*1.0/c3 + 0.5));
+
+ // update the rtt to 1, 2, 3
+ ns->setAddressRTT(v4Addresses[0].getAddress(), 1);
+ ns->setAddressRTT(v4Addresses[1].getAddress(), 2);
+ ns->setAddressRTT(v4Addresses[2].getAddress(), 3);
+ c1 = c2 = c3 = 0;
+ for(int i = 0; i < 100000; ++i){
+ ns.get()->getAddress(ns_address, AF_INET);
+ asiolink::IOAddress io_address = ns_address.getAddress();
+ if(io_address.toText() == v4Addresses[0].getAddress().toText()) ++c1;
+ else if(io_address.toText() == v4Addresses[1].getAddress().toText()) ++c2;
+ else if(io_address.toText() == v4Addresses[2].getAddress().toText()) ++c3;
+ }
+
+ // c1 should be (2*2) times of c2
+ ASSERT_EQ(4, (int)(c1*1.0/c2 + 0.5));
+ // c1 should be (3*3) times of c3
+ ASSERT_EQ(9, (int)(c1*1.0/c3 + 0.5));
+
+ // Test unreachable address
+ ns->setAddressRTT(v4Addresses[0].getAddress(), 1);
+ ns->setAddressRTT(v4Addresses[1].getAddress(), 100);
+ ns->setAddressUnreachable(v4Addresses[2].getAddress());
+ c1 = c2 = c3 = 0;
+ for(int i = 0; i < 100000; ++i){
+ ns.get()->getAddress(ns_address, AF_INET);
+ asiolink::IOAddress io_address = ns_address.getAddress();
+ if(io_address.toText() == v4Addresses[0].getAddress().toText()) ++c1;
+ else if(io_address.toText() == v4Addresses[1].getAddress().toText()) ++c2;
+ else if(io_address.toText() == v4Addresses[2].getAddress().toText()) ++c3;
+ }
+
+ // The 3rd address should not be selected again
+ ASSERT_EQ(0, c3);
+
+ // Test if all the servers are unrachable
+ ns->setAddressUnreachable(v4Addresses[0].getAddress());
+ ns->setAddressUnreachable(v4Addresses[1].getAddress());
+ ns->setAddressUnreachable(v4Addresses[2].getAddress());
+ c1 = c2 = c3 = 0;
+ for(int i = 0; i < 100000; ++i){
+ ns.get()->getAddress(ns_address, AF_INET);
+ asiolink::IOAddress io_address = ns_address.getAddress();
+ if(io_address.toText() == v4Addresses[0].getAddress().toText()) ++c1;
+ else if(io_address.toText() == v4Addresses[1].getAddress().toText()) ++c2;
+ else if(io_address.toText() == v4Addresses[2].getAddress().toText()) ++c3;
+ }
+
+ // All the unreachable servers should be selected with equal opportunity
+ ASSERT_EQ(1, (int)(c1*1.0/c2 + 0.5));
+ ASSERT_EQ(1, (int)(c1*1.0/c3 + 0.5));
+
+ // TODO: The unreachable server should be changed to reachable after 5minutes, but how to test?
+}
+
+// Test the RTT is updated smoothly
+TEST_F(NameserverEntryTest, UpdateRTT) {
+ NameserverEntry ns(&rrv4_, &rrv6_);
+ NameserverEntry::AddressVector vec;
+ ns.getAddresses(vec);
+
+ // Initialize the rtt with a small value
+ uint32_t init_rtt = 1;
+ ns.setAddressRTT(vec[0].getAddress(), init_rtt);
+ // The rtt will be stablized to a large value
+ uint32_t stable_rtt = 100;
+
+ // Update the rtt
+ ns.updateAddressRTTAtIndex(stable_rtt, 0, AF_INET);
+
+ vec.clear();
+ ns.getAddresses(vec);
+ uint32_t new_rtt = vec[0].getRTT();
+
+ // The rtt should not close to new rtt immediately
+ ASSERT_TRUE((stable_rtt - new_rtt) > (new_rtt - init_rtt));
+
+ // Update the rtt for enough times
+ for(int i = 0; i < 10000; ++i){
+ ns.updateAddressRTTAtIndex(stable_rtt, 0, AF_INET);
+ }
+ vec.clear();
+ ns.getAddresses(vec);
+ new_rtt = vec[0].getRTT();
+
+ // The rtt should be close to stable rtt value
+ ASSERT_TRUE((stable_rtt - new_rtt) < (new_rtt - init_rtt));
+}
+#endif
+
} // namespace
More information about the bind10-changes
mailing list