12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/dns_session.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list>
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/rand_util.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_log.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/dns_protocol.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/dns_socket_pool.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/socket/socket_test_util.h"
173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/socket/ssl_client_socket.h"
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "net/socket/stream_socket.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class TestClientSocketFactory : public ClientSocketFactory {
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~TestClientSocketFactory();
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual scoped_ptr<DatagramClientSocket> CreateDatagramClientSocket(
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DatagramSocket::BindType bind_type,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const RandIntCallback& rand_int_cb,
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      net::NetLog* net_log,
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const net::NetLog::Source& source) OVERRIDE;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual scoped_ptr<StreamSocket> CreateTransportClientSocket(
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const AddressList& addresses,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetLog*, const NetLog::Source&) OVERRIDE {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTIMPLEMENTED();
393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return scoped_ptr<StreamSocket>();
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  virtual scoped_ptr<SSLClientSocket> CreateSSLClientSocket(
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      scoped_ptr<ClientSocketHandle> transport_socket,
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const HostPortPair& host_and_port,
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const SSLConfig& ssl_config,
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const SSLClientSocketContext& context) OVERRIDE {
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTIMPLEMENTED();
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    return scoped_ptr<SSLClientSocket>();
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ClearSSLSessionCache() OVERRIDE {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTIMPLEMENTED();
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::list<SocketDataProvider*> data_providers_;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct PoolEvent {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum { ALLOCATE, FREE } action;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unsigned server_index;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DnsSessionTest : public testing::Test {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnSocketAllocated(unsigned server_index);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void OnSocketFreed(unsigned server_index);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Initialize(unsigned num_servers);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DnsSession::SocketLease> Allocate(unsigned server_index);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool DidAllocate(unsigned server_index);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool DidFree(unsigned server_index);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool NoMoreEvents();
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DnsConfig config_;
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TestClientSocketFactory> test_client_socket_factory_;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<DnsSession> session_;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetLog::Source source_;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool ExpectEvent(const PoolEvent& event);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::list<PoolEvent> events_;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockDnsSocketPool : public DnsSocketPool {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockDnsSocketPool(ClientSocketFactory* factory, DnsSessionTest* test)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)     : DnsSocketPool(factory), test_(test) { }
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockDnsSocketPool() { }
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Initialize(
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::vector<IPEndPoint>* nameservers,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NetLog* net_log) OVERRIDE {
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InitializeInternal(nameservers, net_log);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_ptr<DatagramClientSocket> AllocateSocket(
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      unsigned server_index) OVERRIDE {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_->OnSocketAllocated(server_index);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return CreateConnectedSocket(server_index);
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void FreeSocket(
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      unsigned server_index,
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<DatagramClientSocket> socket) OVERRIDE {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    test_->OnSocketFreed(server_index);
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DnsSessionTest* test_;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DnsSessionTest::Initialize(unsigned num_servers) {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(num_servers < 256u);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  config_.nameservers.clear();
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IPAddressNumber dns_ip;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool rv = ParseIPLiteralToNumber("192.168.1.0", &dns_ip);
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(rv);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (unsigned char i = 0; i < num_servers; ++i) {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    dns_ip[3] = i;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IPEndPoint dns_endpoint(dns_ip, dns_protocol::kDefaultPort);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    config_.nameservers.push_back(dns_endpoint);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test_client_socket_factory_.reset(new TestClientSocketFactory());
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DnsSocketPool* dns_socket_pool =
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new MockDnsSocketPool(test_client_socket_factory_.get(), this);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  session_ = new DnsSession(config_,
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            scoped_ptr<DnsSocketPool>(dns_socket_pool),
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            base::Bind(&base::RandInt),
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            NULL /* NetLog */);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  events_.clear();
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<DnsSession::SocketLease> DnsSessionTest::Allocate(
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned server_index) {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return session_->AllocateSocket(server_index, source_);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DnsSessionTest::DidAllocate(unsigned server_index) {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PoolEvent expected_event = { PoolEvent::ALLOCATE, server_index };
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ExpectEvent(expected_event);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DnsSessionTest::DidFree(unsigned server_index) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PoolEvent expected_event = { PoolEvent::FREE, server_index };
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ExpectEvent(expected_event);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DnsSessionTest::NoMoreEvents() {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return events_.empty();
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DnsSessionTest::OnSocketAllocated(unsigned server_index) {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PoolEvent event = { PoolEvent::ALLOCATE, server_index };
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  events_.push_back(event);
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DnsSessionTest::OnSocketFreed(unsigned server_index) {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PoolEvent event = { PoolEvent::FREE, server_index };
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  events_.push_back(event);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool DnsSessionTest::ExpectEvent(const PoolEvent& expected) {
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (events_.empty()) {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const PoolEvent actual = events_.front();
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((expected.action != actual.action)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      || (expected.server_index != actual.server_index)) {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  events_.pop_front();
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return true;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)scoped_ptr<DatagramClientSocket>
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TestClientSocketFactory::CreateDatagramClientSocket(
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DatagramSocket::BindType bind_type,
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const RandIntCallback& rand_int_cb,
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    net::NetLog* net_log,
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const net::NetLog::Source& source) {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We're not actually expecting to send or receive any data, so use the
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // simplest SocketDataProvider with no data supplied.
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SocketDataProvider* data_provider = new StaticSocketDataProvider();
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  data_providers_.push_back(data_provider);
1943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<MockUDPClientSocket> socket(
1953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      new MockUDPClientSocket(data_provider, net_log));
1963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  data_provider->set_socket(socket.get());
1973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return socket.PassAs<DatagramClientSocket>();
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TestClientSocketFactory::~TestClientSocketFactory() {
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  STLDeleteElements(&data_providers_);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DnsSessionTest, AllocateFree) {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DnsSession::SocketLease> lease1, lease2;
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Initialize(2);
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(NoMoreEvents());
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lease1 = Allocate(0);
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DidAllocate(0));
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(NoMoreEvents());
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lease2 = Allocate(1);
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DidAllocate(1));
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(NoMoreEvents());
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lease1.reset();
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DidFree(0));
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(NoMoreEvents());
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  lease2.reset();
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(DidFree(1));
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(NoMoreEvents());
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
227558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Expect default calculated timeout to be within 10ms of in DnsConfig.
228558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(DnsSessionTest, HistogramTimeoutNormal) {
229558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  Initialize(2);
230558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::TimeDelta timeoutDelta = session_->NextTimeout(0, 0) - config_.timeout;
231558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_LT(timeoutDelta.InMilliseconds(), 10);
232558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
233558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
234558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Expect short calculated timeout to be within 10ms of in DnsConfig.
235558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(DnsSessionTest, HistogramTimeoutShort) {
236558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  config_.timeout = base::TimeDelta::FromMilliseconds(15);
237558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  Initialize(2);
238558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::TimeDelta timeoutDelta = session_->NextTimeout(0, 0) - config_.timeout;
239558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_LT(timeoutDelta.InMilliseconds(), 10);
240558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
241558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
242558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch// Expect long calculated timeout to be equal to one in DnsConfig.
243558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(DnsSessionTest, HistogramTimeoutLong) {
244558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  config_.timeout = base::TimeDelta::FromSeconds(15);
245558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  Initialize(2);
246558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  base::TimeDelta timeout = session_->NextTimeout(0, 0);
247558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(config_.timeout.InMilliseconds(), timeout.InMilliseconds());
248558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
249558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
250558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}  // namespace
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net
253