Benchmarks for network metrics reporting

Bug: 29748723
Test: this is an APCT test.

(cherry picked from commit 484dac1d071c7476895c4a3184e8dbdd7b63e524)

Change-Id: I482a7d5c15210906069e0fe7ef55ab3f21bfc127
diff --git a/tests/netd_test.cpp b/tests/netd_test.cpp
index 1096fc7..6c7fdac 100644
--- a/tests/netd_test.cpp
+++ b/tests/netd_test.cpp
@@ -47,6 +47,7 @@
 #include <testUtil.h>
 
 #include "dns_responder.h"
+#include "dns_responder_client.h"
 #include "resolv_params.h"
 #include "ResolverStats.h"
 
@@ -79,51 +80,6 @@
     return true;
 }
 
-// The only response code used in this test, see
-// frameworks/base/services/java/com/android/server/NetworkManagementService.java
-// for others.
-static constexpr int ResponseCodeOK = 200;
-
-// Returns ResponseCode.
-int netdCommand(const char* sockname, const char* command) {
-    int sock = socket_local_client(sockname,
-                                   ANDROID_SOCKET_NAMESPACE_RESERVED,
-                                   SOCK_STREAM);
-    if (sock < 0) {
-        perror("Error connecting");
-        return -1;
-    }
-
-    // FrameworkListener expects the whole command in one read.
-    char buffer[256];
-    int nwritten = snprintf(buffer, sizeof(buffer), "0 %s", command);
-    if (write(sock, buffer, nwritten + 1) < 0) {
-        perror("Error sending netd command");
-        close(sock);
-        return -1;
-    }
-
-    int nread = read(sock, buffer, sizeof(buffer));
-    if (nread < 0) {
-        perror("Error reading response");
-        close(sock);
-        return -1;
-    }
-    close(sock);
-    return atoi(buffer);
-}
-
-bool expectNetdResult(int expected, const char* sockname, const char* format, ...) {
-    char command[256];
-    va_list args;
-    va_start(args, format);
-    vsnprintf(command, sizeof(command), format, args);
-    va_end(args);
-    int result = netdCommand(sockname, command);
-    EXPECT_EQ(expected, result) << command;
-    return (200 <= expected && expected < 300);
-}
-
 class AddrInfo {
   public:
     AddrInfo() : ai_(nullptr), error_(0) {}
@@ -168,131 +124,15 @@
     int error_;
 };
 
