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