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

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

Issue 1626703002: QUIC - fix crash when writing part of the request body fails (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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/quic_http_stream.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/quic_http_stream.h" 5 #include "net/quic/quic_http_stream.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 protected: 118 protected:
119 static const bool kFin = true; 119 static const bool kFin = true;
120 static const bool kIncludeVersion = true; 120 static const bool kIncludeVersion = true;
121 static const bool kIncludeCongestionFeedback = true; 121 static const bool kIncludeCongestionFeedback = true;
122 122
123 // Holds a packet to be written to the wire, and the IO mode that should 123 // Holds a packet to be written to the wire, and the IO mode that should
124 // be used by the mock socket when performing the write. 124 // be used by the mock socket when performing the write.
125 struct PacketToWrite { 125 struct PacketToWrite {
126 PacketToWrite(IoMode mode, QuicEncryptedPacket* packet) 126 PacketToWrite(IoMode mode, QuicEncryptedPacket* packet)
127 : mode(mode), packet(packet) {} 127 : mode(mode), packet(packet) {}
128 PacketToWrite(IoMode mode, int rv) : mode(mode), packet(nullptr), rv(rv) {}
128 IoMode mode; 129 IoMode mode;
129 QuicEncryptedPacket* packet; 130 QuicEncryptedPacket* packet;
131 int rv;
130 }; 132 };
131 133
132 QuicHttpStreamTest() 134 QuicHttpStreamTest()
133 : net_log_(BoundNetLog()), 135 : net_log_(BoundNetLog()),
134 use_closing_stream_(false), 136 use_closing_stream_(false),
135 crypto_config_(CryptoTestUtils::ProofVerifierForTesting()), 137 crypto_config_(CryptoTestUtils::ProofVerifierForTesting()),
136 read_buffer_(new IOBufferWithSize(4096)), 138 read_buffer_(new IOBufferWithSize(4096)),
137 connection_id_(2), 139 connection_id_(2),
138 stream_id_(kClientDataStreamId1), 140 stream_id_(kClientDataStreamId1),
139 maker_(GetParam(), connection_id_, &clock_, kDefaultServerHostName), 141 maker_(GetParam(), connection_id_, &clock_, kDefaultServerHostName),
(...skipping 10 matching lines...) Expand all
150 for (size_t i = 0; i < writes_.size(); i++) { 152 for (size_t i = 0; i < writes_.size(); i++) {
151 delete writes_[i].packet; 153 delete writes_[i].packet;
152 } 154 }
153 } 155 }
154 156
155 // Adds a packet to the list of expected writes. 157 // Adds a packet to the list of expected writes.
156 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) { 158 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
157 writes_.push_back(PacketToWrite(SYNCHRONOUS, packet.release())); 159 writes_.push_back(PacketToWrite(SYNCHRONOUS, packet.release()));
158 } 160 }
159 161
162 void AddWrite(IoMode mode, int rv) {
163 writes_.push_back(PacketToWrite(mode, rv));
164 }
165
160 // Returns the packet to be written at position |pos|. 166 // Returns the packet to be written at position |pos|.
161 QuicEncryptedPacket* GetWrite(size_t pos) { return writes_[pos].packet; } 167 QuicEncryptedPacket* GetWrite(size_t pos) { return writes_[pos].packet; }
162 168
163 bool AtEof() { 169 bool AtEof() {
164 return socket_data_->AllReadDataConsumed() && 170 return socket_data_->AllReadDataConsumed() &&
165 socket_data_->AllWriteDataConsumed(); 171 socket_data_->AllWriteDataConsumed();
166 } 172 }
167 173
168 void ProcessPacket(scoped_ptr<QuicEncryptedPacket> packet) { 174 void ProcessPacket(scoped_ptr<QuicEncryptedPacket> packet) {
169 connection_->ProcessUdpPacket(self_addr_, peer_addr_, *packet); 175 connection_->ProcessUdpPacket(self_addr_, peer_addr_, *packet);
170 } 176 }
171 177
172 // Configures the test fixture to use the list of expected writes. 178 // Configures the test fixture to use the list of expected writes.
173 void Initialize() { 179 void Initialize() {
174 mock_writes_.reset(new MockWrite[writes_.size()]); 180 mock_writes_.reset(new MockWrite[writes_.size()]);
175 for (size_t i = 0; i < writes_.size(); i++) { 181 for (size_t i = 0; i < writes_.size(); i++) {
176 mock_writes_[i] = MockWrite(writes_[i].mode, writes_[i].packet->data(), 182 if (writes_[i].packet == nullptr) {
177 writes_[i].packet->length()); 183 mock_writes_[i] = MockWrite(writes_[i].mode, writes_[i].rv, i);
184 } else {
185 mock_writes_[i] = MockWrite(writes_[i].mode, writes_[i].packet->data(),
186 writes_[i].packet->length());
187 }
178 }; 188 };
179 189
180 socket_data_.reset(new StaticSocketDataProvider( 190 socket_data_.reset(new StaticSocketDataProvider(
181 nullptr, 0, mock_writes_.get(), writes_.size())); 191 nullptr, 0, mock_writes_.get(), writes_.size()));
182 192
183 MockUDPClientSocket* socket = 193 MockUDPClientSocket* socket =
184 new MockUDPClientSocket(socket_data_.get(), net_log_.net_log()); 194 new MockUDPClientSocket(socket_data_.get(), net_log_.net_log());
185 socket->Connect(peer_addr_); 195 socket->Connect(peer_addr_);
186 runner_ = new TestTaskRunner(&clock_); 196 runner_ = new TestTaskRunner(&clock_);
187 send_algorithm_ = new MockSendAlgorithm(); 197 send_algorithm_ = new MockSendAlgorithm();
(...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 // Set Delegate to nullptr and make sure Priority returns highest 939 // Set Delegate to nullptr and make sure Priority returns highest
930 // priority. 940 // priority.
931 reliable_stream->SetDelegate(nullptr); 941 reliable_stream->SetDelegate(nullptr);
932 DCHECK_EQ(kV3HighestPriority, reliable_stream->Priority()); 942 DCHECK_EQ(kV3HighestPriority, reliable_stream->Priority());
933 reliable_stream->SetDelegate(delegate); 943 reliable_stream->SetDelegate(delegate);
934 944
935 EXPECT_EQ(0, stream_->GetTotalSentBytes()); 945 EXPECT_EQ(0, stream_->GetTotalSentBytes());
936 EXPECT_EQ(0, stream_->GetTotalReceivedBytes()); 946 EXPECT_EQ(0, stream_->GetTotalReceivedBytes());
937 } 947 }
938 948
949 TEST_P(QuicHttpStreamTest, SessionClosedBeforeSendHeadersComplete) {
950 SetRequest("POST", "/", DEFAULT_PRIORITY);
951 AddWrite(SYNCHRONOUS, ERR_FAILED);
952 Initialize();
953
954 ChunkedUploadDataStream upload_data_stream(0);
955
956 request_.method = "POST";
957 request_.url = GURL("http://www.google.com/");
958 request_.upload_data_stream = &upload_data_stream;
959 ASSERT_EQ(OK, request_.upload_data_stream->Init(
960 TestCompletionCallback().callback()));
961
962 ASSERT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, net_log_,
963 callback_.callback()));
964 ASSERT_EQ(ERR_QUIC_PROTOCOL_ERROR,
965 stream_->SendRequest(headers_, &response_, callback_.callback()));
966 }
967
968 TEST_P(QuicHttpStreamTest, SessionClosedBeforeSendBodyComplete) {
969 SetRequest("POST", "/", DEFAULT_PRIORITY);
970 size_t spdy_request_headers_frame_length;
971 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
972 &spdy_request_headers_frame_length));
973 AddWrite(SYNCHRONOUS, ERR_FAILED);
974 Initialize();
975
976 ChunkedUploadDataStream upload_data_stream(0);
977 size_t chunk_size = strlen(kUploadData);
978 upload_data_stream.AppendData(kUploadData, chunk_size, false);
979
980 request_.method = "POST";
981 request_.url = GURL("http://www.google.com/");
982 request_.upload_data_stream = &upload_data_stream;
983 ASSERT_EQ(OK, request_.upload_data_stream->Init(
984 TestCompletionCallback().callback()));
985
986 ASSERT_EQ(OK, stream_->InitializeStream(&request_, DEFAULT_PRIORITY, net_log_,
987 callback_.callback()));
988 ASSERT_EQ(ERR_QUIC_PROTOCOL_ERROR,
989 stream_->SendRequest(headers_, &response_, callback_.callback()));
990 }
991
939 } // namespace test 992 } // namespace test
940 } // namespace net 993 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_http_stream.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698