Chromium Code Reviews| 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 {} | 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 Loading... | |
| 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 |
| OLD | NEW |