Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(521)

Side by Side Diff: blimp/net/stream_packet_writer_unittest.cc

Issue 1452823011: Make PacketReader/PacketWriter interfaces async-only. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Resync Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 {} 38 ~StreamPacketWriterTest() override {}
Wez 2015/11/24 23:43:18 Why override this with a trivial dtor?
39 39
40 protected: 40 protected:
41 const std::string test_data_str_ = "U WOT M8"; 41 const std::string test_data_str_ = "U WOT M8";
Wez 2015/11/24 23:43:18 Is it actually permitted to inline-initialize a no
Kevin M 2015/11/25 01:18:37 There aren't any prohibitions against non-POD type
42 scoped_refptr<net::DrainableIOBuffer> test_data_; 42 scoped_refptr<net::DrainableIOBuffer> test_data_;
43 43
44 base::MessageLoop message_loop_;
Wez 2015/11/24 23:43:18 Where is this being used?
Kevin M 2015/11/25 01:18:37 Ditto for reader - it's used as the threadlocal Me
44 MockStreamSocket socket_; 45 MockStreamSocket socket_;
45 StreamPacketWriter message_writer_; 46 StreamPacketWriter message_writer_;
46 base::MessageLoop message_loop_;
47 testing::InSequence mock_sequence_; 47 testing::InSequence mock_sequence_;
48 48
49 private: 49 private:
50 DISALLOW_COPY_AND_ASSIGN(StreamPacketWriterTest); 50 DISALLOW_COPY_AND_ASSIGN(StreamPacketWriterTest);
51 }; 51 };
52 52
53 // Successful write with 1 async header write and 1 async payload write. 53 // Successful write with 1 async header write and 1 async payload write.
54 TEST_F(StreamPacketWriterTest, TestWriteAsync) { 54 TEST_F(StreamPacketWriterTest, TestWriteAsync) {
55 net::TestCompletionCallback writer_cb; 55 net::TestCompletionCallback writer_cb;
56 net::CompletionCallback header_cb; 56 net::CompletionCallback header_cb;
57 net::CompletionCallback payload_cb; 57 net::CompletionCallback payload_cb;
58 58
59 // Write header.
60 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), 59 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
61 kPacketHeaderSizeBytes, _)) 60 kPacketHeaderSizeBytes, _))
62 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING))); 61 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING)));
63 EXPECT_EQ(net::ERR_IO_PENDING, 62 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_, 63 EXPECT_CALL(socket_,
69 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) 64 Write(BufferEquals(test_data_str_), test_data_str_.size(), _))
70 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))); 65 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING)));
71 header_cb.Run(kPacketHeaderSizeBytes); 66 header_cb.Run(kPacketHeaderSizeBytes);
72 Mock::VerifyAndClearExpectations(&socket_);
73 67
74 payload_cb.Run(test_data_str_.size()); 68 payload_cb.Run(test_data_str_.size());
75 EXPECT_EQ(net::OK, writer_cb.WaitForResult()); 69 EXPECT_EQ(net::OK, writer_cb.WaitForResult());
76 } 70 }
77 71
78 // Successful write with 2 async header writes and 2 async payload writes. 72 // Successful write with 2 async header writes and 2 async payload writes.
79 TEST_F(StreamPacketWriterTest, TestPartialWriteAsync) { 73 TEST_F(StreamPacketWriterTest, TestPartialWriteAsync) {
80 net::TestCompletionCallback writer_cb; 74 net::TestCompletionCallback writer_cb;
81 net::CompletionCallback header_cb; 75 net::CompletionCallback header_cb;
82 net::CompletionCallback payload_cb; 76 net::CompletionCallback payload_cb;
(...skipping 10 matching lines...) Expand all
93 .RetiresOnSaturation(); 87 .RetiresOnSaturation();
94 EXPECT_CALL(socket_, Write(BufferEquals(payload), payload.size(), _)) 88 EXPECT_CALL(socket_, Write(BufferEquals(payload), payload.size(), _))
95 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))) 89 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING)))
96 .RetiresOnSaturation(); 90 .RetiresOnSaturation();
97 EXPECT_CALL(socket_, 91 EXPECT_CALL(socket_,
98 Write(BufferEquals(payload.substr(1, payload.size() - 1)), 92 Write(BufferEquals(payload.substr(1, payload.size() - 1)),
99 payload.size() - 1, _)) 93 payload.size() - 1, _))
100 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))) 94 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING)))
101 .RetiresOnSaturation(); 95 .RetiresOnSaturation();
102 96
103 EXPECT_EQ(net::ERR_IO_PENDING, 97 message_writer_.WritePacket(test_data_, writer_cb.callback());
104 message_writer_.WritePacket(test_data_, writer_cb.callback()));
105 98
106 // Header is written - first one byte, then the remainder. 99 // Header is written - first one byte, then the remainder.
107 header_cb.Run(1); 100 header_cb.Run(1);
108 header_cb.Run(header.size() - 1); 101 header_cb.Run(header.size() - 1);
109 102
110 // Payload is written - first one byte, then the remainder. 103 // Payload is written - first one byte, then the remainder.
111 payload_cb.Run(1); 104 payload_cb.Run(1);
112 payload_cb.Run(payload.size() - 1); 105 payload_cb.Run(payload.size() - 1);
113 106
114 EXPECT_EQ(net::OK, writer_cb.WaitForResult()); 107 EXPECT_EQ(net::OK, writer_cb.WaitForResult());
115 } 108 }
116 109
117 // Async socket error while writing data. 110 // Async socket error while writing data.
118 TEST_F(StreamPacketWriterTest, TestWriteErrorAsync) { 111 TEST_F(StreamPacketWriterTest, TestWriteErrorAsync) {
119 net::TestCompletionCallback writer_cb; 112 net::TestCompletionCallback writer_cb;
120 net::CompletionCallback header_cb; 113 net::CompletionCallback header_cb;
121 net::CompletionCallback payload_cb; 114 net::CompletionCallback payload_cb;
122 115
123 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), 116 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
124 kPacketHeaderSizeBytes, _)) 117 kPacketHeaderSizeBytes, _))
125 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING))); 118 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING)));
126 EXPECT_CALL(socket_, 119 EXPECT_CALL(socket_,
127 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) 120 Write(BufferEquals(test_data_str_), test_data_str_.size(), _))
128 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))); 121 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING)));
129 122
130 EXPECT_EQ(net::ERR_IO_PENDING, 123 message_writer_.WritePacket(test_data_, writer_cb.callback());
131 message_writer_.WritePacket(test_data_, writer_cb.callback()));
132 header_cb.Run(kPacketHeaderSizeBytes); 124 header_cb.Run(kPacketHeaderSizeBytes);
133 payload_cb.Run(net::ERR_CONNECTION_RESET); 125 payload_cb.Run(net::ERR_CONNECTION_RESET);
134 126
135 EXPECT_EQ(net::ERR_CONNECTION_RESET, writer_cb.WaitForResult()); 127 EXPECT_EQ(net::ERR_CONNECTION_RESET, writer_cb.WaitForResult());
136 } 128 }
137 129
138 // Successful write with 1 sync header write and 1 sync payload write. 130 // Successful write with 1 sync header write and 1 sync payload write.
139 TEST_F(StreamPacketWriterTest, TestWriteSync) { 131 TEST_F(StreamPacketWriterTest, TestWriteSync) {
140 net::TestCompletionCallback writer_cb; 132 net::TestCompletionCallback writer_cb;
133
141 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), 134 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
142 kPacketHeaderSizeBytes, _)) 135 kPacketHeaderSizeBytes, _))
143 .WillOnce(Return(kPacketHeaderSizeBytes)); 136 .WillOnce(Return(kPacketHeaderSizeBytes));
144 EXPECT_CALL(socket_, 137 EXPECT_CALL(socket_,
145 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) 138 Write(BufferEquals(test_data_str_), test_data_str_.size(), _))
146 .WillOnce(Return(test_data_str_.size())); 139 .WillOnce(Return(test_data_str_.size()));
147 EXPECT_EQ(net::OK, 140
148 message_writer_.WritePacket(test_data_, writer_cb.callback())); 141 message_writer_.WritePacket(test_data_, writer_cb.callback());
149 EXPECT_FALSE(writer_cb.have_result()); 142 EXPECT_EQ(net::OK, writer_cb.WaitForResult());
150 } 143 }
151 144
152 // Successful write with 2 sync header writes and 2 sync payload writes. 145 // Successful write with 2 sync header writes and 2 sync payload writes.
153 TEST_F(StreamPacketWriterTest, TestPartialWriteSync) { 146 TEST_F(StreamPacketWriterTest, TestPartialWriteSync) {
154 net::TestCompletionCallback writer_cb; 147 net::TestCompletionCallback writer_cb;
155 148
156 std::string header = EncodeHeader(test_data_str_.size()); 149 std::string header = EncodeHeader(test_data_str_.size());
157 std::string payload = test_data_str_; 150 std::string payload = test_data_str_;
158 151
159 EXPECT_CALL(socket_, Write(BufferEquals(header), header.size(), _)) 152 EXPECT_CALL(socket_, Write(BufferEquals(header), header.size(), _))
160 .WillOnce(Return(1)); 153 .WillOnce(Return(1));
161 EXPECT_CALL(socket_, Write(BufferEquals(header.substr(1, header.size() - 1)), 154 EXPECT_CALL(socket_, Write(BufferEquals(header.substr(1, header.size() - 1)),
162 header.size() - 1, _)) 155 header.size() - 1, _))
163 .WillOnce(Return(header.size() - 1)); 156 .WillOnce(Return(header.size() - 1));
164 EXPECT_CALL(socket_, Write(BufferEquals(payload), payload.size(), _)) 157 EXPECT_CALL(socket_, Write(BufferEquals(payload), payload.size(), _))
165 .WillOnce(Return(1)); 158 .WillOnce(Return(1));
166 EXPECT_CALL(socket_, Write(BufferEquals(payload.substr(1, payload.size())), 159 EXPECT_CALL(socket_, Write(BufferEquals(payload.substr(1, payload.size())),
167 payload.size() - 1, _)) 160 payload.size() - 1, _))
168 .WillOnce(Return(payload.size() - 1)); 161 .WillOnce(Return(payload.size() - 1));
169 162
170 EXPECT_EQ(net::OK, 163 message_writer_.WritePacket(test_data_, writer_cb.callback());
171 message_writer_.WritePacket(test_data_, writer_cb.callback())); 164 EXPECT_EQ(net::OK, writer_cb.WaitForResult());
172 EXPECT_FALSE(writer_cb.have_result());
173 } 165 }
174 166
175 // Verify that zero-length packets are rejected. 167 // Verify that zero-length packets are rejected.
176 TEST_F(StreamPacketWriterTest, TestZeroLengthPacketsRejected) { 168 TEST_F(StreamPacketWriterTest, TestZeroLengthPacketsRejected) {
177 net::TestCompletionCallback writer_cb; 169 net::TestCompletionCallback writer_cb;
178 170
179 EXPECT_EQ(net::ERR_INVALID_ARGUMENT, 171 message_writer_.WritePacket(
180 message_writer_.WritePacket( 172 new net::DrainableIOBuffer(new net::IOBuffer(0), 0),
181 new net::DrainableIOBuffer(new net::IOBuffer(0), 0), 173 writer_cb.callback());
182 writer_cb.callback()));
183 174
175 EXPECT_EQ(net::ERR_INVALID_ARGUMENT, writer_cb.WaitForResult());
184 EXPECT_FALSE(writer_cb.have_result()); 176 EXPECT_FALSE(writer_cb.have_result());
185 } 177 }
186 178
187 // Sync socket error while writing header data. 179 // Sync socket error while writing header data.
188 TEST_F(StreamPacketWriterTest, TestWriteHeaderErrorSync) { 180 TEST_F(StreamPacketWriterTest, TestWriteHeaderErrorSync) {
189 net::TestCompletionCallback writer_cb; 181 net::TestCompletionCallback writer_cb;
190 182
191 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), 183 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
192 kPacketHeaderSizeBytes, _)) 184 kPacketHeaderSizeBytes, _))
193 .WillOnce(Return(net::ERR_FAILED)); 185 .WillOnce(Return(net::ERR_FAILED));
194 186
195 EXPECT_EQ(net::ERR_FAILED, 187 message_writer_.WritePacket(test_data_, writer_cb.callback());
196 message_writer_.WritePacket(test_data_, writer_cb.callback())); 188 EXPECT_EQ(net::ERR_FAILED, writer_cb.WaitForResult());
197
198 EXPECT_EQ(net::ERR_EMPTY_RESPONSE, 189 EXPECT_EQ(net::ERR_EMPTY_RESPONSE,
199 writer_cb.GetResult(net::ERR_EMPTY_RESPONSE)); 190 writer_cb.GetResult(net::ERR_EMPTY_RESPONSE));
200 EXPECT_FALSE(writer_cb.have_result()); 191 EXPECT_FALSE(writer_cb.have_result());
201 } 192 }
202 193
203 // Sync socket error while writing payload data. 194 // Sync socket error while writing payload data.
204 TEST_F(StreamPacketWriterTest, TestWritePayloadErrorSync) { 195 TEST_F(StreamPacketWriterTest, TestWritePayloadErrorSync) {
205 net::TestCompletionCallback writer_cb; 196 net::TestCompletionCallback writer_cb;
206 197
207 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), 198 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
208 kPacketHeaderSizeBytes, _)) 199 kPacketHeaderSizeBytes, _))
209 .WillOnce(Return(kPacketHeaderSizeBytes)); 200 .WillOnce(Return(kPacketHeaderSizeBytes));
210 EXPECT_CALL(socket_, 201 EXPECT_CALL(socket_,
211 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) 202 Write(BufferEquals(test_data_str_), test_data_str_.size(), _))
212 .WillOnce(Return(net::ERR_FAILED)); 203 .WillOnce(Return(net::ERR_FAILED));
213 204
214 EXPECT_EQ(net::ERR_FAILED, 205 message_writer_.WritePacket(test_data_, writer_cb.callback());
215 message_writer_.WritePacket(test_data_, writer_cb.callback())); 206 EXPECT_EQ(net::ERR_FAILED, writer_cb.WaitForResult());
216 EXPECT_FALSE(writer_cb.have_result());
217 } 207 }
218 208
219 // Verify that asynchronous header write completions don't cause a 209 // Verify that asynchronous header write completions don't cause a
220 // use-after-free error if the writer object is deleted. 210 // use-after-free error if the writer object is deleted.
221 TEST_F(StreamPacketWriterTest, DeletedDuringHeaderWrite) { 211 TEST_F(StreamPacketWriterTest, DeletedDuringHeaderWrite) {
222 net::TestCompletionCallback writer_cb; 212 net::TestCompletionCallback writer_cb;
223 net::CompletionCallback header_cb; 213 net::CompletionCallback header_cb;
224 net::CompletionCallback payload_cb; 214 net::CompletionCallback payload_cb;
225 scoped_ptr<StreamPacketWriter> writer(new StreamPacketWriter(&socket_)); 215 scoped_ptr<StreamPacketWriter> writer(new StreamPacketWriter(&socket_));
226 216
227 // Write header. 217 // Write header.
228 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), 218 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
229 kPacketHeaderSizeBytes, _)) 219 kPacketHeaderSizeBytes, _))
230 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING))); 220 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING)));
231 EXPECT_EQ(net::ERR_IO_PENDING, 221 writer->WritePacket(test_data_, writer_cb.callback());
232 writer->WritePacket(test_data_, writer_cb.callback()));
233 Mock::VerifyAndClearExpectations(&socket_); 222 Mock::VerifyAndClearExpectations(&socket_);
234 223
235 // Header write completion callback is invoked after the writer died. 224 // Header write completion callback is invoked after the writer died.
236 writer.reset(); 225 writer.reset();
237 header_cb.Run(kPacketHeaderSizeBytes); 226 header_cb.Run(kPacketHeaderSizeBytes);
238 } 227 }
239 228
240 // Verify that asynchronous payload write completions don't cause a 229 // Verify that asynchronous payload write completions don't cause a
241 // use-after-free error if the writer object is deleted. 230 // use-after-free error if the writer object is deleted.
242 TEST_F(StreamPacketWriterTest, DeletedDuringPayloadWrite) { 231 TEST_F(StreamPacketWriterTest, DeletedDuringPayloadWrite) {
243 net::TestCompletionCallback writer_cb; 232 net::TestCompletionCallback writer_cb;
244 net::CompletionCallback header_cb; 233 net::CompletionCallback header_cb;
245 net::CompletionCallback payload_cb; 234 net::CompletionCallback payload_cb;
246 scoped_ptr<StreamPacketWriter> writer(new StreamPacketWriter(&socket_)); 235 scoped_ptr<StreamPacketWriter> writer(new StreamPacketWriter(&socket_));
247 236
248 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())), 237 EXPECT_CALL(socket_, Write(BufferEquals(EncodeHeader(test_data_str_.size())),
249 kPacketHeaderSizeBytes, _)) 238 kPacketHeaderSizeBytes, _))
250 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING))); 239 .WillOnce(DoAll(SaveArg<2>(&header_cb), Return(net::ERR_IO_PENDING)));
251 EXPECT_CALL(socket_, 240 EXPECT_CALL(socket_,
252 Write(BufferEquals(test_data_str_), test_data_str_.size(), _)) 241 Write(BufferEquals(test_data_str_), test_data_str_.size(), _))
253 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING))); 242 .WillOnce(DoAll(SaveArg<2>(&payload_cb), Return(net::ERR_IO_PENDING)));
254 243
255 EXPECT_EQ(net::ERR_IO_PENDING, 244 writer->WritePacket(test_data_, writer_cb.callback());
256 writer->WritePacket(test_data_, writer_cb.callback()));
257 245
258 // Header write completes successfully. 246 // Header write completes successfully.
259 header_cb.Run(kPacketHeaderSizeBytes); 247 header_cb.Run(kPacketHeaderSizeBytes);
260 248
261 // Payload write completion callback is invoked after the writer died. 249 // Payload write completion callback is invoked after the writer died.
262 writer.reset(); 250 writer.reset();
263 payload_cb.Run(test_data_str_.size()); 251 payload_cb.Run(test_data_str_.size());
264 } 252 }
265 253
266 } // namespace 254 } // namespace
267 } // namespace blimp 255 } // namespace blimp
OLDNEW
« blimp/net/stream_packet_writer.cc ('K') | « blimp/net/stream_packet_writer.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698