| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/dns/dns_transaction.h" | 5 #include "net/dns/dns_transaction.h" |
| 6 | 6 |
| 7 #include <stdint.h> |
| 8 |
| 9 #include <limits> |
| 10 |
| 7 #include "base/bind.h" | 11 #include "base/bind.h" |
| 8 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/rand_util.h" | 13 #include "base/rand_util.h" |
| 10 #include "base/sys_byteorder.h" | 14 #include "base/sys_byteorder.h" |
| 11 #include "base/test/test_timeouts.h" | 15 #include "base/test/test_timeouts.h" |
| 12 #include "net/dns/dns_protocol.h" | 16 #include "net/dns/dns_protocol.h" |
| 13 #include "net/dns/dns_query.h" | 17 #include "net/dns/dns_query.h" |
| 14 #include "net/dns/dns_response.h" | 18 #include "net/dns/dns_response.h" |
| 15 #include "net/dns/dns_session.h" | 19 #include "net/dns/dns_session.h" |
| 16 #include "net/dns/dns_test_util.h" | 20 #include "net/dns/dns_test_util.h" |
| 17 #include "net/dns/dns_util.h" | 21 #include "net/dns/dns_util.h" |
| 18 #include "net/log/net_log.h" | 22 #include "net/log/net_log.h" |
| 19 #include "net/socket/socket_test_util.h" | 23 #include "net/socket/socket_test_util.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 24 #include "testing/gtest/include/gtest/gtest.h" |
| 21 | 25 |
| 22 namespace net { | 26 namespace net { |
| 23 | 27 |
| 24 namespace { | 28 namespace { |
| 25 | 29 |
| 26 std::string DomainFromDot(const base::StringPiece& dotted) { | 30 std::string DomainFromDot(const base::StringPiece& dotted) { |
| 27 std::string out; | 31 std::string out; |
| 28 EXPECT_TRUE(DNSDomainFromDot(dotted, &out)); | 32 EXPECT_TRUE(DNSDomainFromDot(dotted, &out)); |
| 29 return out; | 33 return out; |
| 30 } | 34 } |
| 31 | 35 |
| 32 // A SocketDataProvider builder. | 36 // A SocketDataProvider builder. |
| 33 class DnsSocketData { | 37 class DnsSocketData { |
| 34 public: | 38 public: |
| 35 // The ctor takes parameters for the DnsQuery. | 39 // The ctor takes parameters for the DnsQuery. |
| 36 DnsSocketData(uint16 id, | 40 DnsSocketData(uint16_t id, |
| 37 const char* dotted_name, | 41 const char* dotted_name, |
| 38 uint16 qtype, | 42 uint16_t qtype, |
| 39 IoMode mode, | 43 IoMode mode, |
| 40 bool use_tcp) | 44 bool use_tcp) |
| 41 : query_(new DnsQuery(id, DomainFromDot(dotted_name), qtype)), | 45 : query_(new DnsQuery(id, DomainFromDot(dotted_name), qtype)), |
| 42 use_tcp_(use_tcp) { | 46 use_tcp_(use_tcp) { |
| 43 if (use_tcp_) { | 47 if (use_tcp_) { |
| 44 scoped_ptr<uint16> length(new uint16); | 48 scoped_ptr<uint16_t> length(new uint16_t); |
| 45 *length = base::HostToNet16(query_->io_buffer()->size()); | 49 *length = base::HostToNet16(query_->io_buffer()->size()); |
| 46 writes_.push_back(MockWrite(mode, | 50 writes_.push_back(MockWrite(mode, |
| 47 reinterpret_cast<const char*>(length.get()), | 51 reinterpret_cast<const char*>(length.get()), |
| 48 sizeof(uint16), num_reads_and_writes())); | 52 sizeof(uint16_t), num_reads_and_writes())); |
| 49 lengths_.push_back(length.Pass()); | 53 lengths_.push_back(length.Pass()); |
| 50 } | 54 } |
| 51 writes_.push_back(MockWrite(mode, query_->io_buffer()->data(), | 55 writes_.push_back(MockWrite(mode, query_->io_buffer()->data(), |
| 52 query_->io_buffer()->size(), | 56 query_->io_buffer()->size(), |
| 53 num_reads_and_writes())); | 57 num_reads_and_writes())); |
| 54 } | 58 } |
| 55 ~DnsSocketData() {} | 59 ~DnsSocketData() {} |
| 56 | 60 |
| 57 // All responses must be added before GetProvider. | 61 // All responses must be added before GetProvider. |
| 58 | 62 |
| 59 // Adds pre-built DnsResponse. |tcp_length| will be used in TCP mode only. | 63 // Adds pre-built DnsResponse. |tcp_length| will be used in TCP mode only. |
| 60 void AddResponseWithLength(scoped_ptr<DnsResponse> response, IoMode mode, | 64 void AddResponseWithLength(scoped_ptr<DnsResponse> response, |
| 61 uint16 tcp_length) { | 65 IoMode mode, |
| 66 uint16_t tcp_length) { |
| 62 CHECK(!provider_.get()); | 67 CHECK(!provider_.get()); |
| 63 if (use_tcp_) { | 68 if (use_tcp_) { |
| 64 scoped_ptr<uint16> length(new uint16); | 69 scoped_ptr<uint16_t> length(new uint16_t); |
| 65 *length = base::HostToNet16(tcp_length); | 70 *length = base::HostToNet16(tcp_length); |
| 66 reads_.push_back(MockRead(mode, | 71 reads_.push_back(MockRead(mode, |
| 67 reinterpret_cast<const char*>(length.get()), | 72 reinterpret_cast<const char*>(length.get()), |
| 68 sizeof(uint16), num_reads_and_writes())); | 73 sizeof(uint16_t), num_reads_and_writes())); |
| 69 lengths_.push_back(length.Pass()); | 74 lengths_.push_back(length.Pass()); |
| 70 } | 75 } |
| 71 reads_.push_back(MockRead(mode, response->io_buffer()->data(), | 76 reads_.push_back(MockRead(mode, response->io_buffer()->data(), |
| 72 response->io_buffer()->size(), | 77 response->io_buffer()->size(), |
| 73 num_reads_and_writes())); | 78 num_reads_and_writes())); |
| 74 responses_.push_back(response.Pass()); | 79 responses_.push_back(response.Pass()); |
| 75 } | 80 } |
| 76 | 81 |
| 77 // Adds pre-built DnsResponse. | 82 // Adds pre-built DnsResponse. |
| 78 void AddResponse(scoped_ptr<DnsResponse> response, IoMode mode) { | 83 void AddResponse(scoped_ptr<DnsResponse> response, IoMode mode) { |
| 79 uint16 tcp_length = response->io_buffer()->size(); | 84 uint16_t tcp_length = response->io_buffer()->size(); |
| 80 AddResponseWithLength(response.Pass(), mode, tcp_length); | 85 AddResponseWithLength(response.Pass(), mode, tcp_length); |
| 81 } | 86 } |
| 82 | 87 |
| 83 // Adds pre-built response from |data| buffer. | 88 // Adds pre-built response from |data| buffer. |
| 84 void AddResponseData(const uint8* data, size_t length, IoMode mode) { | 89 void AddResponseData(const uint8_t* data, size_t length, IoMode mode) { |
| 85 CHECK(!provider_.get()); | 90 CHECK(!provider_.get()); |
| 86 AddResponse(make_scoped_ptr( | 91 AddResponse(make_scoped_ptr( |
| 87 new DnsResponse(reinterpret_cast<const char*>(data), length, 0)), mode); | 92 new DnsResponse(reinterpret_cast<const char*>(data), length, 0)), mode); |
| 88 } | 93 } |
| 89 | 94 |
| 90 // Add no-answer (RCODE only) response matching the query. | 95 // Add no-answer (RCODE only) response matching the query. |
| 91 void AddRcode(int rcode, IoMode mode) { | 96 void AddRcode(int rcode, IoMode mode) { |
| 92 scoped_ptr<DnsResponse> response( | 97 scoped_ptr<DnsResponse> response( |
| 93 new DnsResponse(query_->io_buffer()->data(), | 98 new DnsResponse(query_->io_buffer()->data(), |
| 94 query_->io_buffer()->size(), | 99 query_->io_buffer()->size(), |
| (...skipping 19 matching lines...) Expand all Loading... |
| 114 reads_.push_back( | 119 reads_.push_back( |
| 115 MockRead(ASYNC, ERR_IO_PENDING, writes_.size() + reads_.size())); | 120 MockRead(ASYNC, ERR_IO_PENDING, writes_.size() + reads_.size())); |
| 116 provider_.reset(new SequencedSocketData(&reads_[0], reads_.size(), | 121 provider_.reset(new SequencedSocketData(&reads_[0], reads_.size(), |
| 117 &writes_[0], writes_.size())); | 122 &writes_[0], writes_.size())); |
| 118 if (use_tcp_) { | 123 if (use_tcp_) { |
| 119 provider_->set_connect_data(MockConnect(reads_[0].mode, OK)); | 124 provider_->set_connect_data(MockConnect(reads_[0].mode, OK)); |
| 120 } | 125 } |
| 121 return provider_.get(); | 126 return provider_.get(); |
| 122 } | 127 } |
| 123 | 128 |
| 124 uint16 query_id() const { | 129 uint16_t query_id() const { return query_->id(); } |
| 125 return query_->id(); | |
| 126 } | |
| 127 | 130 |
| 128 private: | 131 private: |
| 129 size_t num_reads_and_writes() const { return reads_.size() + writes_.size(); } | 132 size_t num_reads_and_writes() const { return reads_.size() + writes_.size(); } |
| 130 | 133 |
| 131 scoped_ptr<DnsQuery> query_; | 134 scoped_ptr<DnsQuery> query_; |
| 132 bool use_tcp_; | 135 bool use_tcp_; |
| 133 std::vector<scoped_ptr<uint16>> lengths_; | 136 std::vector<scoped_ptr<uint16_t>> lengths_; |
| 134 std::vector<scoped_ptr<DnsResponse>> responses_; | 137 std::vector<scoped_ptr<DnsResponse>> responses_; |
| 135 std::vector<MockWrite> writes_; | 138 std::vector<MockWrite> writes_; |
| 136 std::vector<MockRead> reads_; | 139 std::vector<MockRead> reads_; |
| 137 scoped_ptr<SequencedSocketData> provider_; | 140 scoped_ptr<SequencedSocketData> provider_; |
| 138 | 141 |
| 139 DISALLOW_COPY_AND_ASSIGN(DnsSocketData); | 142 DISALLOW_COPY_AND_ASSIGN(DnsSocketData); |
| 140 }; | 143 }; |
| 141 | 144 |
| 142 class TestSocketFactory; | 145 class TestSocketFactory; |
| 143 | 146 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 int TestUDPClientSocket::Connect(const IPEndPoint& endpoint) { | 216 int TestUDPClientSocket::Connect(const IPEndPoint& endpoint) { |
| 214 factory_->OnConnect(endpoint); | 217 factory_->OnConnect(endpoint); |
| 215 return MockUDPClientSocket::Connect(endpoint); | 218 return MockUDPClientSocket::Connect(endpoint); |
| 216 } | 219 } |
| 217 | 220 |
| 218 // Helper class that holds a DnsTransaction and handles OnTransactionComplete. | 221 // Helper class that holds a DnsTransaction and handles OnTransactionComplete. |
| 219 class TransactionHelper { | 222 class TransactionHelper { |
| 220 public: | 223 public: |
| 221 // If |expected_answer_count| < 0 then it is the expected net error. | 224 // If |expected_answer_count| < 0 then it is the expected net error. |
| 222 TransactionHelper(const char* hostname, | 225 TransactionHelper(const char* hostname, |
| 223 uint16 qtype, | 226 uint16_t qtype, |
| 224 int expected_answer_count) | 227 int expected_answer_count) |
| 225 : hostname_(hostname), | 228 : hostname_(hostname), |
| 226 qtype_(qtype), | 229 qtype_(qtype), |
| 227 expected_answer_count_(expected_answer_count), | 230 expected_answer_count_(expected_answer_count), |
| 228 cancel_in_callback_(false), | 231 cancel_in_callback_(false), |
| 229 quit_in_callback_(false), | 232 quit_in_callback_(false), |
| 230 completed_(false) { | 233 completed_(false) {} |
| 231 } | |
| 232 | 234 |
| 233 // Mark that the transaction shall be destroyed immediately upon callback. | 235 // Mark that the transaction shall be destroyed immediately upon callback. |
| 234 void set_cancel_in_callback() { | 236 void set_cancel_in_callback() { |
| 235 cancel_in_callback_ = true; | 237 cancel_in_callback_ = true; |
| 236 } | 238 } |
| 237 | 239 |
| 238 // Mark to call MessageLoop::QuitWhenIdle() upon callback. | 240 // Mark to call MessageLoop::QuitWhenIdle() upon callback. |
| 239 void set_quit_in_callback() { | 241 void set_quit_in_callback() { |
| 240 quit_in_callback_ = true; | 242 quit_in_callback_ = true; |
| 241 } | 243 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 // Use when some of the responses are timeouts. | 309 // Use when some of the responses are timeouts. |
| 308 bool RunUntilDone(DnsTransactionFactory* factory) { | 310 bool RunUntilDone(DnsTransactionFactory* factory) { |
| 309 set_quit_in_callback(); | 311 set_quit_in_callback(); |
| 310 StartTransaction(factory); | 312 StartTransaction(factory); |
| 311 base::MessageLoop::current()->Run(); | 313 base::MessageLoop::current()->Run(); |
| 312 return has_completed(); | 314 return has_completed(); |
| 313 } | 315 } |
| 314 | 316 |
| 315 private: | 317 private: |
| 316 std::string hostname_; | 318 std::string hostname_; |
| 317 uint16 qtype_; | 319 uint16_t qtype_; |
| 318 scoped_ptr<DnsTransaction> transaction_; | 320 scoped_ptr<DnsTransaction> transaction_; |
| 319 int expected_answer_count_; | 321 int expected_answer_count_; |
| 320 bool cancel_in_callback_; | 322 bool cancel_in_callback_; |
| 321 bool quit_in_callback_; | 323 bool quit_in_callback_; |
| 322 | 324 |
| 323 bool completed_; | 325 bool completed_; |
| 324 }; | 326 }; |
| 325 | 327 |
| 326 class DnsTransactionTest : public testing::Test { | 328 class DnsTransactionTest : public testing::Test { |
| 327 public: | 329 public: |
| (...skipping 29 matching lines...) Expand all Loading... |
| 357 void AddSocketData(scoped_ptr<DnsSocketData> data) { | 359 void AddSocketData(scoped_ptr<DnsSocketData> data) { |
| 358 CHECK(socket_factory_.get()); | 360 CHECK(socket_factory_.get()); |
| 359 transaction_ids_.push_back(data->query_id()); | 361 transaction_ids_.push_back(data->query_id()); |
| 360 socket_factory_->AddSocketDataProvider(data->GetProvider()); | 362 socket_factory_->AddSocketDataProvider(data->GetProvider()); |
| 361 socket_data_.push_back(data.Pass()); | 363 socket_data_.push_back(data.Pass()); |
| 362 } | 364 } |
| 363 | 365 |
| 364 // Add expected query for |dotted_name| and |qtype| with |id| and response | 366 // Add expected query for |dotted_name| and |qtype| with |id| and response |
| 365 // taken verbatim from |data| of |data_length| bytes. The transaction id in | 367 // taken verbatim from |data| of |data_length| bytes. The transaction id in |
| 366 // |data| should equal |id|, unless testing mismatched response. | 368 // |data| should equal |id|, unless testing mismatched response. |
| 367 void AddQueryAndResponse(uint16 id, | 369 void AddQueryAndResponse(uint16_t id, |
| 368 const char* dotted_name, | 370 const char* dotted_name, |
| 369 uint16 qtype, | 371 uint16_t qtype, |
| 370 const uint8* response_data, | 372 const uint8_t* response_data, |
| 371 size_t response_length, | 373 size_t response_length, |
| 372 IoMode mode, | 374 IoMode mode, |
| 373 bool use_tcp) { | 375 bool use_tcp) { |
| 374 CHECK(socket_factory_.get()); | 376 CHECK(socket_factory_.get()); |
| 375 scoped_ptr<DnsSocketData> data( | 377 scoped_ptr<DnsSocketData> data( |
| 376 new DnsSocketData(id, dotted_name, qtype, mode, use_tcp)); | 378 new DnsSocketData(id, dotted_name, qtype, mode, use_tcp)); |
| 377 data->AddResponseData(response_data, response_length, mode); | 379 data->AddResponseData(response_data, response_length, mode); |
| 378 AddSocketData(data.Pass()); | 380 AddSocketData(data.Pass()); |
| 379 } | 381 } |
| 380 | 382 |
| 381 void AddAsyncQueryAndResponse(uint16 id, | 383 void AddAsyncQueryAndResponse(uint16_t id, |
| 382 const char* dotted_name, | 384 const char* dotted_name, |
| 383 uint16 qtype, | 385 uint16_t qtype, |
| 384 const uint8* data, | 386 const uint8_t* data, |
| 385 size_t data_length) { | 387 size_t data_length) { |
| 386 AddQueryAndResponse(id, dotted_name, qtype, data, data_length, ASYNC, | 388 AddQueryAndResponse(id, dotted_name, qtype, data, data_length, ASYNC, |
| 387 false); | 389 false); |
| 388 } | 390 } |
| 389 | 391 |
| 390 void AddSyncQueryAndResponse(uint16 id, | 392 void AddSyncQueryAndResponse(uint16_t id, |
| 391 const char* dotted_name, | 393 const char* dotted_name, |
| 392 uint16 qtype, | 394 uint16_t qtype, |
| 393 const uint8* data, | 395 const uint8_t* data, |
| 394 size_t data_length) { | 396 size_t data_length) { |
| 395 AddQueryAndResponse(id, dotted_name, qtype, data, data_length, SYNCHRONOUS, | 397 AddQueryAndResponse(id, dotted_name, qtype, data, data_length, SYNCHRONOUS, |
| 396 false); | 398 false); |
| 397 } | 399 } |
| 398 | 400 |
| 399 // Add expected query of |dotted_name| and |qtype| and no response. | 401 // Add expected query of |dotted_name| and |qtype| and no response. |
| 400 void AddQueryAndTimeout(const char* dotted_name, uint16 qtype) { | 402 void AddQueryAndTimeout(const char* dotted_name, uint16_t qtype) { |
| 401 uint16 id = base::RandInt(0, kuint16max); | 403 uint16_t id = base::RandInt(0, std::numeric_limits<uint16_t>::max()); |
| 402 scoped_ptr<DnsSocketData> data( | 404 scoped_ptr<DnsSocketData> data( |
| 403 new DnsSocketData(id, dotted_name, qtype, ASYNC, false)); | 405 new DnsSocketData(id, dotted_name, qtype, ASYNC, false)); |
| 404 AddSocketData(data.Pass()); | 406 AddSocketData(data.Pass()); |
| 405 } | 407 } |
| 406 | 408 |
| 407 // Add expected query of |dotted_name| and |qtype| and matching response with | 409 // Add expected query of |dotted_name| and |qtype| and matching response with |
| 408 // no answer and RCODE set to |rcode|. The id will be generated randomly. | 410 // no answer and RCODE set to |rcode|. The id will be generated randomly. |
| 409 void AddQueryAndRcode(const char* dotted_name, | 411 void AddQueryAndRcode(const char* dotted_name, |
| 410 uint16 qtype, | 412 uint16_t qtype, |
| 411 int rcode, | 413 int rcode, |
| 412 IoMode mode, | 414 IoMode mode, |
| 413 bool use_tcp) { | 415 bool use_tcp) { |
| 414 CHECK_NE(dns_protocol::kRcodeNOERROR, rcode); | 416 CHECK_NE(dns_protocol::kRcodeNOERROR, rcode); |
| 415 uint16 id = base::RandInt(0, kuint16max); | 417 uint16_t id = base::RandInt(0, std::numeric_limits<uint16_t>::max()); |
| 416 scoped_ptr<DnsSocketData> data( | 418 scoped_ptr<DnsSocketData> data( |
| 417 new DnsSocketData(id, dotted_name, qtype, mode, use_tcp)); | 419 new DnsSocketData(id, dotted_name, qtype, mode, use_tcp)); |
| 418 data->AddRcode(rcode, mode); | 420 data->AddRcode(rcode, mode); |
| 419 AddSocketData(data.Pass()); | 421 AddSocketData(data.Pass()); |
| 420 } | 422 } |
| 421 | 423 |
| 422 void AddAsyncQueryAndRcode(const char* dotted_name, uint16 qtype, int rcode) { | 424 void AddAsyncQueryAndRcode(const char* dotted_name, |
| 425 uint16_t qtype, |
| 426 int rcode) { |
| 423 AddQueryAndRcode(dotted_name, qtype, rcode, ASYNC, false); | 427 AddQueryAndRcode(dotted_name, qtype, rcode, ASYNC, false); |
| 424 } | 428 } |
| 425 | 429 |
| 426 void AddSyncQueryAndRcode(const char* dotted_name, uint16 qtype, int rcode) { | 430 void AddSyncQueryAndRcode(const char* dotted_name, |
| 431 uint16_t qtype, |
| 432 int rcode) { |
| 427 AddQueryAndRcode(dotted_name, qtype, rcode, SYNCHRONOUS, false); | 433 AddQueryAndRcode(dotted_name, qtype, rcode, SYNCHRONOUS, false); |
| 428 } | 434 } |
| 429 | 435 |
| 430 // Checks if the sockets were connected in the order matching the indices in | 436 // Checks if the sockets were connected in the order matching the indices in |
| 431 // |servers|. | 437 // |servers|. |
| 432 void CheckServerOrder(const unsigned* servers, size_t num_attempts) { | 438 void CheckServerOrder(const unsigned* servers, size_t num_attempts) { |
| 433 ASSERT_EQ(num_attempts, socket_factory_->remote_endpoints_.size()); | 439 ASSERT_EQ(num_attempts, socket_factory_->remote_endpoints_.size()); |
| 434 for (size_t i = 0; i < num_attempts; ++i) { | 440 for (size_t i = 0; i < num_attempts; ++i) { |
| 435 EXPECT_EQ(socket_factory_->remote_endpoints_[i], | 441 EXPECT_EQ(socket_factory_->remote_endpoints_[i], |
| 436 session_->config().nameservers[servers[i]]); | 442 session_->config().nameservers[servers[i]]); |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 777 ERR_NAME_NOT_RESOLVED); | 783 ERR_NAME_NOT_RESOLVED); |
| 778 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 784 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
| 779 | 785 |
| 780 TransactionHelper helper1("x.y", dns_protocol::kTypeA, ERR_NAME_NOT_RESOLVED); | 786 TransactionHelper helper1("x.y", dns_protocol::kTypeA, ERR_NAME_NOT_RESOLVED); |
| 781 EXPECT_TRUE(helper1.Run(transaction_factory_.get())); | 787 EXPECT_TRUE(helper1.Run(transaction_factory_.get())); |
| 782 | 788 |
| 783 TransactionHelper helper2("x", dns_protocol::kTypeA, ERR_NAME_NOT_RESOLVED); | 789 TransactionHelper helper2("x", dns_protocol::kTypeA, ERR_NAME_NOT_RESOLVED); |
| 784 EXPECT_TRUE(helper2.Run(transaction_factory_.get())); | 790 EXPECT_TRUE(helper2.Run(transaction_factory_.get())); |
| 785 } | 791 } |
| 786 | 792 |
| 787 const uint8 kResponseNoData[] = { | 793 const uint8_t kResponseNoData[] = { |
| 788 0x00, 0x00, 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, | 794 0x00, 0x00, 0x81, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, |
| 789 // Question | 795 // Question |
| 790 0x01, 'x', 0x01, 'y', 0x01, 'z', 0x01, 'b', 0x00, 0x00, 0x01, 0x00, 0x01, | 796 0x01, 'x', 0x01, 'y', 0x01, 'z', 0x01, 'b', 0x00, 0x00, 0x01, 0x00, 0x01, |
| 791 // Authority section, SOA record, TTL 0x3E6 | 797 // Authority section, SOA record, TTL 0x3E6 |
| 792 0x01, 'z', 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x03, 0xE6, | 798 0x01, 'z', 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x03, 0xE6, |
| 793 // Minimal RDATA, 18 bytes | 799 // Minimal RDATA, 18 bytes |
| 794 0x00, 0x12, | 800 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 795 0x00, 0x00, | 801 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 796 0x00, 0x00, 0x00, 0x00, | |
| 797 0x00, 0x00, 0x00, 0x00, | |
| 798 0x00, 0x00, 0x00, 0x00, | |
| 799 0x00, 0x00, 0x00, 0x00, | |
| 800 }; | 802 }; |
| 801 | 803 |
| 802 TEST_F(DnsTransactionTest, SuffixSearchStop) { | 804 TEST_F(DnsTransactionTest, SuffixSearchStop) { |
| 803 config_.ndots = 2; | 805 config_.ndots = 2; |
| 804 config_.search.push_back("a"); | 806 config_.search.push_back("a"); |
| 805 config_.search.push_back("b"); | 807 config_.search.push_back("b"); |
| 806 config_.search.push_back("c"); | 808 config_.search.push_back("c"); |
| 807 ConfigureFactory(); | 809 ConfigureFactory(); |
| 808 | 810 |
| 809 AddAsyncQueryAndRcode("x.y.z", dns_protocol::kTypeA, | 811 AddAsyncQueryAndRcode("x.y.z", dns_protocol::kTypeA, |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 908 scoped_ptr<DnsSocketData> data( | 910 scoped_ptr<DnsSocketData> data( |
| 909 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); | 911 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); |
| 910 // Valid response but length too short. | 912 // Valid response but length too short. |
| 911 // This must be truncated in the question section. The DnsResponse doesn't | 913 // This must be truncated in the question section. The DnsResponse doesn't |
| 912 // examine the answer section until asked to parse it, so truncating it in | 914 // examine the answer section until asked to parse it, so truncating it in |
| 913 // the answer section would result in the DnsTransaction itself succeeding. | 915 // the answer section would result in the DnsTransaction itself succeeding. |
| 914 data->AddResponseWithLength( | 916 data->AddResponseWithLength( |
| 915 make_scoped_ptr( | 917 make_scoped_ptr( |
| 916 new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram), | 918 new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram), |
| 917 arraysize(kT0ResponseDatagram), 0)), | 919 arraysize(kT0ResponseDatagram), 0)), |
| 918 ASYNC, | 920 ASYNC, static_cast<uint16_t>(kT0QuerySize - 1)); |
| 919 static_cast<uint16>(kT0QuerySize - 1)); | |
| 920 AddSocketData(data.Pass()); | 921 AddSocketData(data.Pass()); |
| 921 | 922 |
| 922 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_MALFORMED_RESPONSE); | 923 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_MALFORMED_RESPONSE); |
| 923 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 924 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
| 924 } | 925 } |
| 925 | 926 |
| 926 TEST_F(DnsTransactionTest, TCPTimeout) { | 927 TEST_F(DnsTransactionTest, TCPTimeout) { |
| 927 config_.timeout = TestTimeouts::tiny_timeout(); | 928 config_.timeout = TestTimeouts::tiny_timeout(); |
| 928 ConfigureFactory(); | 929 ConfigureFactory(); |
| 929 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, | 930 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, |
| 930 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); | 931 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); |
| 931 AddSocketData(make_scoped_ptr( | 932 AddSocketData(make_scoped_ptr( |
| 932 new DnsSocketData(1 /* id */, kT0HostName, kT0Qtype, ASYNC, true))); | 933 new DnsSocketData(1 /* id */, kT0HostName, kT0Qtype, ASYNC, true))); |
| 933 | 934 |
| 934 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_TIMED_OUT); | 935 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_TIMED_OUT); |
| 935 EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get())); | 936 EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get())); |
| 936 } | 937 } |
| 937 | 938 |
| 938 TEST_F(DnsTransactionTest, TCPReadReturnsZeroAsync) { | 939 TEST_F(DnsTransactionTest, TCPReadReturnsZeroAsync) { |
| 939 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, | 940 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, |
| 940 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); | 941 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); |
| 941 scoped_ptr<DnsSocketData> data( | 942 scoped_ptr<DnsSocketData> data( |
| 942 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); | 943 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); |
| 943 // Return all but the last byte of the response. | 944 // Return all but the last byte of the response. |
| 944 data->AddResponseWithLength( | 945 data->AddResponseWithLength( |
| 945 make_scoped_ptr( | 946 make_scoped_ptr( |
| 946 new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram), | 947 new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram), |
| 947 arraysize(kT0ResponseDatagram) - 1, 0)), | 948 arraysize(kT0ResponseDatagram) - 1, 0)), |
| 948 ASYNC, | 949 ASYNC, static_cast<uint16_t>(arraysize(kT0ResponseDatagram))); |
| 949 static_cast<uint16>(arraysize(kT0ResponseDatagram))); | |
| 950 // Then return a 0-length read. | 950 // Then return a 0-length read. |
| 951 data->AddReadError(0, ASYNC); | 951 data->AddReadError(0, ASYNC); |
| 952 AddSocketData(data.Pass()); | 952 AddSocketData(data.Pass()); |
| 953 | 953 |
| 954 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_CONNECTION_CLOSED); | 954 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_CONNECTION_CLOSED); |
| 955 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 955 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
| 956 } | 956 } |
| 957 | 957 |
| 958 TEST_F(DnsTransactionTest, TCPReadReturnsZeroSynchronous) { | 958 TEST_F(DnsTransactionTest, TCPReadReturnsZeroSynchronous) { |
| 959 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, | 959 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, |
| 960 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); | 960 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); |
| 961 scoped_ptr<DnsSocketData> data( | 961 scoped_ptr<DnsSocketData> data( |
| 962 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); | 962 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); |
| 963 // Return all but the last byte of the response. | 963 // Return all but the last byte of the response. |
| 964 data->AddResponseWithLength( | 964 data->AddResponseWithLength( |
| 965 make_scoped_ptr( | 965 make_scoped_ptr( |
| 966 new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram), | 966 new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram), |
| 967 arraysize(kT0ResponseDatagram) - 1, 0)), | 967 arraysize(kT0ResponseDatagram) - 1, 0)), |
| 968 SYNCHRONOUS, | 968 SYNCHRONOUS, static_cast<uint16_t>(arraysize(kT0ResponseDatagram))); |
| 969 static_cast<uint16>(arraysize(kT0ResponseDatagram))); | |
| 970 // Then return a 0-length read. | 969 // Then return a 0-length read. |
| 971 data->AddReadError(0, SYNCHRONOUS); | 970 data->AddReadError(0, SYNCHRONOUS); |
| 972 AddSocketData(data.Pass()); | 971 AddSocketData(data.Pass()); |
| 973 | 972 |
| 974 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_CONNECTION_CLOSED); | 973 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_CONNECTION_CLOSED); |
| 975 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 974 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
| 976 } | 975 } |
| 977 | 976 |
| 978 TEST_F(DnsTransactionTest, TCPConnectionClosedAsync) { | 977 TEST_F(DnsTransactionTest, TCPConnectionClosedAsync) { |
| 979 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, | 978 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1003 config_.timeout = TestTimeouts::tiny_timeout(); | 1002 config_.timeout = TestTimeouts::tiny_timeout(); |
| 1004 ConfigureFactory(); | 1003 ConfigureFactory(); |
| 1005 | 1004 |
| 1006 TransactionHelper helper0(".", dns_protocol::kTypeA, ERR_INVALID_ARGUMENT); | 1005 TransactionHelper helper0(".", dns_protocol::kTypeA, ERR_INVALID_ARGUMENT); |
| 1007 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 1006 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
| 1008 } | 1007 } |
| 1009 | 1008 |
| 1010 } // namespace | 1009 } // namespace |
| 1011 | 1010 |
| 1012 } // namespace net | 1011 } // namespace net |
| OLD | NEW |