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

Side by Side Diff: net/quic/bidirectional_stream_quic_impl_unittest.cc

Issue 2032733002: Do not crash on null stream in writing to bidirectional streams (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@fix_crash
Patch Set: Address Andrei's comments round 2 Created 4 years, 6 months 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
« no previous file with comments | « net/quic/bidirectional_stream_quic_impl.cc ('k') | net/spdy/bidirectional_stream_spdy_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/quic/bidirectional_stream_quic_impl.h" 5 #include "net/quic/bidirectional_stream_quic_impl.h"
6 6
7 #include "base/callback_helpers.h" 7 #include "base/callback_helpers.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 int read_buf_len, 61 int read_buf_len,
62 std::unique_ptr<base::Timer> timer) 62 std::unique_ptr<base::Timer> timer)
63 : read_buf_(read_buf), 63 : read_buf_(read_buf),
64 read_buf_len_(read_buf_len), 64 read_buf_len_(read_buf_len),
65 timer_(std::move(timer)), 65 timer_(std::move(timer)),
66 loop_(nullptr), 66 loop_(nullptr),
67 error_(OK), 67 error_(OK),
68 on_data_read_count_(0), 68 on_data_read_count_(0),
69 on_data_sent_count_(0), 69 on_data_sent_count_(0),
70 not_expect_callback_(false), 70 not_expect_callback_(false),
71 on_failed_called_(false),
71 send_request_headers_automatically_(true) { 72 send_request_headers_automatically_(true) {
72 loop_.reset(new base::RunLoop); 73 loop_.reset(new base::RunLoop);
73 } 74 }
74 75
75 ~TestDelegateBase() override {} 76 ~TestDelegateBase() override {}
76 77
77 void OnStreamReady(bool request_headers_sent) override { 78 void OnStreamReady(bool request_headers_sent) override {
79 CHECK(!on_failed_called_);
78 EXPECT_EQ(send_request_headers_automatically_, request_headers_sent); 80 EXPECT_EQ(send_request_headers_automatically_, request_headers_sent);
79 CHECK(!not_expect_callback_); 81 CHECK(!not_expect_callback_);
80 loop_->Quit(); 82 loop_->Quit();
81 } 83 }
82 84
83 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { 85 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override {
86 CHECK(!on_failed_called_);
84 CHECK(!not_expect_callback_); 87 CHECK(!not_expect_callback_);
85 88
86 response_headers_ = response_headers; 89 response_headers_ = response_headers;
87 loop_->Quit(); 90 loop_->Quit();
88 } 91 }
89 92
90 void OnDataRead(int bytes_read) override { 93 void OnDataRead(int bytes_read) override {
94 CHECK(!on_failed_called_);
91 CHECK(!not_expect_callback_); 95 CHECK(!not_expect_callback_);
92 CHECK(!callback_.is_null()); 96 CHECK(!callback_.is_null());
93 97
94 ++on_data_read_count_; 98 ++on_data_read_count_;
95 CHECK_GE(bytes_read, OK); 99 CHECK_GE(bytes_read, OK);
96 data_received_.append(read_buf_->data(), bytes_read); 100 data_received_.append(read_buf_->data(), bytes_read);
97 base::ResetAndReturn(&callback_).Run(bytes_read); 101 base::ResetAndReturn(&callback_).Run(bytes_read);
98 } 102 }
99 103
100 void OnDataSent() override { 104 void OnDataSent() override {
105 CHECK(!on_failed_called_);
101 CHECK(!not_expect_callback_); 106 CHECK(!not_expect_callback_);
102 107
103 ++on_data_sent_count_; 108 ++on_data_sent_count_;
104 loop_->Quit(); 109 loop_->Quit();
105 } 110 }
106 111
107 void OnTrailersReceived(const SpdyHeaderBlock& trailers) override { 112 void OnTrailersReceived(const SpdyHeaderBlock& trailers) override {
113 CHECK(!on_failed_called_);
108 CHECK(!not_expect_callback_); 114 CHECK(!not_expect_callback_);
109 115
110 trailers_ = trailers; 116 trailers_ = trailers;
111 loop_->Quit(); 117 loop_->Quit();
112 } 118 }
113 119
114 void OnFailed(int error) override { 120 void OnFailed(int error) override {
121 CHECK(!on_failed_called_);
115 CHECK(!not_expect_callback_); 122 CHECK(!not_expect_callback_);
116 CHECK_EQ(OK, error_); 123 CHECK_EQ(OK, error_);
117 CHECK_NE(OK, error); 124 CHECK_NE(OK, error);
118 125
126 on_failed_called_ = true;
119 error_ = error; 127 error_ = error;
120 loop_->Quit(); 128 loop_->Quit();
121 } 129 }
122 130
123 void Start(const BidirectionalStreamRequestInfo* request_info, 131 void Start(const BidirectionalStreamRequestInfo* request_info,
124 const BoundNetLog& net_log, 132 const BoundNetLog& net_log,
125 const base::WeakPtr<QuicChromiumClientSession> session) { 133 const base::WeakPtr<QuicChromiumClientSession> session) {
126 stream_.reset(new BidirectionalStreamQuicImpl(session)); 134 stream_.reset(new BidirectionalStreamQuicImpl(session));
127 stream_->Start(request_info, net_log, send_request_headers_automatically_, 135 stream_->Start(request_info, net_log, send_request_headers_automatically_,
128 this, nullptr); 136 this, nullptr);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 send_request_headers_automatically_ = false; 187 send_request_headers_automatically_ = false;
180 } 188 }
181 189
182 // Const getters for internal states. 190 // Const getters for internal states.
183 const std::string& data_received() const { return data_received_; } 191 const std::string& data_received() const { return data_received_; }
184 int error() const { return error_; } 192 int error() const { return error_; }
185 const SpdyHeaderBlock& response_headers() const { return response_headers_; } 193 const SpdyHeaderBlock& response_headers() const { return response_headers_; }
186 const SpdyHeaderBlock& trailers() const { return trailers_; } 194 const SpdyHeaderBlock& trailers() const { return trailers_; }
187 int on_data_read_count() const { return on_data_read_count_; } 195 int on_data_read_count() const { return on_data_read_count_; }
188 int on_data_sent_count() const { return on_data_sent_count_; } 196 int on_data_sent_count() const { return on_data_sent_count_; }
197 bool on_failed_called() const { return on_failed_called_; }
189 198
190 protected: 199 protected:
191 // Quits |loop_|. 200 // Quits |loop_|.
192 void QuitLoop() { loop_->Quit(); } 201 void QuitLoop() { loop_->Quit(); }
193 202
194 // Deletes |stream_|. 203 // Deletes |stream_|.
195 void DeleteStream() { stream_.reset(); } 204 void DeleteStream() { stream_.reset(); }
196 205
197 private: 206 private:
198 std::unique_ptr<BidirectionalStreamQuicImpl> stream_; 207 std::unique_ptr<BidirectionalStreamQuicImpl> stream_;
199 scoped_refptr<IOBuffer> read_buf_; 208 scoped_refptr<IOBuffer> read_buf_;
200 int read_buf_len_; 209 int read_buf_len_;
201 std::unique_ptr<base::Timer> timer_; 210 std::unique_ptr<base::Timer> timer_;
202 std::string data_received_; 211 std::string data_received_;
203 std::unique_ptr<base::RunLoop> loop_; 212 std::unique_ptr<base::RunLoop> loop_;
204 SpdyHeaderBlock response_headers_; 213 SpdyHeaderBlock response_headers_;
205 SpdyHeaderBlock trailers_; 214 SpdyHeaderBlock trailers_;
206 int error_; 215 int error_;
207 int on_data_read_count_; 216 int on_data_read_count_;
208 int on_data_sent_count_; 217 int on_data_sent_count_;
209 // This is to ensure that delegate callback is not invoked synchronously when 218 // This is to ensure that delegate callback is not invoked synchronously when
210 // calling into |stream_|. 219 // calling into |stream_|.
211 bool not_expect_callback_; 220 bool not_expect_callback_;
221 bool on_failed_called_;
212 CompletionCallback callback_; 222 CompletionCallback callback_;
213 bool send_request_headers_automatically_; 223 bool send_request_headers_automatically_;
214 224
215 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase); 225 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase);
216 }; 226 };
217 227
218 // A delegate that deletes the stream in a particular callback. 228 // A delegate that deletes the stream in a particular callback.
219 class DeleteStreamDelegate : public TestDelegateBase { 229 class DeleteStreamDelegate : public TestDelegateBase {
220 public: 230 public:
221 // Specifies in which callback the stream can be deleted. 231 // Specifies in which callback the stream can be deleted.
(...skipping 1044 matching lines...) Expand 10 before | Expand all | Expand 10 after
1266 1276
1267 // Send a DATA frame. 1277 // Send a DATA frame.
1268 scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(kUploadData)); 1278 scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(kUploadData));
1269 1279
1270 delegate->SendData(buf, buf->size(), false); 1280 delegate->SendData(buf, buf->size(), false);
1271 delegate->WaitUntilNextCallback(); // OnDataSent 1281 delegate->WaitUntilNextCallback(); // OnDataSent
1272 1282
1273 delegate->CancelStream(); 1283 delegate->CancelStream();
1274 base::MessageLoop::current()->RunUntilIdle(); 1284 base::MessageLoop::current()->RunUntilIdle();
1275 1285
1286 // Try to send data after Cancel(), should not get called back.
1287 delegate->SendData(buf, buf->size(), false);
1288 base::MessageLoop::current()->RunUntilIdle();
1289 EXPECT_FALSE(delegate->on_failed_called());
1290
1276 EXPECT_EQ(0, delegate->on_data_read_count()); 1291 EXPECT_EQ(0, delegate->on_data_read_count());
1277 EXPECT_EQ(1, delegate->on_data_sent_count()); 1292 EXPECT_EQ(1, delegate->on_data_sent_count());
1278 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); 1293 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol());
1279 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length + 1294 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length +
1280 strlen(kUploadData)), 1295 strlen(kUploadData)),
1281 delegate->GetTotalSentBytes()); 1296 delegate->GetTotalSentBytes());
1282 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length), 1297 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length),
1283 delegate->GetTotalReceivedBytes()); 1298 delegate->GetTotalReceivedBytes());
1284 } 1299 }
1285 1300
1286 TEST_P(BidirectionalStreamQuicImplTest, SessionClosedBeforeReadData) { 1301 TEST_P(BidirectionalStreamQuicImplTest, SessionClosedBeforeReadData) {
1287 SetRequest("GET", "/", DEFAULT_PRIORITY); 1302 SetRequest("POST", "/", DEFAULT_PRIORITY);
1288 size_t spdy_request_headers_frame_length; 1303 size_t spdy_request_headers_frame_length;
1289 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY, 1304 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
1290 &spdy_request_headers_frame_length)); 1305 &spdy_request_headers_frame_length));
1291 Initialize(); 1306 Initialize();
1292 1307
1293 BidirectionalStreamRequestInfo request; 1308 BidirectionalStreamRequestInfo request;
1294 request.method = "GET"; 1309 request.method = "POST";
1295 request.url = GURL("http://www.google.com/"); 1310 request.url = GURL("http://www.google.com/");
1296 request.end_stream_on_headers = true; 1311 request.end_stream_on_headers = false;
1297 request.priority = DEFAULT_PRIORITY; 1312 request.priority = DEFAULT_PRIORITY;
1298 1313
1299 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); 1314 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
1300 std::unique_ptr<TestDelegateBase> delegate( 1315 std::unique_ptr<TestDelegateBase> delegate(
1301 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); 1316 new TestDelegateBase(read_buffer.get(), kReadBufferSize));
1302 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); 1317 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr());
1303 delegate->WaitUntilNextCallback(); // OnStreamReady 1318 delegate->WaitUntilNextCallback(); // OnStreamReady
1304 1319
1305 // Server acks the request. 1320 // Server acks the request.
1306 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); 1321 ProcessPacket(ConstructServerAckPacket(1, 0, 0));
1307 1322
1308 // Server sends the response headers. 1323 // Server sends the response headers.
1309 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); 1324 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
1310 1325
1311 size_t spdy_response_headers_frame_length; 1326 size_t spdy_response_headers_frame_length;
1312 QuicStreamOffset offset = 0; 1327 QuicStreamOffset offset = 0;
1313 ProcessPacket(ConstructResponseHeadersPacket( 1328 ProcessPacket(ConstructResponseHeadersPacket(
1314 2, !kFin, response_headers, &spdy_response_headers_frame_length, 1329 2, !kFin, response_headers, &spdy_response_headers_frame_length,
1315 &offset)); 1330 &offset));
1316 1331
1317 delegate->WaitUntilNextCallback(); // OnHeadersReceived 1332 delegate->WaitUntilNextCallback(); // OnHeadersReceived
1318 TestCompletionCallback cb; 1333 TestCompletionCallback cb;
1319 int rv = delegate->ReadData(cb.callback()); 1334 int rv = delegate->ReadData(cb.callback());
1320 EXPECT_EQ(ERR_IO_PENDING, rv); 1335 EXPECT_EQ(ERR_IO_PENDING, rv);
1321 session()->connection()->CloseConnection( 1336 session()->connection()->CloseConnection(
1322 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE); 1337 QUIC_NO_ERROR, "test", ConnectionCloseBehavior::SILENT_CLOSE);
1323 delegate->WaitUntilNextCallback(); // OnFailed 1338 delegate->WaitUntilNextCallback(); // OnFailed
1339 EXPECT_TRUE(delegate->on_failed_called());
1324 1340
1341 // Try to send data after OnFailed(), should not get called back.
1342 scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(kUploadData));
1343 delegate->SendData(buf, buf->size(), false);
1325 base::MessageLoop::current()->RunUntilIdle(); 1344 base::MessageLoop::current()->RunUntilIdle();
1326 1345
1327 EXPECT_EQ(ERR_UNEXPECTED, delegate->ReadData(cb.callback())); 1346 EXPECT_EQ(ERR_UNEXPECTED, delegate->ReadData(cb.callback()));
1328 EXPECT_EQ(ERR_UNEXPECTED, delegate->error()); 1347 EXPECT_EQ(ERR_UNEXPECTED, delegate->error());
1329 EXPECT_EQ(0, delegate->on_data_read_count()); 1348 EXPECT_EQ(0, delegate->on_data_read_count());
1330 EXPECT_EQ(0, delegate->on_data_sent_count()); 1349 EXPECT_EQ(0, delegate->on_data_sent_count());
1331 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); 1350 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol());
1332 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length), 1351 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length),
1333 delegate->GetTotalSentBytes()); 1352 delegate->GetTotalSentBytes());
1334 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length), 1353 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length),
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
1541 1560
1542 base::MessageLoop::current()->RunUntilIdle(); 1561 base::MessageLoop::current()->RunUntilIdle();
1543 1562
1544 EXPECT_EQ(1, delegate->on_data_read_count()); 1563 EXPECT_EQ(1, delegate->on_data_read_count());
1545 EXPECT_EQ(0, delegate->on_data_sent_count()); 1564 EXPECT_EQ(0, delegate->on_data_sent_count());
1546 } 1565 }
1547 1566
1548 } // namespace test 1567 } // namespace test
1549 1568
1550 } // namespace net 1569 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/bidirectional_stream_quic_impl.cc ('k') | net/spdy/bidirectional_stream_spdy_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698