Loading res_cache.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -1412,8 +1412,10 @@ ResolvCacheStatus _resolv_cache_lookup(unsigned netid, const void* query, int qu uint32_t flags) { // Skip cache lookup, return RESOLV_CACHE_NOTFOUND directly so that it is // possible to cache the answer of this query. // If ANDROID_RESOLV_NO_CACHE_STORE is set, return RESOLV_CACHE_SKIP to skip possible cache // storing. if (flags & ANDROID_RESOLV_NO_CACHE_LOOKUP) { return RESOLV_CACHE_NOTFOUND; return flags & ANDROID_RESOLV_NO_CACHE_STORE ? RESOLV_CACHE_SKIP : RESOLV_CACHE_NOTFOUND; } Entry key; Entry** lookup; Loading resolver_test.cpp +34 −0 Original line number Diff line number Diff line Loading @@ -2039,9 +2039,12 @@ TEST_F(ResolverTest, Async_MalformedQuery) { TEST_F(ResolverTest, Async_CacheFlags) { constexpr char listen_addr[] = "127.0.0.4"; constexpr char host_name[] = "howdy.example.com."; constexpr char another_host_name[] = "howdy.example2.com."; const std::vector<DnsRecord> records = { {host_name, ns_type::ns_t_a, "1.2.3.4"}, {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"}, {another_host_name, ns_type::ns_t_a, "1.2.3.5"}, {another_host_name, ns_type::ns_t_aaaa, "::1.2.3.5"}, }; test::DNSResponder dns(listen_addr); Loading Loading @@ -2130,6 +2133,37 @@ TEST_F(ResolverTest, Async_CacheFlags) { // Cache hits, expect still 2 queries EXPECT_EQ(2U, GetNumQueries(dns, host_name)); // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set dns.clearQueries(); // Make sure that the cache of "howdy.example2.com" exists. fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0); EXPECT_TRUE(fd1 != -1); expectAnswersValid(fd1, AF_INET6, "::1.2.3.5"); EXPECT_EQ(1U, GetNumQueries(dns, another_host_name)); // Re-query with testFlags const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP; fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, testFlag); EXPECT_TRUE(fd1 != -1); expectAnswersValid(fd1, AF_INET6, "::1.2.3.5"); // Expect cache lookup is skipped. EXPECT_EQ(2U, GetNumQueries(dns, another_host_name)); // Do another query with testFlags fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, testFlag); EXPECT_TRUE(fd1 != -1); expectAnswersValid(fd1, AF_INET, "1.2.3.5"); // Expect cache lookup is skipped. EXPECT_EQ(3U, GetNumQueries(dns, another_host_name)); // Re-query with no flags fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, 0); EXPECT_TRUE(fd1 != -1); expectAnswersValid(fd1, AF_INET, "1.2.3.5"); // Expect no cache hit because cache storing is also skipped in previous query. EXPECT_EQ(4U, GetNumQueries(dns, another_host_name)); } TEST_F(ResolverTest, Async_NoRetryFlag) { Loading Loading
res_cache.cpp +3 −1 Original line number Diff line number Diff line Loading @@ -1412,8 +1412,10 @@ ResolvCacheStatus _resolv_cache_lookup(unsigned netid, const void* query, int qu uint32_t flags) { // Skip cache lookup, return RESOLV_CACHE_NOTFOUND directly so that it is // possible to cache the answer of this query. // If ANDROID_RESOLV_NO_CACHE_STORE is set, return RESOLV_CACHE_SKIP to skip possible cache // storing. if (flags & ANDROID_RESOLV_NO_CACHE_LOOKUP) { return RESOLV_CACHE_NOTFOUND; return flags & ANDROID_RESOLV_NO_CACHE_STORE ? RESOLV_CACHE_SKIP : RESOLV_CACHE_NOTFOUND; } Entry key; Entry** lookup; Loading
resolver_test.cpp +34 −0 Original line number Diff line number Diff line Loading @@ -2039,9 +2039,12 @@ TEST_F(ResolverTest, Async_MalformedQuery) { TEST_F(ResolverTest, Async_CacheFlags) { constexpr char listen_addr[] = "127.0.0.4"; constexpr char host_name[] = "howdy.example.com."; constexpr char another_host_name[] = "howdy.example2.com."; const std::vector<DnsRecord> records = { {host_name, ns_type::ns_t_a, "1.2.3.4"}, {host_name, ns_type::ns_t_aaaa, "::1.2.3.4"}, {another_host_name, ns_type::ns_t_a, "1.2.3.5"}, {another_host_name, ns_type::ns_t_aaaa, "::1.2.3.5"}, }; test::DNSResponder dns(listen_addr); Loading Loading @@ -2130,6 +2133,37 @@ TEST_F(ResolverTest, Async_CacheFlags) { // Cache hits, expect still 2 queries EXPECT_EQ(2U, GetNumQueries(dns, host_name)); // Test both ANDROID_RESOLV_NO_CACHE_STORE and ANDROID_RESOLV_NO_CACHE_LOOKUP are set dns.clearQueries(); // Make sure that the cache of "howdy.example2.com" exists. fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, 0); EXPECT_TRUE(fd1 != -1); expectAnswersValid(fd1, AF_INET6, "::1.2.3.5"); EXPECT_EQ(1U, GetNumQueries(dns, another_host_name)); // Re-query with testFlags const int testFlag = ANDROID_RESOLV_NO_CACHE_STORE | ANDROID_RESOLV_NO_CACHE_LOOKUP; fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_aaaa, testFlag); EXPECT_TRUE(fd1 != -1); expectAnswersValid(fd1, AF_INET6, "::1.2.3.5"); // Expect cache lookup is skipped. EXPECT_EQ(2U, GetNumQueries(dns, another_host_name)); // Do another query with testFlags fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, testFlag); EXPECT_TRUE(fd1 != -1); expectAnswersValid(fd1, AF_INET, "1.2.3.5"); // Expect cache lookup is skipped. EXPECT_EQ(3U, GetNumQueries(dns, another_host_name)); // Re-query with no flags fd1 = resNetworkQuery(TEST_NETID, "howdy.example2.com", ns_c_in, ns_t_a, 0); EXPECT_TRUE(fd1 != -1); expectAnswersValid(fd1, AF_INET, "1.2.3.5"); // Expect no cache hit because cache storing is also skipped in previous query. EXPECT_EQ(4U, GetNumQueries(dns, another_host_name)); } TEST_F(ResolverTest, Async_NoRetryFlag) { Loading