-class ResolverTest : public ::testing::Test {
+class ResolverTest : public ::testing::Test, public DnsResponderClient {
 protected:
-    struct Mapping {
-        std::string host;
-        std::string entry;
-        std::string ip4;
-        std::string ip6;
-    };
-
     virtual void SetUp() {
         // Ensure resolutions go via proxy.
-        setenv("ANDROID_DNS_MODE", "", 1);
-        uid = getuid();
-        pid = getpid();
-        SetupOemNetwork();
-
-        // binder setup
-        auto binder = android::defaultServiceManager()->getService(android::String16("netd"));
-        ASSERT_TRUE(binder != nullptr);
-        mNetdSrv = android::interface_cast<android::net::INetd>(binder);
+        DnsResponderClient::SetUp();
     }
 
     virtual void TearDown() {
-        TearDownOemNetwork();
-        netdCommand("netd", "network destroy " TEST_OEM_NETWORK);
-    }
-
-    void SetupOemNetwork() {
-        netdCommand("netd", "network destroy " TEST_OEM_NETWORK);
-        if (expectNetdResult(ResponseCodeOK, "netd",
-                             "network create %s", TEST_OEM_NETWORK)) {
-            oemNetId = TEST_NETID;
-        }
-        setNetworkForProcess(oemNetId);
-        ASSERT_EQ((unsigned) oemNetId, getNetworkForProcess());
-    }
-
-    void SetupMappings(unsigned num_hosts, const std::vector<std::string>& domains,
-            std::vector<Mapping>* mappings) const {
-        mappings->resize(num_hosts * domains.size());
-        auto mappings_it = mappings->begin();
-        for (unsigned i = 0 ; i < num_hosts ; ++i) {
-            for (const auto& domain : domains) {
-                ASSERT_TRUE(mappings_it != mappings->end());
-                mappings_it->host = StringPrintf("host%u", i);
-                mappings_it->entry = StringPrintf("%s.%s.", mappings_it->host.c_str(),
-                        domain.c_str());
-                mappings_it->ip4 = StringPrintf("192.0.2.%u", i%253 + 1);
-                mappings_it->ip6 = StringPrintf("2001:db8::%x", i%65534 + 1);
-                ++mappings_it;
-            }
-        }
-    }
-
-    void SetupDNSServers(unsigned num_servers, const std::vector<Mapping>& mappings,
-            std::vector<std::unique_ptr<test::DNSResponder>>* dns,
-            std::vector<std::string>* servers) const {
-        ASSERT_TRUE(num_servers != 0 && num_servers < 100);
-        const char* listen_srv = "53";
-        dns->resize(num_servers);
-        servers->resize(num_servers);
-        for (unsigned i = 0 ; i < num_servers ; ++i) {
-            auto& server = (*servers)[i];
-            auto& d = (*dns)[i];
-            server = StringPrintf("127.0.0.%u", i + 100);
-            d = std::make_unique<test::DNSResponder>(server, listen_srv, 250,
-                    ns_rcode::ns_r_servfail, 1.0);
-            ASSERT_TRUE(d.get() != nullptr);
-            for (const auto& mapping : mappings) {
-                d->addMapping(mapping.entry.c_str(), ns_type::ns_t_a, mapping.ip4.c_str());
-                d->addMapping(mapping.entry.c_str(), ns_type::ns_t_aaaa, mapping.ip6.c_str());
-            }
-            ASSERT_TRUE(d->startServer());
-        }
-    }
-
-    void ShutdownDNSServers(std::vector<std::unique_ptr<test::DNSResponder>>* dns) const {
-        for (const auto& d : *dns) {
-            ASSERT_TRUE(d.get() != nullptr);
-            d->stopServer();
-        }
-        dns->clear();
-    }
-
-    void TearDownOemNetwork() {
-        if (oemNetId != -1) {
-            expectNetdResult(ResponseCodeOK, "netd",
-                             "network destroy %s", TEST_OEM_NETWORK);
-        }
-    }
-
-    bool SetResolversForNetwork(const std::vector<std::string>& servers,
-            const std::vector<std::string>& domains, const std::vector<int>& params) {
-        auto rv = mNetdSrv->setResolverConfiguration(TEST_NETID, servers, domains, params);
-        return rv.isOk();
-    }
-
-    bool SetResolversForNetwork(const std::vector<std::string>& searchDomains,
-            const std::vector<std::string>& servers, const std::string& params) {
-        std::string cmd = StringPrintf("resolver setnetdns %d \"", oemNetId);
-        if (!searchDomains.empty()) {
-            cmd += searchDomains[0].c_str();
-            for (size_t i = 1 ; i < searchDomains.size() ; ++i) {
-                cmd += " ";
-                cmd += searchDomains[i];
-            }
-        }
-        cmd += "\"";
-
-        for (const auto& str : servers) {
-            cmd += " ";
-            cmd += str;
-        }
-
-        if (!params.empty()) {
-            cmd += " --params \"";
-            cmd += params;
-            cmd += "\"";
-        }
-
-        int rv = netdCommand("netd", cmd.c_str());
-        if (rv != ResponseCodeOK) {
-            return false;
-        }
-        return true;
+        DnsResponderClient::TearDown();
     }
 
     bool GetResolverInfo(std::vector<std::string>* servers, std::vector<std::string>* domains,
@@ -368,7 +208,7 @@
         std::vector<std::string> domains = { "example.com" };
         std::vector<std::unique_ptr<test::DNSResponder>> dns;
         std::vector<std::string> servers;
-        std::vector<Mapping> mappings;
+        std::vector<DnsResponderClient::Mapping> mappings;
         ASSERT_NO_FATAL_FAILURE(SetupMappings(num_hosts, domains, &mappings));
         ASSERT_NO_FATAL_FAILURE(SetupDNSServers(MAXNS, mappings, &dns, &servers));
 
@@ -407,10 +247,6 @@
         ASSERT_NO_FATAL_FAILURE(ShutdownDNSServers(&dns));
     }
 
-    int pid;
-    int uid;
-    int oemNetId = -1;
-    android::sp<android::net::INetd> mNetdSrv = nullptr;
     const std::vector<std::string> mDefaultSearchDomains = { "example.com" };
     // <sample validity in s> <success threshold in percent> <min samples> <max samples>
     const std::string mDefaultParams = "300 25 8 8";