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