Improve prioritizing DNS servers to handle no permission failure
The quality of a DNS server should not dramatically drop if
the failure is due to no permission.
Bug: 137169582
Test: ran resolv_unit_test
Test: ran resolv_integration_test with the sorting enabled
Change-Id: Idad2ef2c34e708bd4bd64c50669de21f1abe3ac0
diff --git a/DnsStatsTest.cpp b/DnsStatsTest.cpp
index 38a7a21..5efd186 100644
--- a/DnsStatsTest.cpp
+++ b/DnsStatsTest.cpp
@@ -59,8 +59,16 @@
TEST_F(StatsRecordsTest, PushRecord) {
const IPSockAddr server = IPSockAddr::toIPSockAddr("127.0.0.2", 53);
constexpr size_t size = 3;
- const StatsRecords::Record recordNoError = {NS_R_NO_ERROR, 10ms};
- const StatsRecords::Record recordTimeout = {NS_R_TIMEOUT, 250ms};
+ const StatsRecords::Record recordNoError = {
+ .rcode = NS_R_NO_ERROR,
+ .linux_errno = 0,
+ .latencyUs{10ms},
+ };
+ const StatsRecords::Record recordTimeout = {
+ .rcode = NS_R_TIMEOUT,
+ .linux_errno = 0,
+ .latencyUs{250ms},
+ };
StatsRecords sr(server, size);
EXPECT_EQ(sr.getStatsData(), makeStatsData(server, 0, 0ms, {}));
@@ -424,6 +432,17 @@
EXPECT_THAT(mDnsStats.getSortedServers(PROTO_UDP),
testing::ElementsAreArray({server2, server3, server1, server4}));
+ // Add some internal_error records with permission error to server2.
+ // The internal_error won't cause the priority of server2 drop. (but some of the other
+ // quality factors will still be counted, such as skipped_count and latency)
+ auto recordFromNetworkRestricted = makeDnsQueryEvent(PROTO_UDP, NS_R_INTERNAL_ERROR, 1ms);
+ recordFromNetworkRestricted.set_linux_errno(static_cast<LinuxErrno>(EPERM));
+ for (int i = 0; i < 3; i++) {
+ EXPECT_TRUE(mDnsStats.addStats(server2, recordFromNetworkRestricted));
+ }
+ EXPECT_THAT(mDnsStats.getSortedServers(PROTO_UDP),
+ testing::ElementsAreArray({server2, server3, server1, server4}));
+
// The list of the DNS servers changed.
EXPECT_TRUE(mDnsStats.setServers({server2, server4}, PROTO_UDP));
EXPECT_THAT(mDnsStats.getSortedServers(PROTO_UDP),