OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "google_apis/gcm/base/socket_stream.h" | 5 #include "google_apis/gcm/base/socket_stream.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
(...skipping 28 matching lines...) Expand all Loading... |
39 | 39 |
40 // Simulates a google::protobuf::io::CodedInputStream read. | 40 // Simulates a google::protobuf::io::CodedInputStream read. |
41 base::StringPiece DoInputStreamRead(int bytes); | 41 base::StringPiece DoInputStreamRead(int bytes); |
42 // Simulates a google::protobuf::io::CodedOutputStream write. | 42 // Simulates a google::protobuf::io::CodedOutputStream write. |
43 int DoOutputStreamWrite(const base::StringPiece& write_src); | 43 int DoOutputStreamWrite(const base::StringPiece& write_src); |
44 | 44 |
45 // Synchronous Refresh wrapper. | 45 // Synchronous Refresh wrapper. |
46 void WaitForData(int msg_size); | 46 void WaitForData(int msg_size); |
47 | 47 |
48 base::MessageLoop* message_loop() { return &message_loop_; }; | 48 base::MessageLoop* message_loop() { return &message_loop_; }; |
49 net::DelayedSocketData* data_provider() { return data_provider_.get(); } | 49 net::StaticSocketDataProvider* data_provider() { |
| 50 return data_provider_.get(); |
| 51 } |
50 SocketInputStream* input_stream() { return socket_input_stream_.get(); } | 52 SocketInputStream* input_stream() { return socket_input_stream_.get(); } |
51 SocketOutputStream* output_stream() { return socket_output_stream_.get(); } | 53 SocketOutputStream* output_stream() { return socket_output_stream_.get(); } |
52 net::StreamSocket* socket() { return socket_.get(); } | 54 net::StreamSocket* socket() { return socket_.get(); } |
53 | 55 |
54 private: | 56 private: |
55 void OpenConnection(); | 57 void OpenConnection(); |
56 void ResetInputStream(); | 58 void ResetInputStream(); |
57 void ResetOutputStream(); | 59 void ResetOutputStream(); |
58 | 60 |
59 void ConnectCallback(int result); | 61 void ConnectCallback(int result); |
60 | 62 |
61 // SocketStreams and their data providers. | 63 // SocketStreams and their data providers. |
62 ReadList mock_reads_; | 64 ReadList mock_reads_; |
63 WriteList mock_writes_; | 65 WriteList mock_writes_; |
64 scoped_ptr<net::DelayedSocketData> data_provider_; | 66 scoped_ptr<net::StaticSocketDataProvider> data_provider_; |
65 scoped_ptr<SocketInputStream> socket_input_stream_; | 67 scoped_ptr<SocketInputStream> socket_input_stream_; |
66 scoped_ptr<SocketOutputStream> socket_output_stream_; | 68 scoped_ptr<SocketOutputStream> socket_output_stream_; |
67 | 69 |
68 // net:: components. | 70 // net:: components. |
69 scoped_ptr<net::StreamSocket> socket_; | 71 scoped_ptr<net::StreamSocket> socket_; |
70 net::MockClientSocketFactory socket_factory_; | 72 net::MockClientSocketFactory socket_factory_; |
71 net::AddressList address_list_; | 73 net::AddressList address_list_; |
72 | 74 |
73 base::MessageLoopForIO message_loop_; | 75 base::MessageLoopForIO message_loop_; |
74 }; | 76 }; |
75 | 77 |
76 GCMSocketStreamTest::GCMSocketStreamTest() { | 78 GCMSocketStreamTest::GCMSocketStreamTest() { |
77 net::IPAddressNumber ip_number; | 79 net::IPAddressNumber ip_number; |
78 net::ParseIPLiteralToNumber("127.0.0.1", &ip_number); | 80 net::ParseIPLiteralToNumber("127.0.0.1", &ip_number); |
79 address_list_ = net::AddressList::CreateFromIPAddress(ip_number, 5228); | 81 address_list_ = net::AddressList::CreateFromIPAddress(ip_number, 5228); |
80 } | 82 } |
81 | 83 |
82 GCMSocketStreamTest::~GCMSocketStreamTest() {} | 84 GCMSocketStreamTest::~GCMSocketStreamTest() {} |
83 | 85 |
84 void GCMSocketStreamTest::BuildSocket(const ReadList& read_list, | 86 void GCMSocketStreamTest::BuildSocket(const ReadList& read_list, |
85 const WriteList& write_list) { | 87 const WriteList& write_list) { |
86 mock_reads_ = read_list; | 88 mock_reads_ = read_list; |
87 mock_writes_ = write_list; | 89 mock_writes_ = write_list; |
88 data_provider_.reset( | 90 data_provider_.reset( |
89 new net::DelayedSocketData( | 91 new net::StaticSocketDataProvider( |
90 0, | |
91 vector_as_array(&mock_reads_), mock_reads_.size(), | 92 vector_as_array(&mock_reads_), mock_reads_.size(), |
92 vector_as_array(&mock_writes_), mock_writes_.size())); | 93 vector_as_array(&mock_writes_), mock_writes_.size())); |
93 socket_factory_.AddSocketDataProvider(data_provider_.get()); | 94 socket_factory_.AddSocketDataProvider(data_provider_.get()); |
94 OpenConnection(); | 95 OpenConnection(); |
95 ResetInputStream(); | 96 ResetInputStream(); |
96 ResetOutputStream(); | 97 ResetOutputStream(); |
97 } | 98 } |
98 | 99 |
99 void GCMSocketStreamTest::PumpLoop() { | 100 void GCMSocketStreamTest::PumpLoop() { |
100 base::RunLoop run_loop; | 101 base::RunLoop run_loop; |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 ASSERT_EQ(std::string(kReadData, kReadDataSize), | 225 ASSERT_EQ(std::string(kReadData, kReadDataSize), |
225 DoInputStreamRead(kReadDataSize)); | 226 DoInputStreamRead(kReadDataSize)); |
226 } | 227 } |
227 | 228 |
228 // A read where no data is available at first (IO_PENDING will be returned). | 229 // A read where no data is available at first (IO_PENDING will be returned). |
229 TEST_F(GCMSocketStreamTest, ReadAsync) { | 230 TEST_F(GCMSocketStreamTest, ReadAsync) { |
230 int first_read_len = kReadDataSize / 2; | 231 int first_read_len = kReadDataSize / 2; |
231 int second_read_len = kReadDataSize - first_read_len; | 232 int second_read_len = kReadDataSize - first_read_len; |
232 ReadList read_list; | 233 ReadList read_list; |
233 read_list.push_back( | 234 read_list.push_back( |
234 net::MockRead(net::SYNCHRONOUS, net::ERR_IO_PENDING)); | |
235 read_list.push_back( | |
236 net::MockRead(net::ASYNC, kReadData, first_read_len)); | 235 net::MockRead(net::ASYNC, kReadData, first_read_len)); |
237 read_list.push_back( | 236 read_list.push_back( |
238 net::MockRead(net::ASYNC, &kReadData[first_read_len], second_read_len)); | 237 net::MockRead(net::ASYNC, &kReadData[first_read_len], second_read_len)); |
239 BuildSocket(read_list, WriteList()); | 238 BuildSocket(read_list, WriteList()); |
240 | |
241 base::MessageLoop::current()->PostTask( | |
242 FROM_HERE, | |
243 base::Bind(&net::DelayedSocketData::ForceNextRead, | |
244 base::Unretained(data_provider()))); | |
245 WaitForData(kReadDataSize); | 239 WaitForData(kReadDataSize); |
246 ASSERT_EQ(std::string(kReadData, kReadDataSize), | 240 ASSERT_EQ(std::string(kReadData, kReadDataSize), |
247 DoInputStreamRead(kReadDataSize)); | 241 DoInputStreamRead(kReadDataSize)); |
248 } | 242 } |
249 | 243 |
250 // Simulate two packets arriving at once. Read them in two separate calls. | 244 // Simulate two packets arriving at once. Read them in two separate calls. |
251 TEST_F(GCMSocketStreamTest, TwoReadsAtOnce) { | 245 TEST_F(GCMSocketStreamTest, TwoReadsAtOnce) { |
252 std::string long_data = std::string(kReadData, kReadDataSize) + | 246 std::string long_data = std::string(kReadData, kReadDataSize) + |
253 std::string(kReadData2, kReadData2Size); | 247 std::string(kReadData2, kReadData2Size); |
254 BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, | 248 BuildSocket(ReadList(1, net::MockRead(net::SYNCHRONOUS, |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 TEST_F(GCMSocketStreamTest, WriteDisconnected) { | 391 TEST_F(GCMSocketStreamTest, WriteDisconnected) { |
398 BuildSocket(ReadList(), WriteList()); | 392 BuildSocket(ReadList(), WriteList()); |
399 socket()->Disconnect(); | 393 socket()->Disconnect(); |
400 DoOutputStreamWrite(base::StringPiece(kWriteData, kWriteDataSize)); | 394 DoOutputStreamWrite(base::StringPiece(kWriteData, kWriteDataSize)); |
401 ASSERT_EQ(SocketOutputStream::CLOSED, output_stream()->GetState()); | 395 ASSERT_EQ(SocketOutputStream::CLOSED, output_stream()->GetState()); |
402 ASSERT_EQ(net::ERR_CONNECTION_CLOSED, output_stream()->last_error()); | 396 ASSERT_EQ(net::ERR_CONNECTION_CLOSED, output_stream()->last_error()); |
403 } | 397 } |
404 | 398 |
405 } // namespace | 399 } // namespace |
406 } // namespace gcm | 400 } // namespace gcm |
OLD | NEW |