OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <string> | 5 #include <string> |
6 | 6 |
7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "blimp/net/common.h" | 9 #include "blimp/net/common.h" |
10 #include "blimp/net/stream_packet_writer.h" | 10 #include "blimp/net/stream_packet_writer.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 namespace { | 28 namespace { |
29 | 29 |
30 class StreamPacketWriterTest : public testing::Test { | 30 class StreamPacketWriterTest : public testing::Test { |
31 public: | 31 public: |
32 StreamPacketWriterTest() | 32 StreamPacketWriterTest() |
33 : test_data_( | 33 : test_data_( |
34 new net::DrainableIOBuffer(new net::StringIOBuffer(test_data_str_), | 34 new net::DrainableIOBuffer(new net::StringIOBuffer(test_data_str_), |
35 test_data_str_.size())), | 35 test_data_str_.size())), |
36 message_writer_(&socket_) {} | 36 message_writer_(&socket_) {} |
37 | 37 |
38 ~StreamPacketWriterTest() override {} | |
39 | |
40 protected: | 38 protected: |
41 const std::string test_data_str_ = "U WOT M8"; | 39 const std::string test_data_str_ = "U WOT M8"; |
42 scoped_refptr<net::DrainableIOBuffer> test_data_; | 40 scoped_refptr<net::DrainableIOBuffer> test_data_; |
43 | 41 |
| 42 base::MessageLoop message_loop_; |
44 MockStreamSocket socket_; | 43 MockStreamSocket socket_; |
45 StreamPacketWriter message_writer_; | 44 StreamPacketWriter message_writer_; |
46 base::MessageLoop message_loop_; | |
47 testing::InSequence mock_sequence_; | 45 testing::InSequence mock_sequence_; |
48 | 46 |
49 private: | 47 private: |
50 DISALLOW_COPY_AND_ASSIGN(StreamPacketWriterTest); | 48 DISALLOW_COPY_AND_ASSIGN(StreamPacketWriterTest); |
51 }; | 49 }; |
52 | 50 |
53 // Successful write with 1 async header write and 1 async payload write. | 51 // Successful write with 1 async header write and 1 async payload write. |
54 TEST_F(StreamPacketWriterTest, TestWriteAsync) { | 52 TEST_F(StreamPacketWriterTest, TestWriteAsync) { |
55 net::TestCompletionCallback writer_cb; | 53 net::TestCompletionCallback writer_cb; |
56 net::CompletionCallback header_cb; | 54 net::CompletionCallback header_cb; |
57 net::CompletionCallback payload_cb; | 55 net::CompletionCallback payload_cb; |
58 | 56 |
59 // Write header. | |
60 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), | 57 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), |
61 kPacketHeaderSizeBytes, _)) | 58 kPacketHeaderSizeBytes, _)) |
62 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING))); | 59 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING))); |
63 EXPECT_EQ(net::ERR_IO_PENDING, | 60 message_writer_.WritePacket(test_data_, writer_cb.callback()); |
64 message_writer_.WritePacket(test_data_, writer_cb.callback())); | |
65 Mock::VerifyAndClearExpectations(&socket_); | |
66 | |
67 // Write payload. | |
68 EXPECT_CALL(socket_, | 61 EXPECT_CALL(socket_, |
69 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) | 62 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) |
70 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))); | 63 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))); |
71 header_cb.Run(kPacketHeaderSizeBytes); | 64 header_cb.Run(kPacketHeaderSizeBytes); |
72 Mock::VerifyAndClearExpectations(&socket_); | |
73 | 65 |
74 payload_cb.Run(test_data_str_.size()); | 66 payload_cb.Run(test_data_str_.size()); |
75 EXPECT_EQ(net::OK, writer_cb.WaitForResult()); | 67 EXPECT_EQ(net::OK, writer_cb.WaitForResult()); |
76 } | 68 } |
77 | 69 |
78 // Successful write with 2 async header writes and 2 async payload writes. | 70 // Successful write with 2 async header writes and 2 async payload writes. |
79 TEST_F(StreamPacketWriterTest, TestPartialWriteAsync) { | 71 TEST_F(StreamPacketWriterTest, TestPartialWriteAsync) { |
80 net::TestCompletionCallback writer_cb; | 72 net::TestCompletionCallback writer_cb; |
81 net::CompletionCallback header_cb; | 73 net::CompletionCallback header_cb; |
82 net::CompletionCallback payload_cb; | 74 net::CompletionCallback payload_cb; |
(...skipping 10 matching lines...) Expand all Loading... |
93 .RetiresOnSaturation(); | 85 .RetiresOnSaturation(); |
94 EXPECT_CALL(socket_, Write(BufferEquals(payload), payload.size(), _)) | 86 EXPECT_CALL(socket_, Write(BufferEquals(payload), payload.size(), _)) |
95 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))) | 87 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))) |
96 .RetiresOnSaturation(); | 88 .RetiresOnSaturation(); |
97 EXPECT_CALL(socket_, | 89 EXPECT_CALL(socket_, |
98 Write(BufferEquals(payload.substr(1, payload.size() - 1)), | 90 Write(BufferEquals(payload.substr(1, payload.size() - 1)), |
99 payload.size() - 1, _)) | 91 payload.size() - 1, _)) |
100 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))) | 92 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))) |
101 .RetiresOnSaturation(); | 93 .RetiresOnSaturation(); |
102 | 94 |
103 EXPECT_EQ(net::ERR_IO_PENDING, | 95 message_writer_.WritePacket(test_data_, writer_cb.callback()); |
104 message_writer_.WritePacket(test_data_, writer_cb.callback())); | |
105 | 96 |
106 // Header is written - first one byte, then the remainder. | 97 // Header is written - first one byte, then the remainder. |
107 header_cb.Run(1); | 98 header_cb.Run(1); |
108 header_cb.Run(header.size() - 1); | 99 header_cb.Run(header.size() - 1); |
109 | 100 |
110 // Payload is written - first one byte, then the remainder. | 101 // Payload is written - first one byte, then the remainder. |
111 payload_cb.Run(1); | 102 payload_cb.Run(1); |
112 payload_cb.Run(payload.size() - 1); | 103 payload_cb.Run(payload.size() - 1); |
113 | 104 |
114 EXPECT_EQ(net::OK, writer_cb.WaitForResult()); | 105 EXPECT_EQ(net::OK, writer_cb.WaitForResult()); |
115 } | 106 } |
116 | 107 |
117 // Async socket error while writing data. | 108 // Async socket error while writing data. |
118 TEST_F(StreamPacketWriterTest, TestWriteErrorAsync) { | 109 TEST_F(StreamPacketWriterTest, TestWriteErrorAsync) { |
119 net::TestCompletionCallback writer_cb; | 110 net::TestCompletionCallback writer_cb; |
120 net::CompletionCallback header_cb; | 111 net::CompletionCallback header_cb; |
121 net::CompletionCallback payload_cb; | 112 net::CompletionCallback payload_cb; |
122 | 113 |
123 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), | 114 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), |
124 kPacketHeaderSizeBytes, _)) | 115 kPacketHeaderSizeBytes, _)) |
125 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING))); | 116 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING))); |
126 EXPECT_CALL(socket_, | 117 EXPECT_CALL(socket_, |
127 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) | 118 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) |
128 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))); | 119 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))); |
129 | 120 |
130 EXPECT_EQ(net::ERR_IO_PENDING, | 121 message_writer_.WritePacket(test_data_, writer_cb.callback()); |
131 message_writer_.WritePacket(test_data_, writer_cb.callback())); | |
132 header_cb.Run(kPacketHeaderSizeBytes); | 122 header_cb.Run(kPacketHeaderSizeBytes); |
133 payload_cb.Run(net::ERR_CONNECTION_RESET); | 123 payload_cb.Run(net::ERR_CONNECTION_RESET); |
134 | 124 |
135 EXPECT_EQ(net::ERR_CONNECTION_RESET, writer_cb.WaitForResult()); | 125 EXPECT_EQ(net::ERR_CONNECTION_RESET, writer_cb.WaitForResult()); |
136 } | 126 } |
137 | 127 |
138 // Successful write with 1 sync header write and 1 sync payload write. | 128 // Successful write with 1 sync header write and 1 sync payload write. |
139 TEST_F(StreamPacketWriterTest, TestWriteSync) { | 129 TEST_F(StreamPacketWriterTest, TestWriteSync) { |
140 net::TestCompletionCallback writer_cb; | 130 net::TestCompletionCallback writer_cb; |
| 131 |
141 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), | 132 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), |
142 kPacketHeaderSizeBytes, _)) | 133 kPacketHeaderSizeBytes, _)) |
143 .WillOnce(Return(kPacketHeaderSizeBytes)); | 134 .WillOnce(Return(kPacketHeaderSizeBytes)); |
144 EXPECT_CALL(socket_, | 135 EXPECT_CALL(socket_, |
145 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) | 136 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) |
146 .WillOnce(Return(test_data_str_.size())); | 137 .WillOnce(Return(test_data_str_.size())); |
147 EXPECT_EQ(net::OK, | 138 |
148 message_writer_.WritePacket(test_data_, writer_cb.callback())); | 139 message_writer_.WritePacket(test_data_, writer_cb.callback()); |
149 EXPECT_FALSE(writer_cb.have_result()); | 140 EXPECT_EQ(net::OK, writer_cb.WaitForResult()); |
150 } | 141 } |
151 | 142 |
152 // Successful write with 2 sync header writes and 2 sync payload writes. | 143 // Successful write with 2 sync header writes and 2 sync payload writes. |
153 TEST_F(StreamPacketWriterTest, TestPartialWriteSync) { | 144 TEST_F(StreamPacketWriterTest, TestPartialWriteSync) { |
154 net::TestCompletionCallback writer_cb; | 145 net::TestCompletionCallback writer_cb; |
155 | 146 |
156 std::string header = EncodeHeader(test_data_str_.size()); | 147 std::string header = EncodeHeader(test_data_str_.size()); |
157 std::string payload = test_data_str_; | 148 std::string payload = test_data_str_; |
158 | 149 |
159 EXPECT_CALL(socket_, Write(BufferEquals(header), header.size(), _)) | 150 EXPECT_CALL(socket_, Write(BufferEquals(header), header.size(), _)) |
160 .WillOnce(Return(1)); | 151 .WillOnce(Return(1)); |
161 EXPECT_CALL(socket_, Write(BufferEquals(header.substr(1, header.size() - 1)), | 152 EXPECT_CALL(socket_, Write(BufferEquals(header.substr(1, header.size() - 1)), |
162 header.size() - 1, _)) | 153 header.size() - 1, _)) |
163 .WillOnce(Return(header.size() - 1)); | 154 .WillOnce(Return(header.size() - 1)); |
164 EXPECT_CALL(socket_, Write(BufferEquals(payload), payload.size(), _)) | 155 EXPECT_CALL(socket_, Write(BufferEquals(payload), payload.size(), _)) |
165 .WillOnce(Return(1)); | 156 .WillOnce(Return(1)); |
166 EXPECT_CALL(socket_, Write(BufferEquals(payload.substr(1, payload.size())), | 157 EXPECT_CALL(socket_, Write(BufferEquals(payload.substr(1, payload.size())), |
167 payload.size() - 1, _)) | 158 payload.size() - 1, _)) |
168 .WillOnce(Return(payload.size() - 1)); | 159 .WillOnce(Return(payload.size() - 1)); |
169 | 160 |
170 EXPECT_EQ(net::OK, | 161 message_writer_.WritePacket(test_data_, writer_cb.callback()); |
171 message_writer_.WritePacket(test_data_, writer_cb.callback())); | 162 EXPECT_EQ(net::OK, writer_cb.WaitForResult()); |
172 EXPECT_FALSE(writer_cb.have_result()); | |
173 } | |
174 | |
175 // Verify that zero-length packets are rejected. | |
176 TEST_F(StreamPacketWriterTest, TestZeroLengthPacketsRejected) { | |
177 net::TestCompletionCallback writer_cb; | |
178 | |
179 EXPECT_EQ(net::ERR_INVALID_ARGUMENT, | |
180 message_writer_.WritePacket( | |
181 new net::DrainableIOBuffer(new net::IOBuffer(0), 0), | |
182 writer_cb.callback())); | |
183 | |
184 EXPECT_FALSE(writer_cb.have_result()); | |
185 } | 163 } |
186 | 164 |
187 // Sync socket error while writing header data. | 165 // Sync socket error while writing header data. |
188 TEST_F(StreamPacketWriterTest, TestWriteHeaderErrorSync) { | 166 TEST_F(StreamPacketWriterTest, TestWriteHeaderErrorSync) { |
189 net::TestCompletionCallback writer_cb; | 167 net::TestCompletionCallback writer_cb; |
190 | 168 |
191 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), | 169 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), |
192 kPacketHeaderSizeBytes, _)) | 170 kPacketHeaderSizeBytes, _)) |
193 .WillOnce(Return(net::ERR_FAILED)); | 171 .WillOnce(Return(net::ERR_FAILED)); |
194 | 172 |
195 EXPECT_EQ(net::ERR_FAILED, | 173 message_writer_.WritePacket(test_data_, writer_cb.callback()); |
196 message_writer_.WritePacket(test_data_, writer_cb.callback())); | 174 EXPECT_EQ(net::ERR_FAILED, writer_cb.WaitForResult()); |
197 | |
198 EXPECT_EQ(net::ERR_EMPTY_RESPONSE, | 175 EXPECT_EQ(net::ERR_EMPTY_RESPONSE, |
199 writer_cb.GetResult(net::ERR_EMPTY_RESPONSE)); | 176 writer_cb.GetResult(net::ERR_EMPTY_RESPONSE)); |
200 EXPECT_FALSE(writer_cb.have_result()); | 177 EXPECT_FALSE(writer_cb.have_result()); |
201 } | 178 } |
202 | 179 |
203 // Sync socket error while writing payload data. | 180 // Sync socket error while writing payload data. |
204 TEST_F(StreamPacketWriterTest, TestWritePayloadErrorSync) { | 181 TEST_F(StreamPacketWriterTest, TestWritePayloadErrorSync) { |
205 net::TestCompletionCallback writer_cb; | 182 net::TestCompletionCallback writer_cb; |
206 | 183 |
207 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), | 184 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), |
208 kPacketHeaderSizeBytes, _)) | 185 kPacketHeaderSizeBytes, _)) |
209 .WillOnce(Return(kPacketHeaderSizeBytes)); | 186 .WillOnce(Return(kPacketHeaderSizeBytes)); |
210 EXPECT_CALL(socket_, | 187 EXPECT_CALL(socket_, |
211 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) | 188 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) |
212 .WillOnce(Return(net::ERR_FAILED)); | 189 .WillOnce(Return(net::ERR_FAILED)); |
213 | 190 |
214 EXPECT_EQ(net::ERR_FAILED, | 191 message_writer_.WritePacket(test_data_, writer_cb.callback()); |
215 message_writer_.WritePacket(test_data_, writer_cb.callback())); | 192 EXPECT_EQ(net::ERR_FAILED, writer_cb.WaitForResult()); |
216 EXPECT_FALSE(writer_cb.have_result()); | |
217 } | 193 } |
218 | 194 |
219 // Verify that asynchronous header write completions don't cause a | 195 // Verify that asynchronous header write completions don't cause a |
220 // use-after-free error if the writer object is deleted. | 196 // use-after-free error if the writer object is deleted. |
221 TEST_F(StreamPacketWriterTest, DeletedDuringHeaderWrite) { | 197 TEST_F(StreamPacketWriterTest, DeletedDuringHeaderWrite) { |
222 net::TestCompletionCallback writer_cb; | 198 net::TestCompletionCallback writer_cb; |
223 net::CompletionCallback header_cb; | 199 net::CompletionCallback header_cb; |
224 net::CompletionCallback payload_cb; | 200 net::CompletionCallback payload_cb; |
225 scoped_ptr<StreamPacketWriter> writer(new StreamPacketWriter(&socket_)); | 201 scoped_ptr<StreamPacketWriter> writer(new StreamPacketWriter(&socket_)); |
226 | 202 |
227 // Write header. | 203 // Write header. |
228 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), | 204 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), |
229 kPacketHeaderSizeBytes, _)) | 205 kPacketHeaderSizeBytes, _)) |
230 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING))); | 206 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING))); |
231 EXPECT_EQ(net::ERR_IO_PENDING, | 207 writer->WritePacket(test_data_, writer_cb.callback()); |
232 writer->WritePacket(test_data_, writer_cb.callback())); | |
233 Mock::VerifyAndClearExpectations(&socket_); | 208 Mock::VerifyAndClearExpectations(&socket_); |
234 | 209 |
235 // Header write completion callback is invoked after the writer died. | 210 // Header write completion callback is invoked after the writer died. |
236 writer.reset(); | 211 writer.reset(); |
237 header_cb.Run(kPacketHeaderSizeBytes); | 212 header_cb.Run(kPacketHeaderSizeBytes); |
238 } | 213 } |
239 | 214 |
240 // Verify that asynchronous payload write completions don't cause a | 215 // Verify that asynchronous payload write completions don't cause a |
241 // use-after-free error if the writer object is deleted. | 216 // use-after-free error if the writer object is deleted. |
242 TEST_F(StreamPacketWriterTest, DeletedDuringPayloadWrite) { | 217 TEST_F(StreamPacketWriterTest, DeletedDuringPayloadWrite) { |
243 net::TestCompletionCallback writer_cb; | 218 net::TestCompletionCallback writer_cb; |
244 net::CompletionCallback header_cb; | 219 net::CompletionCallback header_cb; |
245 net::CompletionCallback payload_cb; | 220 net::CompletionCallback payload_cb; |
246 scoped_ptr<StreamPacketWriter> writer(new StreamPacketWriter(&socket_)); | 221 scoped_ptr<StreamPacketWriter> writer(new StreamPacketWriter(&socket_)); |
247 | 222 |
248 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), | 223 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), |
249 kPacketHeaderSizeBytes, _)) | 224 kPacketHeaderSizeBytes, _)) |
250 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING))); | 225 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING))); |
251 EXPECT_CALL(socket_, | 226 EXPECT_CALL(socket_, |
252 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) | 227 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) |
253 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))); | 228 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))); |
254 | 229 |
255 EXPECT_EQ(net::ERR_IO_PENDING, | 230 writer->WritePacket(test_data_, writer_cb.callback()); |
256 writer->WritePacket(test_data_, writer_cb.callback())); | |
257 | 231 |
258 // Header write completes successfully. | 232 // Header write completes successfully. |
259 header_cb.Run(kPacketHeaderSizeBytes); | 233 header_cb.Run(kPacketHeaderSizeBytes); |
260 | 234 |
261 // Payload write completion callback is invoked after the writer died. | 235 // Payload write completion callback is invoked after the writer died. |
262 writer.reset(); | 236 writer.reset(); |
263 payload_cb.Run(test_data_str_.size()); | 237 payload_cb.Run(test_data_str_.size()); |
264 } | 238 } |
265 | 239 |
266 } // namespace | 240 } // namespace |
267 } // namespace blimp | 241 } // namespace blimp |
OLD | NEW |