OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/dns/host_resolver_mojo.h" | 5 #include "net/dns/host_resolver_mojo.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
11 #include "mojo/public/cpp/bindings/binding.h" | 11 #include "mojo/public/cpp/bindings/binding.h" |
12 #include "net/base/address_list.h" | 12 #include "net/base/address_list.h" |
13 #include "net/base/ip_address.h" | 13 #include "net/base/ip_address.h" |
14 #include "net/base/net_errors.h" | 14 #include "net/base/net_errors.h" |
15 #include "net/base/request_priority.h" | 15 #include "net/base/request_priority.h" |
16 #include "net/base/test_completion_callback.h" | 16 #include "net/base/test_completion_callback.h" |
17 #include "net/dns/mojo_host_type_converters.h" | |
18 #include "net/test/event_waiter.h" | 17 #include "net/test/event_waiter.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
20 | 19 |
21 namespace net { | 20 namespace net { |
22 namespace { | 21 namespace { |
23 | 22 |
24 void Fail(int result) { | 23 void Fail(int result) { |
25 FAIL() << "Unexpected callback called with error " << result; | 24 FAIL() << "Unexpected callback called with error " << result; |
26 } | 25 } |
27 | 26 |
(...skipping 20 matching lines...) Expand all Loading... |
48 error_callback_.Run(); | 47 error_callback_.Run(); |
49 } | 48 } |
50 | 49 |
51 struct HostResolverAction { | 50 struct HostResolverAction { |
52 enum Action { | 51 enum Action { |
53 COMPLETE, | 52 COMPLETE, |
54 DROP, | 53 DROP, |
55 RETAIN, | 54 RETAIN, |
56 }; | 55 }; |
57 | 56 |
58 static std::unique_ptr<HostResolverAction> ReturnError(Error error) { | 57 static HostResolverAction ReturnError(Error error) { |
59 std::unique_ptr<HostResolverAction> result(new HostResolverAction); | 58 HostResolverAction result; |
60 result->error = error; | 59 result.error = error; |
61 return result; | 60 return result; |
62 } | 61 } |
63 | 62 |
64 static std::unique_ptr<HostResolverAction> ReturnResult( | 63 static HostResolverAction ReturnResult(const AddressList& address_list) { |
65 const AddressList& address_list) { | 64 HostResolverAction result; |
66 std::unique_ptr<HostResolverAction> result(new HostResolverAction); | 65 result.addresses = address_list; |
67 result->addresses = interfaces::AddressList::From(address_list); | |
68 return result; | 66 return result; |
69 } | 67 } |
70 | 68 |
71 static std::unique_ptr<HostResolverAction> DropRequest() { | 69 static HostResolverAction DropRequest() { |
72 std::unique_ptr<HostResolverAction> result(new HostResolverAction); | 70 HostResolverAction result; |
73 result->action = DROP; | 71 result.action = DROP; |
74 return result; | 72 return result; |
75 } | 73 } |
76 | 74 |
77 static std::unique_ptr<HostResolverAction> RetainRequest() { | 75 static HostResolverAction RetainRequest() { |
78 std::unique_ptr<HostResolverAction> result(new HostResolverAction); | 76 HostResolverAction result; |
79 result->action = RETAIN; | 77 result.action = RETAIN; |
80 return result; | 78 return result; |
81 } | 79 } |
82 | 80 |
83 Action action = COMPLETE; | 81 Action action = COMPLETE; |
84 interfaces::AddressListPtr addresses; | 82 AddressList addresses; |
85 Error error = OK; | 83 Error error = OK; |
86 }; | 84 }; |
87 | 85 |
88 class MockMojoHostResolver : public HostResolverMojo::Impl { | 86 class MockMojoHostResolver : public HostResolverMojo::Impl { |
89 public: | 87 public: |
90 explicit MockMojoHostResolver( | 88 explicit MockMojoHostResolver( |
91 const base::Closure& request_connection_error_callback); | 89 const base::Closure& request_connection_error_callback); |
92 ~MockMojoHostResolver() override; | 90 ~MockMojoHostResolver() override; |
93 | 91 |
94 void AddAction(std::unique_ptr<HostResolverAction> action); | 92 void AddAction(HostResolverAction action); |
95 | 93 |
96 const mojo::Array<interfaces::HostResolverRequestInfoPtr>& requests() { | 94 const std::vector<HostResolver::RequestInfo>& requests() { |
97 return requests_received_; | 95 return requests_received_; |
98 } | 96 } |
99 | 97 |
100 void ResolveDns(interfaces::HostResolverRequestInfoPtr request_info, | 98 void ResolveDns(std::unique_ptr<HostResolver::RequestInfo> request_info, |
101 interfaces::HostResolverRequestClientPtr client) override; | 99 interfaces::HostResolverRequestClientPtr client) override; |
102 | 100 |
103 private: | 101 private: |
104 std::vector<std::unique_ptr<HostResolverAction>> actions_; | 102 std::vector<HostResolverAction> actions_; |
105 size_t results_returned_ = 0; | 103 size_t results_returned_ = 0; |
106 mojo::Array<interfaces::HostResolverRequestInfoPtr> requests_received_; | 104 std::vector<HostResolver::RequestInfo> requests_received_; |
107 const base::Closure request_connection_error_callback_; | 105 const base::Closure request_connection_error_callback_; |
108 std::vector<std::unique_ptr<MockMojoHostResolverRequest>> requests_; | 106 std::vector<std::unique_ptr<MockMojoHostResolverRequest>> requests_; |
109 }; | 107 }; |
110 | 108 |
111 MockMojoHostResolver::MockMojoHostResolver( | 109 MockMojoHostResolver::MockMojoHostResolver( |
112 const base::Closure& request_connection_error_callback) | 110 const base::Closure& request_connection_error_callback) |
113 : request_connection_error_callback_(request_connection_error_callback) { | 111 : request_connection_error_callback_(request_connection_error_callback) { |
114 } | 112 } |
115 | 113 |
116 MockMojoHostResolver::~MockMojoHostResolver() { | 114 MockMojoHostResolver::~MockMojoHostResolver() { |
117 EXPECT_EQ(results_returned_, actions_.size()); | 115 EXPECT_EQ(results_returned_, actions_.size()); |
118 } | 116 } |
119 | 117 |
120 void MockMojoHostResolver::AddAction( | 118 void MockMojoHostResolver::AddAction(HostResolverAction action) { |
121 std::unique_ptr<HostResolverAction> action) { | |
122 actions_.push_back(std::move(action)); | 119 actions_.push_back(std::move(action)); |
123 } | 120 } |
124 | 121 |
125 void MockMojoHostResolver::ResolveDns( | 122 void MockMojoHostResolver::ResolveDns( |
126 interfaces::HostResolverRequestInfoPtr request_info, | 123 std::unique_ptr<HostResolver::RequestInfo> request_info, |
127 interfaces::HostResolverRequestClientPtr client) { | 124 interfaces::HostResolverRequestClientPtr client) { |
128 requests_received_.push_back(std::move(request_info)); | 125 requests_received_.push_back(std::move(*request_info)); |
129 ASSERT_LE(results_returned_, actions_.size()); | 126 ASSERT_LE(results_returned_, actions_.size()); |
130 switch (actions_[results_returned_]->action) { | 127 switch (actions_[results_returned_].action) { |
131 case HostResolverAction::COMPLETE: | 128 case HostResolverAction::COMPLETE: |
132 client->ReportResult(actions_[results_returned_]->error, | 129 client->ReportResult(actions_[results_returned_].error, |
133 std::move(actions_[results_returned_]->addresses)); | 130 std::move(actions_[results_returned_].addresses)); |
134 break; | 131 break; |
135 case HostResolverAction::RETAIN: | 132 case HostResolverAction::RETAIN: |
136 requests_.push_back(base::WrapUnique(new MockMojoHostResolverRequest( | 133 requests_.push_back(base::WrapUnique(new MockMojoHostResolverRequest( |
137 std::move(client), request_connection_error_callback_))); | 134 std::move(client), request_connection_error_callback_))); |
138 break; | 135 break; |
139 case HostResolverAction::DROP: | 136 case HostResolverAction::DROP: |
140 client.reset(); | 137 client.reset(); |
141 break; | 138 break; |
142 } | 139 } |
143 results_returned_++; | 140 results_returned_++; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 mock_resolver_->AddAction(HostResolverAction::ReturnResult(address_list)); | 181 mock_resolver_->AddAction(HostResolverAction::ReturnResult(address_list)); |
185 HostResolver::RequestInfo request_info( | 182 HostResolver::RequestInfo request_info( |
186 HostPortPair::FromString("example.com:12345")); | 183 HostPortPair::FromString("example.com:12345")); |
187 AddressList result; | 184 AddressList result; |
188 EXPECT_EQ(OK, Resolve(request_info, &result)); | 185 EXPECT_EQ(OK, Resolve(request_info, &result)); |
189 ASSERT_EQ(2u, result.size()); | 186 ASSERT_EQ(2u, result.size()); |
190 EXPECT_EQ(address_list[0], result[0]); | 187 EXPECT_EQ(address_list[0], result[0]); |
191 EXPECT_EQ(address_list[1], result[1]); | 188 EXPECT_EQ(address_list[1], result[1]); |
192 | 189 |
193 ASSERT_EQ(1u, mock_resolver_->requests().size()); | 190 ASSERT_EQ(1u, mock_resolver_->requests().size()); |
194 interfaces::HostResolverRequestInfo& request = *mock_resolver_->requests()[0]; | 191 const HostResolver::RequestInfo& request = mock_resolver_->requests()[0]; |
195 EXPECT_EQ("example.com", request.host.To<std::string>()); | 192 EXPECT_EQ("example.com", request.hostname()); |
196 EXPECT_EQ(12345, request.port); | 193 EXPECT_EQ(12345, request.port()); |
197 EXPECT_EQ(interfaces::AddressFamily::UNSPECIFIED, request.address_family); | 194 EXPECT_EQ(ADDRESS_FAMILY_UNSPECIFIED, request.address_family()); |
198 EXPECT_FALSE(request.is_my_ip_address); | 195 EXPECT_FALSE(request.is_my_ip_address()); |
199 } | 196 } |
200 | 197 |
201 TEST_F(HostResolverMojoTest, ResolveCachedResult) { | 198 TEST_F(HostResolverMojoTest, ResolveCachedResult) { |
202 AddressList address_list; | 199 AddressList address_list; |
203 IPAddress address(1, 2, 3, 4); | 200 IPAddress address(1, 2, 3, 4); |
204 address_list.push_back(IPEndPoint(address, 12345)); | 201 address_list.push_back(IPEndPoint(address, 12345)); |
205 address_list.push_back( | 202 address_list.push_back( |
206 IPEndPoint(ConvertIPv4ToIPv4MappedIPv6(address), 12345)); | 203 IPEndPoint(ConvertIPv4ToIPv4MappedIPv6(address), 12345)); |
207 mock_resolver_->AddAction(HostResolverAction::ReturnResult(address_list)); | 204 mock_resolver_->AddAction(HostResolverAction::ReturnResult(address_list)); |
208 HostResolver::RequestInfo request_info( | 205 HostResolver::RequestInfo request_info( |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 resolver_->Resolve(request_info2, DEFAULT_PRIORITY, &result2, | 258 resolver_->Resolve(request_info2, DEFAULT_PRIORITY, &result2, |
262 callback2.callback(), &request_handle2, | 259 callback2.callback(), &request_handle2, |
263 BoundNetLog())); | 260 BoundNetLog())); |
264 EXPECT_EQ(OK, callback1.GetResult(ERR_IO_PENDING)); | 261 EXPECT_EQ(OK, callback1.GetResult(ERR_IO_PENDING)); |
265 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback2.GetResult(ERR_IO_PENDING)); | 262 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback2.GetResult(ERR_IO_PENDING)); |
266 ASSERT_EQ(1u, result1.size()); | 263 ASSERT_EQ(1u, result1.size()); |
267 EXPECT_EQ(address_list[0], result1[0]); | 264 EXPECT_EQ(address_list[0], result1[0]); |
268 ASSERT_EQ(0u, result2.size()); | 265 ASSERT_EQ(0u, result2.size()); |
269 | 266 |
270 ASSERT_EQ(2u, mock_resolver_->requests().size()); | 267 ASSERT_EQ(2u, mock_resolver_->requests().size()); |
271 interfaces::HostResolverRequestInfo& request1 = | 268 const HostResolver::RequestInfo& request1 = mock_resolver_->requests()[0]; |
272 *mock_resolver_->requests()[0]; | 269 EXPECT_EQ("example.com", request1.hostname()); |
273 EXPECT_EQ("example.com", request1.host.To<std::string>()); | 270 EXPECT_EQ(12345, request1.port()); |
274 EXPECT_EQ(12345, request1.port); | 271 EXPECT_EQ(ADDRESS_FAMILY_IPV4, request1.address_family()); |
275 EXPECT_EQ(interfaces::AddressFamily::IPV4, request1.address_family); | 272 EXPECT_TRUE(request1.is_my_ip_address()); |
276 EXPECT_TRUE(request1.is_my_ip_address); | 273 const HostResolver::RequestInfo& request2 = mock_resolver_->requests()[1]; |
277 interfaces::HostResolverRequestInfo& request2 = | 274 EXPECT_EQ("example.org", request2.hostname()); |
278 *mock_resolver_->requests()[1]; | 275 EXPECT_EQ(80, request2.port()); |
279 EXPECT_EQ("example.org", request2.host.To<std::string>()); | 276 EXPECT_EQ(ADDRESS_FAMILY_IPV6, request2.address_family()); |
280 EXPECT_EQ(80, request2.port); | 277 EXPECT_FALSE(request2.is_my_ip_address()); |
281 EXPECT_EQ(interfaces::AddressFamily::IPV6, request2.address_family); | |
282 EXPECT_FALSE(request2.is_my_ip_address); | |
283 } | 278 } |
284 | 279 |
285 TEST_F(HostResolverMojoTest, Error) { | 280 TEST_F(HostResolverMojoTest, Error) { |
286 mock_resolver_->AddAction( | 281 mock_resolver_->AddAction( |
287 HostResolverAction::ReturnError(ERR_NAME_NOT_RESOLVED)); | 282 HostResolverAction::ReturnError(ERR_NAME_NOT_RESOLVED)); |
288 HostResolver::RequestInfo request_info( | 283 HostResolver::RequestInfo request_info( |
289 HostPortPair::FromString("example.com:8080")); | 284 HostPortPair::FromString("example.com:8080")); |
290 request_info.set_address_family(ADDRESS_FAMILY_IPV4); | 285 request_info.set_address_family(ADDRESS_FAMILY_IPV4); |
291 AddressList result; | 286 AddressList result; |
292 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, Resolve(request_info, &result)); | 287 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, Resolve(request_info, &result)); |
293 EXPECT_TRUE(result.empty()); | 288 EXPECT_TRUE(result.empty()); |
294 | 289 |
295 ASSERT_EQ(1u, mock_resolver_->requests().size()); | 290 ASSERT_EQ(1u, mock_resolver_->requests().size()); |
296 interfaces::HostResolverRequestInfo& request = *mock_resolver_->requests()[0]; | 291 const HostResolver::RequestInfo& request = mock_resolver_->requests()[0]; |
297 EXPECT_EQ("example.com", request.host.To<std::string>()); | 292 EXPECT_EQ("example.com", request.hostname()); |
298 EXPECT_EQ(8080, request.port); | 293 EXPECT_EQ(8080, request.port()); |
299 EXPECT_EQ(interfaces::AddressFamily::IPV4, request.address_family); | 294 EXPECT_EQ(ADDRESS_FAMILY_IPV4, request.address_family()); |
300 EXPECT_FALSE(request.is_my_ip_address); | 295 EXPECT_FALSE(request.is_my_ip_address()); |
301 } | 296 } |
302 | 297 |
303 TEST_F(HostResolverMojoTest, EmptyResult) { | 298 TEST_F(HostResolverMojoTest, EmptyResult) { |
304 mock_resolver_->AddAction(HostResolverAction::ReturnError(OK)); | 299 mock_resolver_->AddAction(HostResolverAction::ReturnError(OK)); |
305 HostResolver::RequestInfo request_info( | 300 HostResolver::RequestInfo request_info( |
306 HostPortPair::FromString("example.com:8080")); | 301 HostPortPair::FromString("example.com:8080")); |
307 AddressList result; | 302 AddressList result; |
308 EXPECT_EQ(OK, Resolve(request_info, &result)); | 303 EXPECT_EQ(OK, Resolve(request_info, &result)); |
309 EXPECT_TRUE(result.empty()); | 304 EXPECT_TRUE(result.empty()); |
310 | 305 |
311 ASSERT_EQ(1u, mock_resolver_->requests().size()); | 306 ASSERT_EQ(1u, mock_resolver_->requests().size()); |
312 } | 307 } |
313 | 308 |
314 TEST_F(HostResolverMojoTest, Cancel) { | 309 TEST_F(HostResolverMojoTest, Cancel) { |
315 mock_resolver_->AddAction(HostResolverAction::RetainRequest()); | 310 mock_resolver_->AddAction(HostResolverAction::RetainRequest()); |
316 HostResolver::RequestInfo request_info( | 311 HostResolver::RequestInfo request_info( |
317 HostPortPair::FromString("example.com:80")); | 312 HostPortPair::FromString("example.com:80")); |
318 request_info.set_address_family(ADDRESS_FAMILY_IPV6); | 313 request_info.set_address_family(ADDRESS_FAMILY_IPV6); |
319 AddressList result; | 314 AddressList result; |
320 HostResolver::RequestHandle request_handle = nullptr; | 315 HostResolver::RequestHandle request_handle = nullptr; |
321 resolver_->Resolve(request_info, DEFAULT_PRIORITY, &result, base::Bind(&Fail), | 316 resolver_->Resolve(request_info, DEFAULT_PRIORITY, &result, base::Bind(&Fail), |
322 &request_handle, BoundNetLog()); | 317 &request_handle, BoundNetLog()); |
323 resolver_->CancelRequest(request_handle); | 318 resolver_->CancelRequest(request_handle); |
324 waiter_.WaitForEvent(ConnectionErrorSource::REQUEST); | 319 waiter_.WaitForEvent(ConnectionErrorSource::REQUEST); |
325 EXPECT_TRUE(result.empty()); | 320 EXPECT_TRUE(result.empty()); |
326 | 321 |
327 ASSERT_EQ(1u, mock_resolver_->requests().size()); | 322 ASSERT_EQ(1u, mock_resolver_->requests().size()); |
328 interfaces::HostResolverRequestInfo& request = *mock_resolver_->requests()[0]; | 323 const HostResolver::RequestInfo& request = mock_resolver_->requests()[0]; |
329 EXPECT_EQ("example.com", request.host.To<std::string>()); | 324 EXPECT_EQ("example.com", request.hostname()); |
330 EXPECT_EQ(80, request.port); | 325 EXPECT_EQ(80, request.port()); |
331 EXPECT_EQ(interfaces::AddressFamily::IPV6, request.address_family); | 326 EXPECT_EQ(ADDRESS_FAMILY_IPV6, request.address_family()); |
332 EXPECT_FALSE(request.is_my_ip_address); | 327 EXPECT_FALSE(request.is_my_ip_address()); |
333 } | 328 } |
334 | 329 |
335 TEST_F(HostResolverMojoTest, ImplDropsClientConnection) { | 330 TEST_F(HostResolverMojoTest, ImplDropsClientConnection) { |
336 mock_resolver_->AddAction(HostResolverAction::DropRequest()); | 331 mock_resolver_->AddAction(HostResolverAction::DropRequest()); |
337 HostResolver::RequestInfo request_info( | 332 HostResolver::RequestInfo request_info( |
338 HostPortPair::FromString("example.com:1")); | 333 HostPortPair::FromString("example.com:1")); |
339 AddressList result; | 334 AddressList result; |
340 EXPECT_EQ(ERR_FAILED, Resolve(request_info, &result)); | 335 EXPECT_EQ(ERR_FAILED, Resolve(request_info, &result)); |
341 EXPECT_TRUE(result.empty()); | 336 EXPECT_TRUE(result.empty()); |
342 | 337 |
343 ASSERT_EQ(1u, mock_resolver_->requests().size()); | 338 ASSERT_EQ(1u, mock_resolver_->requests().size()); |
344 interfaces::HostResolverRequestInfo& request = *mock_resolver_->requests()[0]; | 339 const HostResolver::RequestInfo& request = mock_resolver_->requests()[0]; |
345 EXPECT_EQ("example.com", request.host.To<std::string>()); | 340 EXPECT_EQ("example.com", request.hostname()); |
346 EXPECT_EQ(1, request.port); | 341 EXPECT_EQ(1, request.port()); |
347 EXPECT_EQ(interfaces::AddressFamily::UNSPECIFIED, request.address_family); | 342 EXPECT_EQ(ADDRESS_FAMILY_UNSPECIFIED, request.address_family()); |
348 EXPECT_FALSE(request.is_my_ip_address); | 343 EXPECT_FALSE(request.is_my_ip_address()); |
349 } | 344 } |
350 | 345 |
351 TEST_F(HostResolverMojoTest, ResolveFromCache_Miss) { | 346 TEST_F(HostResolverMojoTest, ResolveFromCache_Miss) { |
352 HostResolver::RequestInfo request_info( | 347 HostResolver::RequestInfo request_info( |
353 HostPortPair::FromString("example.com:8080")); | 348 HostPortPair::FromString("example.com:8080")); |
354 AddressList result; | 349 AddressList result; |
355 EXPECT_EQ(ERR_DNS_CACHE_MISS, | 350 EXPECT_EQ(ERR_DNS_CACHE_MISS, |
356 resolver_->ResolveFromCache(request_info, &result, BoundNetLog())); | 351 resolver_->ResolveFromCache(request_info, &result, BoundNetLog())); |
357 EXPECT_TRUE(result.empty()); | 352 EXPECT_TRUE(result.empty()); |
358 } | 353 } |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 EXPECT_EQ(ERR_DNS_CACHE_MISS, | 392 EXPECT_EQ(ERR_DNS_CACHE_MISS, |
398 resolver_->ResolveFromCache(request_info, &result, BoundNetLog())); | 393 resolver_->ResolveFromCache(request_info, &result, BoundNetLog())); |
399 EXPECT_TRUE(result.empty()); | 394 EXPECT_TRUE(result.empty()); |
400 } | 395 } |
401 | 396 |
402 TEST_F(HostResolverMojoTest, GetHostCache) { | 397 TEST_F(HostResolverMojoTest, GetHostCache) { |
403 EXPECT_TRUE(resolver_->GetHostCache()); | 398 EXPECT_TRUE(resolver_->GetHostCache()); |
404 } | 399 } |
405 | 400 |
406 } // namespace net | 401 } // namespace net |
OLD | NEW |