From 00c81aa09ccb6a8567b0a11ba9b3c152a6fa2c3c Mon Sep 17 00:00:00 2001 From: Christian Herdtweck Date: Thu, 30 Apr 2015 18:10:46 +0200 Subject: [PATCH] fixed bug that caused outdated IPsto be returned from cache; added test for that --- src/dns/dnscache.cpp | 2 +- test/test_dns.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/dns/dnscache.cpp b/src/dns/dnscache.cpp index 2796a07..7f48183 100644 --- a/src/dns/dnscache.cpp +++ b/src/dns/dnscache.cpp @@ -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() ) diff --git a/test/test_dns.cpp b/test/test_dns.cpp index 6cb1df5..9c95577 100644 --- a/test/test_dns.cpp +++ b/test/test_dns.cpp @@ -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 ); } -- 1.7.1