xref: /aosp_15_r20/external/cronet/net/dns/address_info_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/dns/address_info.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
8*6777b538SAndroid Build Coastguard Worker #include <stdlib.h>
9*6777b538SAndroid Build Coastguard Worker #include <string.h>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include <array>
12*6777b538SAndroid Build Coastguard Worker #include <memory>
13*6777b538SAndroid Build Coastguard Worker #include <optional>
14*6777b538SAndroid Build Coastguard Worker #include <string_view>
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/numerics/safe_conversions.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/sys_byteorder.h"
19*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/base/address_list.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
22*6777b538SAndroid Build Coastguard Worker #include "net/base/sys_addrinfo.h"
23*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
24*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker namespace net {
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker namespace {
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker class MockAddrInfoGetter : public AddrInfoGetter {
31*6777b538SAndroid Build Coastguard Worker  public:
32*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<addrinfo, FreeAddrInfoFunc> getaddrinfo(
33*6777b538SAndroid Build Coastguard Worker       const std::string& host,
34*6777b538SAndroid Build Coastguard Worker       const addrinfo* hints,
35*6777b538SAndroid Build Coastguard Worker       int* out_os_error,
36*6777b538SAndroid Build Coastguard Worker       handles::NetworkHandle network) override;
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker  private:
39*6777b538SAndroid Build Coastguard Worker   struct IpAndPort {
40*6777b538SAndroid Build Coastguard Worker     struct Ip {
41*6777b538SAndroid Build Coastguard Worker       uint8_t a;
42*6777b538SAndroid Build Coastguard Worker       uint8_t b;
43*6777b538SAndroid Build Coastguard Worker       uint8_t c;
44*6777b538SAndroid Build Coastguard Worker       uint8_t d;
45*6777b538SAndroid Build Coastguard Worker     };
46*6777b538SAndroid Build Coastguard Worker     Ip ip;
47*6777b538SAndroid Build Coastguard Worker     int port;
48*6777b538SAndroid Build Coastguard Worker   };
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker   // Initialises `addr` and `ai` from `ip_and_port`, `canonical_name` and
51*6777b538SAndroid Build Coastguard Worker   // `ai_next`.
52*6777b538SAndroid Build Coastguard Worker   static void InitializeAddrinfo(const IpAndPort& ip_and_port,
53*6777b538SAndroid Build Coastguard Worker                                  char* canonical_name,
54*6777b538SAndroid Build Coastguard Worker                                  addrinfo* ai_next,
55*6777b538SAndroid Build Coastguard Worker                                  sockaddr_in* addr,
56*6777b538SAndroid Build Coastguard Worker                                  addrinfo* ai);
57*6777b538SAndroid Build Coastguard Worker 
58*6777b538SAndroid Build Coastguard Worker   // Allocates and initialises an addrinfo structure containing the ip addresses
59*6777b538SAndroid Build Coastguard Worker   // and ports from `ipp` and the name `canonical_name`. This function is
60*6777b538SAndroid Build Coastguard Worker   // designed to be used within getaddrinfo(), which returns a raw pointer even
61*6777b538SAndroid Build Coastguard Worker   // though it transfers ownership. So this function does the same. Since
62*6777b538SAndroid Build Coastguard Worker   // addrinfo is a C-style variable-sized structure it cannot be allocated with
63*6777b538SAndroid Build Coastguard Worker   // new. It is allocated with malloc() instead, so it must be freed with
64*6777b538SAndroid Build Coastguard Worker   // free().
65*6777b538SAndroid Build Coastguard Worker   template <size_t N>
66*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<addrinfo, FreeAddrInfoFunc> MakeAddrInfoList(
67*6777b538SAndroid Build Coastguard Worker       const IpAndPort (&ipp)[N],
68*6777b538SAndroid Build Coastguard Worker       std::string_view canonical_name);
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<addrinfo, FreeAddrInfoFunc> MakeAddrInfo(
71*6777b538SAndroid Build Coastguard Worker       IpAndPort ipp,
72*6777b538SAndroid Build Coastguard Worker       std::string_view canonical_name);
73*6777b538SAndroid Build Coastguard Worker };
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker template <size_t N>
76*6777b538SAndroid Build Coastguard Worker std::unique_ptr<addrinfo, FreeAddrInfoFunc>
MakeAddrInfoList(const IpAndPort (& ipp)[N],std::string_view canonical_name)77*6777b538SAndroid Build Coastguard Worker MockAddrInfoGetter::MakeAddrInfoList(const IpAndPort (&ipp)[N],
78*6777b538SAndroid Build Coastguard Worker                                      std::string_view canonical_name) {
79*6777b538SAndroid Build Coastguard Worker   struct Buffer {
80*6777b538SAndroid Build Coastguard Worker     addrinfo ai[N];
81*6777b538SAndroid Build Coastguard Worker     sockaddr_in addr[N];
82*6777b538SAndroid Build Coastguard Worker     char canonical_name[256];
83*6777b538SAndroid Build Coastguard Worker   };
84*6777b538SAndroid Build Coastguard Worker 
85*6777b538SAndroid Build Coastguard Worker   CHECK_LE(canonical_name.size(), 255u);
86*6777b538SAndroid Build Coastguard Worker 
87*6777b538SAndroid Build Coastguard Worker   Buffer* const buffer = new Buffer();
88*6777b538SAndroid Build Coastguard Worker   memset(buffer, 0x0, sizeof(Buffer));
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker   // At least one trailing nul byte on buffer->canonical_name was added by
91*6777b538SAndroid Build Coastguard Worker   // memset() above.
92*6777b538SAndroid Build Coastguard Worker   memcpy(buffer->canonical_name, canonical_name.data(), canonical_name.size());
93*6777b538SAndroid Build Coastguard Worker 
94*6777b538SAndroid Build Coastguard Worker   for (size_t i = 0; i < N; ++i) {
95*6777b538SAndroid Build Coastguard Worker     InitializeAddrinfo(ipp[i], buffer->canonical_name,
96*6777b538SAndroid Build Coastguard Worker                        i + 1 < N ? buffer->ai + i + 1 : nullptr,
97*6777b538SAndroid Build Coastguard Worker                        buffer->addr + i, buffer->ai + i);
98*6777b538SAndroid Build Coastguard Worker   }
99*6777b538SAndroid Build Coastguard Worker 
100*6777b538SAndroid Build Coastguard Worker   return {reinterpret_cast<addrinfo*>(buffer),
101*6777b538SAndroid Build Coastguard Worker           [](addrinfo* ai) { delete reinterpret_cast<Buffer*>(ai); }};
102*6777b538SAndroid Build Coastguard Worker }
103*6777b538SAndroid Build Coastguard Worker 
MakeAddrInfo(IpAndPort ipp,std::string_view canonical_name)104*6777b538SAndroid Build Coastguard Worker std::unique_ptr<addrinfo, FreeAddrInfoFunc> MockAddrInfoGetter::MakeAddrInfo(
105*6777b538SAndroid Build Coastguard Worker     IpAndPort ipp,
106*6777b538SAndroid Build Coastguard Worker     std::string_view canonical_name) {
107*6777b538SAndroid Build Coastguard Worker   return MakeAddrInfoList({ipp}, canonical_name);
108*6777b538SAndroid Build Coastguard Worker }
109*6777b538SAndroid Build Coastguard Worker 
InitializeAddrinfo(const IpAndPort & ip_and_port,char * canonical_name,addrinfo * ai_next,sockaddr_in * addr,addrinfo * ai)110*6777b538SAndroid Build Coastguard Worker void MockAddrInfoGetter::InitializeAddrinfo(const IpAndPort& ip_and_port,
111*6777b538SAndroid Build Coastguard Worker                                             char* canonical_name,
112*6777b538SAndroid Build Coastguard Worker                                             addrinfo* ai_next,
113*6777b538SAndroid Build Coastguard Worker                                             sockaddr_in* addr,
114*6777b538SAndroid Build Coastguard Worker                                             addrinfo* ai) {
115*6777b538SAndroid Build Coastguard Worker   const uint8_t ip[4] = {ip_and_port.ip.a, ip_and_port.ip.b, ip_and_port.ip.c,
116*6777b538SAndroid Build Coastguard Worker                          ip_and_port.ip.d};
117*6777b538SAndroid Build Coastguard Worker   memcpy(&addr->sin_addr, ip, 4);
118*6777b538SAndroid Build Coastguard Worker   addr->sin_family = AF_INET;
119*6777b538SAndroid Build Coastguard Worker   addr->sin_port =
120*6777b538SAndroid Build Coastguard Worker       base::HostToNet16(base::checked_cast<uint16_t>(ip_and_port.port));
121*6777b538SAndroid Build Coastguard Worker 
122*6777b538SAndroid Build Coastguard Worker   ai->ai_family = AF_INET;
123*6777b538SAndroid Build Coastguard Worker   ai->ai_socktype = SOCK_STREAM;
124*6777b538SAndroid Build Coastguard Worker   ai->ai_addrlen = sizeof(sockaddr_in);
125*6777b538SAndroid Build Coastguard Worker   ai->ai_addr = reinterpret_cast<sockaddr*>(addr);
126*6777b538SAndroid Build Coastguard Worker   ai->ai_canonname =
127*6777b538SAndroid Build Coastguard Worker       reinterpret_cast<decltype(ai->ai_canonname)>(canonical_name);
128*6777b538SAndroid Build Coastguard Worker   if (ai_next)
129*6777b538SAndroid Build Coastguard Worker     ai->ai_next = ai_next;
130*6777b538SAndroid Build Coastguard Worker }
131*6777b538SAndroid Build Coastguard Worker 
getaddrinfo(const std::string & host,const addrinfo *,int * out_os_error,handles::NetworkHandle)132*6777b538SAndroid Build Coastguard Worker std::unique_ptr<addrinfo, FreeAddrInfoFunc> MockAddrInfoGetter::getaddrinfo(
133*6777b538SAndroid Build Coastguard Worker     const std::string& host,
134*6777b538SAndroid Build Coastguard Worker     const addrinfo* /* hints */,
135*6777b538SAndroid Build Coastguard Worker     int* out_os_error,
136*6777b538SAndroid Build Coastguard Worker     handles::NetworkHandle) {
137*6777b538SAndroid Build Coastguard Worker   // Presume success
138*6777b538SAndroid Build Coastguard Worker   *out_os_error = 0;
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker   if (host == std::string("canonical.bar.com"))
141*6777b538SAndroid Build Coastguard Worker     return MakeAddrInfo({{1, 2, 3, 4}, 80}, "canonical.bar.com");
142*6777b538SAndroid Build Coastguard Worker   else if (host == "iteration.test")
143*6777b538SAndroid Build Coastguard Worker     return MakeAddrInfoList({{{10, 20, 30, 40}, 80},
144*6777b538SAndroid Build Coastguard Worker                              {{11, 21, 31, 41}, 81},
145*6777b538SAndroid Build Coastguard Worker                              {{12, 22, 32, 42}, 82}},
146*6777b538SAndroid Build Coastguard Worker                             "iteration.test");
147*6777b538SAndroid Build Coastguard Worker   else if (host == "alllocalhost.com")
148*6777b538SAndroid Build Coastguard Worker     return MakeAddrInfoList(
149*6777b538SAndroid Build Coastguard Worker         {{{127, 0, 0, 1}, 80}, {{127, 0, 0, 2}, 80}, {{127, 0, 0, 3}, 80}},
150*6777b538SAndroid Build Coastguard Worker         "alllocalhost.com");
151*6777b538SAndroid Build Coastguard Worker   else if (host == "not.alllocalhost.com")
152*6777b538SAndroid Build Coastguard Worker     return MakeAddrInfoList(
153*6777b538SAndroid Build Coastguard Worker         {{{128, 0, 0, 1}, 80}, {{127, 0, 0, 2}, 80}, {{127, 0, 0, 3}, 80}},
154*6777b538SAndroid Build Coastguard Worker         "not.alllocalhost.com");
155*6777b538SAndroid Build Coastguard Worker   else if (host == "www.example.com")
156*6777b538SAndroid Build Coastguard Worker     return MakeAddrInfo({{8, 8, 8, 8}, 80}, "www.example.com");
157*6777b538SAndroid Build Coastguard Worker 
158*6777b538SAndroid Build Coastguard Worker   // Failure
159*6777b538SAndroid Build Coastguard Worker   *out_os_error = 1;
160*6777b538SAndroid Build Coastguard Worker 
161*6777b538SAndroid Build Coastguard Worker   return {nullptr, [](addrinfo*) {}};
162*6777b538SAndroid Build Coastguard Worker }
163*6777b538SAndroid Build Coastguard Worker 
MakeHints(AddressFamily address_family,HostResolverFlags host_resolver_flags)164*6777b538SAndroid Build Coastguard Worker std::unique_ptr<addrinfo> MakeHints(AddressFamily address_family,
165*6777b538SAndroid Build Coastguard Worker                                     HostResolverFlags host_resolver_flags) {
166*6777b538SAndroid Build Coastguard Worker   auto hints = std::make_unique<addrinfo>();
167*6777b538SAndroid Build Coastguard Worker   *hints = {0};
168*6777b538SAndroid Build Coastguard Worker 
169*6777b538SAndroid Build Coastguard Worker   switch (address_family) {
170*6777b538SAndroid Build Coastguard Worker     case ADDRESS_FAMILY_IPV4:
171*6777b538SAndroid Build Coastguard Worker       hints->ai_family = AF_INET;
172*6777b538SAndroid Build Coastguard Worker       break;
173*6777b538SAndroid Build Coastguard Worker     case ADDRESS_FAMILY_IPV6:
174*6777b538SAndroid Build Coastguard Worker       hints->ai_family = AF_INET6;
175*6777b538SAndroid Build Coastguard Worker       break;
176*6777b538SAndroid Build Coastguard Worker     case ADDRESS_FAMILY_UNSPECIFIED:
177*6777b538SAndroid Build Coastguard Worker       hints->ai_family = AF_UNSPEC;
178*6777b538SAndroid Build Coastguard Worker       break;
179*6777b538SAndroid Build Coastguard Worker   }
180*6777b538SAndroid Build Coastguard Worker 
181*6777b538SAndroid Build Coastguard Worker   if (host_resolver_flags & HOST_RESOLVER_CANONNAME)
182*6777b538SAndroid Build Coastguard Worker     hints->ai_flags |= AI_CANONNAME;
183*6777b538SAndroid Build Coastguard Worker 
184*6777b538SAndroid Build Coastguard Worker   hints->ai_socktype = SOCK_STREAM;
185*6777b538SAndroid Build Coastguard Worker 
186*6777b538SAndroid Build Coastguard Worker   return hints;
187*6777b538SAndroid Build Coastguard Worker }
188*6777b538SAndroid Build Coastguard Worker 
TEST(AddressInfoTest,Failure)189*6777b538SAndroid Build Coastguard Worker TEST(AddressInfoTest, Failure) {
190*6777b538SAndroid Build Coastguard Worker   auto getter = std::make_unique<MockAddrInfoGetter>();
191*6777b538SAndroid Build Coastguard Worker   auto [ai, err, os_error] = AddressInfo::Get(
192*6777b538SAndroid Build Coastguard Worker       "failure.com", *MakeHints(ADDRESS_FAMILY_IPV4, HOST_RESOLVER_CANONNAME),
193*6777b538SAndroid Build Coastguard Worker       std::move(getter));
194*6777b538SAndroid Build Coastguard Worker 
195*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ai);
196*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(err, OK);
197*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(os_error, 0);
198*6777b538SAndroid Build Coastguard Worker }
199*6777b538SAndroid Build Coastguard Worker 
200*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
201*6777b538SAndroid Build Coastguard Worker // Note: this test is descriptive, not prescriptive.
TEST(AddressInfoTest,FailureWin)202*6777b538SAndroid Build Coastguard Worker TEST(AddressInfoTest, FailureWin) {
203*6777b538SAndroid Build Coastguard Worker   auto getter = std::make_unique<MockAddrInfoGetter>();
204*6777b538SAndroid Build Coastguard Worker   auto [ai, err, os_error] = AddressInfo::Get(
205*6777b538SAndroid Build Coastguard Worker       "failure.com", *MakeHints(ADDRESS_FAMILY_IPV4, HOST_RESOLVER_CANONNAME),
206*6777b538SAndroid Build Coastguard Worker       std::move(getter));
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ai);
209*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(err, ERR_NAME_RESOLUTION_FAILED);
210*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(os_error, 0);
211*6777b538SAndroid Build Coastguard Worker }
212*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_WIN)
213*6777b538SAndroid Build Coastguard Worker 
214*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
215*6777b538SAndroid Build Coastguard Worker // Note: this test is descriptive, not prescriptive.
TEST(AddressInfoTest,FailureAndroid)216*6777b538SAndroid Build Coastguard Worker TEST(AddressInfoTest, FailureAndroid) {
217*6777b538SAndroid Build Coastguard Worker   auto getter = std::make_unique<MockAddrInfoGetter>();
218*6777b538SAndroid Build Coastguard Worker   auto [ai, err, os_error] = AddressInfo::Get(
219*6777b538SAndroid Build Coastguard Worker       "failure.com", *MakeHints(ADDRESS_FAMILY_IPV4, HOST_RESOLVER_CANONNAME),
220*6777b538SAndroid Build Coastguard Worker       std::move(getter));
221*6777b538SAndroid Build Coastguard Worker 
222*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ai);
223*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(err, ERR_NAME_NOT_RESOLVED);
224*6777b538SAndroid Build Coastguard Worker   EXPECT_NE(os_error, 0);
225*6777b538SAndroid Build Coastguard Worker }
226*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(IS_ANDROID)
227*6777b538SAndroid Build Coastguard Worker 
TEST(AddressInfoTest,Canonical)228*6777b538SAndroid Build Coastguard Worker TEST(AddressInfoTest, Canonical) {
229*6777b538SAndroid Build Coastguard Worker   auto [ai, err, os_error] =
230*6777b538SAndroid Build Coastguard Worker       AddressInfo::Get("canonical.bar.com",
231*6777b538SAndroid Build Coastguard Worker                        *MakeHints(ADDRESS_FAMILY_IPV4, HOST_RESOLVER_CANONNAME),
232*6777b538SAndroid Build Coastguard Worker                        std::make_unique<MockAddrInfoGetter>());
233*6777b538SAndroid Build Coastguard Worker 
234*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ai);
235*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(err, OK);
236*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(os_error, 0);
237*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(ai->GetCanonicalName(),
238*6777b538SAndroid Build Coastguard Worker               std::optional<std::string>("canonical.bar.com"));
239*6777b538SAndroid Build Coastguard Worker }
240*6777b538SAndroid Build Coastguard Worker 
TEST(AddressInfoTest,Iteration)241*6777b538SAndroid Build Coastguard Worker TEST(AddressInfoTest, Iteration) {
242*6777b538SAndroid Build Coastguard Worker   auto [ai, err, os_error] =
243*6777b538SAndroid Build Coastguard Worker       AddressInfo::Get("iteration.test",
244*6777b538SAndroid Build Coastguard Worker                        *MakeHints(ADDRESS_FAMILY_IPV4, HOST_RESOLVER_CANONNAME),
245*6777b538SAndroid Build Coastguard Worker                        std::make_unique<MockAddrInfoGetter>());
246*6777b538SAndroid Build Coastguard Worker 
247*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ai);
248*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(err, OK);
249*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(os_error, 0);
250*6777b538SAndroid Build Coastguard Worker 
251*6777b538SAndroid Build Coastguard Worker   {
252*6777b538SAndroid Build Coastguard Worker     int count = 0;
253*6777b538SAndroid Build Coastguard Worker     for (const auto& addr_info : *ai) {
254*6777b538SAndroid Build Coastguard Worker       const sockaddr_in* addr =
255*6777b538SAndroid Build Coastguard Worker           reinterpret_cast<sockaddr_in*>(addr_info.ai_addr);
256*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(base::HostToNet16(addr->sin_port) % 10, count % 10);
257*6777b538SAndroid Build Coastguard Worker       ++count;
258*6777b538SAndroid Build Coastguard Worker     }
259*6777b538SAndroid Build Coastguard Worker 
260*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(count, 3);
261*6777b538SAndroid Build Coastguard Worker   }
262*6777b538SAndroid Build Coastguard Worker 
263*6777b538SAndroid Build Coastguard Worker   {
264*6777b538SAndroid Build Coastguard Worker     int count = 0;
265*6777b538SAndroid Build Coastguard Worker     for (auto&& aii : ai.value()) {
266*6777b538SAndroid Build Coastguard Worker       const sockaddr_in* addr = reinterpret_cast<sockaddr_in*>(aii.ai_addr);
267*6777b538SAndroid Build Coastguard Worker       EXPECT_EQ(base::HostToNet16(addr->sin_port) % 10, count % 10);
268*6777b538SAndroid Build Coastguard Worker       ++count;
269*6777b538SAndroid Build Coastguard Worker     }
270*6777b538SAndroid Build Coastguard Worker 
271*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(count, 3);
272*6777b538SAndroid Build Coastguard Worker   }
273*6777b538SAndroid Build Coastguard Worker }
274*6777b538SAndroid Build Coastguard Worker 
TEST(AddressInfoTest,IsAllLocalhostOfOneFamily)275*6777b538SAndroid Build Coastguard Worker TEST(AddressInfoTest, IsAllLocalhostOfOneFamily) {
276*6777b538SAndroid Build Coastguard Worker   auto [ai, err, os_error] =
277*6777b538SAndroid Build Coastguard Worker       AddressInfo::Get("alllocalhost.com",
278*6777b538SAndroid Build Coastguard Worker                        *MakeHints(ADDRESS_FAMILY_IPV4, HOST_RESOLVER_CANONNAME),
279*6777b538SAndroid Build Coastguard Worker                        std::make_unique<MockAddrInfoGetter>());
280*6777b538SAndroid Build Coastguard Worker 
281*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ai);
282*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(err, OK);
283*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(os_error, 0);
284*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ai->IsAllLocalhostOfOneFamily());
285*6777b538SAndroid Build Coastguard Worker }
286*6777b538SAndroid Build Coastguard Worker 
TEST(AddressInfoTest,IsAllLocalhostOfOneFamilyFalse)287*6777b538SAndroid Build Coastguard Worker TEST(AddressInfoTest, IsAllLocalhostOfOneFamilyFalse) {
288*6777b538SAndroid Build Coastguard Worker   auto [ai, err, os_error] =
289*6777b538SAndroid Build Coastguard Worker       AddressInfo::Get("not.alllocalhost.com",
290*6777b538SAndroid Build Coastguard Worker                        *MakeHints(ADDRESS_FAMILY_IPV4, HOST_RESOLVER_CANONNAME),
291*6777b538SAndroid Build Coastguard Worker                        std::make_unique<MockAddrInfoGetter>());
292*6777b538SAndroid Build Coastguard Worker 
293*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ai);
294*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(err, OK);
295*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(os_error, 0);
296*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(ai->IsAllLocalhostOfOneFamily());
297*6777b538SAndroid Build Coastguard Worker }
298*6777b538SAndroid Build Coastguard Worker 
TEST(AddressInfoTest,CreateAddressList)299*6777b538SAndroid Build Coastguard Worker TEST(AddressInfoTest, CreateAddressList) {
300*6777b538SAndroid Build Coastguard Worker   auto [ai, err, os_error] =
301*6777b538SAndroid Build Coastguard Worker       AddressInfo::Get("www.example.com",
302*6777b538SAndroid Build Coastguard Worker                        *MakeHints(ADDRESS_FAMILY_IPV4, HOST_RESOLVER_CANONNAME),
303*6777b538SAndroid Build Coastguard Worker                        std::make_unique<MockAddrInfoGetter>());
304*6777b538SAndroid Build Coastguard Worker 
305*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(ai);
306*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(err, OK);
307*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(os_error, 0);
308*6777b538SAndroid Build Coastguard Worker 
309*6777b538SAndroid Build Coastguard Worker   AddressList list = ai->CreateAddressList();
310*6777b538SAndroid Build Coastguard Worker 
311*6777b538SAndroid Build Coastguard Worker   // Verify one result.
312*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(1u, list.size());
313*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(ADDRESS_FAMILY_IPV4, list[0].GetFamily());
314*6777b538SAndroid Build Coastguard Worker 
315*6777b538SAndroid Build Coastguard Worker   // Check if operator= works.
316*6777b538SAndroid Build Coastguard Worker   AddressList copy;
317*6777b538SAndroid Build Coastguard Worker   copy = list;
318*6777b538SAndroid Build Coastguard Worker   ASSERT_EQ(1u, copy.size());
319*6777b538SAndroid Build Coastguard Worker }
320*6777b538SAndroid Build Coastguard Worker 
321*6777b538SAndroid Build Coastguard Worker }  // namespace
322*6777b538SAndroid Build Coastguard Worker }  // namespace net
323