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),