Loading Android.bp +22 −0 Original line number Diff line number Diff line Loading @@ -359,3 +359,25 @@ filegroup { // ], // min_sdk_version: "29", // } // rust_test { // name: "doh_unit_test", // enabled: support_rust_toolchain, // crate_name: "doh", // srcs: ["doh.rs"], // edition: "2018", // test_suites: ["general-tests"], // auto_gen_config: true, // rustlibs: [ // "libandroid_logger", // "libanyhow", // "liblazy_static", // "liblibc", // "liblog_rust", // "libquiche", // "libring", // "libtokio", // "liburl", // ], // min_sdk_version: "29", // } doh.rs +11 −0 Original line number Diff line number Diff line Loading @@ -472,3 +472,14 @@ pub unsafe extern "C" fn doh_query( } } } #[cfg(test)] mod tests { #[test] fn doh_init() { unsafe { // Safety: the returned pointer from doh_init() must be a null terminated string. assert_eq!(std::ffi::CStr::from_ptr(super::doh_init()).to_str().unwrap(), "1.0"); } } } getaddrinfo.cpp +7 −1 Original line number Diff line number Diff line Loading @@ -1603,6 +1603,7 @@ struct QueryResult { int ancount; int rcode; int herrno; int qerrno; NetworkDnsEventReported event; }; Loading Loading @@ -1635,6 +1636,7 @@ QueryResult doQuery(const char* name, res_target* t, res_state res, .ancount = 0, .rcode = -1, .herrno = NO_RECOVERY, .qerrno = errno, .event = event, }; } Loading @@ -1644,13 +1646,15 @@ QueryResult doQuery(const char* name, res_target* t, res_state res, int rcode = NOERROR; n = res_nsend(&res_temp, buf, n, t->answer.data(), anslen, &rcode, 0, sleepTimeMs); if (n < 0 || hp->rcode != NOERROR || ntohs(hp->ancount) == 0) { // To ensure that the rcode handling is identical to res_queryN(). if (rcode != RCODE_TIMEOUT) rcode = hp->rcode; // if the query choked with EDNS0, retry without EDNS0 if ((res_temp.netcontext_flags & (NET_CONTEXT_FLAG_USE_DNS_OVER_TLS | NET_CONTEXT_FLAG_USE_EDNS)) && (res_temp._flags & RES_F_EDNS0ERR)) { LOG(DEBUG) << __func__ << ": retry without EDNS0"; n = res_nmkquery(QUERY, name, cl, type, /*data=*/nullptr, /*datalen=*/0, buf, sizeof(buf), res->netcontext_flags); sizeof(buf), res_temp.netcontext_flags); n = res_nsend(&res_temp, buf, n, t->answer.data(), anslen, &rcode, 0); } } Loading @@ -1661,6 +1665,7 @@ QueryResult doQuery(const char* name, res_target* t, res_state res, return { .ancount = ntohs(hp->ancount), .rcode = rcode, .qerrno = errno, .event = event, }; } Loading Loading @@ -1695,6 +1700,7 @@ static int res_queryN_parallel(const char* name, res_target* target, res_state r res->event->MergeFrom(r.event); ancount += r.ancount; rcode = r.rcode; errno = r.qerrno; } if (ancount == 0) { Loading res_cache.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -903,7 +903,7 @@ namespace { // if the ReturnCode is not associated with any rate_denom, use default // Sampling rate varies by return code; events to log are chosen randomly, with a // probability proportional to the sampling rate. constexpr const char DEFAULT_SUBSAMPLING_MAP[] = "default:1 0:100 7:10"; constexpr const char DEFAULT_SUBSAMPLING_MAP[] = "default:8 0:400 2:110 7:110"; std::unordered_map<int, uint32_t> resolv_get_dns_event_subsampling_map() { using android::base::ParseInt; Loading tests/resolv_cache_unit_test.cpp +6 −5 Original line number Diff line number Diff line Loading @@ -935,15 +935,16 @@ class ScopedCacheCreate { } // namespace TEST_F(ResolvCacheTest, DnsEventSubsampling) { // Test defaults, default flag is "default:1 0:100 7:10" if no experiment flag is set // Test defaults, default flag is "default:8 0:400 2:110 7:110" if no experiment flag is set { ScopedCacheCreate scopedCacheCreate(TEST_NETID, ""); EXPECT_EQ(resolv_cache_get_subsampling_denom(TEST_NETID, EAI_NODATA), 10U); EXPECT_EQ(resolv_cache_get_subsampling_denom(TEST_NETID, EAI_OK), 100U); EXPECT_EQ(resolv_cache_get_subsampling_denom(TEST_NETID, EAI_AGAIN), 110U); EXPECT_EQ(resolv_cache_get_subsampling_denom(TEST_NETID, EAI_NODATA), 110U); EXPECT_EQ(resolv_cache_get_subsampling_denom(TEST_NETID, EAI_OK), 400U); EXPECT_EQ(resolv_cache_get_subsampling_denom(TEST_NETID, EAI_BADFLAGS), 1U); // default 8U); // default EXPECT_THAT(resolv_cache_dump_subsampling_map(TEST_NETID), testing::UnorderedElementsAreArray({"default:1", "0:100", "7:10"})); testing::UnorderedElementsAreArray({"default:8", "0:400", "2:110", "7:110"})); } // Now change the experiment flag to "0:42 default:666" { Loading Loading
Android.bp +22 −0 Original line number Diff line number Diff line Loading @@ -359,3 +359,25 @@ filegroup { // ], // min_sdk_version: "29", // } // rust_test { // name: "doh_unit_test", // enabled: support_rust_toolchain, // crate_name: "doh", // srcs: ["doh.rs"], // edition: "2018", // test_suites: ["general-tests"], // auto_gen_config: true, // rustlibs: [ // "libandroid_logger", // "libanyhow", // "liblazy_static", // "liblibc", // "liblog_rust", // "libquiche", // "libring", // "libtokio", // "liburl", // ], // min_sdk_version: "29", // }
doh.rs +11 −0 Original line number Diff line number Diff line Loading @@ -472,3 +472,14 @@ pub unsafe extern "C" fn doh_query( } } } #[cfg(test)] mod tests { #[test] fn doh_init() { unsafe { // Safety: the returned pointer from doh_init() must be a null terminated string. assert_eq!(std::ffi::CStr::from_ptr(super::doh_init()).to_str().unwrap(), "1.0"); } } }
getaddrinfo.cpp +7 −1 Original line number Diff line number Diff line Loading @@ -1603,6 +1603,7 @@ struct QueryResult { int ancount; int rcode; int herrno; int qerrno; NetworkDnsEventReported event; }; Loading Loading @@ -1635,6 +1636,7 @@ QueryResult doQuery(const char* name, res_target* t, res_state res, .ancount = 0, .rcode = -1, .herrno = NO_RECOVERY, .qerrno = errno, .event = event, }; } Loading @@ -1644,13 +1646,15 @@ QueryResult doQuery(const char* name, res_target* t, res_state res, int rcode = NOERROR; n = res_nsend(&res_temp, buf, n, t->answer.data(), anslen, &rcode, 0, sleepTimeMs); if (n < 0 || hp->rcode != NOERROR || ntohs(hp->ancount) == 0) { // To ensure that the rcode handling is identical to res_queryN(). if (rcode != RCODE_TIMEOUT) rcode = hp->rcode; // if the query choked with EDNS0, retry without EDNS0 if ((res_temp.netcontext_flags & (NET_CONTEXT_FLAG_USE_DNS_OVER_TLS | NET_CONTEXT_FLAG_USE_EDNS)) && (res_temp._flags & RES_F_EDNS0ERR)) { LOG(DEBUG) << __func__ << ": retry without EDNS0"; n = res_nmkquery(QUERY, name, cl, type, /*data=*/nullptr, /*datalen=*/0, buf, sizeof(buf), res->netcontext_flags); sizeof(buf), res_temp.netcontext_flags); n = res_nsend(&res_temp, buf, n, t->answer.data(), anslen, &rcode, 0); } } Loading @@ -1661,6 +1665,7 @@ QueryResult doQuery(const char* name, res_target* t, res_state res, return { .ancount = ntohs(hp->ancount), .rcode = rcode, .qerrno = errno, .event = event, }; } Loading Loading @@ -1695,6 +1700,7 @@ static int res_queryN_parallel(const char* name, res_target* target, res_state r res->event->MergeFrom(r.event); ancount += r.ancount; rcode = r.rcode; errno = r.qerrno; } if (ancount == 0) { Loading
res_cache.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -903,7 +903,7 @@ namespace { // if the ReturnCode is not associated with any rate_denom, use default // Sampling rate varies by return code; events to log are chosen randomly, with a // probability proportional to the sampling rate. constexpr const char DEFAULT_SUBSAMPLING_MAP[] = "default:1 0:100 7:10"; constexpr const char DEFAULT_SUBSAMPLING_MAP[] = "default:8 0:400 2:110 7:110"; std::unordered_map<int, uint32_t> resolv_get_dns_event_subsampling_map() { using android::base::ParseInt; Loading
tests/resolv_cache_unit_test.cpp +6 −5 Original line number Diff line number Diff line Loading @@ -935,15 +935,16 @@ class ScopedCacheCreate { } // namespace TEST_F(ResolvCacheTest, DnsEventSubsampling) { // Test defaults, default flag is "default:1 0:100 7:10" if no experiment flag is set // Test defaults, default flag is "default:8 0:400 2:110 7:110" if no experiment flag is set { ScopedCacheCreate scopedCacheCreate(TEST_NETID, ""); EXPECT_EQ(resolv_cache_get_subsampling_denom(TEST_NETID, EAI_NODATA), 10U); EXPECT_EQ(resolv_cache_get_subsampling_denom(TEST_NETID, EAI_OK), 100U); EXPECT_EQ(resolv_cache_get_subsampling_denom(TEST_NETID, EAI_AGAIN), 110U); EXPECT_EQ(resolv_cache_get_subsampling_denom(TEST_NETID, EAI_NODATA), 110U); EXPECT_EQ(resolv_cache_get_subsampling_denom(TEST_NETID, EAI_OK), 400U); EXPECT_EQ(resolv_cache_get_subsampling_denom(TEST_NETID, EAI_BADFLAGS), 1U); // default 8U); // default EXPECT_THAT(resolv_cache_dump_subsampling_map(TEST_NETID), testing::UnorderedElementsAreArray({"default:1", "0:100", "7:10"})); testing::UnorderedElementsAreArray({"default:8", "0:400", "2:110", "7:110"})); } // Now change the experiment flag to "0:42 default:666" { Loading