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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « no previous file | net/spdy/spdy_session.cc » ('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 (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 <cmath> 5 #include <cmath>
6 #include <memory> 6 #include <memory>
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after
502 << expected; 502 << expected;
503 503
504 // Verify the response HEADERS. 504 // Verify the response HEADERS.
505 // Copy the response info, because trans goes away. 505 // Copy the response info, because trans goes away.
506 *response = *trans->GetResponseInfo(); 506 *response = *trans->GetResponseInfo();
507 *push_response = *trans2.GetResponseInfo(); 507 *push_response = *trans2.GetResponseInfo();
508 508
509 VerifyStreamsClosed(helper); 509 VerifyStreamsClosed(helper);
510 } 510 }
511 511
512 void RunBrokenPushTest(SequencedSocketData* data, int expected_rv) {
513 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
514 NetLogWithSource(), nullptr);
515 helper.RunPreTestSetup();
516 helper.AddData(data);
517
518 HttpNetworkTransaction* trans = helper.trans();
519
520 // Start the transaction with basic parameters.
521 TestCompletionCallback callback;
522 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
523 NetLogWithSource());
524 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
525 rv = callback.WaitForResult();
526 EXPECT_EQ(expected_rv, rv);
527
528 // Finish async network reads/writes.
529 base::RunLoop().RunUntilIdle();
530
531 // Verify that we consumed all test data.
532 EXPECT_TRUE(data->AllReadDataConsumed());
533 EXPECT_TRUE(data->AllWriteDataConsumed());
534
535 if (expected_rv == OK) {
536 // Expected main request to succeed, even if push failed.
537 HttpResponseInfo response = *trans->GetResponseInfo();
538 EXPECT_TRUE(response.headers);
539 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
540 }
541 }
542
512 static void DeleteSessionCallback(NormalSpdyTransactionHelper* helper, 543 static void DeleteSessionCallback(NormalSpdyTransactionHelper* helper,
513 int result) { 544 int result) {
514 helper->ResetTrans(); 545 helper->ResetTrans();
515 } 546 }
516 547
517 static void StartTransactionCallback(HttpNetworkSession* session, 548 static void StartTransactionCallback(HttpNetworkSession* session,
518 GURL url, 549 GURL url,
519 int result) { 550 int result) {
520 HttpRequestInfo request; 551 HttpRequestInfo request;
521 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session); 552 HttpNetworkTransaction trans(DEFAULT_PRIORITY, session);
(...skipping 2332 matching lines...) Expand 10 before | Expand all | Expand 10 after
2854 2885
2855 // Verify the response headers. 2886 // Verify the response headers.
2856 EXPECT_TRUE(response.headers); 2887 EXPECT_TRUE(response.headers);
2857 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2888 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2858 2889
2859 // Verify the pushed stream. 2890 // Verify the pushed stream.
2860 EXPECT_TRUE(response2.headers); 2891 EXPECT_TRUE(response2.headers);
2861 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2892 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2862 } 2893 }
2863 2894
2895 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidUrl) {
2896 // Coverage on how a non-empty invalid GURL in a PUSH_PROMISE is handled.
2897 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl));
2898 SpdySerializedFrame req(
2899 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true));
2900
2901 // Can't use ConstructSpdyPush here since it wants to parse a URL and
2902 // split it into the appropriate :header pieces. So we have to hand-fill
2903 // those pieces in.
2904 SpdyFramer response_spdy_framer(SpdyFramer::ENABLE_COMPRESSION);
2905 SpdyHeaderBlock push_promise_header_block;
2906 push_promise_header_block[spdy_util_.GetHostKey()] = "";
2907 push_promise_header_block[spdy_util_.GetSchemeKey()] = "";
2908 push_promise_header_block[spdy_util_.GetPathKey()] = "/index.html";
2909
2910 SpdyPushPromiseIR push_promise(1, 2, std::move(push_promise_header_block));
2911 SpdySerializedFrame push_promise_frame(
2912 response_spdy_framer.SerializeFrame(push_promise));
2913
2914 SpdySerializedFrame stream2_rst(
2915 spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_PROTOCOL_ERROR));
2916
2917 MockWrite writes[] = {CreateMockWrite(req, 0),
2918 CreateMockWrite(stream2_rst, 2)};
2919 MockRead reads[] = {
2920 CreateMockRead(push_promise_frame, 1), MockRead(ASYNC, 0, 3) /* EOF */
2921 };
2922 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2923 RunBrokenPushTest(&data, ERR_CONNECTION_CLOSED);
2924 }
2925
2864 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { 2926 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) {
2865 SpdySerializedFrame stream1_syn( 2927 SpdySerializedFrame stream1_syn(
2866 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2928 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2867 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 2929 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
2868 0, ERROR_CODE_PROTOCOL_ERROR, "Framer error: 1 (INVALID_STREAM_ID).")); 2930 0, ERROR_CODE_PROTOCOL_ERROR, "Framer error: 1 (INVALID_STREAM_ID)."));
2869 MockWrite writes[] = { 2931 MockWrite writes[] = {
2870 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 3), 2932 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 3),
2871 }; 2933 };
2872 2934
2873 SpdySerializedFrame stream1_reply( 2935 SpdySerializedFrame stream1_reply(
2874 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 2936 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2875 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2937 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2876 nullptr, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str())); 2938 nullptr, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str()));
2877 MockRead reads[] = { 2939 MockRead reads[] = {
2878 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 2940 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2879 }; 2941 };
2880
2881 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2942 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2882 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2943 RunBrokenPushTest(&data, OK);
2883 NetLogWithSource(), nullptr);
2884
2885 helper.RunPreTestSetup();
2886 helper.AddData(&data);
2887
2888 HttpNetworkTransaction* trans = helper.trans();
2889
2890 // Start the transaction with basic parameters.
2891 TestCompletionCallback callback;
2892 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
2893 NetLogWithSource());
2894 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2895 rv = callback.WaitForResult();
2896 EXPECT_THAT(rv, IsOk());
2897
2898 // Finish async network reads/writes.
2899 base::RunLoop().RunUntilIdle();
2900
2901 // Verify that we consumed all test data.
2902 EXPECT_TRUE(data.AllReadDataConsumed());
2903 EXPECT_TRUE(data.AllWriteDataConsumed());
2904
2905 // Verify the response headers.
2906 HttpResponseInfo response = *trans->GetResponseInfo();
2907 EXPECT_TRUE(response.headers);
2908 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2909 } 2944 }
2910 2945
2911 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { 2946 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) {
2912 SpdySerializedFrame stream1_syn( 2947 SpdySerializedFrame stream1_syn(
2913 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2948 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2914 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2949 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2915 SpdySerializedFrame stream2_rst( 2950 SpdySerializedFrame stream2_rst(
2916 spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_STREAM_CLOSED)); 2951 spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_STREAM_CLOSED));
2917 MockWrite writes[] = { 2952 MockWrite writes[] = {
2918 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), 2953 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3),
2919 }; 2954 };
2920 2955
2921 SpdySerializedFrame stream1_reply( 2956 SpdySerializedFrame stream1_reply(
2922 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 2957 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2923 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2958 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2924 nullptr, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str())); 2959 nullptr, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str()));
2925 MockRead reads[] = { 2960 MockRead reads[] = {
2926 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 2961 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2927 CreateMockRead(stream1_body, 4), 2962 CreateMockRead(stream1_body, 4),
2928 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2963 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2929 }; 2964 };
2930 2965
2931 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2966 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2932 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2967 RunBrokenPushTest(&data, OK);
2933 NetLogWithSource(), nullptr);
2934
2935 helper.RunPreTestSetup();
2936 helper.AddData(&data);
2937
2938 HttpNetworkTransaction* trans = helper.trans();
2939
2940 // Start the transaction with basic parameters.
2941 TestCompletionCallback callback;
2942 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
2943 NetLogWithSource());
2944 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2945 rv = callback.WaitForResult();
2946 EXPECT_THAT(rv, IsOk());
2947
2948 // Finish async network reads/writes.
2949 base::RunLoop().RunUntilIdle();
2950
2951 // Verify that we consumed all test data.
2952 EXPECT_TRUE(data.AllReadDataConsumed());
2953 EXPECT_TRUE(data.AllWriteDataConsumed());
2954
2955 // Verify the response headers.
2956 HttpResponseInfo response = *trans->GetResponseInfo();
2957 EXPECT_TRUE(response.headers);
2958 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2959 } 2968 }
2960 2969
2961 TEST_F(SpdyNetworkTransactionTest, ServerPushNoURL) { 2970 TEST_F(SpdyNetworkTransactionTest, ServerPushNoURL) {
2962 SpdySerializedFrame stream1_syn( 2971 SpdySerializedFrame stream1_syn(
2963 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2972 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2964 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2973 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2965 SpdySerializedFrame stream2_rst( 2974 SpdySerializedFrame stream2_rst(
2966 spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_PROTOCOL_ERROR)); 2975 spdy_util_.ConstructSpdyRstStream(2, ERROR_CODE_PROTOCOL_ERROR));
2967 MockWrite writes[] = { 2976 MockWrite writes[] = {
2968 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), 2977 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3),
2969 }; 2978 };
2970 2979
2971 SpdySerializedFrame stream1_reply( 2980 SpdySerializedFrame stream1_reply(
2972 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 2981 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2973 SpdyHeaderBlock incomplete_headers; 2982 SpdyHeaderBlock incomplete_headers;
2974 incomplete_headers[spdy_util_.GetStatusKey()] = "200 OK"; 2983 incomplete_headers[spdy_util_.GetStatusKey()] = "200 OK";
2975 incomplete_headers["hello"] = "bye"; 2984 incomplete_headers["hello"] = "bye";
2976 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 2985 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame(
2977 std::move(incomplete_headers), 2, 1)); 2986 std::move(incomplete_headers), 2, 1));
2978 MockRead reads[] = { 2987 MockRead reads[] = {
2979 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 2988 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2980 CreateMockRead(stream1_body, 4), 2989 CreateMockRead(stream1_body, 4),
2981 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause 2990 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause
2982 }; 2991 };
2983 2992
2984 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2993 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2985 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2994 RunBrokenPushTest(&data, OK);
2986 NetLogWithSource(), nullptr);
2987
2988 helper.RunPreTestSetup();
2989 helper.AddData(&data);
2990
2991 HttpNetworkTransaction* trans = helper.trans();
2992
2993 // Start the transaction with basic parameters.
2994 TestCompletionCallback callback;
2995 int rv = trans->Start(&CreateGetRequest(), callback.callback(),
2996 NetLogWithSource());
2997 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2998 rv = callback.WaitForResult();
2999 EXPECT_THAT(rv, IsOk());
3000
3001 // Finish async network reads/writes.
3002 base::RunLoop().RunUntilIdle();
3003
3004 // Verify that we consumed all test data.
3005 EXPECT_TRUE(data.AllReadDataConsumed());
3006 EXPECT_TRUE(data.AllWriteDataConsumed());
3007
3008 // Verify the response headers.
3009 HttpResponseInfo response = *trans->GetResponseInfo();
3010 EXPECT_TRUE(response.headers);
3011 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
3012 } 2995 }
3013 2996
3014 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY. 2997 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY.
3015 TEST_F(SpdyNetworkTransactionTest, ServerPushOnPushedStream) { 2998 TEST_F(SpdyNetworkTransactionTest, ServerPushOnPushedStream) {
3016 SpdySerializedFrame stream1_syn( 2999 SpdySerializedFrame stream1_syn(
3017 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3000 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3018 SpdySerializedFrame stream2_priority( 3001 SpdySerializedFrame stream2_priority(
3019 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true)); 3002 spdy_util_.ConstructSpdyPriority(2, 1, IDLE, true));
3020 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 3003 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
3021 2, ERROR_CODE_PROTOCOL_ERROR, "Push on even stream id.")); 3004 2, ERROR_CODE_PROTOCOL_ERROR, "Push on even stream id."));
(...skipping 3534 matching lines...) Expand 10 before | Expand all | Expand 10 after
6556 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { 6539 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) {
6557 std::unique_ptr<SSLSocketDataProvider> ssl_provider( 6540 std::unique_ptr<SSLSocketDataProvider> ssl_provider(
6558 new SSLSocketDataProvider(ASYNC, OK)); 6541 new SSLSocketDataProvider(ASYNC, OK));
6559 // Set to TLS_RSA_WITH_NULL_MD5 6542 // Set to TLS_RSA_WITH_NULL_MD5
6560 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); 6543 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status);
6561 6544
6562 RunTLSUsageCheckTest(std::move(ssl_provider)); 6545 RunTLSUsageCheckTest(std::move(ssl_provider));
6563 } 6546 }
6564 6547
6565 } // namespace net 6548 } // namespace net
OLDNEW
« 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