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 "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
10 #include "base/rand_util.h" | 10 #include "base/rand_util.h" |
(...skipping 28 matching lines...) Expand all Loading... | |
39 uint16 qtype, | 39 uint16 qtype, |
40 IoMode mode, | 40 IoMode mode, |
41 bool use_tcp) | 41 bool use_tcp) |
42 : query_(new DnsQuery(id, DomainFromDot(dotted_name), qtype)), | 42 : query_(new DnsQuery(id, DomainFromDot(dotted_name), qtype)), |
43 use_tcp_(use_tcp) { | 43 use_tcp_(use_tcp) { |
44 if (use_tcp_) { | 44 if (use_tcp_) { |
45 scoped_ptr<uint16> length(new uint16); | 45 scoped_ptr<uint16> length(new uint16); |
46 *length = base::HostToNet16(query_->io_buffer()->size()); | 46 *length = base::HostToNet16(query_->io_buffer()->size()); |
47 writes_.push_back(MockWrite(mode, | 47 writes_.push_back(MockWrite(mode, |
48 reinterpret_cast<const char*>(length.get()), | 48 reinterpret_cast<const char*>(length.get()), |
49 sizeof(uint16))); | 49 sizeof(uint16), num_reads_and_writes())); |
50 lengths_.push_back(length.release()); | 50 lengths_.push_back(length.release()); |
51 } | 51 } |
52 writes_.push_back(MockWrite(mode, | 52 writes_.push_back(MockWrite(mode, query_->io_buffer()->data(), |
53 query_->io_buffer()->data(), | 53 query_->io_buffer()->size(), |
54 query_->io_buffer()->size())); | 54 num_reads_and_writes())); |
55 } | 55 } |
56 ~DnsSocketData() {} | 56 ~DnsSocketData() {} |
57 | 57 |
58 // All responses must be added before GetProvider. | 58 // All responses must be added before GetProvider. |
59 | 59 |
60 // Adds pre-built DnsResponse. |tcp_length| will be used in TCP mode only. | 60 // Adds pre-built DnsResponse. |tcp_length| will be used in TCP mode only. |
61 void AddResponseWithLength(scoped_ptr<DnsResponse> response, IoMode mode, | 61 void AddResponseWithLength(scoped_ptr<DnsResponse> response, IoMode mode, |
62 uint16 tcp_length) { | 62 uint16 tcp_length) { |
63 CHECK(!provider_.get()); | 63 CHECK(!provider_.get()); |
64 if (use_tcp_) { | 64 if (use_tcp_) { |
65 scoped_ptr<uint16> length(new uint16); | 65 scoped_ptr<uint16> length(new uint16); |
66 *length = base::HostToNet16(tcp_length); | 66 *length = base::HostToNet16(tcp_length); |
67 reads_.push_back(MockRead(mode, | 67 reads_.push_back(MockRead(mode, |
68 reinterpret_cast<const char*>(length.get()), | 68 reinterpret_cast<const char*>(length.get()), |
69 sizeof(uint16))); | 69 sizeof(uint16), num_reads_and_writes())); |
70 lengths_.push_back(length.release()); | 70 lengths_.push_back(length.release()); |
71 } | 71 } |
72 reads_.push_back(MockRead(mode, | 72 reads_.push_back(MockRead(mode, response->io_buffer()->data(), |
73 response->io_buffer()->data(), | 73 response->io_buffer()->size(), |
74 response->io_buffer()->size())); | 74 num_reads_and_writes())); |
75 responses_.push_back(response.release()); | 75 responses_.push_back(response.release()); |
76 } | 76 } |
77 | 77 |
78 // Adds pre-built DnsResponse. | 78 // Adds pre-built DnsResponse. |
79 void AddResponse(scoped_ptr<DnsResponse> response, IoMode mode) { | 79 void AddResponse(scoped_ptr<DnsResponse> response, IoMode mode) { |
80 uint16 tcp_length = response->io_buffer()->size(); | 80 uint16 tcp_length = response->io_buffer()->size(); |
81 AddResponseWithLength(response.Pass(), mode, tcp_length); | 81 AddResponseWithLength(response.Pass(), mode, tcp_length); |
82 } | 82 } |
83 | 83 |
84 // Adds pre-built response from |data| buffer. | 84 // Adds pre-built response from |data| buffer. |
(...skipping 10 matching lines...) Expand all Loading... | |
95 query_->io_buffer()->size(), | 95 query_->io_buffer()->size(), |
96 0)); | 96 0)); |
97 dns_protocol::Header* header = | 97 dns_protocol::Header* header = |
98 reinterpret_cast<dns_protocol::Header*>(response->io_buffer()->data()); | 98 reinterpret_cast<dns_protocol::Header*>(response->io_buffer()->data()); |
99 header->flags |= base::HostToNet16(dns_protocol::kFlagResponse | rcode); | 99 header->flags |= base::HostToNet16(dns_protocol::kFlagResponse | rcode); |
100 AddResponse(response.Pass(), mode); | 100 AddResponse(response.Pass(), mode); |
101 } | 101 } |
102 | 102 |
103 // Add error response. | 103 // Add error response. |
104 void AddReadError(int error, IoMode mode) { | 104 void AddReadError(int error, IoMode mode) { |
105 reads_.push_back(MockRead(mode, error)); | 105 reads_.push_back(MockRead(mode, error, num_reads_and_writes())); |
106 } | 106 } |
107 | 107 |
108 // Build, if needed, and return the SocketDataProvider. No new responses | 108 // Build, if needed, and return the SocketDataProvider. No new responses |
109 // should be added afterwards. | 109 // should be added afterwards. |
110 SocketDataProvider* GetProvider() { | 110 SocketDataProvider* GetProvider() { |
111 if (provider_.get()) | 111 if (provider_.get()) |
112 return provider_.get(); | 112 return provider_.get(); |
113 // Terminate the reads with ERR_IO_PENDING to prevent overrun and default to | 113 // Terminate the reads with ERR_IO_PENDING to prevent overrun and default to |
114 // timeout. | 114 // timeout. |
115 reads_.push_back(MockRead(ASYNC, ERR_IO_PENDING)); | 115 reads_.push_back( |
116 provider_.reset(new DelayedSocketData(1, &reads_[0], reads_.size(), | 116 MockRead(ASYNC, ERR_IO_PENDING, writes_.size() + reads_.size())); |
117 &writes_[0], writes_.size())); | 117 provider_.reset(new SequencedSocketData(&reads_[0], reads_.size(), |
118 &writes_[0], writes_.size())); | |
118 if (use_tcp_) { | 119 if (use_tcp_) { |
119 provider_->set_connect_data(MockConnect(reads_[0].mode, OK)); | 120 provider_->set_connect_data(MockConnect(reads_[0].mode, OK)); |
120 } | 121 } |
121 return provider_.get(); | 122 return provider_.get(); |
122 } | 123 } |
123 | 124 |
124 uint16 query_id() const { | 125 uint16 query_id() const { |
125 return query_->id(); | 126 return query_->id(); |
126 } | 127 } |
127 | 128 |
128 // Returns true if the expected query was written to the socket. | 129 // Returns true if the expected query was written to the socket. |
129 bool was_written() const { | 130 bool was_written() const { |
130 CHECK(provider_.get()); | 131 CHECK(provider_.get()); |
131 return provider_->write_index() > 0; | 132 return provider_->WasDataWritten(); |
mmenke
2015/05/04 19:10:57
For the TCP case, where there are two writes, this
mmenke
2015/05/04 19:10:57
optional: Seems a little weird for a lower-case n
Ryan Hamilton
2015/05/04 19:20:30
Good point! I've inlined WasDataWritten().
Ryan Hamilton
2015/05/04 19:24:46
Whoops, sorry, missed this. I don't think I change
mmenke
2015/05/04 19:34:49
Ahh...You're right! I saw the "at_write_eof" just
| |
132 } | 133 } |
133 | 134 |
134 private: | 135 private: |
136 size_t num_reads_and_writes() { return reads_.size() + writes_.size(); } | |
mmenke
2015/05/04 19:10:57
nit: const
Ryan Hamilton
2015/05/04 19:20:30
Done.
| |
137 | |
135 scoped_ptr<DnsQuery> query_; | 138 scoped_ptr<DnsQuery> query_; |
136 bool use_tcp_; | 139 bool use_tcp_; |
137 ScopedVector<uint16> lengths_; | 140 ScopedVector<uint16> lengths_; |
138 ScopedVector<DnsResponse> responses_; | 141 ScopedVector<DnsResponse> responses_; |
139 std::vector<MockWrite> writes_; | 142 std::vector<MockWrite> writes_; |
140 std::vector<MockRead> reads_; | 143 std::vector<MockRead> reads_; |
141 scoped_ptr<DelayedSocketData> provider_; | 144 scoped_ptr<SequencedSocketData> provider_; |
142 | 145 |
143 DISALLOW_COPY_AND_ASSIGN(DnsSocketData); | 146 DISALLOW_COPY_AND_ASSIGN(DnsSocketData); |
144 }; | 147 }; |
145 | 148 |
146 class TestSocketFactory; | 149 class TestSocketFactory; |
147 | 150 |
148 // A variant of MockUDPClientSocket which always fails to Connect. | 151 // A variant of MockUDPClientSocket which always fails to Connect. |
149 class FailingUDPClientSocket : public MockUDPClientSocket { | 152 class FailingUDPClientSocket : public MockUDPClientSocket { |
150 public: | 153 public: |
151 FailingUDPClientSocket(SocketDataProvider* data, | 154 FailingUDPClientSocket(SocketDataProvider* data, |
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1002 config_.timeout = TestTimeouts::tiny_timeout(); | 1005 config_.timeout = TestTimeouts::tiny_timeout(); |
1003 ConfigureFactory(); | 1006 ConfigureFactory(); |
1004 | 1007 |
1005 TransactionHelper helper0(".", dns_protocol::kTypeA, ERR_INVALID_ARGUMENT); | 1008 TransactionHelper helper0(".", dns_protocol::kTypeA, ERR_INVALID_ARGUMENT); |
1006 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); | 1009 EXPECT_TRUE(helper0.Run(transaction_factory_.get())); |
1007 } | 1010 } |
1008 | 1011 |
1009 } // namespace | 1012 } // namespace |
1010 | 1013 |
1011 } // namespace net | 1014 } // namespace net |
OLD | NEW |