| Index: net/dns/dns_transaction_unittest.cc
|
| diff --git a/net/dns/dns_transaction_unittest.cc b/net/dns/dns_transaction_unittest.cc
|
| index a99f55b35b0eba8e5406522646e99a722a8067cc..27f9bd157f311123132f81b55f7ca15c57dd30b3 100644
|
| --- a/net/dns/dns_transaction_unittest.cc
|
| +++ b/net/dns/dns_transaction_unittest.cc
|
| @@ -8,6 +8,11 @@
|
| #include <vector>
|
|
|
| #include "base/bind.h"
|
| +#include "base/time.h"
|
| +#include "net/dns/dns_protocol.h"
|
| +#include "net/dns/dns_query.h"
|
| +#include "net/dns/dns_response.h"
|
| +#include "net/dns/dns_session.h"
|
| #include "net/dns/dns_test_util.h"
|
| #include "net/socket/socket_test_util.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| @@ -16,43 +21,68 @@ namespace net {
|
|
|
| namespace {
|
|
|
| -static const base::TimeDelta kTimeoutsMs[] = {
|
| - base::TimeDelta::FromMilliseconds(20),
|
| - base::TimeDelta::FromMilliseconds(20),
|
| - base::TimeDelta::FromMilliseconds(20),
|
| -};
|
| +// A mock for RandIntCallback that always returns 0.
|
| +int ReturnZero(int min, int max) {
|
| + return 0;
|
| +}
|
|
|
| } // namespace
|
|
|
| -class TestDelegate : public DnsTransaction::Delegate {
|
| - public:
|
| - TestDelegate() : result_(ERR_UNEXPECTED), transaction_(NULL) {}
|
| - virtual ~TestDelegate() {}
|
| - virtual void OnTransactionComplete(
|
| - int result,
|
| - const DnsTransaction* transaction,
|
| - const IPAddressList& ip_addresses) {
|
| - result_ = result;
|
| - transaction_ = transaction;
|
| - ip_addresses_ = ip_addresses;
|
| +class DnsTransactionTest : public testing::Test {
|
| + protected:
|
| + void SetUp() OVERRIDE {
|
| + DnsConfig config;
|
| +
|
| + IPEndPoint dns_server;
|
| + bool rv = CreateDnsAddress(kDnsIp, kDnsPort, &dns_server);
|
| + ASSERT_TRUE(rv);
|
| + config.nameservers.push_back(dns_server);
|
| + config.attempts = 3;
|
| + config.timeout = base::TimeDelta::FromMilliseconds(20);
|
| +
|
| + qname_ = std::string(kT0DnsName, arraysize(kT0DnsName));
|
| +
|
| + session_ = new DnsSession(config,
|
| + new MockClientSocketFactory(),
|
| + base::Bind(&ReturnZero),
|
| + NULL /* NetLog */);
|
| +
|
| + callback_ = base::Bind(&DnsTransactionTest::OnTransactionComplete,
|
| + base::Unretained(this));
|
| + }
|
| +
|
| + void StartTransaction() {
|
| + transaction_.reset(new DnsTransaction(session_.get(),
|
| + qname_,
|
| + kT0Qtype,
|
| + callback_,
|
| + BoundNetLog()));
|
| +
|
| + int rv0 = transaction_->Start();
|
| + EXPECT_EQ(ERR_IO_PENDING, rv0);
|
| + }
|
| +
|
| + void OnTransactionComplete(DnsTransaction* transaction, int rv) {
|
| + EXPECT_EQ(transaction_.get(), transaction);
|
| + EXPECT_EQ(qname_, transaction->query()->qname().as_string());
|
| + EXPECT_EQ(kT0Qtype, transaction->query()->qtype());
|
| + rv_ = rv;
|
| MessageLoop::current()->Quit();
|
| }
|
| - int result() const { return result_; }
|
| - const DnsTransaction* transaction() const { return transaction_; }
|
| - const IPAddressList& ip_addresses() const {
|
| - return ip_addresses_;
|
| +
|
| + MockClientSocketFactory& factory() {
|
| + return *static_cast<MockClientSocketFactory*>(session_->socket_factory());
|
| }
|
|
|
| - private:
|
| - int result_;
|
| - const DnsTransaction* transaction_;
|
| - IPAddressList ip_addresses_;
|
| + std::string qname_;
|
| + scoped_refptr<DnsSession> session_;
|
| + scoped_ptr<DnsTransaction> transaction_;
|
| + DnsTransaction::ResultCallback callback_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(TestDelegate);
|
| + int rv_;
|
| };
|
|
|
| -
|
| -TEST(DnsTransactionTest, NormalQueryResponseTest) {
|
| +TEST_F(DnsTransactionTest, NormalQueryResponseTest) {
|
| MockWrite writes0[] = {
|
| MockWrite(true, reinterpret_cast<const char*>(kT0QueryDatagram),
|
| arraysize(kT0QueryDatagram))
|
| @@ -65,45 +95,19 @@ TEST(DnsTransactionTest, NormalQueryResponseTest) {
|
|
|
| StaticSocketDataProvider data(reads0, arraysize(reads0),
|
| writes0, arraysize(writes0));
|
| - MockClientSocketFactory factory;
|
| - factory.AddSocketDataProvider(&data);
|
| -
|
| - TestPrng test_prng(std::deque<int>(1, 0));
|
| - RandIntCallback rand_int_cb =
|
| - base::Bind(&TestPrng::GetNext, base::Unretained(&test_prng));
|
| - std::string t0_dns_name(kT0DnsName, arraysize(kT0DnsName));
|
| -
|
| - IPEndPoint dns_server;
|
| - bool rv = CreateDnsAddress(kDnsIp, kDnsPort, &dns_server);
|
| - ASSERT_TRUE(rv);
|
| -
|
| - DnsTransaction t(dns_server, t0_dns_name, kT1Qtype, rand_int_cb, &factory,
|
| - BoundNetLog(), NULL);
|
| -
|
| - TestDelegate delegate;
|
| - t.SetDelegate(&delegate);
|
| -
|
| - IPAddressList expected_ip_addresses;
|
| - rv = ConvertStringsToIPAddressList(kT0IpAddresses,
|
| - arraysize(kT0IpAddresses),
|
| - &expected_ip_addresses);
|
| - ASSERT_TRUE(rv);
|
| -
|
| - int rv0 = t.Start();
|
| - EXPECT_EQ(ERR_IO_PENDING, rv0);
|
| + factory().AddSocketDataProvider(&data);
|
|
|
| + StartTransaction();
|
| MessageLoop::current()->Run();
|
|
|
| - EXPECT_TRUE(DnsTransaction::Key(t0_dns_name, kT0Qtype) == t.key());
|
| - EXPECT_EQ(OK, delegate.result());
|
| - EXPECT_EQ(&t, delegate.transaction());
|
| - EXPECT_TRUE(expected_ip_addresses == delegate.ip_addresses());
|
| + EXPECT_EQ(OK, rv_);
|
| + // TODO(szym): test fields of |transaction_->response()|
|
|
|
| EXPECT_TRUE(data.at_read_eof());
|
| EXPECT_TRUE(data.at_write_eof());
|
| }
|
|
|
| -TEST(DnsTransactionTest, MismatchedQueryResponseTest) {
|
| +TEST_F(DnsTransactionTest, MismatchedQueryResponseTest) {
|
| MockWrite writes0[] = {
|
| MockWrite(true, reinterpret_cast<const char*>(kT0QueryDatagram),
|
| arraysize(kT0QueryDatagram))
|
| @@ -116,40 +120,20 @@ TEST(DnsTransactionTest, MismatchedQueryResponseTest) {
|
|
|
| StaticSocketDataProvider data(reads1, arraysize(reads1),
|
| writes0, arraysize(writes0));
|
| - MockClientSocketFactory factory;
|
| - factory.AddSocketDataProvider(&data);
|
| -
|
| - TestPrng test_prng(std::deque<int>(1, 0));
|
| - RandIntCallback rand_int_cb =
|
| - base::Bind(&TestPrng::GetNext, base::Unretained(&test_prng));
|
| - std::string t0_dns_name(kT0DnsName, arraysize(kT0DnsName));
|
| -
|
| - IPEndPoint dns_server;
|
| - bool rv = CreateDnsAddress(kDnsIp, kDnsPort, &dns_server);
|
| - ASSERT_TRUE(rv);
|
| -
|
| - DnsTransaction t(dns_server, t0_dns_name, kT1Qtype, rand_int_cb, &factory,
|
| - BoundNetLog(), NULL);
|
| -
|
| - TestDelegate delegate;
|
| - t.SetDelegate(&delegate);
|
| -
|
| - int rv0 = t.Start();
|
| - EXPECT_EQ(ERR_IO_PENDING, rv0);
|
| + factory().AddSocketDataProvider(&data);
|
|
|
| + StartTransaction();
|
| MessageLoop::current()->Run();
|
|
|
| - EXPECT_TRUE(DnsTransaction::Key(t0_dns_name, kT0Qtype) == t.key());
|
| - EXPECT_EQ(ERR_DNS_MALFORMED_RESPONSE, delegate.result());
|
| - EXPECT_EQ(0u, delegate.ip_addresses().size());
|
| - EXPECT_EQ(&t, delegate.transaction());
|
| + EXPECT_EQ(ERR_DNS_MALFORMED_RESPONSE, rv_);
|
| +
|
| EXPECT_TRUE(data.at_read_eof());
|
| EXPECT_TRUE(data.at_write_eof());
|
| }
|
|
|
| // Test that after the first timeout we do a fresh connection and if we get
|
| // a response on the new connection, we return it.
|
| -TEST(DnsTransactionTest, FirstTimeoutTest) {
|
| +TEST_F(DnsTransactionTest, FirstTimeoutTest) {
|
| MockWrite writes0[] = {
|
| MockWrite(true, reinterpret_cast<const char*>(kT0QueryDatagram),
|
| arraysize(kT0QueryDatagram))
|
| @@ -165,57 +149,27 @@ TEST(DnsTransactionTest, FirstTimeoutTest) {
|
| scoped_refptr<DelayedSocketData> socket1_data(
|
| new DelayedSocketData(0, reads0, arraysize(reads0),
|
| writes0, arraysize(writes0)));
|
| - MockClientSocketFactory factory;
|
| - factory.AddSocketDataProvider(socket0_data.get());
|
| - factory.AddSocketDataProvider(socket1_data.get());
|
| -
|
| - TestPrng test_prng(std::deque<int>(2, 0));
|
| - RandIntCallback rand_int_cb =
|
| - base::Bind(&TestPrng::GetNext, base::Unretained(&test_prng));
|
| - std::string t0_dns_name(kT0DnsName, arraysize(kT0DnsName));
|
| -
|
| - IPEndPoint dns_server;
|
| - bool rv = CreateDnsAddress(kDnsIp, kDnsPort, &dns_server);
|
| - ASSERT_TRUE(rv);
|
| -
|
| - DnsTransaction t(dns_server, t0_dns_name, kT1Qtype, rand_int_cb, &factory,
|
| - BoundNetLog(), NULL);
|
| -
|
| - TestDelegate delegate;
|
| - t.SetDelegate(&delegate);
|
| -
|
| - t.set_timeouts_ms(
|
| - std::vector<base::TimeDelta>(kTimeoutsMs,
|
| - kTimeoutsMs + arraysize(kTimeoutsMs)));
|
|
|
| - IPAddressList expected_ip_addresses;
|
| - rv = ConvertStringsToIPAddressList(kT0IpAddresses,
|
| - arraysize(kT0IpAddresses),
|
| - &expected_ip_addresses);
|
| - ASSERT_TRUE(rv);
|
| -
|
| - int rv0 = t.Start();
|
| - EXPECT_EQ(ERR_IO_PENDING, rv0);
|
| + factory().AddSocketDataProvider(socket0_data.get());
|
| + factory().AddSocketDataProvider(socket1_data.get());
|
|
|
| + StartTransaction();
|
|
|
| MessageLoop::current()->Run();
|
|
|
| - EXPECT_TRUE(DnsTransaction::Key(t0_dns_name, kT0Qtype) == t.key());
|
| - EXPECT_EQ(OK, delegate.result());
|
| - EXPECT_EQ(&t, delegate.transaction());
|
| - EXPECT_TRUE(expected_ip_addresses == delegate.ip_addresses());
|
| + EXPECT_EQ(OK, rv_);
|
|
|
| EXPECT_TRUE(socket0_data->at_read_eof());
|
| EXPECT_TRUE(socket0_data->at_write_eof());
|
| EXPECT_TRUE(socket1_data->at_read_eof());
|
| EXPECT_TRUE(socket1_data->at_write_eof());
|
| - EXPECT_EQ(2u, factory.udp_client_sockets().size());
|
| + EXPECT_EQ(2u, factory().udp_client_sockets().size());
|
| }
|
|
|
| // Test that after the first timeout we do a fresh connection, and after
|
| // the second timeout we do another fresh connection, and if we get a
|
| // response on the second connection, we return it.
|
| -TEST(DnsTransactionTest, SecondTimeoutTest) {
|
| +TEST_F(DnsTransactionTest, SecondTimeoutTest) {
|
| MockWrite writes0[] = {
|
| MockWrite(true, reinterpret_cast<const char*>(kT0QueryDatagram),
|
| arraysize(kT0QueryDatagram))
|
| @@ -233,45 +187,16 @@ TEST(DnsTransactionTest, SecondTimeoutTest) {
|
| scoped_refptr<DelayedSocketData> socket2_data(
|
| new DelayedSocketData(0, reads0, arraysize(reads0),
|
| writes0, arraysize(writes0)));
|
| - MockClientSocketFactory factory;
|
| - factory.AddSocketDataProvider(socket0_data.get());
|
| - factory.AddSocketDataProvider(socket1_data.get());
|
| - factory.AddSocketDataProvider(socket2_data.get());
|
| -
|
| - TestPrng test_prng(std::deque<int>(3, 0));
|
| - RandIntCallback rand_int_cb =
|
| - base::Bind(&TestPrng::GetNext, base::Unretained(&test_prng));
|
| - std::string t0_dns_name(kT0DnsName, arraysize(kT0DnsName));
|
| -
|
| - IPEndPoint dns_server;
|
| - bool rv = CreateDnsAddress(kDnsIp, kDnsPort, &dns_server);
|
| - ASSERT_TRUE(rv);
|
| -
|
| - DnsTransaction t(dns_server, t0_dns_name, kT1Qtype, rand_int_cb, &factory,
|
| - BoundNetLog(), NULL);
|
| -
|
| - TestDelegate delegate;
|
| - t.SetDelegate(&delegate);
|
|
|
| - t.set_timeouts_ms(
|
| - std::vector<base::TimeDelta>(kTimeoutsMs,
|
| - kTimeoutsMs + arraysize(kTimeoutsMs)));
|
| + factory().AddSocketDataProvider(socket0_data.get());
|
| + factory().AddSocketDataProvider(socket1_data.get());
|
| + factory().AddSocketDataProvider(socket2_data.get());
|
|
|
| - IPAddressList expected_ip_addresses;
|
| - rv = ConvertStringsToIPAddressList(kT0IpAddresses,
|
| - arraysize(kT0IpAddresses),
|
| - &expected_ip_addresses);
|
| - ASSERT_TRUE(rv);
|
| -
|
| - int rv0 = t.Start();
|
| - EXPECT_EQ(ERR_IO_PENDING, rv0);
|
| + StartTransaction();
|
|
|
| MessageLoop::current()->Run();
|
|
|
| - EXPECT_TRUE(DnsTransaction::Key(t0_dns_name, kT1Qtype) == t.key());
|
| - EXPECT_EQ(OK, delegate.result());
|
| - EXPECT_EQ(&t, delegate.transaction());
|
| - EXPECT_TRUE(expected_ip_addresses == delegate.ip_addresses());
|
| + EXPECT_EQ(OK, rv_);
|
|
|
| EXPECT_TRUE(socket0_data->at_read_eof());
|
| EXPECT_TRUE(socket0_data->at_write_eof());
|
| @@ -279,13 +204,13 @@ TEST(DnsTransactionTest, SecondTimeoutTest) {
|
| EXPECT_TRUE(socket1_data->at_write_eof());
|
| EXPECT_TRUE(socket2_data->at_read_eof());
|
| EXPECT_TRUE(socket2_data->at_write_eof());
|
| - EXPECT_EQ(3u, factory.udp_client_sockets().size());
|
| + EXPECT_EQ(3u, factory().udp_client_sockets().size());
|
| }
|
|
|
| // Test that after the first timeout we do a fresh connection, and after
|
| // the second timeout we do another fresh connection and after the third
|
| // timeout we give up and return a timeout error.
|
| -TEST(DnsTransactionTest, ThirdTimeoutTest) {
|
| +TEST_F(DnsTransactionTest, ThirdTimeoutTest) {
|
| MockWrite writes0[] = {
|
| MockWrite(true, reinterpret_cast<const char*>(kT0QueryDatagram),
|
| arraysize(kT0QueryDatagram))
|
| @@ -297,38 +222,16 @@ TEST(DnsTransactionTest, ThirdTimeoutTest) {
|
| new DelayedSocketData(2, NULL, 0, writes0, arraysize(writes0)));
|
| scoped_refptr<DelayedSocketData> socket2_data(
|
| new DelayedSocketData(2, NULL, 0, writes0, arraysize(writes0)));
|
| - MockClientSocketFactory factory;
|
| - factory.AddSocketDataProvider(socket0_data.get());
|
| - factory.AddSocketDataProvider(socket1_data.get());
|
| - factory.AddSocketDataProvider(socket2_data.get());
|
| -
|
| - TestPrng test_prng(std::deque<int>(3, 0));
|
| - RandIntCallback rand_int_cb =
|
| - base::Bind(&TestPrng::GetNext, base::Unretained(&test_prng));
|
| - std::string t0_dns_name(kT0DnsName, arraysize(kT0DnsName));
|
| -
|
| - IPEndPoint dns_server;
|
| - bool rv = CreateDnsAddress(kDnsIp, kDnsPort, &dns_server);
|
| - ASSERT_TRUE(rv);
|
| -
|
| - DnsTransaction t(dns_server, t0_dns_name, kT1Qtype, rand_int_cb, &factory,
|
| - BoundNetLog(), NULL);
|
| -
|
| - TestDelegate delegate;
|
| - t.SetDelegate(&delegate);
|
|
|
| - t.set_timeouts_ms(
|
| - std::vector<base::TimeDelta>(kTimeoutsMs,
|
| - kTimeoutsMs + arraysize(kTimeoutsMs)));
|
| + factory().AddSocketDataProvider(socket0_data.get());
|
| + factory().AddSocketDataProvider(socket1_data.get());
|
| + factory().AddSocketDataProvider(socket2_data.get());
|
|
|
| - int rv0 = t.Start();
|
| - EXPECT_EQ(ERR_IO_PENDING, rv0);
|
| + StartTransaction();
|
|
|
| MessageLoop::current()->Run();
|
|
|
| - EXPECT_TRUE(DnsTransaction::Key(t0_dns_name, kT0Qtype) == t.key());
|
| - EXPECT_EQ(ERR_DNS_TIMED_OUT, delegate.result());
|
| - EXPECT_EQ(&t, delegate.transaction());
|
| + EXPECT_EQ(ERR_DNS_TIMED_OUT, rv_);
|
|
|
| EXPECT_TRUE(socket0_data->at_read_eof());
|
| EXPECT_TRUE(socket0_data->at_write_eof());
|
| @@ -336,7 +239,7 @@ TEST(DnsTransactionTest, ThirdTimeoutTest) {
|
| EXPECT_TRUE(socket1_data->at_write_eof());
|
| EXPECT_TRUE(socket2_data->at_read_eof());
|
| EXPECT_TRUE(socket2_data->at_write_eof());
|
| - EXPECT_EQ(3u, factory.udp_client_sockets().size());
|
| + EXPECT_EQ(3u, factory().udp_client_sockets().size());
|
| }
|
|
|
| } // namespace net
|
|
|