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> | 7 #include <stdint.h> |
8 | |
9 #include <limits> | 8 #include <limits> |
| 9 #include <utility> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/macros.h" | 12 #include "base/macros.h" |
13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
14 #include "base/rand_util.h" | 14 #include "base/rand_util.h" |
15 #include "base/sys_byteorder.h" | 15 #include "base/sys_byteorder.h" |
16 #include "base/test/test_timeouts.h" | 16 #include "base/test/test_timeouts.h" |
17 #include "net/dns/dns_protocol.h" | 17 #include "net/dns/dns_protocol.h" |
18 #include "net/dns/dns_query.h" | 18 #include "net/dns/dns_query.h" |
19 #include "net/dns/dns_response.h" | 19 #include "net/dns/dns_response.h" |
(...skipping 24 matching lines...) Expand all Loading... |
44 IoMode mode, | 44 IoMode mode, |
45 bool use_tcp) | 45 bool use_tcp) |
46 : query_(new DnsQuery(id, DomainFromDot(dotted_name), qtype)), | 46 : query_(new DnsQuery(id, DomainFromDot(dotted_name), qtype)), |
47 use_tcp_(use_tcp) { | 47 use_tcp_(use_tcp) { |
48 if (use_tcp_) { | 48 if (use_tcp_) { |
49 scoped_ptr<uint16_t> length(new uint16_t); | 49 scoped_ptr<uint16_t> length(new uint16_t); |
50 *length = base::HostToNet16(query_->io_buffer()->size()); | 50 *length = base::HostToNet16(query_->io_buffer()->size()); |
51 writes_.push_back(MockWrite(mode, | 51 writes_.push_back(MockWrite(mode, |
52 reinterpret_cast<const char*>(length.get()), | 52 reinterpret_cast<const char*>(length.get()), |
53 sizeof(uint16_t), num_reads_and_writes())); | 53 sizeof(uint16_t), num_reads_and_writes())); |
54 lengths_.push_back(length.Pass()); | 54 lengths_.push_back(std::move(length)); |
55 } | 55 } |
56 writes_.push_back(MockWrite(mode, query_->io_buffer()->data(), | 56 writes_.push_back(MockWrite(mode, query_->io_buffer()->data(), |
57 query_->io_buffer()->size(), | 57 query_->io_buffer()->size(), |
58 num_reads_and_writes())); | 58 num_reads_and_writes())); |
59 } | 59 } |
60 ~DnsSocketData() {} | 60 ~DnsSocketData() {} |
61 | 61 |
62 // All responses must be added before GetProvider. | 62 // All responses must be added before GetProvider. |
63 | 63 |
64 // Adds pre-built DnsResponse. |tcp_length| will be used in TCP mode only. | 64 // Adds pre-built DnsResponse. |tcp_length| will be used in TCP mode only. |
65 void AddResponseWithLength(scoped_ptr<DnsResponse> response, | 65 void AddResponseWithLength(scoped_ptr<DnsResponse> response, |
66 IoMode mode, | 66 IoMode mode, |
67 uint16_t tcp_length) { | 67 uint16_t tcp_length) { |
68 CHECK(!provider_.get()); | 68 CHECK(!provider_.get()); |
69 if (use_tcp_) { | 69 if (use_tcp_) { |
70 scoped_ptr<uint16_t> length(new uint16_t); | 70 scoped_ptr<uint16_t> length(new uint16_t); |
71 *length = base::HostToNet16(tcp_length); | 71 *length = base::HostToNet16(tcp_length); |
72 reads_.push_back(MockRead(mode, | 72 reads_.push_back(MockRead(mode, |
73 reinterpret_cast<const char*>(length.get()), | 73 reinterpret_cast<const char*>(length.get()), |
74 sizeof(uint16_t), num_reads_and_writes())); | 74 sizeof(uint16_t), num_reads_and_writes())); |
75 lengths_.push_back(length.Pass()); | 75 lengths_.push_back(std::move(length)); |
76 } | 76 } |
77 reads_.push_back(MockRead(mode, response->io_buffer()->data(), | 77 reads_.push_back(MockRead(mode, response->io_buffer()->data(), |
78 response->io_buffer()->size(), | 78 response->io_buffer()->size(), |
79 num_reads_and_writes())); | 79 num_reads_and_writes())); |
80 responses_.push_back(response.Pass()); | 80 responses_.push_back(std::move(response)); |
81 } | 81 } |
82 | 82 |
83 // Adds pre-built DnsResponse. | 83 // Adds pre-built DnsResponse. |
84 void AddResponse(scoped_ptr<DnsResponse> response, IoMode mode) { | 84 void AddResponse(scoped_ptr<DnsResponse> response, IoMode mode) { |
85 uint16_t tcp_length = response->io_buffer()->size(); | 85 uint16_t tcp_length = response->io_buffer()->size(); |
86 AddResponseWithLength(response.Pass(), mode, tcp_length); | 86 AddResponseWithLength(std::move(response), mode, tcp_length); |
87 } | 87 } |
88 | 88 |
89 // Adds pre-built response from |data| buffer. | 89 // Adds pre-built response from |data| buffer. |
90 void AddResponseData(const uint8_t* data, size_t length, IoMode mode) { | 90 void AddResponseData(const uint8_t* data, size_t length, IoMode mode) { |
91 CHECK(!provider_.get()); | 91 CHECK(!provider_.get()); |
92 AddResponse(make_scoped_ptr( | 92 AddResponse(make_scoped_ptr( |
93 new DnsResponse(reinterpret_cast<const char*>(data), length, 0)), mode); | 93 new DnsResponse(reinterpret_cast<const char*>(data), length, 0)), mode); |
94 } | 94 } |
95 | 95 |
96 // Add no-answer (RCODE only) response matching the query. | 96 // Add no-answer (RCODE only) response matching the query. |
97 void AddRcode(int rcode, IoMode mode) { | 97 void AddRcode(int rcode, IoMode mode) { |
98 scoped_ptr<DnsResponse> response( | 98 scoped_ptr<DnsResponse> response( |
99 new DnsResponse(query_->io_buffer()->data(), | 99 new DnsResponse(query_->io_buffer()->data(), |
100 query_->io_buffer()->size(), | 100 query_->io_buffer()->size(), |
101 0)); | 101 0)); |
102 dns_protocol::Header* header = | 102 dns_protocol::Header* header = |
103 reinterpret_cast<dns_protocol::Header*>(response->io_buffer()->data()); | 103 reinterpret_cast<dns_protocol::Header*>(response->io_buffer()->data()); |
104 header->flags |= base::HostToNet16(dns_protocol::kFlagResponse | rcode); | 104 header->flags |= base::HostToNet16(dns_protocol::kFlagResponse | rcode); |
105 AddResponse(response.Pass(), mode); | 105 AddResponse(std::move(response), mode); |
106 } | 106 } |
107 | 107 |
108 // Add error response. | 108 // Add error response. |
109 void AddReadError(int error, IoMode mode) { | 109 void AddReadError(int error, IoMode mode) { |
110 reads_.push_back(MockRead(mode, error, num_reads_and_writes())); | 110 reads_.push_back(MockRead(mode, error, num_reads_and_writes())); |
111 } | 111 } |
112 | 112 |
113 // Build, if needed, and return the SocketDataProvider. No new responses | 113 // Build, if needed, and return the SocketDataProvider. No new responses |
114 // should be added afterwards. | 114 // should be added afterwards. |
115 SequencedSocketData* GetProvider() { | 115 SequencedSocketData* GetProvider() { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 NetLog* net_log, | 190 NetLog* net_log, |
191 const NetLog::Source& source) override { | 191 const NetLog::Source& source) override { |
192 if (fail_next_socket_) { | 192 if (fail_next_socket_) { |
193 fail_next_socket_ = false; | 193 fail_next_socket_ = false; |
194 return scoped_ptr<DatagramClientSocket>( | 194 return scoped_ptr<DatagramClientSocket>( |
195 new FailingUDPClientSocket(&empty_data_, net_log)); | 195 new FailingUDPClientSocket(&empty_data_, net_log)); |
196 } | 196 } |
197 SocketDataProvider* data_provider = mock_data().GetNext(); | 197 SocketDataProvider* data_provider = mock_data().GetNext(); |
198 scoped_ptr<TestUDPClientSocket> socket( | 198 scoped_ptr<TestUDPClientSocket> socket( |
199 new TestUDPClientSocket(this, data_provider, net_log)); | 199 new TestUDPClientSocket(this, data_provider, net_log)); |
200 return socket.Pass(); | 200 return std::move(socket); |
201 } | 201 } |
202 | 202 |
203 void OnConnect(const IPEndPoint& endpoint) { | 203 void OnConnect(const IPEndPoint& endpoint) { |
204 remote_endpoints_.push_back(endpoint); | 204 remote_endpoints_.push_back(endpoint); |
205 } | 205 } |
206 | 206 |
207 std::vector<IPEndPoint> remote_endpoints_; | 207 std::vector<IPEndPoint> remote_endpoints_; |
208 bool fail_next_socket_; | 208 bool fail_next_socket_; |
209 | 209 |
210 private: | 210 private: |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 DnsSocketPool::CreateNull(socket_factory_.get()), | 353 DnsSocketPool::CreateNull(socket_factory_.get()), |
354 base::Bind(&DnsTransactionTest::GetNextId, base::Unretained(this)), | 354 base::Bind(&DnsTransactionTest::GetNextId, base::Unretained(this)), |
355 NULL /* NetLog */); | 355 NULL /* NetLog */); |
356 transaction_factory_ = DnsTransactionFactory::CreateFactory(session_.get()); | 356 transaction_factory_ = DnsTransactionFactory::CreateFactory(session_.get()); |
357 } | 357 } |
358 | 358 |
359 void AddSocketData(scoped_ptr<DnsSocketData> data) { | 359 void AddSocketData(scoped_ptr<DnsSocketData> data) { |
360 CHECK(socket_factory_.get()); | 360 CHECK(socket_factory_.get()); |
361 transaction_ids_.push_back(data->query_id()); | 361 transaction_ids_.push_back(data->query_id()); |
362 socket_factory_->AddSocketDataProvider(data->GetProvider()); | 362 socket_factory_->AddSocketDataProvider(data->GetProvider()); |
363 socket_data_.push_back(data.Pass()); | 363 socket_data_.push_back(std::move(data)); |
364 } | 364 } |
365 | 365 |
366 // 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 |
367 // 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 |
368 // |data| should equal |id|, unless testing mismatched response. | 368 // |data| should equal |id|, unless testing mismatched response. |
369 void AddQueryAndResponse(uint16_t id, | 369 void AddQueryAndResponse(uint16_t id, |
370 const char* dotted_name, | 370 const char* dotted_name, |
371 uint16_t qtype, | 371 uint16_t qtype, |
372 const uint8_t* response_data, | 372 const uint8_t* response_data, |
373 size_t response_length, | 373 size_t response_length, |
374 IoMode mode, | 374 IoMode mode, |
375 bool use_tcp) { | 375 bool use_tcp) { |
376 CHECK(socket_factory_.get()); | 376 CHECK(socket_factory_.get()); |
377 scoped_ptr<DnsSocketData> data( | 377 scoped_ptr<DnsSocketData> data( |
378 new DnsSocketData(id, dotted_name, qtype, mode, use_tcp)); | 378 new DnsSocketData(id, dotted_name, qtype, mode, use_tcp)); |
379 data->AddResponseData(response_data, response_length, mode); | 379 data->AddResponseData(response_data, response_length, mode); |
380 AddSocketData(data.Pass()); | 380 AddSocketData(std::move(data)); |
381 } | 381 } |
382 | 382 |
383 void AddAsyncQueryAndResponse(uint16_t id, | 383 void AddAsyncQueryAndResponse(uint16_t id, |
384 const char* dotted_name, | 384 const char* dotted_name, |
385 uint16_t qtype, | 385 uint16_t qtype, |
386 const uint8_t* data, | 386 const uint8_t* data, |
387 size_t data_length) { | 387 size_t data_length) { |
388 AddQueryAndResponse(id, dotted_name, qtype, data, data_length, ASYNC, | 388 AddQueryAndResponse(id, dotted_name, qtype, data, data_length, ASYNC, |
389 false); | 389 false); |
390 } | 390 } |
391 | 391 |
392 void AddSyncQueryAndResponse(uint16_t id, | 392 void AddSyncQueryAndResponse(uint16_t id, |
393 const char* dotted_name, | 393 const char* dotted_name, |
394 uint16_t qtype, | 394 uint16_t qtype, |
395 const uint8_t* data, | 395 const uint8_t* data, |
396 size_t data_length) { | 396 size_t data_length) { |
397 AddQueryAndResponse(id, dotted_name, qtype, data, data_length, SYNCHRONOUS, | 397 AddQueryAndResponse(id, dotted_name, qtype, data, data_length, SYNCHRONOUS, |
398 false); | 398 false); |
399 } | 399 } |
400 | 400 |
401 // Add expected query of |dotted_name| and |qtype| and no response. | 401 // Add expected query of |dotted_name| and |qtype| and no response. |
402 void AddQueryAndTimeout(const char* dotted_name, uint16_t qtype) { | 402 void AddQueryAndTimeout(const char* dotted_name, uint16_t qtype) { |
403 uint16_t id = base::RandInt(0, std::numeric_limits<uint16_t>::max()); | 403 uint16_t id = base::RandInt(0, std::numeric_limits<uint16_t>::max()); |
404 scoped_ptr<DnsSocketData> data( | 404 scoped_ptr<DnsSocketData> data( |
405 new DnsSocketData(id, dotted_name, qtype, ASYNC, false)); | 405 new DnsSocketData(id, dotted_name, qtype, ASYNC, false)); |
406 AddSocketData(data.Pass()); | 406 AddSocketData(std::move(data)); |
407 } | 407 } |
408 | 408 |
409 // 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 |
410 // 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. |
411 void AddQueryAndRcode(const char* dotted_name, | 411 void AddQueryAndRcode(const char* dotted_name, |
412 uint16_t qtype, | 412 uint16_t qtype, |
413 int rcode, | 413 int rcode, |
414 IoMode mode, | 414 IoMode mode, |
415 bool use_tcp) { | 415 bool use_tcp) { |
416 CHECK_NE(dns_protocol::kRcodeNOERROR, rcode); | 416 CHECK_NE(dns_protocol::kRcodeNOERROR, rcode); |
417 uint16_t id = base::RandInt(0, std::numeric_limits<uint16_t>::max()); | 417 uint16_t id = base::RandInt(0, std::numeric_limits<uint16_t>::max()); |
418 scoped_ptr<DnsSocketData> data( | 418 scoped_ptr<DnsSocketData> data( |
419 new DnsSocketData(id, dotted_name, qtype, mode, use_tcp)); | 419 new DnsSocketData(id, dotted_name, qtype, mode, use_tcp)); |
420 data->AddRcode(rcode, mode); | 420 data->AddRcode(rcode, mode); |
421 AddSocketData(data.Pass()); | 421 AddSocketData(std::move(data)); |
422 } | 422 } |
423 | 423 |
424 void AddAsyncQueryAndRcode(const char* dotted_name, | 424 void AddAsyncQueryAndRcode(const char* dotted_name, |
425 uint16_t qtype, | 425 uint16_t qtype, |
426 int rcode) { | 426 int rcode) { |
427 AddQueryAndRcode(dotted_name, qtype, rcode, ASYNC, false); | 427 AddQueryAndRcode(dotted_name, qtype, rcode, ASYNC, false); |
428 } | 428 } |
429 | 429 |
430 void AddSyncQueryAndRcode(const char* dotted_name, | 430 void AddSyncQueryAndRcode(const char* dotted_name, |
431 uint16_t qtype, | 431 uint16_t qtype, |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 config_.timeout = TestTimeouts::tiny_timeout(); | 555 config_.timeout = TestTimeouts::tiny_timeout(); |
556 ConfigureFactory(); | 556 ConfigureFactory(); |
557 | 557 |
558 // Attempt receives mismatched response followed by valid response. | 558 // Attempt receives mismatched response followed by valid response. |
559 scoped_ptr<DnsSocketData> data( | 559 scoped_ptr<DnsSocketData> data( |
560 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, false)); | 560 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, SYNCHRONOUS, false)); |
561 data->AddResponseData(kT1ResponseDatagram, | 561 data->AddResponseData(kT1ResponseDatagram, |
562 arraysize(kT1ResponseDatagram), SYNCHRONOUS); | 562 arraysize(kT1ResponseDatagram), SYNCHRONOUS); |
563 data->AddResponseData(kT0ResponseDatagram, | 563 data->AddResponseData(kT0ResponseDatagram, |
564 arraysize(kT0ResponseDatagram), SYNCHRONOUS); | 564 arraysize(kT0ResponseDatagram), SYNCHRONOUS); |
565 AddSocketData(data.Pass()); | 565 AddSocketData(std::move(data)); |
566 | 566 |
567 TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount); | 567 TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount); |
568 EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get())); | 568 EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get())); |
569 } | 569 } |
570 | 570 |
571 TEST_F(DnsTransactionTest, MismatchedResponseAsync) { | 571 TEST_F(DnsTransactionTest, MismatchedResponseAsync) { |
572 config_.attempts = 2; | 572 config_.attempts = 2; |
573 config_.timeout = TestTimeouts::tiny_timeout(); | 573 config_.timeout = TestTimeouts::tiny_timeout(); |
574 ConfigureFactory(); | 574 ConfigureFactory(); |
575 | 575 |
576 // First attempt receives mismatched response followed by valid response. | 576 // First attempt receives mismatched response followed by valid response. |
577 // Second attempt times out. | 577 // Second attempt times out. |
578 scoped_ptr<DnsSocketData> data( | 578 scoped_ptr<DnsSocketData> data( |
579 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, false)); | 579 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, false)); |
580 data->AddResponseData(kT1ResponseDatagram, | 580 data->AddResponseData(kT1ResponseDatagram, |
581 arraysize(kT1ResponseDatagram), ASYNC); | 581 arraysize(kT1ResponseDatagram), ASYNC); |
582 data->AddResponseData(kT0ResponseDatagram, | 582 data->AddResponseData(kT0ResponseDatagram, |
583 arraysize(kT0ResponseDatagram), ASYNC); | 583 arraysize(kT0ResponseDatagram), ASYNC); |
584 AddSocketData(data.Pass()); | 584 AddSocketData(std::move(data)); |
585 AddQueryAndTimeout(kT0HostName, kT0Qtype); | 585 AddQueryAndTimeout(kT0HostName, kT0Qtype); |
586 | 586 |
587 TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount); | 587 TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount); |
588 EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get())); | 588 EXPECT_TRUE(helper0.RunUntilDone(transaction_factory_.get())); |
589 } | 589 } |
590 | 590 |
591 TEST_F(DnsTransactionTest, MismatchedResponseFail) { | 591 TEST_F(DnsTransactionTest, MismatchedResponseFail) { |
592 config_.timeout = TestTimeouts::tiny_timeout(); | 592 config_.timeout = TestTimeouts::tiny_timeout(); |
593 ConfigureFactory(); | 593 ConfigureFactory(); |
594 | 594 |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
906 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); | 906 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); |
907 // Valid response but length too short. | 907 // Valid response but length too short. |
908 // This must be truncated in the question section. The DnsResponse doesn't | 908 // This must be truncated in the question section. The DnsResponse doesn't |
909 // examine the answer section until asked to parse it, so truncating it in | 909 // examine the answer section until asked to parse it, so truncating it in |
910 // the answer section would result in the DnsTransaction itself succeeding. | 910 // the answer section would result in the DnsTransaction itself succeeding. |
911 data->AddResponseWithLength( | 911 data->AddResponseWithLength( |
912 make_scoped_ptr( | 912 make_scoped_ptr( |
913 new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram), | 913 new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram), |
914 arraysize(kT0ResponseDatagram), 0)), | 914 arraysize(kT0ResponseDatagram), 0)), |
915 ASYNC, static_cast<uint16_t>(kT0QuerySize - 1)); | 915 ASYNC, static_cast<uint16_t>(kT0QuerySize - 1)); |
916 AddSocketData(data.Pass()); | 916 AddSocketData(std::move(data)); |
917 | 917 |
918 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_MALFORMED_RESPONSE); | 918 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_MALFORMED_RESPONSE); |
919 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 919 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
920 } | 920 } |
921 | 921 |
922 TEST_F(DnsTransactionTest, TCPTimeout) { | 922 TEST_F(DnsTransactionTest, TCPTimeout) { |
923 config_.timeout = TestTimeouts::tiny_timeout(); | 923 config_.timeout = TestTimeouts::tiny_timeout(); |
924 ConfigureFactory(); | 924 ConfigureFactory(); |
925 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, | 925 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, |
926 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); | 926 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); |
(...skipping 10 matching lines...) Expand all Loading... |
937 scoped_ptr<DnsSocketData> data( | 937 scoped_ptr<DnsSocketData> data( |
938 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); | 938 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); |
939 // Return all but the last byte of the response. | 939 // Return all but the last byte of the response. |
940 data->AddResponseWithLength( | 940 data->AddResponseWithLength( |
941 make_scoped_ptr( | 941 make_scoped_ptr( |
942 new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram), | 942 new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram), |
943 arraysize(kT0ResponseDatagram) - 1, 0)), | 943 arraysize(kT0ResponseDatagram) - 1, 0)), |
944 ASYNC, static_cast<uint16_t>(arraysize(kT0ResponseDatagram))); | 944 ASYNC, static_cast<uint16_t>(arraysize(kT0ResponseDatagram))); |
945 // Then return a 0-length read. | 945 // Then return a 0-length read. |
946 data->AddReadError(0, ASYNC); | 946 data->AddReadError(0, ASYNC); |
947 AddSocketData(data.Pass()); | 947 AddSocketData(std::move(data)); |
948 | 948 |
949 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_CONNECTION_CLOSED); | 949 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_CONNECTION_CLOSED); |
950 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 950 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
951 } | 951 } |
952 | 952 |
953 TEST_F(DnsTransactionTest, TCPReadReturnsZeroSynchronous) { | 953 TEST_F(DnsTransactionTest, TCPReadReturnsZeroSynchronous) { |
954 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, | 954 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, |
955 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); | 955 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); |
956 scoped_ptr<DnsSocketData> data( | 956 scoped_ptr<DnsSocketData> data( |
957 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); | 957 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); |
958 // Return all but the last byte of the response. | 958 // Return all but the last byte of the response. |
959 data->AddResponseWithLength( | 959 data->AddResponseWithLength( |
960 make_scoped_ptr( | 960 make_scoped_ptr( |
961 new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram), | 961 new DnsResponse(reinterpret_cast<const char*>(kT0ResponseDatagram), |
962 arraysize(kT0ResponseDatagram) - 1, 0)), | 962 arraysize(kT0ResponseDatagram) - 1, 0)), |
963 SYNCHRONOUS, static_cast<uint16_t>(arraysize(kT0ResponseDatagram))); | 963 SYNCHRONOUS, static_cast<uint16_t>(arraysize(kT0ResponseDatagram))); |
964 // Then return a 0-length read. | 964 // Then return a 0-length read. |
965 data->AddReadError(0, SYNCHRONOUS); | 965 data->AddReadError(0, SYNCHRONOUS); |
966 AddSocketData(data.Pass()); | 966 AddSocketData(std::move(data)); |
967 | 967 |
968 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_CONNECTION_CLOSED); | 968 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_CONNECTION_CLOSED); |
969 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 969 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
970 } | 970 } |
971 | 971 |
972 TEST_F(DnsTransactionTest, TCPConnectionClosedAsync) { | 972 TEST_F(DnsTransactionTest, TCPConnectionClosedAsync) { |
973 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, | 973 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, |
974 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); | 974 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); |
975 scoped_ptr<DnsSocketData> data( | 975 scoped_ptr<DnsSocketData> data( |
976 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); | 976 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); |
977 data->AddReadError(ERR_CONNECTION_CLOSED, ASYNC); | 977 data->AddReadError(ERR_CONNECTION_CLOSED, ASYNC); |
978 AddSocketData(data.Pass()); | 978 AddSocketData(std::move(data)); |
979 | 979 |
980 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_CONNECTION_CLOSED); | 980 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_CONNECTION_CLOSED); |
981 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 981 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
982 } | 982 } |
983 | 983 |
984 TEST_F(DnsTransactionTest, TCPConnectionClosedSynchronous) { | 984 TEST_F(DnsTransactionTest, TCPConnectionClosedSynchronous) { |
985 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, | 985 AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, |
986 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); | 986 dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC); |
987 scoped_ptr<DnsSocketData> data( | 987 scoped_ptr<DnsSocketData> data( |
988 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); | 988 new DnsSocketData(0 /* id */, kT0HostName, kT0Qtype, ASYNC, true)); |
989 data->AddReadError(ERR_CONNECTION_CLOSED, SYNCHRONOUS); | 989 data->AddReadError(ERR_CONNECTION_CLOSED, SYNCHRONOUS); |
990 AddSocketData(data.Pass()); | 990 AddSocketData(std::move(data)); |
991 | 991 |
992 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_CONNECTION_CLOSED); | 992 TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_CONNECTION_CLOSED); |
993 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 993 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
994 } | 994 } |
995 | 995 |
996 TEST_F(DnsTransactionTest, InvalidQuery) { | 996 TEST_F(DnsTransactionTest, InvalidQuery) { |
997 config_.timeout = TestTimeouts::tiny_timeout(); | 997 config_.timeout = TestTimeouts::tiny_timeout(); |
998 ConfigureFactory(); | 998 ConfigureFactory(); |
999 | 999 |
1000 TransactionHelper helper0(".", dns_protocol::kTypeA, ERR_INVALID_ARGUMENT); | 1000 TransactionHelper helper0(".", dns_protocol::kTypeA, ERR_INVALID_ARGUMENT); |
1001 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 1001 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
1002 } | 1002 } |
1003 | 1003 |
1004 } // namespace | 1004 } // namespace |
1005 | 1005 |
1006 } // namespace net | 1006 } // namespace net |
OLD | NEW |