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/socket/socket_test_util.h" | 5 #include "net/socket/socket_test_util.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
149 read_count_(reads_count), | 149 read_count_(reads_count), |
150 writes_(writes), | 150 writes_(writes), |
151 write_index_(0), | 151 write_index_(0), |
152 write_count_(writes_count) { | 152 write_count_(writes_count) { |
153 } | 153 } |
154 | 154 |
155 StaticSocketDataHelper::~StaticSocketDataHelper() { | 155 StaticSocketDataHelper::~StaticSocketDataHelper() { |
156 } | 156 } |
157 | 157 |
158 const MockRead& StaticSocketDataHelper::PeekRead() const { | 158 const MockRead& StaticSocketDataHelper::PeekRead() const { |
159 CHECK(!AllReadDataConsumed()); | 159 CHECK(!at_read_eof()); |
160 return reads_[read_index_]; | 160 return reads_[read_index_]; |
161 } | 161 } |
162 | 162 |
163 const MockWrite& StaticSocketDataHelper::PeekWrite() const { | 163 const MockWrite& StaticSocketDataHelper::PeekWrite() const { |
164 CHECK(!AllWriteDataConsumed()); | 164 CHECK(!at_write_eof()); |
165 return writes_[write_index_]; | 165 return writes_[write_index_]; |
166 } | 166 } |
167 | 167 |
168 const MockRead& StaticSocketDataHelper::AdvanceRead() { | 168 const MockRead& StaticSocketDataHelper::AdvanceRead() { |
169 CHECK(!AllReadDataConsumed()); | 169 CHECK(!at_read_eof()); |
170 return reads_[read_index_++]; | 170 return reads_[read_index_++]; |
171 } | 171 } |
172 | 172 |
173 const MockWrite& StaticSocketDataHelper::AdvanceWrite() { | 173 const MockWrite& StaticSocketDataHelper::AdvanceWrite() { |
174 CHECK(!AllWriteDataConsumed()); | 174 CHECK(!at_write_eof()); |
175 return writes_[write_index_++]; | 175 return writes_[write_index_++]; |
176 } | 176 } |
177 | 177 |
178 bool StaticSocketDataHelper::VerifyWriteData(const std::string& data) { | 178 bool StaticSocketDataHelper::VerifyWriteData(const std::string& data) { |
179 CHECK(!AllWriteDataConsumed()); | 179 CHECK(!at_write_eof()); |
180 // Check that what the actual data matches the expectations. | 180 // Check that what the actual data matches the expectations. |
181 const MockWrite& next_write = PeekWrite(); | 181 const MockWrite& next_write = PeekWrite(); |
182 if (!next_write.data) | 182 if (!next_write.data) |
183 return true; | 183 return true; |
184 | 184 |
185 // Note: Partial writes are supported here. If the expected data | 185 // Note: Partial writes are supported here. If the expected data |
186 // is a match, but shorter than the write actually written, that is legal. | 186 // is a match, but shorter than the write actually written, that is legal. |
187 // Example: | 187 // Example: |
188 // Application writes "foobarbaz" (9 bytes) | 188 // Application writes "foobarbaz" (9 bytes) |
189 // Expected write was "foo" (3 bytes) | 189 // Expected write was "foo" (3 bytes) |
190 // This is a success, and the function returns true. | 190 // This is a success, and the function returns true. |
191 std::string expected_data(next_write.data, next_write.data_len); | 191 std::string expected_data(next_write.data, next_write.data_len); |
192 std::string actual_data(data.substr(0, next_write.data_len)); | 192 std::string actual_data(data.substr(0, next_write.data_len)); |
193 EXPECT_GE(data.length(), expected_data.length()); | 193 EXPECT_GE(data.length(), expected_data.length()); |
194 EXPECT_EQ(expected_data, actual_data); | 194 EXPECT_EQ(expected_data, actual_data); |
195 return expected_data == actual_data; | 195 return expected_data == actual_data; |
196 } | 196 } |
197 | 197 |
198 bool StaticSocketDataHelper::AllReadDataConsumed() const { | |
199 return read_index_ >= read_count_; | |
200 } | |
201 | |
202 bool StaticSocketDataHelper::AllWriteDataConsumed() const { | |
203 return write_index_ >= write_count_; | |
204 } | |
205 | |
206 void StaticSocketDataHelper::Reset() { | 198 void StaticSocketDataHelper::Reset() { |
207 read_index_ = 0; | 199 read_index_ = 0; |
208 write_index_ = 0; | 200 write_index_ = 0; |
209 } | 201 } |
210 | 202 |
211 StaticSocketDataProvider::StaticSocketDataProvider() | 203 StaticSocketDataProvider::StaticSocketDataProvider() |
212 : StaticSocketDataProvider(nullptr, 0, nullptr, 0) { | 204 : StaticSocketDataProvider(nullptr, 0, nullptr, 0) { |
213 } | 205 } |
214 | 206 |
215 StaticSocketDataProvider::StaticSocketDataProvider(MockRead* reads, | 207 StaticSocketDataProvider::StaticSocketDataProvider(MockRead* reads, |
216 size_t reads_count, | 208 size_t reads_count, |
217 MockWrite* writes, | 209 MockWrite* writes, |
218 size_t writes_count) | 210 size_t writes_count) |
219 : helper_(reads, reads_count, writes, writes_count) { | 211 : helper_(reads, reads_count, writes, writes_count) { |
220 } | 212 } |
221 | 213 |
222 StaticSocketDataProvider::~StaticSocketDataProvider() { | 214 StaticSocketDataProvider::~StaticSocketDataProvider() { |
223 } | 215 } |
224 | 216 |
225 MockRead StaticSocketDataProvider::OnRead() { | 217 MockRead StaticSocketDataProvider::OnRead() { |
226 CHECK(!helper_.AllReadDataConsumed()); | 218 CHECK(!helper_.at_read_eof()); |
227 return helper_.AdvanceRead(); | 219 return helper_.AdvanceRead(); |
228 } | 220 } |
229 | 221 |
230 MockWriteResult StaticSocketDataProvider::OnWrite(const std::string& data) { | 222 MockWriteResult StaticSocketDataProvider::OnWrite(const std::string& data) { |
231 if (helper_.write_count() == 0) { | 223 if (helper_.write_count() == 0) { |
232 // Not using mock writes; succeed synchronously. | 224 // Not using mock writes; succeed synchronously. |
233 return MockWriteResult(SYNCHRONOUS, data.length()); | 225 return MockWriteResult(SYNCHRONOUS, data.length()); |
234 } | 226 } |
235 EXPECT_FALSE(helper_.AllWriteDataConsumed()); | 227 EXPECT_FALSE(helper_.at_write_eof()); |
236 if (helper_.AllWriteDataConsumed()) { | 228 if (helper_.at_write_eof()) { |
237 // Show what the extra write actually consists of. | 229 // Show what the extra write actually consists of. |
238 EXPECT_EQ("<unexpected write>", data); | 230 EXPECT_EQ("<unexpected write>", data); |
239 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); | 231 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); |
240 } | 232 } |
241 | 233 |
242 // Check that what we are writing matches the expectation. | 234 // Check that what we are writing matches the expectation. |
243 // Then give the mocked return value. | 235 // Then give the mocked return value. |
244 if (!helper_.VerifyWriteData(data)) | 236 if (!helper_.VerifyWriteData(data)) |
245 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); | 237 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); |
246 | 238 |
247 const MockWrite& next_write = helper_.AdvanceWrite(); | 239 const MockWrite& next_write = helper_.AdvanceWrite(); |
248 // In the case that the write was successful, return the number of bytes | 240 // In the case that the write was successful, return the number of bytes |
249 // written. Otherwise return the error code. | 241 // written. Otherwise return the error code. |
250 int result = | 242 int result = |
251 next_write.result == OK ? next_write.data_len : next_write.result; | 243 next_write.result == OK ? next_write.data_len : next_write.result; |
252 return MockWriteResult(next_write.mode, result); | 244 return MockWriteResult(next_write.mode, result); |
253 } | 245 } |
254 | 246 |
255 void StaticSocketDataProvider::Reset() { | 247 void StaticSocketDataProvider::Reset() { |
256 helper_.Reset(); | 248 helper_.Reset(); |
257 } | 249 } |
258 | 250 |
259 bool StaticSocketDataProvider::AllReadDataConsumed() const { | |
260 return helper_.AllReadDataConsumed(); | |
261 } | |
262 | |
263 bool StaticSocketDataProvider::AllWriteDataConsumed() const { | |
264 return helper_.AllWriteDataConsumed(); | |
265 } | |
266 | |
267 DynamicSocketDataProvider::DynamicSocketDataProvider() | 251 DynamicSocketDataProvider::DynamicSocketDataProvider() |
268 : short_read_limit_(0), | 252 : short_read_limit_(0), |
269 allow_unconsumed_reads_(false) { | 253 allow_unconsumed_reads_(false) { |
270 } | 254 } |
271 | 255 |
272 DynamicSocketDataProvider::~DynamicSocketDataProvider() {} | 256 DynamicSocketDataProvider::~DynamicSocketDataProvider() {} |
273 | 257 |
274 MockRead DynamicSocketDataProvider::OnRead() { | 258 MockRead DynamicSocketDataProvider::OnRead() { |
275 if (reads_.empty()) | 259 if (reads_.empty()) |
276 return MockRead(SYNCHRONOUS, ERR_UNEXPECTED); | 260 return MockRead(SYNCHRONOUS, ERR_UNEXPECTED); |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 MockRead* reads, | 501 MockRead* reads, |
518 size_t reads_count, | 502 size_t reads_count, |
519 MockWrite* writes, | 503 MockWrite* writes, |
520 size_t writes_count) | 504 size_t writes_count) |
521 : SequencedSocketData(reads, reads_count, writes, writes_count) { | 505 : SequencedSocketData(reads, reads_count, writes, writes_count) { |
522 set_connect_data(connect); | 506 set_connect_data(connect); |
523 } | 507 } |
524 | 508 |
525 MockRead SequencedSocketData::OnRead() { | 509 MockRead SequencedSocketData::OnRead() { |
526 CHECK_EQ(IDLE, read_state_); | 510 CHECK_EQ(IDLE, read_state_); |
527 CHECK(!helper_.AllReadDataConsumed()); | 511 CHECK(!helper_.at_read_eof()); |
528 | 512 |
529 NET_TRACE(1, " *** ") << "sequence_number: " << sequence_number_; | 513 NET_TRACE(1, " *** ") << "sequence_number: " << sequence_number_; |
530 const MockRead& next_read = helper_.PeekRead(); | 514 const MockRead& next_read = helper_.PeekRead(); |
531 NET_TRACE(1, " *** ") << "next_read: " << next_read.sequence_number; | 515 NET_TRACE(1, " *** ") << "next_read: " << next_read.sequence_number; |
532 CHECK_GE(next_read.sequence_number, sequence_number_); | 516 CHECK_GE(next_read.sequence_number, sequence_number_); |
533 | 517 |
534 // Special case handling for hanging reads. | 518 // Special case handling for hanging reads. |
535 if (next_read.mode == ASYNC && next_read.result == ERR_IO_PENDING) { | 519 if (next_read.mode == ASYNC && next_read.result == ERR_IO_PENDING) { |
536 NET_TRACE(1, " *** ") << "Hanging read"; | 520 NET_TRACE(1, " *** ") << "Hanging read"; |
537 helper_.AdvanceRead(); | 521 helper_.AdvanceRead(); |
538 ++sequence_number_; | 522 ++sequence_number_; |
539 CHECK(helper_.AllReadDataConsumed()); | 523 CHECK(helper_.at_read_eof()); |
540 return MockRead(SYNCHRONOUS, ERR_IO_PENDING); | 524 return MockRead(SYNCHRONOUS, ERR_IO_PENDING); |
541 } | 525 } |
542 | 526 |
543 if (next_read.sequence_number <= sequence_number_) { | 527 if (next_read.sequence_number <= sequence_number_) { |
544 if (next_read.mode == SYNCHRONOUS) { | 528 if (next_read.mode == SYNCHRONOUS) { |
545 NET_TRACE(1, " *** ") << "Returning synchronously"; | 529 NET_TRACE(1, " *** ") << "Returning synchronously"; |
546 DumpMockReadWrite(next_read); | 530 DumpMockReadWrite(next_read); |
547 helper_.AdvanceRead(); | 531 helper_.AdvanceRead(); |
548 ++sequence_number_; | 532 ++sequence_number_; |
549 MaybePostWriteCompleteTask(); | 533 MaybePostWriteCompleteTask(); |
(...skipping 11 matching lines...) Expand all Loading... |
561 } else { | 545 } else { |
562 NET_TRACE(1, " *** ") << "Waiting for write to trigger read"; | 546 NET_TRACE(1, " *** ") << "Waiting for write to trigger read"; |
563 read_state_ = PENDING; | 547 read_state_ = PENDING; |
564 } | 548 } |
565 | 549 |
566 return MockRead(SYNCHRONOUS, ERR_IO_PENDING); | 550 return MockRead(SYNCHRONOUS, ERR_IO_PENDING); |
567 } | 551 } |
568 | 552 |
569 MockWriteResult SequencedSocketData::OnWrite(const std::string& data) { | 553 MockWriteResult SequencedSocketData::OnWrite(const std::string& data) { |
570 CHECK_EQ(IDLE, write_state_); | 554 CHECK_EQ(IDLE, write_state_); |
571 CHECK(!helper_.AllWriteDataConsumed()); | 555 CHECK(!helper_.at_write_eof()); |
572 | 556 |
573 NET_TRACE(1, " *** ") << "sequence_number: " << sequence_number_; | 557 NET_TRACE(1, " *** ") << "sequence_number: " << sequence_number_; |
574 const MockWrite& next_write = helper_.PeekWrite(); | 558 const MockWrite& next_write = helper_.PeekWrite(); |
575 NET_TRACE(1, " *** ") << "next_write: " << next_write.sequence_number; | 559 NET_TRACE(1, " *** ") << "next_write: " << next_write.sequence_number; |
576 CHECK_GE(next_write.sequence_number, sequence_number_); | 560 CHECK_GE(next_write.sequence_number, sequence_number_); |
577 | 561 |
578 if (!helper_.VerifyWriteData(data)) | 562 if (!helper_.VerifyWriteData(data)) |
579 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); | 563 return MockWriteResult(SYNCHRONOUS, ERR_UNEXPECTED); |
580 | 564 |
581 if (next_write.sequence_number <= sequence_number_) { | 565 if (next_write.sequence_number <= sequence_number_) { |
(...skipping 27 matching lines...) Expand all Loading... |
609 } | 593 } |
610 | 594 |
611 void SequencedSocketData::Reset() { | 595 void SequencedSocketData::Reset() { |
612 helper_.Reset(); | 596 helper_.Reset(); |
613 sequence_number_ = 0; | 597 sequence_number_ = 0; |
614 read_state_ = IDLE; | 598 read_state_ = IDLE; |
615 write_state_ = IDLE; | 599 write_state_ = IDLE; |
616 weak_factory_.InvalidateWeakPtrs(); | 600 weak_factory_.InvalidateWeakPtrs(); |
617 } | 601 } |
618 | 602 |
619 bool SequencedSocketData::AllReadDataConsumed() const { | 603 bool SequencedSocketData::at_read_eof() const { |
620 return helper_.AllReadDataConsumed(); | 604 return helper_.at_read_eof(); |
621 } | 605 } |
622 | 606 |
623 bool SequencedSocketData::AllWriteDataConsumed() const { | 607 bool SequencedSocketData::at_write_eof() const { |
624 return helper_.AllWriteDataConsumed(); | 608 return helper_.at_read_eof(); |
625 } | 609 } |
626 | 610 |
627 void SequencedSocketData::MaybePostReadCompleteTask() { | 611 void SequencedSocketData::MaybePostReadCompleteTask() { |
628 NET_TRACE(1, " ****** ") << " current: " << sequence_number_; | 612 NET_TRACE(1, " ****** ") << " current: " << sequence_number_; |
629 // Only trigger the next read to complete if there is already a read pending | 613 // Only trigger the next read to complete if there is already a read pending |
630 // which should complete at the current sequence number. | 614 // which should complete at the current sequence number. |
631 if (read_state_ != PENDING || | 615 if (read_state_ != PENDING || |
632 helper_.PeekRead().sequence_number != sequence_number_) { | 616 helper_.PeekRead().sequence_number != sequence_number_) { |
633 return; | 617 return; |
634 } | 618 } |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
734 DCHECK(!is_running_); | 718 DCHECK(!is_running_); |
735 is_running_ = true; | 719 is_running_ = true; |
736 | 720 |
737 SetStopped(false); | 721 SetStopped(false); |
738 int counter = 0; | 722 int counter = 0; |
739 // Continue to consume data until all data has run out, or the stopped_ flag | 723 // Continue to consume data until all data has run out, or the stopped_ flag |
740 // has been set. Consuming data requires two separate operations -- running | 724 // has been set. Consuming data requires two separate operations -- running |
741 // the tasks in the message loop, and explicitly invoking the read/write | 725 // the tasks in the message loop, and explicitly invoking the read/write |
742 // callbacks (simulating network I/O). We check our conditions between each, | 726 // callbacks (simulating network I/O). We check our conditions between each, |
743 // since they can change in either. | 727 // since they can change in either. |
744 while ((!AllWriteDataConsumed() || !AllReadDataConsumed()) && !stopped()) { | 728 while ((!at_write_eof() || !at_read_eof()) && !stopped()) { |
745 if (counter % 2 == 0) | 729 if (counter % 2 == 0) |
746 base::RunLoop().RunUntilIdle(); | 730 base::RunLoop().RunUntilIdle(); |
747 if (counter % 2 == 1) { | 731 if (counter % 2 == 1) { |
748 InvokeCallbacks(); | 732 InvokeCallbacks(); |
749 } | 733 } |
750 counter++; | 734 counter++; |
751 } | 735 } |
752 // We're done consuming new data, but it is possible there are still some | 736 // We're done consuming new data, but it is possible there are still some |
753 // pending callbacks which we expect to complete before returning. | 737 // pending callbacks which we expect to complete before returning. |
754 while (delegate_.get() && | 738 while (delegate_.get() && |
(...skipping 1440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2195 | 2179 |
2196 const char kSOCKS5OkRequest[] = | 2180 const char kSOCKS5OkRequest[] = |
2197 { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 }; | 2181 { 0x05, 0x01, 0x00, 0x03, 0x04, 'h', 'o', 's', 't', 0x00, 0x50 }; |
2198 const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest); | 2182 const int kSOCKS5OkRequestLength = arraysize(kSOCKS5OkRequest); |
2199 | 2183 |
2200 const char kSOCKS5OkResponse[] = | 2184 const char kSOCKS5OkResponse[] = |
2201 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; | 2185 { 0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x00, 0x50 }; |
2202 const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse); | 2186 const int kSOCKS5OkResponseLength = arraysize(kSOCKS5OkResponse); |
2203 | 2187 |
2204 } // namespace net | 2188 } // namespace net |
OLD | NEW |