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