15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/single_request_host_resolver.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/address_list.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class used by SingleRequestHostResolverTest.Cancel test. 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It checks that only one request is outstanding at a time, and that 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it is cancelled before the class is destroyed. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HangingHostResolver : public HostResolver { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HangingHostResolver() : outstanding_request_(NULL) {} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~HangingHostResolver() { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(!has_outstanding_request()); 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_outstanding_request() const { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return outstanding_request_ != NULL; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int Resolve(const RequestInfo& info, 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) RequestPriority priority, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddressList* addresses, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestHandle* out_req, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BoundNetLog& net_log) OVERRIDE { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(has_outstanding_request()); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outstanding_request_ = reinterpret_cast<RequestHandle>(0x1234); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out_req = outstanding_request_; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Never complete this request! Caller is expected to cancel it 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before destroying the resolver. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_IO_PENDING; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int ResolveFromCache(const RequestInfo& info, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddressList* addresses, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BoundNetLog& net_log) OVERRIDE { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ERR_UNEXPECTED; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CancelRequest(RequestHandle req) OVERRIDE { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(has_outstanding_request()); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(req, outstanding_request_); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) outstanding_request_ = NULL; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RequestHandle outstanding_request_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HangingHostResolver); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that a regular end-to-end lookup returns the expected result. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SingleRequestHostResolverTest, NormalResolve) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a host resolver dependency that returns address "199.188.1.166" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for resolutions of "watsup". 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockHostResolver resolver; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) resolver.rules()->AddIPLiteralRule("watsup", "199.188.1.166", std::string()); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SingleRequestHostResolver single_request_resolver(&resolver); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resolve "watsup:90" using our SingleRequestHostResolver. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddressList addrlist; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostResolver::RequestInfo request(HostPortPair("watsup", 90)); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rv = single_request_resolver.Resolve( 813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) request, DEFAULT_PRIORITY, &addrlist, callback.callback(), BoundNetLog()); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(OK, callback.WaitForResult()); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the result is what we specified in the MockHostResolver. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(addrlist.empty()); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("199.188.1.166", addrlist.front().ToStringWithoutPort()); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the Cancel() method cancels any outstanding request. 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SingleRequestHostResolverTest, Cancel) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HangingHostResolver resolver; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SingleRequestHostResolver single_request_resolver(&resolver); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Resolve "watsup:90" using our SingleRequestHostResolver. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddressList addrlist; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HostResolver::RequestInfo request(HostPortPair("watsup", 90)); 1013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int rv = single_request_resolver.Resolve(request, 1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DEFAULT_PRIORITY, 1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) &addrlist, 1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) callback.callback(), 1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) BoundNetLog()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ERR_IO_PENDING, rv); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(resolver.has_outstanding_request()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now that the SingleRequestHostResolver has been destroyed, the 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in-progress request should have been aborted. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(resolver.has_outstanding_request()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that the Cancel() method is a no-op when there is no outstanding 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// request. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SingleRequestHostResolverTest, CancelWhileNoPendingRequest) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HangingHostResolver resolver; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SingleRequestHostResolver single_request_resolver(&resolver); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) single_request_resolver.Cancel(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To pass, HangingHostResolver should not have received a cancellation 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // request (since there is nothing to cancel). If it does, it will crash. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 129