fixed bug that caused outdated IPsto be returned from cache; added test for that
authorChristian Herdtweck <christian.herdtweck@intra2net.com>
Thu, 30 Apr 2015 16:10:46 +0000 (18:10 +0200)
committerChristian Herdtweck <christian.herdtweck@intra2net.com>
Mon, 4 May 2015 14:57:59 +0000 (16:57 +0200)
src/dns/dnscache.cpp
test/test_dns.cpp

index 2796a07..7f48183 100644 (file)
@@ -318,7 +318,7 @@ HostAddressVec DnsCache::get_ips_recursive(const std::string &hostname,
 {
     std::string current_host = hostname;
     Cname current_cname;
-    HostAddressVec result = get_ips(current_host);
+    HostAddressVec result = get_ips(current_host, check_up_to_date);
     int n_recursions = 0;
     uint32_t min_cname_ttl = 0xffff;   // largest possible unsigned 4-byte value
     while ( result.empty() )
index 6cb1df5..9c95577 100644 (file)
@@ -121,14 +121,34 @@ struct GlobalFixture
             Cache->update("host2_3.test", ips);
         }
 
-        // cname.test --> host1.test
-        Cache->update("cname.test", Cname("host1.test", 35) );
+        {
+            // cname.test --> host1.test
+            Cache->update("cname.test", Cname("host1.test", 35) );
 
-        // cname2.test --> cname.test --> host1.test
-        Cache->update("cname2.test", Cname("cname.test", 33) );
+            // cname2.test --> cname.test --> host1.test
+            Cache->update("cname2.test", Cname("cname.test", 33) );
 
-        // cname3.test --> cname2.test --> cname.test --> host1.test
-        Cache->update("cname3.test", Cname("cname2.test", 37) );
+            // cname3.test --> cname2.test --> cname.test --> host1.test
+            Cache->update("cname3.test", Cname("cname2.test", 37) );
+        }
+
+        {
+            HostAddressVec ips;
+            ips.push_back( HostAddress( address::from_string("192.168.42.4"),
+                                        0 ) );
+            ips.push_back( HostAddress( address::from_string("192.168.42.5"),
+                                        resolved_ip_ttl_threshold-1 ) );
+            ips.push_back( HostAddress( address::from_string("192.168.42.6"),
+                                        resolved_ip_ttl_threshold ) );
+            ips.push_back( HostAddress( address::from_string("192.168.42.7"),
+                                        resolved_ip_ttl_threshold+1 ) );
+            Cache->update("host_outdated.test", ips);
+
+            Cache->update( "cname_outdated.test",
+                      Cname("host_outdated.test", resolved_ip_ttl_threshold) );
+            Cache->update( "cname_up_to_date.test",
+                      Cname("host_outdated.test", resolved_ip_ttl_threshold+1));
+        }
 
         BOOST_TEST_MESSAGE( "Done filling cache." );
     }
@@ -260,7 +280,8 @@ void cname_skip_test(const uint32_t ttl1, const uint32_t ttl2,
         cache->update( "skip_chain_third.test",
                  Cname("skip_chain_fourth.test", ttl3) );
         HostAddressVec ips;
-        ips.push_back( HostAddress( address::from_string("192.168.42.4"), ttl4) );
+        ips.push_back( HostAddress( address::from_string("192.168.42.100"),
+                                    ttl4 ) );
         cache->update("skip_chain_fourth.test", ips);
     }
 
@@ -326,6 +347,34 @@ BOOST_AUTO_TEST_CASE( cache_load_test )
     // not testing Ttl set time since is private
 }
 
+BOOST_AUTO_TEST_CASE( cache_outdated_test )
+{
+    bool check_up_to_date = false;
+    HostAddressVec ips = Cache->get_ips("host_outdated.test", check_up_to_date);
+    BOOST_CHECK_EQUAL( ips.size(), 4 );
+    ips = Cache->get_ips_recursive("host_outdated.test", check_up_to_date);
+    BOOST_CHECK_EQUAL( ips.size(), 4 );
+    Cname cname = Cache->get_cname("cname_outdated.test", check_up_to_date);
+    BOOST_CHECK( !cname.Host.empty() );
+    ips = Cache->get_ips_recursive("cname_outdated.test", check_up_to_date);
+    BOOST_CHECK_EQUAL( ips.size(), 4 );
+    ips = Cache->get_ips_recursive("cname_up_to_date.test", check_up_to_date);
+    BOOST_CHECK_EQUAL( ips.size(), 4 );
+
+    check_up_to_date = true;
+    ips = Cache->get_ips( "host_outdated.test", check_up_to_date );
+    BOOST_CHECK_EQUAL( ips.size(), 1 );
+    ips = Cache->get_ips_recursive("host_outdated.test", check_up_to_date);
+    BOOST_CHECK_EQUAL( ips.size(), 1 );
+    cname = Cache->get_cname("cname_outdated.test", check_up_to_date);
+    BOOST_CHECK( cname.Host.empty() );
+    ips = Cache->get_ips_recursive("cname_outdated.test", check_up_to_date);
+    BOOST_CHECK_EQUAL( ips.size(), 0 );
+    ips = Cache->get_ips_recursive("cname_up_to_date.test", check_up_to_date);
+    BOOST_CHECK_EQUAL( ips.size(), 1 );
+}
+
+
 
 BOOST_AUTO_TEST_SUITE_END()    // of TestDnsCache
 
@@ -365,6 +414,8 @@ void resolve_callback(IoServiceItem io_serv, ResolverItem resolver,
     resolver->cancel_resolve();
     io_serv->stop();
     BOOST_TEST_MESSAGE( "Stopped io_service" );
+    BOOST_CHECK( was_success );
+    BOOST_CHECK_EQUAL( cname_count, 0 );
 }