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

Unified Diff: net/spdy/spdy_network_transaction_unittest.cc

Issue 2673363003: Don't access .spec on a !is_valid PUSH_PROMISE URL. (Closed)
Patch Set: Factor out some common things, check rv of wait in the new test. Created 3 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | net/spdy/spdy_session.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/spdy/spdy_network_transaction_unittest.cc
diff --git a/net/spdy/spdy_network_transaction_unittest.cc b/net/spdy/spdy_network_transaction_unittest.cc
index ca0372801977dc6b9ed161a5110a11669b03c212..e856c55ddb184c5062663c6419c5e538f38a1845 100644
--- a/net/spdy/spdy_network_transaction_unittest.cc
+++ b/net/spdy/spdy_network_transaction_unittest.cc
@@ -509,6 +509,37 @@ class SpdyNetworkTransactionTest : public ::testing::Test {
VerifyStreamsClosed(helper);
}
+ void RunBrokenPushTest(SequencedSocketData* data, int expected_rv) {
+ NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
+ NetLogWithSource(), nullptr);
+ helper.RunPreTestSetup();
+ helper.AddData(data);
+
+ HttpNetworkTransaction* trans = helper.trans();
+
+ // Start the transaction with basic parameters.
+ TestCompletionCallback callback;
+ int rv = trans->Start(&CreateGetRequest(), callback.callback(),
+ NetLogWithSource());
+ EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
+ rv = callback.WaitForResult();
+ EXPECT_EQ(expected_rv, rv);
+
+ // Finish async network reads/writes.
+ base::RunLoop().RunUntilIdle();
+
+ // Verify that we consumed all test data.
+ EXPECT_TRUE(data->AllReadDataConsumed());
+ EXPECT_TRUE(data->AllWriteDataConsumed());
+
+ if (expected_rv == OK) {
+ // Expected main request to succeed, even if push failed.
+ HttpResponseInfo response = *trans->GetResponseInfo();
+ EXPECT_TRUE(response.headers);
+ EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
+ }
+ }
+
static void DeleteSessionCallback(NormalSpdyTransactionHelper* helper,
int result) {
helper->ResetTrans();
@@ -2861,6 +2892,37 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) {
EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
}
+TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidUrl) {
+ // Coverage on how a non-empty invalid GURL in a PUSH_PROMISE is handled.
+ SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl));
+ SpdySerializedFrame req(
+ spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true));
+
+ // Can't use ConstructSpdyPush here since it wants to parse a URL and
+ // split it into the appropriate :header pieces. So we have to hand-fill
+ // those pieces in.
+ SpdyFramer response_spdy_framer(SpdyFramer::ENABLE_COMPRESSION);
+ SpdyHeaderBlock push_promise_header_block;
+ push_promise_header_block[spdy_util_.GetHostKey()] = "";
+ push_promise_header_block[spdy_util_.GetSchemeKey()] = "";
+ push_promise_header_block[spdy_util_.GetPathKey()] = "/index.html";
+
+ SpdyPushPromiseIR push_promise(1, 2, std::move(push_promise_header_block));
+ SpdySerializedFrame push_promise_frame(
+ response_spdy_framer.SerializeFrame(push_promise));
+
+ SpdySerializedFrame stream2_rst(
+ spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_PROTOCOL_ERROR));
+
+ MockWrite writes[] = {CreateMockWrite(req, 0),
+ CreateMockWrite(stream2_rst, 2)};
+ MockRead reads[] = {
+ CreateMockRead(push_promise_frame, 1), MockRead(ASYNC, 0, 3) /* EOF */
+ };
+ SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
+ RunBrokenPushTest(&data, ERR_CONNECTION_CLOSED);
+}
+
TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) {
SpdySerializedFrame stream1_syn(
spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
@@ -2877,35 +2939,8 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) {
MockRead reads[] = {
CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
};
-
SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
- NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
- NetLogWithSource(), nullptr);
-
- helper.RunPreTestSetup();
- helper.AddData(&data);
-
- HttpNetworkTransaction* trans = helper.trans();
-
- // Start the transaction with basic parameters.
- TestCompletionCallback callback;
- int rv = trans->Start(&CreateGetRequest(), callback.callback(),
- NetLogWithSource());
- EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
- rv = callback.WaitForResult();
- EXPECT_THAT(rv, IsOk());
-
- // Finish async network reads/writes.
- base::RunLoop().RunUntilIdle();
-
- // Verify that we consumed all test data.
- EXPECT_TRUE(data.AllReadDataConsumed());
- EXPECT_TRUE(data.AllWriteDataConsumed());
-
- // Verify the response headers.
- HttpResponseInfo response = *trans->GetResponseInfo();
- EXPECT_TRUE(response.headers);
- EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
+ RunBrokenPushTest(&data, OK);
}
TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) {
@@ -2929,33 +2964,7 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) {
};
SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
- NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
- NetLogWithSource(), nullptr);
-
- helper.RunPreTestSetup();
- helper.AddData(&data);
-
- HttpNetworkTransaction* trans = helper.trans();
-
- // Start the transaction with basic parameters.
- TestCompletionCallback callback;
- int rv = trans->Start(&CreateGetRequest(), callback.callback(),
- NetLogWithSource());
- EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
- rv = callback.WaitForResult();
- EXPECT_THAT(rv, IsOk());
-
- // Finish async network reads/writes.
- base::RunLoop().RunUntilIdle();
-
- // Verify that we consumed all test data.
- EXPECT_TRUE(data.AllReadDataConsumed());
- EXPECT_TRUE(data.AllWriteDataConsumed());
-
- // Verify the response headers.
- HttpResponseInfo response = *trans->GetResponseInfo();
- EXPECT_TRUE(response.headers);
- EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
+ RunBrokenPushTest(&data, OK);
}
TEST_F(SpdyNetworkTransactionTest, ServerPushNoURL) {
@@ -2982,33 +2991,7 @@ TEST_F(SpdyNetworkTransactionTest, ServerPushNoURL) {
};
SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
- NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
- NetLogWithSource(), nullptr);
-
- helper.RunPreTestSetup();
- helper.AddData(&data);
-
- HttpNetworkTransaction* trans = helper.trans();
-
- // Start the transaction with basic parameters.
- TestCompletionCallback callback;
- int rv = trans->Start(&CreateGetRequest(), callback.callback(),
- NetLogWithSource());
- EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
- rv = callback.WaitForResult();
- EXPECT_THAT(rv, IsOk());
-
- // Finish async network reads/writes.
- base::RunLoop().RunUntilIdle();
-
- // Verify that we consumed all test data.
- EXPECT_TRUE(data.AllReadDataConsumed());
- EXPECT_TRUE(data.AllWriteDataConsumed());
-
- // Verify the response headers.
- HttpResponseInfo response = *trans->GetResponseInfo();
- EXPECT_TRUE(response.headers);
- EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
+ RunBrokenPushTest(&data, OK);
}
// PUSH_PROMISE on a server-initiated stream should trigger GOAWAY.
« no previous file with comments | « no previous file | net/spdy/spdy_session.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698