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

Side by Side Diff: net/spdy/spdy_stream_unittest.cc

Issue 2779763005: Reset stream if HTTP/2 response status is invalid. (Closed)
Patch Set: Created 3 years, 8 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/spdy/spdy_stream.cc ('k') | tools/metrics/histograms/histograms.xml » ('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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/spdy/spdy_stream.h" 5 #include "net/spdy/spdy_stream.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <cstddef> 10 #include <cstddef>
(...skipping 1068 matching lines...) Expand 10 before | Expand all | Expand 10 after
1079 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), 1079 EXPECT_EQ(std::string(kPostBody, kPostBodyLength),
1080 delegate.TakeReceivedData()); 1080 delegate.TakeReceivedData());
1081 1081
1082 // Finish async network reads and writes. 1082 // Finish async network reads and writes.
1083 base::RunLoop().RunUntilIdle(); 1083 base::RunLoop().RunUntilIdle();
1084 1084
1085 EXPECT_TRUE(data.AllWriteDataConsumed()); 1085 EXPECT_TRUE(data.AllWriteDataConsumed());
1086 EXPECT_TRUE(data.AllReadDataConsumed()); 1086 EXPECT_TRUE(data.AllReadDataConsumed());
1087 } 1087 }
1088 1088
1089 TEST_F(SpdyStreamTest, StatusMustStartWithNumber) { 1089 TEST_F(SpdyStreamTest, StatusMustBeNumber) {
1090 SpdySerializedFrame req( 1090 SpdySerializedFrame req(
1091 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1091 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1092 AddWrite(req); 1092 AddWrite(req);
1093 1093
1094 SpdyHeaderBlock incorrect_headers; 1094 SpdyHeaderBlock incorrect_headers;
1095 incorrect_headers[":status"] = "nan"; 1095 incorrect_headers[":status"] = "nan";
1096 SpdySerializedFrame reply(spdy_util_.ConstructSpdyResponseHeaders( 1096 SpdySerializedFrame reply(spdy_util_.ConstructSpdyResponseHeaders(
1097 1, std::move(incorrect_headers), false)); 1097 1, std::move(incorrect_headers), false));
1098 AddRead(reply); 1098 AddRead(reply);
1099 1099
(...skipping 29 matching lines...) Expand all
1129 1129
1130 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR)); 1130 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR));
1131 1131
1132 // Finish async network reads and writes. 1132 // Finish async network reads and writes.
1133 base::RunLoop().RunUntilIdle(); 1133 base::RunLoop().RunUntilIdle();
1134 1134
1135 EXPECT_TRUE(data.AllWriteDataConsumed()); 1135 EXPECT_TRUE(data.AllWriteDataConsumed());
1136 EXPECT_TRUE(data.AllReadDataConsumed()); 1136 EXPECT_TRUE(data.AllReadDataConsumed());
1137 } 1137 }
1138 1138
1139 TEST_F(SpdyStreamTest, StatusCanHaveExtraText) { 1139 TEST_F(SpdyStreamTest, StatusCannotHaveExtraText) {
1140 SpdySerializedFrame req( 1140 SpdySerializedFrame req(
1141 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1141 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1142 AddWrite(req); 1142 AddWrite(req);
1143 1143
1144 SpdyHeaderBlock headers_with_status_text; 1144 SpdyHeaderBlock headers_with_status_text;
1145 headers_with_status_text[":status"] = 1145 headers_with_status_text[":status"] =
1146 "200 Some random extra text describing status"; 1146 "200 Some random extra text describing status";
1147 SpdySerializedFrame reply(spdy_util_.ConstructSpdyResponseHeaders( 1147 SpdySerializedFrame reply(spdy_util_.ConstructSpdyResponseHeaders(
1148 1, std::move(headers_with_status_text), false)); 1148 1, std::move(headers_with_status_text), false));
1149 AddRead(reply); 1149 AddRead(reply);
1150 1150
1151 SpdySerializedFrame body( 1151 SpdySerializedFrame body(
1152 spdy_util_.ConstructSpdyDataFrame(1, kPostBody, kPostBodyLength, true)); 1152 spdy_util_.ConstructSpdyDataFrame(1, kPostBody, kPostBodyLength, true));
1153 AddRead(body); 1153 AddRead(body);
1154 1154
1155 SpdySerializedFrame rst(
1156 spdy_util_.ConstructSpdyRstStream(1, ERROR_CODE_PROTOCOL_ERROR));
1157 AddWrite(rst);
1158
1155 AddReadEOF(); 1159 AddReadEOF();
1156 1160
1157 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(), 1161 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(),
1158 GetNumWrites()); 1162 GetNumWrites());
1159 MockConnect connect_data(SYNCHRONOUS, OK); 1163 MockConnect connect_data(SYNCHRONOUS, OK);
1160 data.set_connect_data(connect_data); 1164 data.set_connect_data(connect_data);
1161 session_deps_.socket_factory->AddSocketDataProvider(&data); 1165 session_deps_.socket_factory->AddSocketDataProvider(&data);
1162 1166
1163 AddSSLSocketData(); 1167 AddSSLSocketData();
1164 1168
1165 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession()); 1169 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession());
1166 1170
1167 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( 1171 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously(
1168 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource()); 1172 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource());
1169 ASSERT_TRUE(stream); 1173 ASSERT_TRUE(stream);
1170 1174
1171 StreamDelegateDoNothing delegate(stream); 1175 StreamDelegateDoNothing delegate(stream);
1172 stream->SetDelegate(&delegate); 1176 stream->SetDelegate(&delegate);
1173 1177
1174 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty()); 1178 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty());
1175 1179
1176 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); 1180 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl));
1177 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers), 1181 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers),
1178 NO_MORE_DATA_TO_SEND)); 1182 NO_MORE_DATA_TO_SEND));
1179 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec()); 1183 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec());
1180 1184
1181 EXPECT_THAT(delegate.WaitForClose(), IsOk()); 1185 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR));
1182 EXPECT_EQ("200 Some random extra text describing status",
1183 delegate.GetResponseHeaderValue(spdy_util_.GetStatusKey()));
1184 EXPECT_EQ(std::string(kPostBody, kPostBodyLength),
1185 delegate.TakeReceivedData());
1186 1186
1187 // Finish async network reads and writes. 1187 // Finish async network reads and writes.
1188 base::RunLoop().RunUntilIdle(); 1188 base::RunLoop().RunUntilIdle();
1189
1190 EXPECT_TRUE(data.AllWriteDataConsumed());
1191 EXPECT_TRUE(data.AllReadDataConsumed());
1192 }
1193
1194 TEST_F(SpdyStreamTest, StatusMustBePresent) {
1195 SpdySerializedFrame req(
1196 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1197 AddWrite(req);
1198
1199 SpdyHeaderBlock headers_without_status;
1200 SpdySerializedFrame reply(spdy_util_.ConstructSpdyResponseHeaders(
1201 1, std::move(headers_without_status), false));
1202 AddRead(reply);
1203
1204 SpdySerializedFrame body(
1205 spdy_util_.ConstructSpdyDataFrame(1, kPostBody, kPostBodyLength, true));
1206 AddRead(body);
1207
1208 SpdySerializedFrame rst(
1209 spdy_util_.ConstructSpdyRstStream(1, ERROR_CODE_PROTOCOL_ERROR));
1210 AddWrite(rst);
1211
1212 AddReadEOF();
1213
1214 SequencedSocketData data(GetReads(), GetNumReads(), GetWrites(),
1215 GetNumWrites());
1216 MockConnect connect_data(SYNCHRONOUS, OK);
1217 data.set_connect_data(connect_data);
1218 session_deps_.socket_factory->AddSocketDataProvider(&data);
1219
1220 AddSSLSocketData();
1221
1222 base::WeakPtr<SpdySession> session(CreateDefaultSpdySession());
1223
1224 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously(
1225 SPDY_REQUEST_RESPONSE_STREAM, session, url_, LOWEST, NetLogWithSource());
1226 ASSERT_TRUE(stream);
1227
1228 StreamDelegateDoNothing delegate(stream);
1229 stream->SetDelegate(&delegate);
1230
1231 EXPECT_TRUE(stream->GetUrlFromHeaders().is_empty());
1232
1233 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl));
1234 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequestHeaders(std::move(headers),
1235 NO_MORE_DATA_TO_SEND));
1236 EXPECT_EQ(kDefaultUrl, stream->GetUrlFromHeaders().spec());
1237
1238 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_PROTOCOL_ERROR));
1239
1240 // Finish async network reads and writes.
1241 base::RunLoop().RunUntilIdle();
1189 1242
1190 EXPECT_TRUE(data.AllWriteDataConsumed()); 1243 EXPECT_TRUE(data.AllWriteDataConsumed());
1191 EXPECT_TRUE(data.AllReadDataConsumed()); 1244 EXPECT_TRUE(data.AllReadDataConsumed());
1192 } 1245 }
1193 1246
1194 // Call IncreaseSendWindowSize on a stream with a large enough delta to overflow 1247 // Call IncreaseSendWindowSize on a stream with a large enough delta to overflow
1195 // an int32_t. The SpdyStream should handle that case gracefully. 1248 // an int32_t. The SpdyStream should handle that case gracefully.
1196 TEST_F(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { 1249 TEST_F(SpdyStreamTest, IncreaseSendWindowSizeOverflow) {
1197 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 1250 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
1198 kDefaultUrl, 1, kPostBodyLength, LOWEST, nullptr, 0)); 1251 kDefaultUrl, 1, kPostBodyLength, LOWEST, nullptr, 0));
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
1499 EXPECT_EQ(response_len, stream->raw_received_bytes()); 1552 EXPECT_EQ(response_len, stream->raw_received_bytes());
1500 1553
1501 // FIN 1554 // FIN
1502 data.Resume(); 1555 data.Resume();
1503 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); 1556 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED));
1504 } 1557 }
1505 1558
1506 } // namespace test 1559 } // namespace test
1507 1560
1508 } // namespace net 1561 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_stream.cc ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698