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