Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 <algorithm> | 5 #include <algorithm> |
| 6 #include <iostream> | 6 #include <iostream> |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 663 LOG(ERROR) << "Expected header named '" << it->first | 663 LOG(ERROR) << "Expected header named '" << it->first |
| 664 << "' to have a value of '" << it->second | 664 << "' to have a value of '" << it->second |
| 665 << "'. The actual value received was '" << it2->second | 665 << "'. The actual value received was '" << it2->second |
| 666 << "'."; | 666 << "'."; |
| 667 return false; | 667 return false; |
| 668 } | 668 } |
| 669 } | 669 } |
| 670 return true; | 670 return true; |
| 671 } | 671 } |
| 672 | 672 |
| 673 bool IsSpdy2() { return spdy_version_ == SPDY2; } | |
|
Ryan Hamilton
2014/11/10 23:08:27
Have these changes been made server side too?
| |
| 674 bool IsSpdy3() { return spdy_version_ == SPDY3; } | 673 bool IsSpdy3() { return spdy_version_ == SPDY3; } |
| 675 bool IsSpdy4() { return spdy_version_ == SPDY4; } | 674 bool IsSpdy4() { return spdy_version_ == SPDY4; } |
| 676 bool IsSpdy5() { return spdy_version_ == SPDY5; } | 675 bool IsSpdy5() { return spdy_version_ == SPDY5; } |
| 677 | 676 |
| 678 // Version of SPDY protocol to be used. | 677 // Version of SPDY protocol to be used. |
| 679 SpdyMajorVersion spdy_version_; | 678 SpdyMajorVersion spdy_version_; |
| 680 unsigned char spdy_version_ch_; | 679 unsigned char spdy_version_ch_; |
| 681 }; | 680 }; |
| 682 | 681 |
| 683 // All tests are run with 3 different SPDY versions: SPDY/2, SPDY/3, SPDY/4. | |
| 684 INSTANTIATE_TEST_CASE_P(SpdyFramerTests, | 682 INSTANTIATE_TEST_CASE_P(SpdyFramerTests, |
| 685 SpdyFramerTest, | 683 SpdyFramerTest, |
| 686 ::testing::Values(SPDY2, SPDY3, SPDY4)); | 684 ::testing::Values(SPDY3, SPDY4)); |
| 687 | 685 |
| 688 // Test that we ignore cookie where both name and value are empty. | 686 // Test that we ignore cookie where both name and value are empty. |
| 689 TEST_P(SpdyFramerTest, HeaderBlockWithEmptyCookie) { | 687 TEST_P(SpdyFramerTest, HeaderBlockWithEmptyCookie) { |
| 690 if (spdy_version_ > SPDY3) { | 688 if (spdy_version_ > SPDY3) { |
| 691 // Not implemented for hpack. | 689 // Not implemented for hpack. |
| 692 return; | 690 return; |
| 693 } | 691 } |
| 694 | 692 |
| 695 SpdyFramer framer(spdy_version_); | 693 SpdyFramer framer(spdy_version_); |
| 696 framer.set_enable_compression(true); | 694 framer.set_enable_compression(true); |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 868 if (spdy_version_ <= SPDY3) { | 866 if (spdy_version_ <= SPDY3) { |
| 869 frame.WriteControlFrameHeader(framer, SYN_STREAM, CONTROL_FLAG_NONE); | 867 frame.WriteControlFrameHeader(framer, SYN_STREAM, CONTROL_FLAG_NONE); |
| 870 frame.WriteUInt32(3); // stream_id | 868 frame.WriteUInt32(3); // stream_id |
| 871 frame.WriteUInt32(0); // associated stream id | 869 frame.WriteUInt32(0); // associated stream id |
| 872 frame.WriteUInt16(0); // Priority. | 870 frame.WriteUInt16(0); // Priority. |
| 873 } else { | 871 } else { |
| 874 frame.BeginNewFrame(framer, HEADERS, HEADERS_FLAG_PRIORITY, 3); | 872 frame.BeginNewFrame(framer, HEADERS, HEADERS_FLAG_PRIORITY, 3); |
| 875 frame.WriteUInt32(framer.GetHighestPriority()); | 873 frame.WriteUInt32(framer.GetHighestPriority()); |
| 876 } | 874 } |
| 877 | 875 |
| 878 if (IsSpdy2()) { | 876 frame.WriteUInt32(2); // Number of headers. |
| 879 frame.WriteUInt16(2); // Number of headers. | 877 frame.WriteStringPiece32("name"); |
| 880 frame.WriteString("name"); | 878 frame.WriteStringPiece32("value1"); |
| 881 frame.WriteString("value1"); | 879 frame.WriteStringPiece32("name"); |
| 882 frame.WriteString("name"); | 880 frame.WriteStringPiece32("value2"); |
| 883 frame.WriteString("value2"); | |
| 884 } else { | |
| 885 frame.WriteUInt32(2); // Number of headers. | |
| 886 frame.WriteStringPiece32("name"); | |
| 887 frame.WriteStringPiece32("value1"); | |
| 888 frame.WriteStringPiece32("name"); | |
| 889 frame.WriteStringPiece32("value2"); | |
| 890 } | |
| 891 // write the length | 881 // write the length |
| 892 frame.RewriteLength(framer); | 882 frame.RewriteLength(framer); |
| 893 | 883 |
| 894 SpdyHeaderBlock new_headers; | 884 SpdyHeaderBlock new_headers; |
| 895 framer.set_enable_compression(false); | 885 framer.set_enable_compression(false); |
| 896 scoped_ptr<SpdyFrame> control_frame(frame.take()); | 886 scoped_ptr<SpdyFrame> control_frame(frame.take()); |
| 897 base::StringPiece serialized_headers = | 887 base::StringPiece serialized_headers = |
| 898 GetSerializedHeaders(control_frame.get(), framer); | 888 GetSerializedHeaders(control_frame.get(), framer); |
| 899 // This should fail because duplicate headers are verboten by the spec. | 889 // This should fail because duplicate headers are verboten by the spec. |
| 900 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(serialized_headers.data(), | 890 EXPECT_FALSE(framer.ParseHeaderBlockInBuffer(serialized_headers.data(), |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 914 } else { | 904 } else { |
| 915 frame.BeginNewFrame(framer, | 905 frame.BeginNewFrame(framer, |
| 916 HEADERS, | 906 HEADERS, |
| 917 HEADERS_FLAG_PRIORITY | HEADERS_FLAG_END_HEADERS, | 907 HEADERS_FLAG_PRIORITY | HEADERS_FLAG_END_HEADERS, |
| 918 3); | 908 3); |
| 919 frame.WriteUInt32(0); // Priority exclusivity and dependent stream. | 909 frame.WriteUInt32(0); // Priority exclusivity and dependent stream. |
| 920 frame.WriteUInt8(255); // Priority weight. | 910 frame.WriteUInt8(255); // Priority weight. |
| 921 } | 911 } |
| 922 | 912 |
| 923 string value("value1\0value2", 13); | 913 string value("value1\0value2", 13); |
| 924 if (IsSpdy2()) { | 914 if (spdy_version_ > SPDY3) { |
| 925 frame.WriteUInt16(1); // Number of headers. | |
| 926 frame.WriteString("name"); | |
| 927 frame.WriteString(value); | |
| 928 } else if (spdy_version_ > SPDY3) { | |
| 929 // TODO(jgraettinger): If this pattern appears again, move to test class. | 915 // TODO(jgraettinger): If this pattern appears again, move to test class. |
| 930 std::map<string, string> header_set; | 916 std::map<string, string> header_set; |
| 931 header_set["name"] = value; | 917 header_set["name"] = value; |
| 932 string buffer; | 918 string buffer; |
| 933 HpackEncoder encoder(ObtainHpackHuffmanTable()); | 919 HpackEncoder encoder(ObtainHpackHuffmanTable()); |
| 934 encoder.EncodeHeaderSetWithoutCompression(header_set, &buffer); | 920 encoder.EncodeHeaderSetWithoutCompression(header_set, &buffer); |
| 935 frame.WriteBytes(&buffer[0], buffer.size()); | 921 frame.WriteBytes(&buffer[0], buffer.size()); |
| 936 } else { | 922 } else { |
| 937 frame.WriteUInt32(1); // Number of headers. | 923 frame.WriteUInt32(1); // Number of headers. |
| 938 frame.WriteStringPiece32("name"); | 924 frame.WriteStringPiece32("name"); |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 967 syn_stream.SetHeader("server", "SpdyServer 1.0"); | 953 syn_stream.SetHeader("server", "SpdyServer 1.0"); |
| 968 syn_stream.SetHeader("date", "Mon 12 Jan 2009 12:12:12 PST"); | 954 syn_stream.SetHeader("date", "Mon 12 Jan 2009 12:12:12 PST"); |
| 969 syn_stream.SetHeader("status", "200"); | 955 syn_stream.SetHeader("status", "200"); |
| 970 syn_stream.SetHeader("version", "HTTP/1.1"); | 956 syn_stream.SetHeader("version", "HTTP/1.1"); |
| 971 syn_stream.SetHeader("content-type", "text/html"); | 957 syn_stream.SetHeader("content-type", "text/html"); |
| 972 syn_stream.SetHeader("content-length", "12"); | 958 syn_stream.SetHeader("content-length", "12"); |
| 973 scoped_ptr<SpdyFrame> frame1(framer.SerializeSynStream(syn_stream)); | 959 scoped_ptr<SpdyFrame> frame1(framer.SerializeSynStream(syn_stream)); |
| 974 size_t uncompressed_size1 = visitor->last_payload_len_; | 960 size_t uncompressed_size1 = visitor->last_payload_len_; |
| 975 size_t compressed_size1 = | 961 size_t compressed_size1 = |
| 976 visitor->last_frame_len_ - framer.GetSynStreamMinimumSize(); | 962 visitor->last_frame_len_ - framer.GetSynStreamMinimumSize(); |
| 977 if (IsSpdy2()) { | 963 EXPECT_EQ(165u, uncompressed_size1); |
| 978 EXPECT_EQ(139u, uncompressed_size1); | |
| 979 #if defined(USE_SYSTEM_ZLIB) | 964 #if defined(USE_SYSTEM_ZLIB) |
| 980 EXPECT_EQ(155u, compressed_size1); | 965 EXPECT_EQ(181u, compressed_size1); |
| 981 #else // !defined(USE_SYSTEM_ZLIB) | 966 #else // !defined(USE_SYSTEM_ZLIB) |
| 982 EXPECT_EQ(135u, compressed_size1); | 967 EXPECT_EQ(117u, compressed_size1); |
| 983 #endif // !defined(USE_SYSTEM_ZLIB) | 968 #endif // !defined(USE_SYSTEM_ZLIB) |
| 984 } else { | |
| 985 EXPECT_EQ(165u, uncompressed_size1); | |
| 986 #if defined(USE_SYSTEM_ZLIB) | |
| 987 EXPECT_EQ(181u, compressed_size1); | |
| 988 #else // !defined(USE_SYSTEM_ZLIB) | |
| 989 EXPECT_EQ(117u, compressed_size1); | |
| 990 #endif // !defined(USE_SYSTEM_ZLIB) | |
| 991 } | |
| 992 scoped_ptr<SpdyFrame> frame2(framer.SerializeSynStream(syn_stream)); | 969 scoped_ptr<SpdyFrame> frame2(framer.SerializeSynStream(syn_stream)); |
| 993 size_t uncompressed_size2 = visitor->last_payload_len_; | 970 size_t uncompressed_size2 = visitor->last_payload_len_; |
| 994 size_t compressed_size2 = | 971 size_t compressed_size2 = |
| 995 visitor->last_frame_len_ - framer.GetSynStreamMinimumSize(); | 972 visitor->last_frame_len_ - framer.GetSynStreamMinimumSize(); |
| 996 | 973 |
| 997 // Expect the second frame to be more compact than the first. | 974 // Expect the second frame to be more compact than the first. |
| 998 EXPECT_LE(frame2->size(), frame1->size()); | 975 EXPECT_LE(frame2->size(), frame1->size()); |
| 999 | 976 |
| 1000 // Decompress the first frame | 977 // Decompress the first frame |
| 1001 scoped_ptr<SpdyFrame> frame3( | 978 scoped_ptr<SpdyFrame> frame3( |
| 1002 SpdyFramerTestUtil::DecompressFrame(&framer, *frame1)); | 979 SpdyFramerTestUtil::DecompressFrame(&framer, *frame1)); |
| 1003 | 980 |
| 1004 // Decompress the second frame | 981 // Decompress the second frame |
| 1005 visitor.reset(new TestSpdyVisitor(spdy_version_)); | 982 visitor.reset(new TestSpdyVisitor(spdy_version_)); |
| 1006 framer.set_debug_visitor(visitor.get()); | 983 framer.set_debug_visitor(visitor.get()); |
| 1007 scoped_ptr<SpdyFrame> frame4( | 984 scoped_ptr<SpdyFrame> frame4( |
| 1008 SpdyFramerTestUtil::DecompressFrame(&framer, *frame2)); | 985 SpdyFramerTestUtil::DecompressFrame(&framer, *frame2)); |
| 1009 size_t uncompressed_size4 = | 986 size_t uncompressed_size4 = |
| 1010 frame4->size() - framer.GetSynStreamMinimumSize(); | 987 frame4->size() - framer.GetSynStreamMinimumSize(); |
| 1011 size_t compressed_size4 = | 988 size_t compressed_size4 = |
| 1012 visitor->last_frame_len_ - framer.GetSynStreamMinimumSize(); | 989 visitor->last_frame_len_ - framer.GetSynStreamMinimumSize(); |
| 1013 if (IsSpdy2()) { | 990 EXPECT_EQ(165u, uncompressed_size4); |
| 1014 EXPECT_EQ(139u, uncompressed_size4); | |
| 1015 #if defined(USE_SYSTEM_ZLIB) | 991 #if defined(USE_SYSTEM_ZLIB) |
| 1016 EXPECT_EQ(149u, compressed_size4); | 992 EXPECT_EQ(175u, compressed_size4); |
| 1017 #else // !defined(USE_SYSTEM_ZLIB) | 993 #else // !defined(USE_SYSTEM_ZLIB) |
| 1018 EXPECT_EQ(101u, compressed_size4); | 994 EXPECT_EQ(102u, compressed_size4); |
| 1019 #endif // !defined(USE_SYSTEM_ZLIB) | 995 #endif // !defined(USE_SYSTEM_ZLIB) |
| 1020 } else { | |
| 1021 EXPECT_EQ(165u, uncompressed_size4); | |
| 1022 #if defined(USE_SYSTEM_ZLIB) | |
| 1023 EXPECT_EQ(175u, compressed_size4); | |
| 1024 #else // !defined(USE_SYSTEM_ZLIB) | |
| 1025 EXPECT_EQ(102u, compressed_size4); | |
| 1026 #endif // !defined(USE_SYSTEM_ZLIB) | |
| 1027 } | |
| 1028 | 996 |
| 1029 EXPECT_EQ(uncompressed_size1, uncompressed_size2); | 997 EXPECT_EQ(uncompressed_size1, uncompressed_size2); |
| 1030 EXPECT_EQ(uncompressed_size1, uncompressed_size4); | 998 EXPECT_EQ(uncompressed_size1, uncompressed_size4); |
| 1031 EXPECT_EQ(compressed_size2, compressed_size4); | 999 EXPECT_EQ(compressed_size2, compressed_size4); |
| 1032 | 1000 |
| 1033 // Expect frames 3 & 4 to be the same. | 1001 // Expect frames 3 & 4 to be the same. |
| 1034 CompareFrames("Uncompressed SYN_STREAM", *frame3, *frame4); | 1002 CompareFrames("Uncompressed SYN_STREAM", *frame3, *frame4); |
| 1035 | 1003 |
| 1036 // Expect frames 3 to be the same as a uncompressed frame created | 1004 // Expect frames 3 to be the same as a uncompressed frame created |
| 1037 // from scratch. | 1005 // from scratch. |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 1051 headers.SetHeader("content-type", "text/html"); | 1019 headers.SetHeader("content-type", "text/html"); |
| 1052 headers.SetHeader("content-length", "12"); | 1020 headers.SetHeader("content-length", "12"); |
| 1053 headers.SetHeader("x-empty-header", ""); | 1021 headers.SetHeader("x-empty-header", ""); |
| 1054 | 1022 |
| 1055 SpdyFramer framer(spdy_version_); | 1023 SpdyFramer framer(spdy_version_); |
| 1056 framer.set_enable_compression(true); | 1024 framer.set_enable_compression(true); |
| 1057 scoped_ptr<SpdyFrame> frame1(framer.SerializeHeaders(headers)); | 1025 scoped_ptr<SpdyFrame> frame1(framer.SerializeHeaders(headers)); |
| 1058 } | 1026 } |
| 1059 | 1027 |
| 1060 TEST_P(SpdyFramerTest, Basic) { | 1028 TEST_P(SpdyFramerTest, Basic) { |
| 1061 const unsigned char kV2Input[] = { | |
| 1062 0x80, spdy_version_ch_, 0x00, 0x01, // SYN Stream #1 | |
| 1063 0x00, 0x00, 0x00, 0x14, | |
| 1064 0x00, 0x00, 0x00, 0x01, | |
| 1065 0x00, 0x00, 0x00, 0x00, | |
| 1066 0x00, 0x00, 0x00, 0x01, | |
| 1067 0x00, 0x02, 'h', 'h', | |
| 1068 0x00, 0x02, 'v', 'v', | |
| 1069 | |
| 1070 0x80, spdy_version_ch_, 0x00, 0x08, // HEADERS on Stream #1 | |
| 1071 0x00, 0x00, 0x00, 0x18, | |
| 1072 0x00, 0x00, 0x00, 0x01, | |
| 1073 0x00, 0x00, 0x00, 0x02, | |
| 1074 0x00, 0x02, 'h', '2', | |
| 1075 0x00, 0x02, 'v', '2', | |
| 1076 0x00, 0x02, 'h', '3', | |
| 1077 0x00, 0x02, 'v', '3', | |
| 1078 | |
| 1079 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 | |
| 1080 0x00, 0x00, 0x00, 0x0c, | |
| 1081 0xde, 0xad, 0xbe, 0xef, | |
| 1082 0xde, 0xad, 0xbe, 0xef, | |
| 1083 0xde, 0xad, 0xbe, 0xef, | |
| 1084 | |
| 1085 0x80, spdy_version_ch_, 0x00, 0x01, // SYN Stream #3 | |
| 1086 0x00, 0x00, 0x00, 0x0c, | |
| 1087 0x00, 0x00, 0x00, 0x03, | |
| 1088 0x00, 0x00, 0x00, 0x00, | |
| 1089 0x00, 0x00, 0x00, 0x00, | |
| 1090 | |
| 1091 0x00, 0x00, 0x00, 0x03, // DATA on Stream #3 | |
| 1092 0x00, 0x00, 0x00, 0x08, | |
| 1093 0xde, 0xad, 0xbe, 0xef, | |
| 1094 0xde, 0xad, 0xbe, 0xef, | |
| 1095 | |
| 1096 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 | |
| 1097 0x00, 0x00, 0x00, 0x04, | |
| 1098 0xde, 0xad, 0xbe, 0xef, | |
| 1099 | |
| 1100 0x80, spdy_version_ch_, 0x00, 0x03, // RST_STREAM on Stream #1 | |
| 1101 0x00, 0x00, 0x00, 0x08, | |
| 1102 0x00, 0x00, 0x00, 0x01, | |
| 1103 0x00, 0x00, 0x00, 0x05, // RST_STREAM_CANCEL | |
| 1104 | |
| 1105 0x00, 0x00, 0x00, 0x03, // DATA on Stream #3 | |
| 1106 0x00, 0x00, 0x00, 0x00, | |
| 1107 | |
| 1108 0x80, spdy_version_ch_, 0x00, 0x03, // RST_STREAM on Stream #3 | |
| 1109 0x00, 0x00, 0x00, 0x08, | |
| 1110 0x00, 0x00, 0x00, 0x03, | |
| 1111 0x00, 0x00, 0x00, 0x05, // RST_STREAM_CANCEL | |
| 1112 }; | |
| 1113 | |
| 1114 const unsigned char kV3Input[] = { | 1029 const unsigned char kV3Input[] = { |
| 1115 0x80, spdy_version_ch_, 0x00, 0x01, // SYN Stream #1 | 1030 0x80, spdy_version_ch_, 0x00, 0x01, // SYN Stream #1 |
| 1116 0x00, 0x00, 0x00, 0x1a, | 1031 0x00, 0x00, 0x00, 0x1a, |
| 1117 0x00, 0x00, 0x00, 0x01, | 1032 0x00, 0x00, 0x00, 0x01, |
| 1118 0x00, 0x00, 0x00, 0x00, | 1033 0x00, 0x00, 0x00, 0x00, |
| 1119 0x00, 0x00, 0x00, 0x00, | 1034 0x00, 0x00, 0x00, 0x00, |
| 1120 0x00, 0x01, 0x00, 0x00, | 1035 0x00, 0x01, 0x00, 0x00, |
| 1121 0x00, 0x02, 'h', 'h', | 1036 0x00, 0x02, 'h', 'h', |
| 1122 0x00, 0x00, 0x00, 0x02, | 1037 0x00, 0x00, 0x00, 0x02, |
| 1123 'v', 'v', | 1038 'v', 'v', |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1216 | 1131 |
| 1217 0x00, 0x00, 0x0f, 0x03, // RST_STREAM on Stream #3 | 1132 0x00, 0x00, 0x0f, 0x03, // RST_STREAM on Stream #3 |
| 1218 0x00, 0x00, 0x00, 0x00, | 1133 0x00, 0x00, 0x00, 0x00, |
| 1219 0x03, 0x00, 0x00, 0x00, // RST_STREAM_CANCEL | 1134 0x03, 0x00, 0x00, 0x00, // RST_STREAM_CANCEL |
| 1220 0x08, 0x52, 0x45, 0x53, // opaque data | 1135 0x08, 0x52, 0x45, 0x53, // opaque data |
| 1221 0x45, 0x54, 0x53, 0x54, | 1136 0x45, 0x54, 0x53, 0x54, |
| 1222 0x52, 0x45, 0x41, 0x4d, | 1137 0x52, 0x45, 0x41, 0x4d, |
| 1223 }; | 1138 }; |
| 1224 | 1139 |
| 1225 TestSpdyVisitor visitor(spdy_version_); | 1140 TestSpdyVisitor visitor(spdy_version_); |
| 1226 if (IsSpdy2()) { | 1141 if (IsSpdy3()) { |
| 1227 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); | |
| 1228 } else if (IsSpdy3()) { | |
| 1229 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); | 1142 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); |
| 1230 } else { | 1143 } else { |
| 1231 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); | 1144 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); |
| 1232 } | 1145 } |
| 1233 | 1146 |
| 1234 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 1147 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
| 1235 EXPECT_EQ(24, visitor.data_bytes_); | 1148 EXPECT_EQ(24, visitor.data_bytes_); |
| 1236 EXPECT_EQ(0, visitor.error_count_); | 1149 EXPECT_EQ(0, visitor.error_count_); |
| 1237 EXPECT_EQ(2, visitor.fin_frame_count_); | 1150 EXPECT_EQ(2, visitor.fin_frame_count_); |
| 1238 | 1151 |
| 1239 if (IsSpdy4()) { | 1152 if (IsSpdy4()) { |
| 1240 EXPECT_EQ(3, visitor.headers_frame_count_); | 1153 EXPECT_EQ(3, visitor.headers_frame_count_); |
| 1241 EXPECT_EQ(0, visitor.syn_frame_count_); | 1154 EXPECT_EQ(0, visitor.syn_frame_count_); |
| 1242 base::StringPiece reset_stream = "RESETSTREAM"; | 1155 base::StringPiece reset_stream = "RESETSTREAM"; |
| 1243 EXPECT_EQ(reset_stream, visitor.fin_opaque_data_); | 1156 EXPECT_EQ(reset_stream, visitor.fin_opaque_data_); |
| 1244 } else { | 1157 } else { |
| 1245 EXPECT_EQ(1, visitor.headers_frame_count_); | 1158 EXPECT_EQ(1, visitor.headers_frame_count_); |
| 1246 EXPECT_EQ(2, visitor.syn_frame_count_); | 1159 EXPECT_EQ(2, visitor.syn_frame_count_); |
| 1247 EXPECT_TRUE(visitor.fin_opaque_data_.empty()); | 1160 EXPECT_TRUE(visitor.fin_opaque_data_.empty()); |
| 1248 } | 1161 } |
| 1249 | 1162 |
| 1250 EXPECT_EQ(0, visitor.fin_flag_count_); | 1163 EXPECT_EQ(0, visitor.fin_flag_count_); |
| 1251 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); | 1164 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); |
| 1252 EXPECT_EQ(4, visitor.data_frame_count_); | 1165 EXPECT_EQ(4, visitor.data_frame_count_); |
| 1253 visitor.fin_opaque_data_.clear(); | 1166 visitor.fin_opaque_data_.clear(); |
| 1254 } | 1167 } |
| 1255 | 1168 |
| 1256 // Test that the FIN flag on a data frame signifies EOF. | 1169 // Test that the FIN flag on a data frame signifies EOF. |
| 1257 TEST_P(SpdyFramerTest, FinOnDataFrame) { | 1170 TEST_P(SpdyFramerTest, FinOnDataFrame) { |
| 1258 const unsigned char kV2Input[] = { | |
| 1259 0x80, spdy_version_ch_, 0x00, 0x01, // SYN Stream #1 | |
| 1260 0x00, 0x00, 0x00, 0x14, | |
| 1261 0x00, 0x00, 0x00, 0x01, | |
| 1262 0x00, 0x00, 0x00, 0x00, | |
| 1263 0x00, 0x00, 0x00, 0x01, | |
| 1264 0x00, 0x02, 'h', 'h', | |
| 1265 0x00, 0x02, 'v', 'v', | |
| 1266 | |
| 1267 0x80, spdy_version_ch_, 0x00, 0x02, // SYN REPLY Stream #1 | |
| 1268 0x00, 0x00, 0x00, 0x10, | |
| 1269 0x00, 0x00, 0x00, 0x01, | |
| 1270 0x00, 0x00, 0x00, 0x01, | |
| 1271 0x00, 0x02, 'a', 'a', | |
| 1272 0x00, 0x02, 'b', 'b', | |
| 1273 | |
| 1274 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 | |
| 1275 0x00, 0x00, 0x00, 0x0c, | |
| 1276 0xde, 0xad, 0xbe, 0xef, | |
| 1277 0xde, 0xad, 0xbe, 0xef, | |
| 1278 0xde, 0xad, 0xbe, 0xef, | |
| 1279 | |
| 1280 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1, with EOF | |
| 1281 0x01, 0x00, 0x00, 0x04, | |
| 1282 0xde, 0xad, 0xbe, 0xef, | |
| 1283 }; | |
| 1284 const unsigned char kV3Input[] = { | 1171 const unsigned char kV3Input[] = { |
| 1285 0x80, spdy_version_ch_, 0x00, 0x01, // SYN Stream #1 | 1172 0x80, spdy_version_ch_, 0x00, 0x01, // SYN Stream #1 |
| 1286 0x00, 0x00, 0x00, 0x1a, | 1173 0x00, 0x00, 0x00, 0x1a, |
| 1287 0x00, 0x00, 0x00, 0x01, | 1174 0x00, 0x00, 0x00, 0x01, |
| 1288 0x00, 0x00, 0x00, 0x00, | 1175 0x00, 0x00, 0x00, 0x00, |
| 1289 0x00, 0x00, 0x00, 0x00, | 1176 0x00, 0x00, 0x00, 0x00, |
| 1290 0x00, 0x01, 0x00, 0x00, | 1177 0x00, 0x01, 0x00, 0x00, |
| 1291 0x00, 0x02, 'h', 'h', | 1178 0x00, 0x02, 'h', 'h', |
| 1292 0x00, 0x00, 0x00, 0x02, | 1179 0x00, 0x00, 0x00, 0x02, |
| 1293 'v', 'v', | 1180 'v', 'v', |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1330 0xef, 0xde, 0xad, 0xbe, | 1217 0xef, 0xde, 0xad, 0xbe, |
| 1331 0xef, | 1218 0xef, |
| 1332 | 1219 |
| 1333 0x00, 0x00, 0x04, 0x00, // DATA on Stream #1, with FIN | 1220 0x00, 0x00, 0x04, 0x00, // DATA on Stream #1, with FIN |
| 1334 0x01, 0x00, 0x00, 0x00, | 1221 0x01, 0x00, 0x00, 0x00, |
| 1335 0x01, 0xde, 0xad, 0xbe, | 1222 0x01, 0xde, 0xad, 0xbe, |
| 1336 0xef, | 1223 0xef, |
| 1337 }; | 1224 }; |
| 1338 | 1225 |
| 1339 TestSpdyVisitor visitor(spdy_version_); | 1226 TestSpdyVisitor visitor(spdy_version_); |
| 1340 if (IsSpdy2()) { | 1227 if (IsSpdy3()) { |
| 1341 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); | |
| 1342 } else if (IsSpdy3()) { | |
| 1343 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); | 1228 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); |
| 1344 } else { | 1229 } else { |
| 1345 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); | 1230 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); |
| 1346 } | 1231 } |
| 1347 | 1232 |
| 1348 EXPECT_EQ(0, visitor.error_count_); | 1233 EXPECT_EQ(0, visitor.error_count_); |
| 1349 if (IsSpdy4()) { | 1234 if (IsSpdy4()) { |
| 1350 EXPECT_EQ(0, visitor.syn_frame_count_); | 1235 EXPECT_EQ(0, visitor.syn_frame_count_); |
| 1351 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 1236 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
| 1352 EXPECT_EQ(2, visitor.headers_frame_count_); | 1237 EXPECT_EQ(2, visitor.headers_frame_count_); |
| 1353 } else { | 1238 } else { |
| 1354 EXPECT_EQ(1, visitor.syn_frame_count_); | 1239 EXPECT_EQ(1, visitor.syn_frame_count_); |
| 1355 EXPECT_EQ(1, visitor.syn_reply_frame_count_); | 1240 EXPECT_EQ(1, visitor.syn_reply_frame_count_); |
| 1356 EXPECT_EQ(0, visitor.headers_frame_count_); | 1241 EXPECT_EQ(0, visitor.headers_frame_count_); |
| 1357 } | 1242 } |
| 1358 EXPECT_EQ(16, visitor.data_bytes_); | 1243 EXPECT_EQ(16, visitor.data_bytes_); |
| 1359 EXPECT_EQ(0, visitor.fin_frame_count_); | 1244 EXPECT_EQ(0, visitor.fin_frame_count_); |
| 1360 EXPECT_EQ(0, visitor.fin_flag_count_); | 1245 EXPECT_EQ(0, visitor.fin_flag_count_); |
| 1361 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); | 1246 EXPECT_EQ(1, visitor.zero_length_data_frame_count_); |
| 1362 EXPECT_EQ(2, visitor.data_frame_count_); | 1247 EXPECT_EQ(2, visitor.data_frame_count_); |
| 1363 } | 1248 } |
| 1364 | 1249 |
| 1365 // Test that the FIN flag on a SYN reply frame signifies EOF. | 1250 // Test that the FIN flag on a SYN reply frame signifies EOF. |
| 1366 TEST_P(SpdyFramerTest, FinOnSynReplyFrame) { | 1251 TEST_P(SpdyFramerTest, FinOnSynReplyFrame) { |
| 1367 const unsigned char kV2Input[] = { | |
| 1368 0x80, spdy_version_ch_, 0x00, // SYN Stream #1 | |
| 1369 0x01, 0x00, 0x00, 0x00, | |
| 1370 0x14, 0x00, 0x00, 0x00, | |
| 1371 0x01, 0x00, 0x00, 0x00, | |
| 1372 0x00, 0x00, 0x00, 0x00, | |
| 1373 0x01, 0x00, 0x02, 'h', | |
| 1374 'h', 0x00, 0x02, 'v', | |
| 1375 'v', | |
| 1376 | |
| 1377 0x80, spdy_version_ch_, 0x00, // SYN REPLY Stream #1 | |
| 1378 0x02, 0x01, 0x00, 0x00, | |
| 1379 0x10, 0x00, 0x00, 0x00, | |
| 1380 0x01, 0x00, 0x00, 0x00, | |
| 1381 0x01, 0x00, 0x02, 'a', | |
| 1382 'a', 0x00, 0x02, 'b', | |
| 1383 'b', | |
| 1384 }; | |
| 1385 const unsigned char kV3Input[] = { | 1252 const unsigned char kV3Input[] = { |
| 1386 0x80, spdy_version_ch_, 0x00, // SYN Stream #1 | 1253 0x80, spdy_version_ch_, 0x00, // SYN Stream #1 |
| 1387 0x01, 0x00, 0x00, 0x00, | 1254 0x01, 0x00, 0x00, 0x00, |
| 1388 0x1a, 0x00, 0x00, 0x00, | 1255 0x1a, 0x00, 0x00, 0x00, |
| 1389 0x01, 0x00, 0x00, 0x00, | 1256 0x01, 0x00, 0x00, 0x00, |
| 1390 0x00, 0x00, 0x00, 0x00, | 1257 0x00, 0x00, 0x00, 0x00, |
| 1391 0x00, 0x00, 0x01, 0x00, | 1258 0x00, 0x00, 0x01, 0x00, |
| 1392 0x00, 0x00, 0x02, 'h', | 1259 0x00, 0x00, 0x02, 'h', |
| 1393 'h', 0x00, 0x00, 0x00, | 1260 'h', 0x00, 0x00, 0x00, |
| 1394 0x02, 'v', 'v', | 1261 0x02, 'v', 'v', |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1410 0x24, 0x00, 0x00, 0x00, | 1277 0x24, 0x00, 0x00, 0x00, |
| 1411 0x01, 0x00, 0x00, 0x00, // Stream 1, Priority 0 | 1278 0x01, 0x00, 0x00, 0x00, // Stream 1, Priority 0 |
| 1412 0x00, 0x82, // :method: GET | 1279 0x00, 0x82, // :method: GET |
| 1413 | 1280 |
| 1414 0x00, 0x00, 0x01, 0x01, // HEADERS: FIN | END_HEADERS | 1281 0x00, 0x00, 0x01, 0x01, // HEADERS: FIN | END_HEADERS |
| 1415 0x05, 0x00, 0x00, 0x00, | 1282 0x05, 0x00, 0x00, 0x00, |
| 1416 0x01, 0x8c, // Stream 1, :status: 200 | 1283 0x01, 0x8c, // Stream 1, :status: 200 |
| 1417 }; | 1284 }; |
| 1418 | 1285 |
| 1419 TestSpdyVisitor visitor(spdy_version_); | 1286 TestSpdyVisitor visitor(spdy_version_); |
| 1420 if (IsSpdy2()) { | 1287 if (IsSpdy3()) { |
| 1421 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); | |
| 1422 } else if (IsSpdy3()) { | |
| 1423 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); | 1288 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); |
| 1424 } else { | 1289 } else { |
| 1425 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); | 1290 visitor.SimulateInFramer(kV4Input, sizeof(kV4Input)); |
| 1426 } | 1291 } |
| 1427 | 1292 |
| 1428 EXPECT_EQ(0, visitor.error_count_); | 1293 EXPECT_EQ(0, visitor.error_count_); |
| 1429 if (IsSpdy4()) { | 1294 if (IsSpdy4()) { |
| 1430 EXPECT_EQ(0, visitor.syn_frame_count_); | 1295 EXPECT_EQ(0, visitor.syn_frame_count_); |
| 1431 EXPECT_EQ(0, visitor.syn_reply_frame_count_); | 1296 EXPECT_EQ(0, visitor.syn_reply_frame_count_); |
| 1432 EXPECT_EQ(2, visitor.headers_frame_count_); | 1297 EXPECT_EQ(2, visitor.headers_frame_count_); |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1885 memset(expected_frame_data.get() + arraysize(kFrameHeader), 'A', kDataSize); | 1750 memset(expected_frame_data.get() + arraysize(kFrameHeader), 'A', kDataSize); |
| 1886 | 1751 |
| 1887 SpdyDataIR data_ir(1, StringPiece(kData.data(), kData.size())); | 1752 SpdyDataIR data_ir(1, StringPiece(kData.data(), kData.size())); |
| 1888 data_ir.set_fin(true); | 1753 data_ir.set_fin(true); |
| 1889 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); | 1754 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); |
| 1890 CompareFrame(kDescription, *frame, expected_frame_data.get(), kFrameSize); | 1755 CompareFrame(kDescription, *frame, expected_frame_data.get(), kFrameSize); |
| 1891 } | 1756 } |
| 1892 } | 1757 } |
| 1893 | 1758 |
| 1894 TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) { | 1759 TEST_P(SpdyFramerTest, CreateSynStreamUncompressed) { |
| 1895 if (!IsSpdy2() && !IsSpdy3()) { | 1760 if (spdy_version_ > SPDY3) { |
| 1896 // SYN_STREAM unsupported in SPDY>3 | 1761 // SYN_STREAM unsupported in SPDY>3 |
| 1897 return; | 1762 return; |
| 1898 } | 1763 } |
| 1899 SpdyFramer framer(spdy_version_); | 1764 SpdyFramer framer(spdy_version_); |
| 1900 framer.set_enable_compression(false); | 1765 framer.set_enable_compression(false); |
| 1901 | 1766 |
| 1902 { | 1767 { |
| 1903 const char kDescription[] = "SYN_STREAM frame, lowest pri, no FIN"; | 1768 const char kDescription[] = "SYN_STREAM frame, lowest pri, no FIN"; |
| 1904 | 1769 const unsigned char kPri = 0xE0; |
| 1905 const unsigned char kPri = IsSpdy2() ? 0xC0 : 0xE0; | |
| 1906 const unsigned char kV2FrameData[] = { | |
| 1907 0x80, spdy_version_ch_, 0x00, 0x01, | |
| 1908 0x00, 0x00, 0x00, 0x20, | |
| 1909 0x00, 0x00, 0x00, 0x01, | |
| 1910 0x00, 0x00, 0x00, 0x00, | |
| 1911 kPri, 0x00, 0x00, 0x02, | |
| 1912 0x00, 0x03, 'b', 'a', | |
| 1913 'r', 0x00, 0x03, 'f', | |
| 1914 'o', 'o', 0x00, 0x03, | |
| 1915 'f', 'o', 'o', 0x00, | |
| 1916 0x03, 'b', 'a', 'r' | |
| 1917 }; | |
| 1918 const unsigned char kV3FrameData[] = { | 1770 const unsigned char kV3FrameData[] = { |
| 1919 0x80, spdy_version_ch_, 0x00, 0x01, | 1771 0x80, spdy_version_ch_, 0x00, 0x01, |
| 1920 0x00, 0x00, 0x00, 0x2a, | 1772 0x00, 0x00, 0x00, 0x2a, |
| 1921 0x00, 0x00, 0x00, 0x01, | 1773 0x00, 0x00, 0x00, 0x01, |
| 1922 0x00, 0x00, 0x00, 0x00, | 1774 0x00, 0x00, 0x00, 0x00, |
| 1923 kPri, 0x00, 0x00, 0x00, | 1775 kPri, 0x00, 0x00, 0x00, |
| 1924 0x00, 0x02, 0x00, 0x00, | 1776 0x00, 0x02, 0x00, 0x00, |
| 1925 0x00, 0x03, 'b', 'a', | 1777 0x00, 0x03, 'b', 'a', |
| 1926 'r', 0x00, 0x00, 0x00, | 1778 'r', 0x00, 0x00, 0x00, |
| 1927 0x03, 'f', 'o', 'o', | 1779 0x03, 'f', 'o', 'o', |
| 1928 0x00, 0x00, 0x00, 0x03, | 1780 0x00, 0x00, 0x00, 0x03, |
| 1929 'f', 'o', 'o', 0x00, | 1781 'f', 'o', 'o', 0x00, |
| 1930 0x00, 0x00, 0x03, 'b', | 1782 0x00, 0x00, 0x03, 'b', |
| 1931 'a', 'r' | 1783 'a', 'r' |
| 1932 }; | 1784 }; |
| 1933 SpdySynStreamIR syn_stream(1); | 1785 SpdySynStreamIR syn_stream(1); |
| 1934 syn_stream.set_priority(framer.GetLowestPriority()); | 1786 syn_stream.set_priority(framer.GetLowestPriority()); |
| 1935 syn_stream.SetHeader("bar", "foo"); | 1787 syn_stream.SetHeader("bar", "foo"); |
| 1936 syn_stream.SetHeader("foo", "bar"); | 1788 syn_stream.SetHeader("foo", "bar"); |
| 1937 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); | 1789 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); |
| 1938 if (IsSpdy2()) { | 1790 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 1939 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 1940 } else if (IsSpdy3()) { | |
| 1941 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | |
| 1942 } else { | |
| 1943 LOG(FATAL) << "Unsupported version in test."; | |
| 1944 } | |
| 1945 } | 1791 } |
| 1946 | 1792 |
| 1947 { | 1793 { |
| 1948 const char kDescription[] = | 1794 const char kDescription[] = |
| 1949 "SYN_STREAM frame with a 0-length header name, highest pri, FIN, " | 1795 "SYN_STREAM frame with a 0-length header name, highest pri, FIN, " |
| 1950 "max stream ID"; | 1796 "max stream ID"; |
| 1951 | |
| 1952 const unsigned char kV2FrameData[] = { | |
| 1953 0x80, spdy_version_ch_, 0x00, 0x01, | |
| 1954 0x01, 0x00, 0x00, 0x1D, | |
| 1955 0x7f, 0xff, 0xff, 0xff, | |
| 1956 0x7f, 0xff, 0xff, 0xff, | |
| 1957 0x00, 0x00, 0x00, 0x02, | |
| 1958 0x00, 0x00, 0x00, 0x03, | |
| 1959 'f', 'o', 'o', 0x00, | |
| 1960 0x03, 'f', 'o', 'o', | |
| 1961 0x00, 0x03, 'b', 'a', | |
| 1962 'r' | |
| 1963 }; | |
| 1964 const unsigned char kV3FrameData[] = { | 1797 const unsigned char kV3FrameData[] = { |
| 1965 0x80, spdy_version_ch_, 0x00, 0x01, | 1798 0x80, spdy_version_ch_, 0x00, 0x01, |
| 1966 0x01, 0x00, 0x00, 0x27, | 1799 0x01, 0x00, 0x00, 0x27, |
| 1967 0x7f, 0xff, 0xff, 0xff, | 1800 0x7f, 0xff, 0xff, 0xff, |
| 1968 0x7f, 0xff, 0xff, 0xff, | 1801 0x7f, 0xff, 0xff, 0xff, |
| 1969 0x00, 0x00, 0x00, 0x00, | 1802 0x00, 0x00, 0x00, 0x00, |
| 1970 0x00, 0x02, 0x00, 0x00, | 1803 0x00, 0x02, 0x00, 0x00, |
| 1971 0x00, 0x00, 0x00, 0x00, | 1804 0x00, 0x00, 0x00, 0x00, |
| 1972 0x00, 0x03, 'f', 'o', | 1805 0x00, 0x03, 'f', 'o', |
| 1973 'o', 0x00, 0x00, 0x00, | 1806 'o', 0x00, 0x00, 0x00, |
| 1974 0x03, 'f', 'o', 'o', | 1807 0x03, 'f', 'o', 'o', |
| 1975 0x00, 0x00, 0x00, 0x03, | 1808 0x00, 0x00, 0x00, 0x03, |
| 1976 'b', 'a', 'r' | 1809 'b', 'a', 'r' |
| 1977 }; | 1810 }; |
| 1978 SpdySynStreamIR syn_stream(0x7fffffff); | 1811 SpdySynStreamIR syn_stream(0x7fffffff); |
| 1979 syn_stream.set_associated_to_stream_id(0x7fffffff); | 1812 syn_stream.set_associated_to_stream_id(0x7fffffff); |
| 1980 syn_stream.set_priority(framer.GetHighestPriority()); | 1813 syn_stream.set_priority(framer.GetHighestPriority()); |
| 1981 syn_stream.set_fin(true); | 1814 syn_stream.set_fin(true); |
| 1982 syn_stream.SetHeader("", "foo"); | 1815 syn_stream.SetHeader("", "foo"); |
| 1983 syn_stream.SetHeader("foo", "bar"); | 1816 syn_stream.SetHeader("foo", "bar"); |
| 1984 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); | 1817 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); |
| 1985 if (IsSpdy2()) { | 1818 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 1986 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 1987 } else if (IsSpdy3()) { | |
| 1988 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | |
| 1989 } else { | |
| 1990 LOG(FATAL) << "Unsupported version in test."; | |
| 1991 } | |
| 1992 } | 1819 } |
| 1993 | 1820 |
| 1994 { | 1821 { |
| 1995 const char kDescription[] = | 1822 const char kDescription[] = |
| 1996 "SYN_STREAM frame with a 0-length header val, high pri, FIN, " | 1823 "SYN_STREAM frame with a 0-length header val, high pri, FIN, " |
| 1997 "max stream ID"; | 1824 "max stream ID"; |
| 1998 | 1825 const unsigned char kPri = 0x20; |
| 1999 const unsigned char kPri = IsSpdy2() ? 0x40 : 0x20; | |
| 2000 const unsigned char kV2FrameData[] = { | |
| 2001 0x80, spdy_version_ch_, 0x00, 0x01, | |
| 2002 0x01, 0x00, 0x00, 0x1D, | |
| 2003 0x7f, 0xff, 0xff, 0xff, | |
| 2004 0x7f, 0xff, 0xff, 0xff, | |
| 2005 kPri, 0x00, 0x00, 0x02, | |
| 2006 0x00, 0x03, 'b', 'a', | |
| 2007 'r', 0x00, 0x03, 'f', | |
| 2008 'o', 'o', 0x00, 0x03, | |
| 2009 'f', 'o', 'o', 0x00, | |
| 2010 0x00 | |
| 2011 }; | |
| 2012 const unsigned char kV3FrameData[] = { | 1826 const unsigned char kV3FrameData[] = { |
| 2013 0x80, spdy_version_ch_, 0x00, 0x01, | 1827 0x80, spdy_version_ch_, 0x00, 0x01, |
| 2014 0x01, 0x00, 0x00, 0x27, | 1828 0x01, 0x00, 0x00, 0x27, |
| 2015 0x7f, 0xff, 0xff, 0xff, | 1829 0x7f, 0xff, 0xff, 0xff, |
| 2016 0x7f, 0xff, 0xff, 0xff, | 1830 0x7f, 0xff, 0xff, 0xff, |
| 2017 kPri, 0x00, 0x00, 0x00, | 1831 kPri, 0x00, 0x00, 0x00, |
| 2018 0x00, 0x02, 0x00, 0x00, | 1832 0x00, 0x02, 0x00, 0x00, |
| 2019 0x00, 0x03, 'b', 'a', | 1833 0x00, 0x03, 'b', 'a', |
| 2020 'r', 0x00, 0x00, 0x00, | 1834 'r', 0x00, 0x00, 0x00, |
| 2021 0x03, 'f', 'o', 'o', | 1835 0x03, 'f', 'o', 'o', |
| 2022 0x00, 0x00, 0x00, 0x03, | 1836 0x00, 0x00, 0x00, 0x03, |
| 2023 'f', 'o', 'o', 0x00, | 1837 'f', 'o', 'o', 0x00, |
| 2024 0x00, 0x00, 0x00 | 1838 0x00, 0x00, 0x00 |
| 2025 }; | 1839 }; |
| 2026 SpdySynStreamIR syn_stream(0x7fffffff); | 1840 SpdySynStreamIR syn_stream(0x7fffffff); |
| 2027 syn_stream.set_associated_to_stream_id(0x7fffffff); | 1841 syn_stream.set_associated_to_stream_id(0x7fffffff); |
| 2028 syn_stream.set_priority(1); | 1842 syn_stream.set_priority(1); |
| 2029 syn_stream.set_fin(true); | 1843 syn_stream.set_fin(true); |
| 2030 syn_stream.SetHeader("bar", "foo"); | 1844 syn_stream.SetHeader("bar", "foo"); |
| 2031 syn_stream.SetHeader("foo", ""); | 1845 syn_stream.SetHeader("foo", ""); |
| 2032 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); | 1846 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); |
| 2033 if (IsSpdy2()) { | 1847 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2034 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 2035 } else if (IsSpdy3()) { | |
| 2036 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | |
| 2037 } else { | |
| 2038 LOG(FATAL) << "Unsupported version in test."; | |
| 2039 } | |
| 2040 } | 1848 } |
| 2041 } | 1849 } |
| 2042 | 1850 |
| 2043 // TODO(phajdan.jr): Clean up after we no longer need | 1851 // TODO(phajdan.jr): Clean up after we no longer need |
| 2044 // to workaround http://crbug.com/139744. | 1852 // to workaround http://crbug.com/139744. |
| 2045 #if !defined(USE_SYSTEM_ZLIB) | 1853 #if !defined(USE_SYSTEM_ZLIB) |
| 2046 TEST_P(SpdyFramerTest, CreateSynStreamCompressed) { | 1854 TEST_P(SpdyFramerTest, CreateSynStreamCompressed) { |
| 2047 if (!IsSpdy2() && !IsSpdy3()) { | 1855 if (spdy_version_ > SPDY3) { |
| 2048 // SYN_STREAM not supported for SPDY>3 | 1856 // SYN_STREAM not supported for SPDY>3 |
| 2049 return; | 1857 return; |
| 2050 } | 1858 } |
| 2051 SpdyFramer framer(spdy_version_); | 1859 SpdyFramer framer(spdy_version_); |
| 2052 framer.set_enable_compression(true); | 1860 framer.set_enable_compression(true); |
| 2053 | 1861 |
| 2054 { | 1862 { |
| 2055 const char kDescription[] = | 1863 const char kDescription[] = |
| 2056 "SYN_STREAM frame, low pri, no FIN"; | 1864 "SYN_STREAM frame, low pri, no FIN"; |
| 2057 const SpdyPriority priority = IsSpdy2() ? 2 : 4; | 1865 const SpdyPriority priority = 4; |
| 2058 | 1866 |
| 2059 const unsigned char kV2FrameData[] = { | |
| 2060 0x80, spdy_version_ch_, 0x00, 0x01, | |
| 2061 0x00, 0x00, 0x00, 0x36, | |
| 2062 0x00, 0x00, 0x00, 0x01, | |
| 2063 0x00, 0x00, 0x00, 0x00, | |
| 2064 0x80, 0x00, 0x38, 0xea, | |
| 2065 0xdf, 0xa2, 0x51, 0xb2, | |
| 2066 0x62, 0x60, 0x62, 0x60, | |
| 2067 0x4e, 0x4a, 0x2c, 0x62, | |
| 2068 0x60, 0x06, 0x08, 0xa0, | |
| 2069 0xb4, 0xfc, 0x7c, 0x80, | |
| 2070 0x00, 0x62, 0x60, 0x4e, | |
| 2071 0xcb, 0xcf, 0x67, 0x60, | |
| 2072 0x06, 0x08, 0xa0, 0xa4, | |
| 2073 0xc4, 0x22, 0x80, 0x00, | |
| 2074 0x02, 0x00, 0x00, 0x00, | |
| 2075 0xff, 0xff, | |
| 2076 }; | |
| 2077 const unsigned char kV3FrameData[] = { | 1867 const unsigned char kV3FrameData[] = { |
| 2078 0x80, spdy_version_ch_, 0x00, 0x01, | 1868 0x80, spdy_version_ch_, 0x00, 0x01, |
| 2079 0x00, 0x00, 0x00, 0x37, | 1869 0x00, 0x00, 0x00, 0x37, |
| 2080 0x00, 0x00, 0x00, 0x01, | 1870 0x00, 0x00, 0x00, 0x01, |
| 2081 0x00, 0x00, 0x00, 0x00, | 1871 0x00, 0x00, 0x00, 0x00, |
| 2082 0x80, 0x00, 0x38, 0xEA, | 1872 0x80, 0x00, 0x38, 0xEA, |
| 2083 0xE3, 0xC6, 0xA7, 0xC2, | 1873 0xE3, 0xC6, 0xA7, 0xC2, |
| 2084 0x02, 0xE5, 0x0E, 0x50, | 1874 0x02, 0xE5, 0x0E, 0x50, |
| 2085 0xC2, 0x4B, 0x4A, 0x04, | 1875 0xC2, 0x4B, 0x4A, 0x04, |
| 2086 0xE5, 0x0B, 0x66, 0x80, | 1876 0xE5, 0x0B, 0x66, 0x80, |
| 2087 0x00, 0x4A, 0xCB, 0xCF, | 1877 0x00, 0x4A, 0xCB, 0xCF, |
| 2088 0x07, 0x08, 0x20, 0x10, | 1878 0x07, 0x08, 0x20, 0x10, |
| 2089 0x95, 0x96, 0x9F, 0x0F, | 1879 0x95, 0x96, 0x9F, 0x0F, |
| 2090 0xA2, 0x00, 0x02, 0x28, | 1880 0xA2, 0x00, 0x02, 0x28, |
| 2091 0x29, 0xB1, 0x08, 0x20, | 1881 0x29, 0xB1, 0x08, 0x20, |
| 2092 0x80, 0x00, 0x00, 0x00, | 1882 0x80, 0x00, 0x00, 0x00, |
| 2093 0x00, 0xFF, 0xFF, | 1883 0x00, 0xFF, 0xFF, |
| 2094 }; | 1884 }; |
| 2095 const unsigned char kV2SIMDFrameData[] = { | |
| 2096 0x80, spdy_version_ch_, 0x00, 0x01, | |
| 2097 0x00, 0x00, 0x00, 0x33, | |
| 2098 0x00, 0x00, 0x00, 0x01, | |
| 2099 0x00, 0x00, 0x00, 0x00, | |
| 2100 0x80, 0x00, 0x38, 0xea, | |
| 2101 0xdf, 0xa2, 0x51, 0xb2, | |
| 2102 0x62, 0x60, 0x62, 0x60, | |
| 2103 0x4e, 0x4a, 0x2c, 0x62, | |
| 2104 0x60, 0x06, 0x08, 0xa0, | |
| 2105 0xb4, 0xfc, 0x7c, 0x80, | |
| 2106 0x00, 0x62, 0x60, 0x06, | |
| 2107 0x13, 0x00, 0x01, 0x94, | |
| 2108 0x94, 0x58, 0x04, 0x10, | |
| 2109 0x40, 0x00, 0x00, 0x00, | |
| 2110 0x00, 0xff, 0xff, | |
| 2111 }; | |
| 2112 const unsigned char kV3SIMDFrameData[] = { | 1885 const unsigned char kV3SIMDFrameData[] = { |
| 2113 0x80, spdy_version_ch_, 0x00, 0x01, | 1886 0x80, spdy_version_ch_, 0x00, 0x01, |
| 2114 0x00, 0x00, 0x00, 0x32, | 1887 0x00, 0x00, 0x00, 0x32, |
| 2115 0x00, 0x00, 0x00, 0x01, | 1888 0x00, 0x00, 0x00, 0x01, |
| 2116 0x00, 0x00, 0x00, 0x00, | 1889 0x00, 0x00, 0x00, 0x00, |
| 2117 0x80, 0x00, 0x38, 0xea, | 1890 0x80, 0x00, 0x38, 0xea, |
| 2118 0xe3, 0xc6, 0xa7, 0xc2, | 1891 0xe3, 0xc6, 0xa7, 0xc2, |
| 2119 0x02, 0xe5, 0x0e, 0x50, | 1892 0x02, 0xe5, 0x0e, 0x50, |
| 2120 0xc2, 0x4b, 0x4a, 0x04, | 1893 0xc2, 0x4b, 0x4a, 0x04, |
| 2121 0xe5, 0x0b, 0x66, 0x80, | 1894 0xe5, 0x0b, 0x66, 0x80, |
| 2122 0x00, 0x4a, 0xcb, 0xcf, | 1895 0x00, 0x4a, 0xcb, 0xcf, |
| 2123 0x07, 0x08, 0x20, 0x24, | 1896 0x07, 0x08, 0x20, 0x24, |
| 2124 0x0a, 0x20, 0x80, 0x92, | 1897 0x0a, 0x20, 0x80, 0x92, |
| 2125 0x12, 0x8b, 0x00, 0x02, | 1898 0x12, 0x8b, 0x00, 0x02, |
| 2126 0x08, 0x00, 0x00, 0x00, | 1899 0x08, 0x00, 0x00, 0x00, |
| 2127 0xff, 0xff, | 1900 0xff, 0xff, |
| 2128 }; | 1901 }; |
| 2129 | 1902 |
| 2130 SpdySynStreamIR syn_stream(1); | 1903 SpdySynStreamIR syn_stream(1); |
| 2131 syn_stream.set_priority(priority); | 1904 syn_stream.set_priority(priority); |
| 2132 syn_stream.SetHeader("bar", "foo"); | 1905 syn_stream.SetHeader("bar", "foo"); |
| 2133 syn_stream.SetHeader("foo", "bar"); | 1906 syn_stream.SetHeader("foo", "bar"); |
| 2134 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); | 1907 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); |
| 2135 const unsigned char* frame_data = | 1908 const unsigned char* frame_data = |
| 2136 reinterpret_cast<const unsigned char*>(frame->data()); | 1909 reinterpret_cast<const unsigned char*>(frame->data()); |
| 2137 if (IsSpdy2()) { | 1910 if (memcmp(frame_data, |
| 2138 // Try comparing with SIMD version, if that fails, do a failing check | 1911 kV3SIMDFrameData, |
| 2139 // with pretty printing against non-SIMD version | 1912 std::min(arraysize(kV3SIMDFrameData), frame->size())) != 0) { |
| 2140 if (memcmp(frame_data, | 1913 CompareCharArraysWithHexError(kDescription, |
| 2141 kV2SIMDFrameData, | 1914 frame_data, |
| 2142 std::min(arraysize(kV2SIMDFrameData), frame->size())) != 0) { | 1915 frame->size(), |
| 2143 CompareCharArraysWithHexError(kDescription, | 1916 kV3FrameData, |
| 2144 frame_data, | 1917 arraysize(kV3FrameData)); |
| 2145 frame->size(), | |
| 2146 kV2FrameData, | |
| 2147 arraysize(kV2FrameData)); | |
| 2148 } | |
| 2149 } else if (IsSpdy3()) { | |
| 2150 if (memcmp(frame_data, | |
| 2151 kV3SIMDFrameData, | |
| 2152 std::min(arraysize(kV3SIMDFrameData), frame->size())) != 0) { | |
| 2153 CompareCharArraysWithHexError(kDescription, | |
| 2154 frame_data, | |
| 2155 frame->size(), | |
| 2156 kV3FrameData, | |
| 2157 arraysize(kV3FrameData)); | |
| 2158 } | |
| 2159 } else { | |
| 2160 LOG(FATAL) << "Unsupported version in test."; | |
| 2161 } | 1918 } |
| 2162 } | 1919 } |
| 2163 } | 1920 } |
| 2164 #endif // !defined(USE_SYSTEM_ZLIB) | 1921 #endif // !defined(USE_SYSTEM_ZLIB) |
| 2165 | 1922 |
| 2166 TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) { | 1923 TEST_P(SpdyFramerTest, CreateSynReplyUncompressed) { |
| 2167 if (spdy_version_ > SPDY3) { | 1924 if (spdy_version_ > SPDY3) { |
| 2168 // SYN_REPLY unsupported in SPDY>3 | 1925 // SYN_REPLY unsupported in SPDY>3 |
| 2169 return; | 1926 return; |
| 2170 } | 1927 } |
| 2171 SpdyFramer framer(spdy_version_); | 1928 SpdyFramer framer(spdy_version_); |
| 2172 framer.set_enable_compression(false); | 1929 framer.set_enable_compression(false); |
| 2173 | 1930 |
| 2174 { | 1931 { |
| 2175 const char kDescription[] = "SYN_REPLY frame, no FIN"; | 1932 const char kDescription[] = "SYN_REPLY frame, no FIN"; |
| 2176 | |
| 2177 const unsigned char kV2FrameData[] = { | |
| 2178 0x80, spdy_version_ch_, 0x00, 0x02, | |
| 2179 0x00, 0x00, 0x00, 0x1C, | |
| 2180 0x00, 0x00, 0x00, 0x01, | |
| 2181 0x00, 0x00, 0x00, 0x02, | |
| 2182 0x00, 0x03, 'b', 'a', | |
| 2183 'r', 0x00, 0x03, 'f', | |
| 2184 'o', 'o', 0x00, 0x03, | |
| 2185 'f', 'o', 'o', 0x00, | |
| 2186 0x03, 'b', 'a', 'r' | |
| 2187 }; | |
| 2188 const unsigned char kV3FrameData[] = { | 1933 const unsigned char kV3FrameData[] = { |
| 2189 0x80, spdy_version_ch_, 0x00, 0x02, | 1934 0x80, spdy_version_ch_, 0x00, 0x02, |
| 2190 0x00, 0x00, 0x00, 0x24, | 1935 0x00, 0x00, 0x00, 0x24, |
| 2191 0x00, 0x00, 0x00, 0x01, | 1936 0x00, 0x00, 0x00, 0x01, |
| 2192 0x00, 0x00, 0x00, 0x02, | 1937 0x00, 0x00, 0x00, 0x02, |
| 2193 0x00, 0x00, 0x00, 0x03, | 1938 0x00, 0x00, 0x00, 0x03, |
| 2194 'b', 'a', 'r', 0x00, | 1939 'b', 'a', 'r', 0x00, |
| 2195 0x00, 0x00, 0x03, 'f', | 1940 0x00, 0x00, 0x03, 'f', |
| 2196 'o', 'o', 0x00, 0x00, | 1941 'o', 'o', 0x00, 0x00, |
| 2197 0x00, 0x03, 'f', 'o', | 1942 0x00, 0x03, 'f', 'o', |
| 2198 'o', 0x00, 0x00, 0x00, | 1943 'o', 0x00, 0x00, 0x00, |
| 2199 0x03, 'b', 'a', 'r' | 1944 0x03, 'b', 'a', 'r' |
| 2200 }; | 1945 }; |
| 2201 SpdySynReplyIR syn_reply(1); | 1946 SpdySynReplyIR syn_reply(1); |
| 2202 syn_reply.SetHeader("bar", "foo"); | 1947 syn_reply.SetHeader("bar", "foo"); |
| 2203 syn_reply.SetHeader("foo", "bar"); | 1948 syn_reply.SetHeader("foo", "bar"); |
| 2204 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); | 1949 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); |
| 2205 if (IsSpdy2()) { | 1950 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2206 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 2207 } else if (IsSpdy3()) { | |
| 2208 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | |
| 2209 } else { | |
| 2210 LOG(FATAL) << "Unsupported version in test."; | |
| 2211 } | |
| 2212 } | 1951 } |
| 2213 | 1952 |
| 2214 { | 1953 { |
| 2215 const char kDescription[] = | 1954 const char kDescription[] = |
| 2216 "SYN_REPLY frame with a 0-length header name, FIN, max stream ID"; | 1955 "SYN_REPLY frame with a 0-length header name, FIN, max stream ID"; |
| 2217 | |
| 2218 const unsigned char kV2FrameData[] = { | |
| 2219 0x80, spdy_version_ch_, 0x00, 0x02, | |
| 2220 0x01, 0x00, 0x00, 0x19, | |
| 2221 0x7f, 0xff, 0xff, 0xff, | |
| 2222 0x00, 0x00, 0x00, 0x02, | |
| 2223 0x00, 0x00, 0x00, 0x03, | |
| 2224 'f', 'o', 'o', 0x00, | |
| 2225 0x03, 'f', 'o', 'o', | |
| 2226 0x00, 0x03, 'b', 'a', | |
| 2227 'r' | |
| 2228 }; | |
| 2229 const unsigned char kV3FrameData[] = { | 1956 const unsigned char kV3FrameData[] = { |
| 2230 0x80, spdy_version_ch_, 0x00, 0x02, | 1957 0x80, spdy_version_ch_, 0x00, 0x02, |
| 2231 0x01, 0x00, 0x00, 0x21, | 1958 0x01, 0x00, 0x00, 0x21, |
| 2232 0x7f, 0xff, 0xff, 0xff, | 1959 0x7f, 0xff, 0xff, 0xff, |
| 2233 0x00, 0x00, 0x00, 0x02, | 1960 0x00, 0x00, 0x00, 0x02, |
| 2234 0x00, 0x00, 0x00, 0x00, | 1961 0x00, 0x00, 0x00, 0x00, |
| 2235 0x00, 0x00, 0x00, 0x03, | 1962 0x00, 0x00, 0x00, 0x03, |
| 2236 'f', 'o', 'o', 0x00, | 1963 'f', 'o', 'o', 0x00, |
| 2237 0x00, 0x00, 0x03, 'f', | 1964 0x00, 0x00, 0x03, 'f', |
| 2238 'o', 'o', 0x00, 0x00, | 1965 'o', 'o', 0x00, 0x00, |
| 2239 0x00, 0x03, 'b', 'a', | 1966 0x00, 0x03, 'b', 'a', |
| 2240 'r' | 1967 'r' |
| 2241 }; | 1968 }; |
| 2242 SpdySynReplyIR syn_reply(0x7fffffff); | 1969 SpdySynReplyIR syn_reply(0x7fffffff); |
| 2243 syn_reply.set_fin(true); | 1970 syn_reply.set_fin(true); |
| 2244 syn_reply.SetHeader("", "foo"); | 1971 syn_reply.SetHeader("", "foo"); |
| 2245 syn_reply.SetHeader("foo", "bar"); | 1972 syn_reply.SetHeader("foo", "bar"); |
| 2246 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); | 1973 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); |
| 2247 if (IsSpdy2()) { | 1974 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2248 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 2249 } else if (IsSpdy3()) { | |
| 2250 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | |
| 2251 } else { | |
| 2252 LOG(FATAL) << "Unsupported version in test."; | |
| 2253 } | |
| 2254 } | 1975 } |
| 2255 | 1976 |
| 2256 { | 1977 { |
| 2257 const char kDescription[] = | 1978 const char kDescription[] = |
| 2258 "SYN_REPLY frame with a 0-length header val, FIN, max stream ID"; | 1979 "SYN_REPLY frame with a 0-length header val, FIN, max stream ID"; |
| 2259 | |
| 2260 const unsigned char kV2FrameData[] = { | |
| 2261 0x80, spdy_version_ch_, 0x00, 0x02, | |
| 2262 0x01, 0x00, 0x00, 0x19, | |
| 2263 0x7f, 0xff, 0xff, 0xff, | |
| 2264 0x00, 0x00, 0x00, 0x02, | |
| 2265 0x00, 0x03, 'b', 'a', | |
| 2266 'r', 0x00, 0x03, 'f', | |
| 2267 'o', 'o', 0x00, 0x03, | |
| 2268 'f', 'o', 'o', 0x00, | |
| 2269 0x00 | |
| 2270 }; | |
| 2271 const unsigned char kV3FrameData[] = { | 1980 const unsigned char kV3FrameData[] = { |
| 2272 0x80, spdy_version_ch_, 0x00, 0x02, | 1981 0x80, spdy_version_ch_, 0x00, 0x02, |
| 2273 0x01, 0x00, 0x00, 0x21, | 1982 0x01, 0x00, 0x00, 0x21, |
| 2274 0x7f, 0xff, 0xff, 0xff, | 1983 0x7f, 0xff, 0xff, 0xff, |
| 2275 0x00, 0x00, 0x00, 0x02, | 1984 0x00, 0x00, 0x00, 0x02, |
| 2276 0x00, 0x00, 0x00, 0x03, | 1985 0x00, 0x00, 0x00, 0x03, |
| 2277 'b', 'a', 'r', 0x00, | 1986 'b', 'a', 'r', 0x00, |
| 2278 0x00, 0x00, 0x03, 'f', | 1987 0x00, 0x00, 0x03, 'f', |
| 2279 'o', 'o', 0x00, 0x00, | 1988 'o', 'o', 0x00, 0x00, |
| 2280 0x00, 0x03, 'f', 'o', | 1989 0x00, 0x03, 'f', 'o', |
| 2281 'o', 0x00, 0x00, 0x00, | 1990 'o', 0x00, 0x00, 0x00, |
| 2282 0x00 | 1991 0x00 |
| 2283 }; | 1992 }; |
| 2284 SpdySynReplyIR syn_reply(0x7fffffff); | 1993 SpdySynReplyIR syn_reply(0x7fffffff); |
| 2285 syn_reply.set_fin(true); | 1994 syn_reply.set_fin(true); |
| 2286 syn_reply.SetHeader("bar", "foo"); | 1995 syn_reply.SetHeader("bar", "foo"); |
| 2287 syn_reply.SetHeader("foo", ""); | 1996 syn_reply.SetHeader("foo", ""); |
| 2288 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); | 1997 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); |
| 2289 if (IsSpdy2()) { | 1998 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2290 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 2291 } else if (IsSpdy3()) { | |
| 2292 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | |
| 2293 } else { | |
| 2294 LOG(FATAL) << "Unsupported version in test."; | |
| 2295 } | |
| 2296 } | 1999 } |
| 2297 } | 2000 } |
| 2298 | 2001 |
| 2299 // TODO(phajdan.jr): Clean up after we no longer need | 2002 // TODO(phajdan.jr): Clean up after we no longer need |
| 2300 // to workaround http://crbug.com/139744. | 2003 // to workaround http://crbug.com/139744. |
| 2301 #if !defined(USE_SYSTEM_ZLIB) | 2004 #if !defined(USE_SYSTEM_ZLIB) |
| 2302 TEST_P(SpdyFramerTest, CreateSynReplyCompressed) { | 2005 TEST_P(SpdyFramerTest, CreateSynReplyCompressed) { |
| 2303 if (spdy_version_ > SPDY3) { | 2006 if (spdy_version_ > SPDY3) { |
| 2304 // SYN_REPLY unsupported in SPDY>3 | 2007 // SYN_REPLY unsupported in SPDY>3 |
| 2305 return; | 2008 return; |
| 2306 } | 2009 } |
| 2307 SpdyFramer framer(spdy_version_); | 2010 SpdyFramer framer(spdy_version_); |
| 2308 framer.set_enable_compression(true); | 2011 framer.set_enable_compression(true); |
| 2309 | 2012 |
| 2310 { | 2013 { |
| 2311 const char kDescription[] = "SYN_REPLY frame, no FIN"; | 2014 const char kDescription[] = "SYN_REPLY frame, no FIN"; |
| 2312 | |
| 2313 const unsigned char kV2FrameData[] = { | |
| 2314 0x80, spdy_version_ch_, 0x00, 0x02, | |
| 2315 0x00, 0x00, 0x00, 0x32, | |
| 2316 0x00, 0x00, 0x00, 0x01, | |
| 2317 0x00, 0x00, 0x38, 0xea, | |
| 2318 0xdf, 0xa2, 0x51, 0xb2, | |
| 2319 0x62, 0x60, 0x62, 0x60, | |
| 2320 0x4e, 0x4a, 0x2c, 0x62, | |
| 2321 0x60, 0x06, 0x08, 0xa0, | |
| 2322 0xb4, 0xfc, 0x7c, 0x80, | |
| 2323 0x00, 0x62, 0x60, 0x4e, | |
| 2324 0xcb, 0xcf, 0x67, 0x60, | |
| 2325 0x06, 0x08, 0xa0, 0xa4, | |
| 2326 0xc4, 0x22, 0x80, 0x00, | |
| 2327 0x02, 0x00, 0x00, 0x00, | |
| 2328 0xff, 0xff, | |
| 2329 }; | |
| 2330 const unsigned char kV3FrameData[] = { | 2015 const unsigned char kV3FrameData[] = { |
| 2331 0x80, spdy_version_ch_, 0x00, 0x02, | 2016 0x80, spdy_version_ch_, 0x00, 0x02, |
| 2332 0x00, 0x00, 0x00, 0x31, | 2017 0x00, 0x00, 0x00, 0x31, |
| 2333 0x00, 0x00, 0x00, 0x01, | 2018 0x00, 0x00, 0x00, 0x01, |
| 2334 0x38, 0xea, 0xe3, 0xc6, | 2019 0x38, 0xea, 0xe3, 0xc6, |
| 2335 0xa7, 0xc2, 0x02, 0xe5, | 2020 0xa7, 0xc2, 0x02, 0xe5, |
| 2336 0x0e, 0x50, 0xc2, 0x4b, | 2021 0x0e, 0x50, 0xc2, 0x4b, |
| 2337 0x4a, 0x04, 0xe5, 0x0b, | 2022 0x4a, 0x04, 0xe5, 0x0b, |
| 2338 0x66, 0x80, 0x00, 0x4a, | 2023 0x66, 0x80, 0x00, 0x4a, |
| 2339 0xcb, 0xcf, 0x07, 0x08, | 2024 0xcb, 0xcf, 0x07, 0x08, |
| 2340 0x20, 0x10, 0x95, 0x96, | 2025 0x20, 0x10, 0x95, 0x96, |
| 2341 0x9f, 0x0f, 0xa2, 0x00, | 2026 0x9f, 0x0f, 0xa2, 0x00, |
| 2342 0x02, 0x28, 0x29, 0xb1, | 2027 0x02, 0x28, 0x29, 0xb1, |
| 2343 0x08, 0x20, 0x80, 0x00, | 2028 0x08, 0x20, 0x80, 0x00, |
| 2344 0x00, 0x00, 0x00, 0xff, | 2029 0x00, 0x00, 0x00, 0xff, |
| 2345 0xff, | 2030 0xff, |
| 2346 }; | 2031 }; |
| 2347 const unsigned char kV2SIMDFrameData[] = { | |
| 2348 0x80, spdy_version_ch_, 0x00, 0x02, | |
| 2349 0x00, 0x00, 0x00, 0x2f, | |
| 2350 0x00, 0x00, 0x00, 0x01, | |
| 2351 0x00, 0x00, 0x38, 0xea, | |
| 2352 0xdf, 0xa2, 0x51, 0xb2, | |
| 2353 0x62, 0x60, 0x62, 0x60, | |
| 2354 0x4e, 0x4a, 0x2c, 0x62, | |
| 2355 0x60, 0x06, 0x08, 0xa0, | |
| 2356 0xb4, 0xfc, 0x7c, 0x80, | |
| 2357 0x00, 0x62, 0x60, 0x06, | |
| 2358 0x13, 0x00, 0x01, 0x94, | |
| 2359 0x94, 0x58, 0x04, 0x10, | |
| 2360 0x40, 0x00, 0x00, 0x00, | |
| 2361 0x00, 0xff, 0xff, | |
| 2362 }; | |
| 2363 const unsigned char kV3SIMDFrameData[] = { | 2032 const unsigned char kV3SIMDFrameData[] = { |
| 2364 0x80, spdy_version_ch_, 0x00, 0x02, | 2033 0x80, spdy_version_ch_, 0x00, 0x02, |
| 2365 0x00, 0x00, 0x00, 0x2c, | 2034 0x00, 0x00, 0x00, 0x2c, |
| 2366 0x00, 0x00, 0x00, 0x01, | 2035 0x00, 0x00, 0x00, 0x01, |
| 2367 0x38, 0xea, 0xe3, 0xc6, | 2036 0x38, 0xea, 0xe3, 0xc6, |
| 2368 0xa7, 0xc2, 0x02, 0xe5, | 2037 0xa7, 0xc2, 0x02, 0xe5, |
| 2369 0x0e, 0x50, 0xc2, 0x4b, | 2038 0x0e, 0x50, 0xc2, 0x4b, |
| 2370 0x4a, 0x04, 0xe5, 0x0b, | 2039 0x4a, 0x04, 0xe5, 0x0b, |
| 2371 0x66, 0x80, 0x00, 0x4a, | 2040 0x66, 0x80, 0x00, 0x4a, |
| 2372 0xcb, 0xcf, 0x07, 0x08, | 2041 0xcb, 0xcf, 0x07, 0x08, |
| 2373 0x20, 0x24, 0x0a, 0x20, | 2042 0x20, 0x24, 0x0a, 0x20, |
| 2374 0x80, 0x92, 0x12, 0x8b, | 2043 0x80, 0x92, 0x12, 0x8b, |
| 2375 0x00, 0x02, 0x08, 0x00, | 2044 0x00, 0x02, 0x08, 0x00, |
| 2376 0x00, 0x00, 0xff, 0xff, | 2045 0x00, 0x00, 0xff, 0xff, |
| 2377 }; | 2046 }; |
| 2378 | 2047 |
| 2379 SpdySynReplyIR syn_reply(1); | 2048 SpdySynReplyIR syn_reply(1); |
| 2380 syn_reply.SetHeader("bar", "foo"); | 2049 syn_reply.SetHeader("bar", "foo"); |
| 2381 syn_reply.SetHeader("foo", "bar"); | 2050 syn_reply.SetHeader("foo", "bar"); |
| 2382 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); | 2051 scoped_ptr<SpdyFrame> frame(framer.SerializeSynReply(syn_reply)); |
| 2383 const unsigned char* frame_data = | 2052 const unsigned char* frame_data = |
| 2384 reinterpret_cast<const unsigned char*>(frame->data()); | 2053 reinterpret_cast<const unsigned char*>(frame->data()); |
| 2385 if (IsSpdy2()) { | 2054 if (memcmp(frame_data, |
| 2386 // Try comparing with SIMD version, if that fails, do a failing check | 2055 kV3SIMDFrameData, |
| 2387 // with pretty printing against non-SIMD version | 2056 std::min(arraysize(kV3SIMDFrameData), frame->size())) != 0) { |
| 2388 if (memcmp(frame_data, | 2057 CompareCharArraysWithHexError(kDescription, |
| 2389 kV2SIMDFrameData, | 2058 frame_data, |
| 2390 std::min(arraysize(kV2SIMDFrameData), frame->size())) != 0) { | 2059 frame->size(), |
| 2391 CompareCharArraysWithHexError(kDescription, | 2060 kV3FrameData, |
| 2392 frame_data, | 2061 arraysize(kV3FrameData)); |
| 2393 frame->size(), | |
| 2394 kV2FrameData, | |
| 2395 arraysize(kV2FrameData)); | |
| 2396 } | |
| 2397 } else if (IsSpdy3()) { | |
| 2398 if (memcmp(frame_data, | |
| 2399 kV3SIMDFrameData, | |
| 2400 std::min(arraysize(kV3SIMDFrameData), frame->size())) != 0) { | |
| 2401 CompareCharArraysWithHexError(kDescription, | |
| 2402 frame_data, | |
| 2403 frame->size(), | |
| 2404 kV3FrameData, | |
| 2405 arraysize(kV3FrameData)); | |
| 2406 } | |
| 2407 } else { | |
| 2408 LOG(FATAL) << "Unsupported version in test."; | |
| 2409 } | 2062 } |
| 2410 } | 2063 } |
| 2411 } | 2064 } |
| 2412 #endif // !defined(USE_SYSTEM_ZLIB) | 2065 #endif // !defined(USE_SYSTEM_ZLIB) |
| 2413 | 2066 |
| 2414 TEST_P(SpdyFramerTest, CreateRstStream) { | 2067 TEST_P(SpdyFramerTest, CreateRstStream) { |
| 2415 SpdyFramer framer(spdy_version_); | 2068 SpdyFramer framer(spdy_version_); |
| 2416 | 2069 |
| 2417 { | 2070 { |
| 2418 const char kDescription[] = "RST_STREAM frame"; | 2071 const char kDescription[] = "RST_STREAM frame"; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2486 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2139 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2487 } | 2140 } |
| 2488 } | 2141 } |
| 2489 } | 2142 } |
| 2490 | 2143 |
| 2491 TEST_P(SpdyFramerTest, CreateSettings) { | 2144 TEST_P(SpdyFramerTest, CreateSettings) { |
| 2492 SpdyFramer framer(spdy_version_); | 2145 SpdyFramer framer(spdy_version_); |
| 2493 | 2146 |
| 2494 { | 2147 { |
| 2495 const char kDescription[] = "Network byte order SETTINGS frame"; | 2148 const char kDescription[] = "Network byte order SETTINGS frame"; |
| 2496 | |
| 2497 const unsigned char kV2FrameData[] = { | |
| 2498 0x80, spdy_version_ch_, 0x00, 0x04, | |
| 2499 0x00, 0x00, 0x00, 0x0c, | |
| 2500 0x00, 0x00, 0x00, 0x01, | |
| 2501 0x07, 0x00, 0x00, 0x01, | |
| 2502 0x0a, 0x0b, 0x0c, 0x0d, | |
| 2503 }; | |
| 2504 const unsigned char kV3FrameData[] = { | 2149 const unsigned char kV3FrameData[] = { |
| 2505 0x80, spdy_version_ch_, 0x00, 0x04, | 2150 0x80, spdy_version_ch_, 0x00, 0x04, |
| 2506 0x00, 0x00, 0x00, 0x0c, | 2151 0x00, 0x00, 0x00, 0x0c, |
| 2507 0x00, 0x00, 0x00, 0x01, | 2152 0x00, 0x00, 0x00, 0x01, |
| 2508 0x01, 0x00, 0x00, 0x07, | 2153 0x01, 0x00, 0x00, 0x07, |
| 2509 0x0a, 0x0b, 0x0c, 0x0d, | 2154 0x0a, 0x0b, 0x0c, 0x0d, |
| 2510 }; | 2155 }; |
| 2511 const unsigned char kV4FrameData[] = { | 2156 const unsigned char kV4FrameData[] = { |
| 2512 0x00, 0x00, 0x06, 0x04, | 2157 0x00, 0x00, 0x06, 0x04, |
| 2513 0x00, 0x00, 0x00, 0x00, | 2158 0x00, 0x00, 0x00, 0x00, |
| 2514 0x00, 0x00, 0x04, 0x0a, | 2159 0x00, 0x00, 0x04, 0x0a, |
| 2515 0x0b, 0x0c, 0x0d, | 2160 0x0b, 0x0c, 0x0d, |
| 2516 }; | 2161 }; |
| 2517 | 2162 |
| 2518 uint32 kValue = 0x0a0b0c0d; | 2163 uint32 kValue = 0x0a0b0c0d; |
| 2519 SpdySettingsIR settings_ir; | 2164 SpdySettingsIR settings_ir; |
| 2520 | 2165 |
| 2521 SpdySettingsFlags kFlags = static_cast<SpdySettingsFlags>(0x01); | 2166 SpdySettingsFlags kFlags = static_cast<SpdySettingsFlags>(0x01); |
| 2522 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE; | 2167 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE; |
| 2523 SettingsMap settings; | 2168 SettingsMap settings; |
| 2524 settings[kId] = SettingsFlagsAndValue(kFlags, kValue); | 2169 settings[kId] = SettingsFlagsAndValue(kFlags, kValue); |
| 2525 EXPECT_EQ(kFlags, settings[kId].first); | 2170 EXPECT_EQ(kFlags, settings[kId].first); |
| 2526 EXPECT_EQ(kValue, settings[kId].second); | 2171 EXPECT_EQ(kValue, settings[kId].second); |
| 2527 settings_ir.AddSetting(kId, | 2172 settings_ir.AddSetting(kId, |
| 2528 kFlags & SETTINGS_FLAG_PLEASE_PERSIST, | 2173 kFlags & SETTINGS_FLAG_PLEASE_PERSIST, |
| 2529 kFlags & SETTINGS_FLAG_PERSISTED, | 2174 kFlags & SETTINGS_FLAG_PERSISTED, |
| 2530 kValue); | 2175 kValue); |
| 2531 | 2176 |
| 2532 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); | 2177 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); |
| 2533 if (IsSpdy2()) { | 2178 if (IsSpdy3()) { |
| 2534 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 2535 } else if (IsSpdy3()) { | |
| 2536 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2179 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2537 } else { | 2180 } else { |
| 2538 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2181 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
| 2539 } | 2182 } |
| 2540 } | 2183 } |
| 2541 | 2184 |
| 2542 { | 2185 { |
| 2543 const char kDescription[] = "Basic SETTINGS frame"; | 2186 const char kDescription[] = "Basic SETTINGS frame"; |
| 2544 | |
| 2545 const unsigned char kV2FrameData[] = { | |
| 2546 0x80, spdy_version_ch_, 0x00, 0x04, | |
| 2547 0x00, 0x00, 0x00, 0x24, | |
| 2548 0x00, 0x00, 0x00, 0x04, | |
| 2549 0x01, 0x00, 0x00, 0x00, // 1st Setting | |
| 2550 0x00, 0x00, 0x00, 0x05, | |
| 2551 0x02, 0x00, 0x00, 0x00, // 2nd Setting | |
| 2552 0x00, 0x00, 0x00, 0x06, | |
| 2553 0x03, 0x00, 0x00, 0x00, // 3rd Setting | |
| 2554 0x00, 0x00, 0x00, 0x07, | |
| 2555 0x04, 0x00, 0x00, 0x00, // 4th Setting | |
| 2556 0x00, 0x00, 0x00, 0x08, | |
| 2557 }; | |
| 2558 const unsigned char kV3FrameData[] = { | 2187 const unsigned char kV3FrameData[] = { |
| 2559 0x80, spdy_version_ch_, 0x00, 0x04, | 2188 0x80, spdy_version_ch_, 0x00, 0x04, |
| 2560 0x00, 0x00, 0x00, 0x24, | 2189 0x00, 0x00, 0x00, 0x24, |
| 2561 0x00, 0x00, 0x00, 0x04, | 2190 0x00, 0x00, 0x00, 0x04, |
| 2562 0x00, 0x00, 0x00, 0x01, // 1st Setting | 2191 0x00, 0x00, 0x00, 0x01, // 1st Setting |
| 2563 0x00, 0x00, 0x00, 0x05, | 2192 0x00, 0x00, 0x00, 0x05, |
| 2564 0x00, 0x00, 0x00, 0x02, // 2nd Setting | 2193 0x00, 0x00, 0x00, 0x02, // 2nd Setting |
| 2565 0x00, 0x00, 0x00, 0x06, | 2194 0x00, 0x00, 0x00, 0x06, |
| 2566 0x00, 0x00, 0x00, 0x03, // 3rd Setting | 2195 0x00, 0x00, 0x00, 0x03, // 3rd Setting |
| 2567 0x00, 0x00, 0x00, 0x07, | 2196 0x00, 0x00, 0x00, 0x07, |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 2596 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 3), | 2225 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 3), |
| 2597 false, // persist | 2226 false, // persist |
| 2598 false, // persisted | 2227 false, // persisted |
| 2599 7); | 2228 7); |
| 2600 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 4), | 2229 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 4), |
| 2601 false, // persist | 2230 false, // persist |
| 2602 false, // persisted | 2231 false, // persisted |
| 2603 8); | 2232 8); |
| 2604 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); | 2233 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); |
| 2605 | 2234 |
| 2606 if (IsSpdy2()) { | 2235 if (IsSpdy3()) { |
| 2607 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 2608 } else if (IsSpdy3()) { | |
| 2609 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2236 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2610 } else { | 2237 } else { |
| 2611 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2238 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
| 2612 } | 2239 } |
| 2613 } | 2240 } |
| 2614 | 2241 |
| 2615 { | 2242 { |
| 2616 const char kDescription[] = "Empty SETTINGS frame"; | 2243 const char kDescription[] = "Empty SETTINGS frame"; |
| 2617 | |
| 2618 const unsigned char kV3FrameData[] = { // Also applies for V2. | 2244 const unsigned char kV3FrameData[] = { // Also applies for V2. |
| 2619 0x80, spdy_version_ch_, 0x00, 0x04, | 2245 0x80, spdy_version_ch_, 0x00, 0x04, |
| 2620 0x00, 0x00, 0x00, 0x04, | 2246 0x00, 0x00, 0x00, 0x04, |
| 2621 0x00, 0x00, 0x00, 0x00, | 2247 0x00, 0x00, 0x00, 0x00, |
| 2622 }; | 2248 }; |
| 2623 const unsigned char kV4FrameData[] = { | 2249 const unsigned char kV4FrameData[] = { |
| 2624 0x00, 0x00, 0x00, 0x04, | 2250 0x00, 0x00, 0x00, 0x04, |
| 2625 0x00, 0x00, 0x00, 0x00, | 2251 0x00, 0x00, 0x00, 0x00, |
| 2626 0x00, | 2252 0x00, |
| 2627 }; | 2253 }; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2679 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2305 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2680 } | 2306 } |
| 2681 } | 2307 } |
| 2682 } | 2308 } |
| 2683 | 2309 |
| 2684 TEST_P(SpdyFramerTest, CreateGoAway) { | 2310 TEST_P(SpdyFramerTest, CreateGoAway) { |
| 2685 SpdyFramer framer(spdy_version_); | 2311 SpdyFramer framer(spdy_version_); |
| 2686 | 2312 |
| 2687 { | 2313 { |
| 2688 const char kDescription[] = "GOAWAY frame"; | 2314 const char kDescription[] = "GOAWAY frame"; |
| 2689 const unsigned char kV2FrameData[] = { | |
| 2690 0x80, spdy_version_ch_, 0x00, 0x07, | |
| 2691 0x00, 0x00, 0x00, 0x04, | |
| 2692 0x00, 0x00, 0x00, 0x00, // Stream Id | |
| 2693 }; | |
| 2694 const unsigned char kV3FrameData[] = { | 2315 const unsigned char kV3FrameData[] = { |
| 2695 0x80, spdy_version_ch_, 0x00, 0x07, | 2316 0x80, spdy_version_ch_, 0x00, 0x07, |
| 2696 0x00, 0x00, 0x00, 0x08, | 2317 0x00, 0x00, 0x00, 0x08, |
| 2697 0x00, 0x00, 0x00, 0x00, // Stream Id | 2318 0x00, 0x00, 0x00, 0x00, // Stream Id |
| 2698 0x00, 0x00, 0x00, 0x00, // Status | 2319 0x00, 0x00, 0x00, 0x00, // Status |
| 2699 }; | 2320 }; |
| 2700 const unsigned char kV4FrameData[] = { | 2321 const unsigned char kV4FrameData[] = { |
| 2701 0x00, 0x00, 0x0a, 0x07, | 2322 0x00, 0x00, 0x0a, 0x07, |
| 2702 0x00, 0x00, 0x00, 0x00, | 2323 0x00, 0x00, 0x00, 0x00, |
| 2703 0x00, 0x00, 0x00, 0x00, // Stream id | 2324 0x00, 0x00, 0x00, 0x00, // Stream id |
| 2704 0x00, 0x00, 0x00, 0x00, // Status | 2325 0x00, 0x00, 0x00, 0x00, // Status |
| 2705 0x00, 0x47, 0x41, // Opaque Description | 2326 0x00, 0x47, 0x41, // Opaque Description |
| 2706 }; | 2327 }; |
| 2707 SpdyGoAwayIR goaway_ir(0, GOAWAY_OK, "GA"); | 2328 SpdyGoAwayIR goaway_ir(0, GOAWAY_OK, "GA"); |
| 2708 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); | 2329 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); |
| 2709 if (IsSpdy2()) { | 2330 if (IsSpdy3()) { |
| 2710 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 2711 } else if (IsSpdy3()) { | |
| 2712 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2331 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2713 } else { | 2332 } else { |
| 2714 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2333 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
| 2715 } | 2334 } |
| 2716 } | 2335 } |
| 2717 | 2336 |
| 2718 { | 2337 { |
| 2719 const char kDescription[] = "GOAWAY frame with max stream ID, status"; | 2338 const char kDescription[] = "GOAWAY frame with max stream ID, status"; |
| 2720 const unsigned char kV2FrameData[] = { | |
| 2721 0x80, spdy_version_ch_, 0x00, 0x07, | |
| 2722 0x00, 0x00, 0x00, 0x04, | |
| 2723 0x7f, 0xff, 0xff, 0xff, // Stream Id | |
| 2724 }; | |
| 2725 const unsigned char kV3FrameData[] = { | 2339 const unsigned char kV3FrameData[] = { |
| 2726 0x80, spdy_version_ch_, 0x00, 0x07, | 2340 0x80, spdy_version_ch_, 0x00, 0x07, |
| 2727 0x00, 0x00, 0x00, 0x08, | 2341 0x00, 0x00, 0x00, 0x08, |
| 2728 0x7f, 0xff, 0xff, 0xff, // Stream Id | 2342 0x7f, 0xff, 0xff, 0xff, // Stream Id |
| 2729 0x00, 0x00, 0x00, 0x01, // Status: PROTOCOL_ERROR. | 2343 0x00, 0x00, 0x00, 0x01, // Status: PROTOCOL_ERROR. |
| 2730 }; | 2344 }; |
| 2731 const unsigned char kV4FrameData[] = { | 2345 const unsigned char kV4FrameData[] = { |
| 2732 0x00, 0x00, 0x0a, 0x07, | 2346 0x00, 0x00, 0x0a, 0x07, |
| 2733 0x00, 0x00, 0x00, 0x00, | 2347 0x00, 0x00, 0x00, 0x00, |
| 2734 0x00, 0x7f, 0xff, 0xff, // Stream Id | 2348 0x00, 0x7f, 0xff, 0xff, // Stream Id |
| 2735 0xff, 0x00, 0x00, 0x00, // Status: INTERNAL_ERROR. | 2349 0xff, 0x00, 0x00, 0x00, // Status: INTERNAL_ERROR. |
| 2736 0x02, 0x47, 0x41, // Opaque Description | 2350 0x02, 0x47, 0x41, // Opaque Description |
| 2737 }; | 2351 }; |
| 2738 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, GOAWAY_INTERNAL_ERROR, "GA"); | 2352 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, GOAWAY_INTERNAL_ERROR, "GA"); |
| 2739 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); | 2353 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); |
| 2740 if (IsSpdy2()) { | 2354 if (IsSpdy3()) { |
| 2741 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 2742 } else if (IsSpdy3()) { | |
| 2743 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2355 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2744 } else { | 2356 } else { |
| 2745 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2357 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
| 2746 } | 2358 } |
| 2747 } | 2359 } |
| 2748 } | 2360 } |
| 2749 | 2361 |
| 2750 TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { | 2362 TEST_P(SpdyFramerTest, CreateHeadersUncompressed) { |
| 2751 SpdyFramer framer(spdy_version_); | 2363 SpdyFramer framer(spdy_version_); |
| 2752 framer.set_enable_compression(false); | 2364 framer.set_enable_compression(false); |
| 2753 | 2365 |
| 2754 { | 2366 { |
| 2755 const char kDescription[] = "HEADERS frame, no FIN"; | 2367 const char kDescription[] = "HEADERS frame, no FIN"; |
| 2756 | |
| 2757 const unsigned char kV2FrameData[] = { | |
| 2758 0x80, spdy_version_ch_, 0x00, 0x08, | |
| 2759 0x00, 0x00, 0x00, 0x1C, | |
| 2760 0x00, 0x00, 0x00, 0x01, | |
| 2761 0x00, 0x00, 0x00, 0x02, | |
| 2762 0x00, 0x03, 'b', 'a', | |
| 2763 'r', 0x00, 0x03, 'f', | |
| 2764 'o', 'o', 0x00, 0x03, | |
| 2765 'f', 'o', 'o', 0x00, | |
| 2766 0x03, 'b', 'a', 'r' | |
| 2767 }; | |
| 2768 const unsigned char kV3FrameData[] = { | 2368 const unsigned char kV3FrameData[] = { |
| 2769 0x80, spdy_version_ch_, 0x00, 0x08, | 2369 0x80, spdy_version_ch_, 0x00, 0x08, |
| 2770 0x00, 0x00, 0x00, 0x24, | 2370 0x00, 0x00, 0x00, 0x24, |
| 2771 0x00, 0x00, 0x00, 0x01, | 2371 0x00, 0x00, 0x00, 0x01, |
| 2772 0x00, 0x00, 0x00, 0x02, | 2372 0x00, 0x00, 0x00, 0x02, |
| 2773 0x00, 0x00, 0x00, 0x03, | 2373 0x00, 0x00, 0x00, 0x03, |
| 2774 'b', 'a', 'r', 0x00, | 2374 'b', 'a', 'r', 0x00, |
| 2775 0x00, 0x00, 0x03, 'f', | 2375 0x00, 0x00, 0x03, 'f', |
| 2776 'o', 'o', 0x00, 0x00, | 2376 'o', 'o', 0x00, 0x00, |
| 2777 0x00, 0x03, 'f', 'o', | 2377 0x00, 0x03, 'f', 'o', |
| 2778 'o', 0x00, 0x00, 0x00, | 2378 'o', 0x00, 0x00, 0x00, |
| 2779 0x03, 'b', 'a', 'r' | 2379 0x03, 'b', 'a', 'r' |
| 2780 }; | 2380 }; |
| 2781 const unsigned char kV4FrameData[] = { | 2381 const unsigned char kV4FrameData[] = { |
| 2782 0x00, 0x00, 0x12, 0x01, // Headers: END_HEADERS | 2382 0x00, 0x00, 0x12, 0x01, // Headers: END_HEADERS |
| 2783 0x04, 0x00, 0x00, 0x00, // Stream 1 | 2383 0x04, 0x00, 0x00, 0x00, // Stream 1 |
| 2784 0x01, 0x00, 0x03, 0x62, // @.ba | 2384 0x01, 0x00, 0x03, 0x62, // @.ba |
| 2785 0x61, 0x72, 0x03, 0x66, // r.fo | 2385 0x61, 0x72, 0x03, 0x66, // r.fo |
| 2786 0x6f, 0x6f, 0x00, 0x03, // o@.f | 2386 0x6f, 0x6f, 0x00, 0x03, // o@.f |
| 2787 0x66, 0x6f, 0x6f, 0x03, // oo.b | 2387 0x66, 0x6f, 0x6f, 0x03, // oo.b |
| 2788 0x62, 0x61, 0x72, // ar | 2388 0x62, 0x61, 0x72, // ar |
| 2789 }; | 2389 }; |
| 2790 SpdyHeadersIR headers_ir(1); | 2390 SpdyHeadersIR headers_ir(1); |
| 2791 headers_ir.SetHeader("bar", "foo"); | 2391 headers_ir.SetHeader("bar", "foo"); |
| 2792 headers_ir.SetHeader("foo", "bar"); | 2392 headers_ir.SetHeader("foo", "bar"); |
| 2793 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); | 2393 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); |
| 2794 if (IsSpdy2()) { | 2394 if (IsSpdy3()) { |
| 2795 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 2796 } else if (IsSpdy3()) { | |
| 2797 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2395 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2798 } else { | 2396 } else { |
| 2799 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2397 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
| 2800 } | 2398 } |
| 2801 } | 2399 } |
| 2802 | 2400 |
| 2803 { | 2401 { |
| 2804 const char kDescription[] = | 2402 const char kDescription[] = |
| 2805 "HEADERS frame with a 0-length header name, FIN, max stream ID"; | 2403 "HEADERS frame with a 0-length header name, FIN, max stream ID"; |
| 2806 | |
| 2807 const unsigned char kV2FrameData[] = { | |
| 2808 0x80, spdy_version_ch_, 0x00, 0x08, | |
| 2809 0x01, 0x00, 0x00, 0x19, | |
| 2810 0x7f, 0xff, 0xff, 0xff, | |
| 2811 0x00, 0x00, 0x00, 0x02, | |
| 2812 0x00, 0x00, 0x00, 0x03, | |
| 2813 'f', 'o', 'o', 0x00, | |
| 2814 0x03, 'f', 'o', 'o', | |
| 2815 0x00, 0x03, 'b', 'a', | |
| 2816 'r' | |
| 2817 }; | |
| 2818 const unsigned char kV3FrameData[] = { | 2404 const unsigned char kV3FrameData[] = { |
| 2819 0x80, spdy_version_ch_, 0x00, 0x08, | 2405 0x80, spdy_version_ch_, 0x00, 0x08, |
| 2820 0x01, 0x00, 0x00, 0x21, | 2406 0x01, 0x00, 0x00, 0x21, |
| 2821 0x7f, 0xff, 0xff, 0xff, | 2407 0x7f, 0xff, 0xff, 0xff, |
| 2822 0x00, 0x00, 0x00, 0x02, | 2408 0x00, 0x00, 0x00, 0x02, |
| 2823 0x00, 0x00, 0x00, 0x00, | 2409 0x00, 0x00, 0x00, 0x00, |
| 2824 0x00, 0x00, 0x00, 0x03, | 2410 0x00, 0x00, 0x00, 0x03, |
| 2825 'f', 'o', 'o', 0x00, | 2411 'f', 'o', 'o', 0x00, |
| 2826 0x00, 0x00, 0x03, 'f', | 2412 0x00, 0x00, 0x03, 'f', |
| 2827 'o', 'o', 0x00, 0x00, | 2413 'o', 'o', 0x00, 0x00, |
| 2828 0x00, 0x03, 'b', 'a', | 2414 0x00, 0x03, 'b', 'a', |
| 2829 'r' | 2415 'r' |
| 2830 }; | 2416 }; |
| 2831 const unsigned char kV4FrameData[] = { | 2417 const unsigned char kV4FrameData[] = { |
| 2832 0x00, 0x00, 0x0f, 0x01, // Headers: FIN | END_HEADERS | 2418 0x00, 0x00, 0x0f, 0x01, // Headers: FIN | END_HEADERS |
| 2833 0x05, 0x7f, 0xff, 0xff, // Stream 0x7fffffff | 2419 0x05, 0x7f, 0xff, 0xff, // Stream 0x7fffffff |
| 2834 0xff, 0x00, 0x00, 0x03, // @.. | 2420 0xff, 0x00, 0x00, 0x03, // @.. |
| 2835 0x66, 0x6f, 0x6f, 0x00, // foo@ | 2421 0x66, 0x6f, 0x6f, 0x00, // foo@ |
| 2836 0x03, 0x66, 0x6f, 0x6f, // .foo | 2422 0x03, 0x66, 0x6f, 0x6f, // .foo |
| 2837 0x03, 0x62, 0x61, 0x72, // .bar | 2423 0x03, 0x62, 0x61, 0x72, // .bar |
| 2838 }; | 2424 }; |
| 2839 SpdyHeadersIR headers_ir(0x7fffffff); | 2425 SpdyHeadersIR headers_ir(0x7fffffff); |
| 2840 headers_ir.set_fin(true); | 2426 headers_ir.set_fin(true); |
| 2841 headers_ir.SetHeader("", "foo"); | 2427 headers_ir.SetHeader("", "foo"); |
| 2842 headers_ir.SetHeader("foo", "bar"); | 2428 headers_ir.SetHeader("foo", "bar"); |
| 2843 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); | 2429 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); |
| 2844 if (IsSpdy2()) { | 2430 if (IsSpdy3()) { |
| 2845 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 2846 } else if (IsSpdy3()) { | |
| 2847 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2431 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2848 } else { | 2432 } else { |
| 2849 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2433 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
| 2850 } | 2434 } |
| 2851 } | 2435 } |
| 2852 | 2436 |
| 2853 { | 2437 { |
| 2854 const char kDescription[] = | 2438 const char kDescription[] = |
| 2855 "HEADERS frame with a 0-length header val, FIN, max stream ID"; | 2439 "HEADERS frame with a 0-length header val, FIN, max stream ID"; |
| 2856 | |
| 2857 const unsigned char kV2FrameData[] = { | |
| 2858 0x80, spdy_version_ch_, 0x00, 0x08, | |
| 2859 0x01, 0x00, 0x00, 0x19, | |
| 2860 0x7f, 0xff, 0xff, 0xff, | |
| 2861 0x00, 0x00, 0x00, 0x02, | |
| 2862 0x00, 0x03, 'b', 'a', | |
| 2863 'r', 0x00, 0x03, 'f', | |
| 2864 'o', 'o', 0x00, 0x03, | |
| 2865 'f', 'o', 'o', 0x00, | |
| 2866 0x00 | |
| 2867 }; | |
| 2868 const unsigned char kV3FrameData[] = { | 2440 const unsigned char kV3FrameData[] = { |
| 2869 0x80, spdy_version_ch_, 0x00, 0x08, | 2441 0x80, spdy_version_ch_, 0x00, 0x08, |
| 2870 0x01, 0x00, 0x00, 0x21, | 2442 0x01, 0x00, 0x00, 0x21, |
| 2871 0x7f, 0xff, 0xff, 0xff, | 2443 0x7f, 0xff, 0xff, 0xff, |
| 2872 0x00, 0x00, 0x00, 0x02, | 2444 0x00, 0x00, 0x00, 0x02, |
| 2873 0x00, 0x00, 0x00, 0x03, | 2445 0x00, 0x00, 0x00, 0x03, |
| 2874 'b', 'a', 'r', 0x00, | 2446 'b', 'a', 'r', 0x00, |
| 2875 0x00, 0x00, 0x03, 'f', | 2447 0x00, 0x00, 0x03, 'f', |
| 2876 'o', 'o', 0x00, 0x00, | 2448 'o', 'o', 0x00, 0x00, |
| 2877 0x00, 0x03, 'f', 'o', | 2449 0x00, 0x03, 'f', 'o', |
| 2878 'o', 0x00, 0x00, 0x00, | 2450 'o', 0x00, 0x00, 0x00, |
| 2879 0x00 | 2451 0x00 |
| 2880 }; | 2452 }; |
| 2881 const unsigned char kV4FrameData[] = { | 2453 const unsigned char kV4FrameData[] = { |
| 2882 0x00, 0x00, 0x0f, 0x01, // Headers: FIN | END_HEADERS | 2454 0x00, 0x00, 0x0f, 0x01, // Headers: FIN | END_HEADERS |
| 2883 0x05, 0x7f, 0xff, 0xff, // Stream 0x7fffffff | 2455 0x05, 0x7f, 0xff, 0xff, // Stream 0x7fffffff |
| 2884 0xff, 0x00, 0x03, 0x62, // @.b | 2456 0xff, 0x00, 0x03, 0x62, // @.b |
| 2885 0x61, 0x72, 0x03, 0x66, // ar.f | 2457 0x61, 0x72, 0x03, 0x66, // ar.f |
| 2886 0x6f, 0x6f, 0x00, 0x03, // oo@. | 2458 0x6f, 0x6f, 0x00, 0x03, // oo@. |
| 2887 0x66, 0x6f, 0x6f, 0x00, // foo. | 2459 0x66, 0x6f, 0x6f, 0x00, // foo. |
| 2888 }; | 2460 }; |
| 2889 SpdyHeadersIR headers_ir(0x7fffffff); | 2461 SpdyHeadersIR headers_ir(0x7fffffff); |
| 2890 headers_ir.set_fin(true); | 2462 headers_ir.set_fin(true); |
| 2891 headers_ir.SetHeader("bar", "foo"); | 2463 headers_ir.SetHeader("bar", "foo"); |
| 2892 headers_ir.SetHeader("foo", ""); | 2464 headers_ir.SetHeader("foo", ""); |
| 2893 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); | 2465 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); |
| 2894 if (IsSpdy2()) { | 2466 if (IsSpdy3()) { |
| 2895 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); | |
| 2896 } else if (IsSpdy3()) { | |
| 2897 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); | 2467 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); |
| 2898 } else { | 2468 } else { |
| 2899 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2469 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
| 2900 } | 2470 } |
| 2901 } | 2471 } |
| 2902 | 2472 |
| 2903 { | 2473 { |
| 2904 const char kDescription[] = | 2474 const char kDescription[] = |
| 2905 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri"; | 2475 "HEADERS frame with a 0-length header val, FIN, max stream ID, pri"; |
| 2906 | |
| 2907 const unsigned char kV4FrameData[] = { | 2476 const unsigned char kV4FrameData[] = { |
| 2908 0x00, 0x00, 0x14, 0x01, // Headers: FIN | END_HEADERS | PRIORITY | 2477 0x00, 0x00, 0x14, 0x01, // Headers: FIN | END_HEADERS | PRIORITY |
| 2909 0x25, 0x7f, 0xff, 0xff, // Stream 0x7fffffff | 2478 0x25, 0x7f, 0xff, 0xff, // Stream 0x7fffffff |
| 2910 0xff, 0x00, 0x00, 0x00, // parent stream | 2479 0xff, 0x00, 0x00, 0x00, // parent stream |
| 2911 0x00, 0xdb, // weight | 2480 0x00, 0xdb, // weight |
| 2912 0x00, 0x03, 0x62, 0x61, // @.ba | 2481 0x00, 0x03, 0x62, 0x61, // @.ba |
| 2913 0x72, 0x03, 0x66, 0x6f, // r.fo | 2482 0x72, 0x03, 0x66, 0x6f, // r.fo |
| 2914 0x6f, 0x00, 0x03, 0x66, // o@.f | 2483 0x6f, 0x00, 0x03, 0x66, // o@.f |
| 2915 0x6f, 0x6f, 0x00, // oo. | 2484 0x6f, 0x6f, 0x00, // oo. |
| 2916 }; | 2485 }; |
| 2917 SpdyHeadersIR headers_ir(0x7fffffff); | 2486 SpdyHeadersIR headers_ir(0x7fffffff); |
| 2918 headers_ir.set_fin(true); | 2487 headers_ir.set_fin(true); |
| 2919 headers_ir.set_priority(1); | 2488 headers_ir.set_priority(1); |
| 2920 headers_ir.set_has_priority(true); | 2489 headers_ir.set_has_priority(true); |
| 2921 headers_ir.SetHeader("bar", "foo"); | 2490 headers_ir.SetHeader("bar", "foo"); |
| 2922 headers_ir.SetHeader("foo", ""); | 2491 headers_ir.SetHeader("foo", ""); |
| 2923 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); | 2492 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); |
| 2924 if (IsSpdy2() || IsSpdy3()) { | 2493 if (spdy_version_ > SPDY3) { |
| 2925 // HEADERS with priority not supported. | 2494 // HEADERS with priority only supported in SPDY>3. |
| 2926 } else { | |
| 2927 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2495 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
| 2928 } | 2496 } |
| 2929 } | 2497 } |
| 2930 | 2498 |
| 2931 { | 2499 { |
| 2932 const char kDescription[] = | 2500 const char kDescription[] = |
| 2933 "HEADERS frame with a 0-length header name, FIN, max stream ID, padded"; | 2501 "HEADERS frame with a 0-length header name, FIN, max stream ID, padded"; |
| 2934 | |
| 2935 const unsigned char kV4FrameData[] = { | 2502 const unsigned char kV4FrameData[] = { |
| 2936 0x00, 0x00, 0x15, 0x01, // Headers | 2503 0x00, 0x00, 0x15, 0x01, // Headers |
| 2937 0x0d, 0x7f, 0xff, 0xff, // FIN | END_HEADERS | PADDED, Stream | 2504 0x0d, 0x7f, 0xff, 0xff, // FIN | END_HEADERS | PADDED, Stream |
| 2938 // 0x7fffffff | 2505 // 0x7fffffff |
| 2939 0xff, 0x05, 0x00, 0x00, // Pad length field | 2506 0xff, 0x05, 0x00, 0x00, // Pad length field |
| 2940 0x03, 0x66, 0x6f, 0x6f, // .foo | 2507 0x03, 0x66, 0x6f, 0x6f, // .foo |
| 2941 0x00, 0x03, 0x66, 0x6f, // @.fo | 2508 0x00, 0x03, 0x66, 0x6f, // @.fo |
| 2942 0x6f, 0x03, 0x62, 0x61, // o.ba | 2509 0x6f, 0x03, 0x62, 0x61, // o.ba |
| 2943 0x72, // r | 2510 0x72, // r |
| 2944 // Padding payload | 2511 // Padding payload |
| 2945 0x00, 0x00, 0x00, 0x00, 0x00, | 2512 0x00, 0x00, 0x00, 0x00, 0x00, |
| 2946 }; | 2513 }; |
| 2947 SpdyHeadersIR headers_ir(0x7fffffff); | 2514 SpdyHeadersIR headers_ir(0x7fffffff); |
| 2948 headers_ir.set_fin(true); | 2515 headers_ir.set_fin(true); |
| 2949 headers_ir.SetHeader("", "foo"); | 2516 headers_ir.SetHeader("", "foo"); |
| 2950 headers_ir.SetHeader("foo", "bar"); | 2517 headers_ir.SetHeader("foo", "bar"); |
| 2951 headers_ir.set_padding_len(6); | 2518 headers_ir.set_padding_len(6); |
| 2952 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); | 2519 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); |
| 2953 if (IsSpdy2() || IsSpdy3()) { | 2520 if (spdy_version_ > SPDY3) { |
| 2954 // Padding is not supported. | 2521 // Padding only supported in SPDY>3. |
| 2955 } else { | |
| 2956 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); | 2522 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); |
| 2957 } | 2523 } |
| 2958 } | 2524 } |
| 2959 } | 2525 } |
| 2960 | 2526 |
| 2961 // TODO(phajdan.jr): Clean up after we no longer need | 2527 // TODO(phajdan.jr): Clean up after we no longer need |
| 2962 // to workaround http://crbug.com/139744. | 2528 // to workaround http://crbug.com/139744. |
| 2963 #if !defined(USE_SYSTEM_ZLIB) | 2529 #if !defined(USE_SYSTEM_ZLIB) |
| 2964 TEST_P(SpdyFramerTest, CreateHeadersCompressed) { | 2530 TEST_P(SpdyFramerTest, CreateHeadersCompressed) { |
| 2531 if (spdy_version_ > SPDY3) { | |
| 2532 // Deflate compression doesn't apply to HPACK. | |
| 2533 return; | |
| 2534 } | |
| 2965 SpdyFramer framer(spdy_version_); | 2535 SpdyFramer framer(spdy_version_); |
| 2966 framer.set_enable_compression(true); | 2536 framer.set_enable_compression(true); |
| 2967 | 2537 |
| 2968 { | 2538 { |
| 2969 const char kDescription[] = "HEADERS frame, no FIN"; | 2539 const char kDescription[] = "HEADERS frame, no FIN"; |
| 2970 | |
| 2971 const unsigned char kV2FrameData[] = { | |
| 2972 0x80, spdy_version_ch_, 0x00, 0x08, | |
| 2973 0x00, 0x00, 0x00, 0x32, | |
| 2974 0x00, 0x00, 0x00, 0x01, | |
| 2975 0x00, 0x00, 0x38, 0xea, | |
| 2976 0xdf, 0xa2, 0x51, 0xb2, | |
| 2977 0x62, 0x60, 0x62, 0x60, | |
| 2978 0x4e, 0x4a, 0x2c, 0x62, | |
| 2979 0x60, 0x06, 0x08, 0xa0, | |
| 2980 0xb4, 0xfc, 0x7c, 0x80, | |
| 2981 0x00, 0x62, 0x60, 0x4e, | |
| 2982 0xcb, 0xcf, 0x67, 0x60, | |
| 2983 0x06, 0x08, 0xa0, 0xa4, | |
| 2984 0xc4, 0x22, 0x80, 0x00, | |
| 2985 0x02, 0x00, 0x00, 0x00, | |
| 2986 0xff, 0xff, | |
| 2987 }; | |
| 2988 const unsigned char kV3FrameData[] = { | 2540 const unsigned char kV3FrameData[] = { |
| 2989 0x80, spdy_version_ch_, 0x00, 0x08, | 2541 0x80, spdy_version_ch_, 0x00, 0x08, |
| 2990 0x00, 0x00, 0x00, 0x31, | 2542 0x00, 0x00, 0x00, 0x31, |
| 2991 0x00, 0x00, 0x00, 0x01, | 2543 0x00, 0x00, 0x00, 0x01, |
| 2992 0x38, 0xea, 0xe3, 0xc6, | 2544 0x38, 0xea, 0xe3, 0xc6, |
| 2993 0xa7, 0xc2, 0x02, 0xe5, | 2545 0xa7, 0xc2, 0x02, 0xe5, |
| 2994 0x0e, 0x50, 0xc2, 0x4b, | 2546 0x0e, 0x50, 0xc2, 0x4b, |
| 2995 0x4a, 0x04, 0xe5, 0x0b, | 2547 0x4a, 0x04, 0xe5, 0x0b, |
| 2996 0x66, 0x80, 0x00, 0x4a, | 2548 0x66, 0x80, 0x00, 0x4a, |
| 2997 0xcb, 0xcf, 0x07, 0x08, | 2549 0xcb, 0xcf, 0x07, 0x08, |
| 2998 0x20, 0x10, 0x95, 0x96, | 2550 0x20, 0x10, 0x95, 0x96, |
| 2999 0x9f, 0x0f, 0xa2, 0x00, | 2551 0x9f, 0x0f, 0xa2, 0x00, |
| 3000 0x02, 0x28, 0x29, 0xb1, | 2552 0x02, 0x28, 0x29, 0xb1, |
| 3001 0x08, 0x20, 0x80, 0x00, | 2553 0x08, 0x20, 0x80, 0x00, |
| 3002 0x00, 0x00, 0x00, 0xff, | 2554 0x00, 0x00, 0x00, 0xff, |
| 3003 0xff, | 2555 0xff, |
| 3004 }; | 2556 }; |
| 3005 const unsigned char kV2SIMDFrameData[] = { | |
| 3006 0x80, spdy_version_ch_, 0x00, 0x08, | |
| 3007 0x00, 0x00, 0x00, 0x2f, | |
| 3008 0x00, 0x00, 0x00, 0x01, | |
| 3009 0x00, 0x00, 0x38, 0xea, | |
| 3010 0xdf, 0xa2, 0x51, 0xb2, | |
| 3011 0x62, 0x60, 0x62, 0x60, | |
| 3012 0x4e, 0x4a, 0x2c, 0x62, | |
| 3013 0x60, 0x06, 0x08, 0xa0, | |
| 3014 0xb4, 0xfc, 0x7c, 0x80, | |
| 3015 0x00, 0x62, 0x60, 0x06, | |
| 3016 0x13, 0x00, 0x01, 0x94, | |
| 3017 0x94, 0x58, 0x04, 0x10, | |
| 3018 0x40, 0x00, 0x00, 0x00, | |
| 3019 0x00, 0xff, 0xff, | |
| 3020 }; | |
| 3021 const unsigned char kV3SIMDFrameData[] = { | 2557 const unsigned char kV3SIMDFrameData[] = { |
| 3022 0x80, spdy_version_ch_, 0x00, 0x08, | 2558 0x80, spdy_version_ch_, 0x00, 0x08, |
| 3023 0x00, 0x00, 0x00, 0x2c, | 2559 0x00, 0x00, 0x00, 0x2c, |
| 3024 0x00, 0x00, 0x00, 0x01, | 2560 0x00, 0x00, 0x00, 0x01, |
| 3025 0x38, 0xea, 0xe3, 0xc6, | 2561 0x38, 0xea, 0xe3, 0xc6, |
| 3026 0xa7, 0xc2, 0x02, 0xe5, | 2562 0xa7, 0xc2, 0x02, 0xe5, |
| 3027 0x0e, 0x50, 0xc2, 0x4b, | 2563 0x0e, 0x50, 0xc2, 0x4b, |
| 3028 0x4a, 0x04, 0xe5, 0x0b, | 2564 0x4a, 0x04, 0xe5, 0x0b, |
| 3029 0x66, 0x80, 0x00, 0x4a, | 2565 0x66, 0x80, 0x00, 0x4a, |
| 3030 0xcb, 0xcf, 0x07, 0x08, | 2566 0xcb, 0xcf, 0x07, 0x08, |
| 3031 0x20, 0x24, 0x0a, 0x20, | 2567 0x20, 0x24, 0x0a, 0x20, |
| 3032 0x80, 0x92, 0x12, 0x8b, | 2568 0x80, 0x92, 0x12, 0x8b, |
| 3033 0x00, 0x02, 0x08, 0x00, | 2569 0x00, 0x02, 0x08, 0x00, |
| 3034 0x00, 0x00, 0xff, 0xff, | 2570 0x00, 0x00, 0xff, 0xff, |
| 3035 }; | 2571 }; |
| 3036 | 2572 |
| 3037 SpdyHeadersIR headers_ir(1); | 2573 SpdyHeadersIR headers_ir(1); |
| 3038 headers_ir.SetHeader("bar", "foo"); | 2574 headers_ir.SetHeader("bar", "foo"); |
| 3039 headers_ir.SetHeader("foo", "bar"); | 2575 headers_ir.SetHeader("foo", "bar"); |
| 3040 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); | 2576 scoped_ptr<SpdyFrame> frame(framer.SerializeHeaders(headers_ir)); |
| 3041 const unsigned char* frame_data = | 2577 const unsigned char* frame_data = |
| 3042 reinterpret_cast<const unsigned char*>(frame->data()); | 2578 reinterpret_cast<const unsigned char*>(frame->data()); |
| 3043 if (IsSpdy2()) { | 2579 if (memcmp(frame_data, |
| 3044 // Try comparing with SIMD version, if that fails, do a failing check | 2580 kV3SIMDFrameData, |
| 3045 // with pretty printing against non-SIMD version | 2581 std::min(arraysize(kV3SIMDFrameData), frame->size())) != 0) { |
| 3046 if (memcmp(frame_data, | 2582 CompareCharArraysWithHexError(kDescription, |
| 3047 kV2SIMDFrameData, | 2583 frame_data, |
| 3048 std::min(arraysize(kV2SIMDFrameData), frame->size())) != 0) { | 2584 frame->size(), |
| 3049 CompareCharArraysWithHexError(kDescription, | 2585 kV3FrameData, |
| 3050 frame_data, | 2586 arraysize(kV3FrameData)); |
| 3051 frame->size(), | |
| 3052 kV2FrameData, | |
| 3053 arraysize(kV2FrameData)); | |
| 3054 } | |
| 3055 } else if (IsSpdy3()) { | |
| 3056 if (memcmp(frame_data, | |
| 3057 kV3SIMDFrameData, | |
| 3058 std::min(arraysize(kV3SIMDFrameData), frame->size())) != 0) { | |
| 3059 CompareCharArraysWithHexError(kDescription, | |
| 3060 frame_data, | |
| 3061 frame->size(), | |
| 3062 kV3FrameData, | |
| 3063 arraysize(kV3FrameData)); | |
| 3064 } | |
| 3065 } else { | |
| 3066 // Deflate compression doesn't apply to HPACK. | |
| 3067 } | 2587 } |
| 3068 } | 2588 } |
| 3069 } | 2589 } |
| 3070 #endif // !defined(USE_SYSTEM_ZLIB) | 2590 #endif // !defined(USE_SYSTEM_ZLIB) |
| 3071 | 2591 |
| 3072 TEST_P(SpdyFramerTest, CreateWindowUpdate) { | 2592 TEST_P(SpdyFramerTest, CreateWindowUpdate) { |
| 3073 SpdyFramer framer(spdy_version_); | 2593 SpdyFramer framer(spdy_version_); |
| 3074 | 2594 |
| 3075 { | 2595 { |
| 3076 const char kDescription[] = "WINDOW_UPDATE frame"; | 2596 const char kDescription[] = "WINDOW_UPDATE frame"; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3183 TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { | 2703 TEST_P(SpdyFramerTest, CreatePushPromiseUncompressed) { |
| 3184 if (spdy_version_ <= SPDY3) { | 2704 if (spdy_version_ <= SPDY3) { |
| 3185 return; | 2705 return; |
| 3186 } | 2706 } |
| 3187 | 2707 |
| 3188 { | 2708 { |
| 3189 // Test framing PUSH_PROMISE without padding. | 2709 // Test framing PUSH_PROMISE without padding. |
| 3190 SpdyFramer framer(spdy_version_); | 2710 SpdyFramer framer(spdy_version_); |
| 3191 framer.set_enable_compression(false); | 2711 framer.set_enable_compression(false); |
| 3192 const char kDescription[] = "PUSH_PROMISE frame without padding"; | 2712 const char kDescription[] = "PUSH_PROMISE frame without padding"; |
| 3193 | |
| 3194 const unsigned char kFrameData[] = { | 2713 const unsigned char kFrameData[] = { |
| 3195 0x00, 0x00, 0x16, 0x05, // PUSH_PROMISE | 2714 0x00, 0x00, 0x16, 0x05, // PUSH_PROMISE |
| 3196 0x04, 0x00, 0x00, 0x00, // END_HEADERS | 2715 0x04, 0x00, 0x00, 0x00, // END_HEADERS |
| 3197 0x2a, 0x00, 0x00, 0x00, // Stream 42 | 2716 0x2a, 0x00, 0x00, 0x00, // Stream 42 |
| 3198 0x39, 0x00, 0x03, 0x62, // Promised stream 57, @.b | 2717 0x39, 0x00, 0x03, 0x62, // Promised stream 57, @.b |
| 3199 0x61, 0x72, 0x03, 0x66, // ar.f | 2718 0x61, 0x72, 0x03, 0x66, // ar.f |
| 3200 0x6f, 0x6f, 0x00, 0x03, // oo@. | 2719 0x6f, 0x6f, 0x00, 0x03, // oo@. |
| 3201 0x66, 0x6f, 0x6f, 0x03, // foo. | 2720 0x66, 0x6f, 0x6f, 0x03, // foo. |
| 3202 0x62, 0x61, 0x72, // bar | 2721 0x62, 0x61, 0x72, // bar |
| 3203 }; | 2722 }; |
| 3204 | 2723 |
| 3205 SpdyPushPromiseIR push_promise(42, 57); | 2724 SpdyPushPromiseIR push_promise(42, 57); |
| 3206 push_promise.SetHeader("bar", "foo"); | 2725 push_promise.SetHeader("bar", "foo"); |
| 3207 push_promise.SetHeader("foo", "bar"); | 2726 push_promise.SetHeader("foo", "bar"); |
| 3208 scoped_ptr<SpdySerializedFrame> frame( | 2727 scoped_ptr<SpdySerializedFrame> frame( |
| 3209 framer.SerializePushPromise(push_promise)); | 2728 framer.SerializePushPromise(push_promise)); |
| 3210 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); | 2729 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
| 3211 } | 2730 } |
| 3212 | 2731 |
| 3213 { | 2732 { |
| 3214 // Test framing PUSH_PROMISE with one byte of padding. | 2733 // Test framing PUSH_PROMISE with one byte of padding. |
| 3215 SpdyFramer framer(spdy_version_); | 2734 SpdyFramer framer(spdy_version_); |
| 3216 framer.set_enable_compression(false); | 2735 framer.set_enable_compression(false); |
| 3217 const char kDescription[] = "PUSH_PROMISE frame with one byte of padding"; | 2736 const char kDescription[] = "PUSH_PROMISE frame with one byte of padding"; |
| 3218 | |
| 3219 const unsigned char kFrameData[] = { | 2737 const unsigned char kFrameData[] = { |
| 3220 0x00, 0x00, 0x17, 0x05, // PUSH_PROMISE | 2738 0x00, 0x00, 0x17, 0x05, // PUSH_PROMISE |
| 3221 0x0c, 0x00, 0x00, 0x00, // END_HEADERS | PADDED | 2739 0x0c, 0x00, 0x00, 0x00, // END_HEADERS | PADDED |
| 3222 0x2a, 0x00, 0x00, 0x00, // Stream 42, Pad length field | 2740 0x2a, 0x00, 0x00, 0x00, // Stream 42, Pad length field |
| 3223 0x00, 0x39, 0x00, 0x03, // Promised stream 57 | 2741 0x00, 0x39, 0x00, 0x03, // Promised stream 57 |
| 3224 0x62, 0x61, 0x72, 0x03, // bar. | 2742 0x62, 0x61, 0x72, 0x03, // bar. |
| 3225 0x66, 0x6f, 0x6f, 0x00, // foo@ | 2743 0x66, 0x6f, 0x6f, 0x00, // foo@ |
| 3226 0x03, 0x66, 0x6f, 0x6f, // .foo | 2744 0x03, 0x66, 0x6f, 0x6f, // .foo |
| 3227 0x03, 0x62, 0x61, 0x72, // .bar | 2745 0x03, 0x62, 0x61, 0x72, // .bar |
| 3228 }; | 2746 }; |
| 3229 | 2747 |
| 3230 SpdyPushPromiseIR push_promise(42, 57); | 2748 SpdyPushPromiseIR push_promise(42, 57); |
| 3231 push_promise.set_padding_len(1); | 2749 push_promise.set_padding_len(1); |
| 3232 push_promise.SetHeader("bar", "foo"); | 2750 push_promise.SetHeader("bar", "foo"); |
| 3233 push_promise.SetHeader("foo", "bar"); | 2751 push_promise.SetHeader("foo", "bar"); |
| 3234 scoped_ptr<SpdySerializedFrame> frame( | 2752 scoped_ptr<SpdySerializedFrame> frame( |
| 3235 framer.SerializePushPromise(push_promise)); | 2753 framer.SerializePushPromise(push_promise)); |
| 3236 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); | 2754 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); |
| 3237 } | 2755 } |
| 3238 | 2756 |
| 3239 { | 2757 { |
| 3240 // Test framing PUSH_PROMISE with 177 bytes of padding. | 2758 // Test framing PUSH_PROMISE with 177 bytes of padding. |
| 3241 SpdyFramer framer(spdy_version_); | 2759 SpdyFramer framer(spdy_version_); |
| 3242 framer.set_enable_compression(false); | 2760 framer.set_enable_compression(false); |
| 3243 const char kDescription[] = "PUSH_PROMISE frame with 177 bytes of padding"; | 2761 const char kDescription[] = "PUSH_PROMISE frame with 177 bytes of padding"; |
| 3244 | |
| 3245 const unsigned char kFrameData[] = { | 2762 const unsigned char kFrameData[] = { |
| 3246 0x00, 0x00, 0xc7, 0x05, // PUSH_PROMISE | 2763 0x00, 0x00, 0xc7, 0x05, // PUSH_PROMISE |
| 3247 0x0c, 0x00, 0x00, 0x00, // END_HEADERS | PADDED | 2764 0x0c, 0x00, 0x00, 0x00, // END_HEADERS | PADDED |
| 3248 0x2a, 0xb0, 0x00, 0x00, // Stream 42, Pad length field | 2765 0x2a, 0xb0, 0x00, 0x00, // Stream 42, Pad length field |
| 3249 0x00, 0x39, 0x00, 0x03, // Promised stream 57 | 2766 0x00, 0x39, 0x00, 0x03, // Promised stream 57 |
| 3250 0x62, 0x61, 0x72, 0x03, // bar. | 2767 0x62, 0x61, 0x72, 0x03, // bar. |
| 3251 0x66, 0x6f, 0x6f, 0x00, // foo@ | 2768 0x66, 0x6f, 0x6f, 0x00, // foo@ |
| 3252 0x03, 0x66, 0x6f, 0x6f, // .foo | 2769 0x03, 0x66, 0x6f, 0x6f, // .foo |
| 3253 0x03, 0x62, 0x61, 0x72, // .bar | 2770 0x03, 0x62, 0x61, 0x72, // .bar |
| 3254 // Padding of 176 0x00(s). | 2771 // Padding of 176 0x00(s). |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 3280 } | 2797 } |
| 3281 | 2798 |
| 3282 TEST_P(SpdyFramerTest, CreateContinuationUncompressed) { | 2799 TEST_P(SpdyFramerTest, CreateContinuationUncompressed) { |
| 3283 if (spdy_version_ <= SPDY3) { | 2800 if (spdy_version_ <= SPDY3) { |
| 3284 return; | 2801 return; |
| 3285 } | 2802 } |
| 3286 | 2803 |
| 3287 SpdyFramer framer(spdy_version_); | 2804 SpdyFramer framer(spdy_version_); |
| 3288 framer.set_enable_compression(false); | 2805 framer.set_enable_compression(false); |
| 3289 const char kDescription[] = "CONTINUATION frame"; | 2806 const char kDescription[] = "CONTINUATION frame"; |
| 3290 | |
| 3291 const unsigned char kFrameData[] = { | 2807 const unsigned char kFrameData[] = { |
| 3292 0x00, 0x00, 0x12, 0x09, 0x00, // CONTINUATION | 2808 0x00, 0x00, 0x12, 0x09, 0x00, // CONTINUATION |
| 3293 0x00, 0x00, 0x00, 0x2a, // Stream 42 | 2809 0x00, 0x00, 0x00, 0x2a, // Stream 42 |
| 3294 0x00, 0x03, 0x62, 0x61, // @.ba | 2810 0x00, 0x03, 0x62, 0x61, // @.ba |
| 3295 0x72, 0x03, 0x66, 0x6f, // r.fo | 2811 0x72, 0x03, 0x66, 0x6f, // r.fo |
| 3296 0x6f, 0x00, 0x03, 0x66, // o@.f | 2812 0x6f, 0x00, 0x03, 0x66, // o@.f |
| 3297 0x6f, 0x6f, 0x03, 0x62, // oo.b | 2813 0x6f, 0x6f, 0x03, 0x62, // oo.b |
| 3298 0x61, 0x72, // ar | 2814 0x61, 0x72, // ar |
| 3299 }; | 2815 }; |
| 3300 | 2816 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 3312 } | 2828 } |
| 3313 | 2829 |
| 3314 { | 2830 { |
| 3315 // Test framing in a case such that a PUSH_PROMISE frame, with one byte of | 2831 // Test framing in a case such that a PUSH_PROMISE frame, with one byte of |
| 3316 // padding, cannot hold all the data payload, which is overflowed to the | 2832 // padding, cannot hold all the data payload, which is overflowed to the |
| 3317 // consecutive CONTINUATION frame. | 2833 // consecutive CONTINUATION frame. |
| 3318 SpdyFramer framer(spdy_version_); | 2834 SpdyFramer framer(spdy_version_); |
| 3319 framer.set_enable_compression(false); | 2835 framer.set_enable_compression(false); |
| 3320 const char kDescription[] = | 2836 const char kDescription[] = |
| 3321 "PUSH_PROMISE and CONTINUATION frames with one byte of padding"; | 2837 "PUSH_PROMISE and CONTINUATION frames with one byte of padding"; |
| 3322 | |
| 3323 const unsigned char kPartialPushPromiseFrameData[] = { | 2838 const unsigned char kPartialPushPromiseFrameData[] = { |
| 3324 0x00, 0x03, 0xf7, 0x05, // PUSH_PROMISE | 2839 0x00, 0x03, 0xf7, 0x05, // PUSH_PROMISE |
| 3325 0x08, 0x00, 0x00, 0x00, // PADDED | 2840 0x08, 0x00, 0x00, 0x00, // PADDED |
| 3326 0x2a, 0x00, 0x00, 0x00, // Stream 42 | 2841 0x2a, 0x00, 0x00, 0x00, // Stream 42 |
| 3327 0x00, 0x39, 0x00, 0x03, // Promised stream 57 | 2842 0x00, 0x39, 0x00, 0x03, // Promised stream 57 |
| 3328 0x78, 0x78, 0x78, 0x7f, // xxx. | 2843 0x78, 0x78, 0x78, 0x7f, // xxx. |
| 3329 0x81, 0x07, 0x78, 0x78, // ..xx | 2844 0x81, 0x07, 0x78, 0x78, // ..xx |
| 3330 0x78, 0x78, 0x78, 0x78, // xxxx | 2845 0x78, 0x78, 0x78, 0x78, // xxxx |
| 3331 0x78, 0x78, 0x78, 0x78, // xxxx | 2846 0x78, 0x78, 0x78, 0x78, // xxxx |
| 3332 0x78, 0x78, 0x78, 0x78, // xxxx | 2847 0x78, 0x78, 0x78, 0x78, // xxxx |
| (...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3904 EXPECT_EQ(3 * 2, visitor.setting_count_); | 3419 EXPECT_EQ(3 * 2, visitor.setting_count_); |
| 3905 if (spdy_version_ > SPDY3) { | 3420 if (spdy_version_ > SPDY3) { |
| 3906 EXPECT_EQ(2, visitor.settings_ack_sent_); | 3421 EXPECT_EQ(2, visitor.settings_ack_sent_); |
| 3907 } | 3422 } |
| 3908 } | 3423 } |
| 3909 | 3424 |
| 3910 // Tests handling of SETTINGS frame with duplicate entries. | 3425 // Tests handling of SETTINGS frame with duplicate entries. |
| 3911 TEST_P(SpdyFramerTest, ReadDuplicateSettings) { | 3426 TEST_P(SpdyFramerTest, ReadDuplicateSettings) { |
| 3912 SpdyFramer framer(spdy_version_); | 3427 SpdyFramer framer(spdy_version_); |
| 3913 | 3428 |
| 3914 const unsigned char kV2FrameData[] = { | |
| 3915 0x80, spdy_version_ch_, 0x00, 0x04, | |
| 3916 0x00, 0x00, 0x00, 0x1C, | |
| 3917 0x00, 0x00, 0x00, 0x03, | |
| 3918 0x01, 0x00, 0x00, 0x00, // 1st Setting | |
| 3919 0x00, 0x00, 0x00, 0x02, | |
| 3920 0x01, 0x00, 0x00, 0x00, // 2nd (duplicate) Setting | |
| 3921 0x00, 0x00, 0x00, 0x03, | |
| 3922 0x03, 0x00, 0x00, 0x00, // 3rd (unprocessed) Setting | |
| 3923 0x00, 0x00, 0x00, 0x03, | |
| 3924 }; | |
| 3925 const unsigned char kV3FrameData[] = { | 3429 const unsigned char kV3FrameData[] = { |
| 3926 0x80, spdy_version_ch_, 0x00, 0x04, | 3430 0x80, spdy_version_ch_, 0x00, 0x04, |
| 3927 0x00, 0x00, 0x00, 0x1C, | 3431 0x00, 0x00, 0x00, 0x1C, |
| 3928 0x00, 0x00, 0x00, 0x03, | 3432 0x00, 0x00, 0x00, 0x03, |
| 3929 0x00, 0x00, 0x00, 0x01, // 1st Setting | 3433 0x00, 0x00, 0x00, 0x01, // 1st Setting |
| 3930 0x00, 0x00, 0x00, 0x02, | 3434 0x00, 0x00, 0x00, 0x02, |
| 3931 0x00, 0x00, 0x00, 0x01, // 2nd (duplicate) Setting | 3435 0x00, 0x00, 0x00, 0x01, // 2nd (duplicate) Setting |
| 3932 0x00, 0x00, 0x00, 0x03, | 3436 0x00, 0x00, 0x00, 0x03, |
| 3933 0x00, 0x00, 0x00, 0x03, // 3rd (unprocessed) Setting | 3437 0x00, 0x00, 0x00, 0x03, // 3rd (unprocessed) Setting |
| 3934 0x00, 0x00, 0x00, 0x03, | 3438 0x00, 0x00, 0x00, 0x03, |
| 3935 }; | 3439 }; |
| 3936 const unsigned char kV4FrameData[] = { | 3440 const unsigned char kV4FrameData[] = { |
| 3937 0x00, 0x00, 0x12, 0x04, | 3441 0x00, 0x00, 0x12, 0x04, |
| 3938 0x00, 0x00, 0x00, 0x00, | 3442 0x00, 0x00, 0x00, 0x00, |
| 3939 0x00, 0x00, 0x01, // 1st Setting | 3443 0x00, 0x00, 0x01, // 1st Setting |
| 3940 0x00, 0x00, 0x00, 0x02, | 3444 0x00, 0x00, 0x00, 0x02, |
| 3941 0x00, 0x01, // 2nd (duplicate) Setting | 3445 0x00, 0x01, // 2nd (duplicate) Setting |
| 3942 0x00, 0x00, 0x00, 0x03, | 3446 0x00, 0x00, 0x00, 0x03, |
| 3943 0x00, 0x03, // 3rd (unprocessed) Setting | 3447 0x00, 0x03, // 3rd (unprocessed) Setting |
| 3944 0x00, 0x00, 0x00, 0x03, | 3448 0x00, 0x00, 0x00, 0x03, |
| 3945 }; | 3449 }; |
| 3946 | 3450 |
| 3947 TestSpdyVisitor visitor(spdy_version_); | 3451 TestSpdyVisitor visitor(spdy_version_); |
| 3948 visitor.use_compression_ = false; | 3452 visitor.use_compression_ = false; |
| 3949 if (IsSpdy2()) { | 3453 if (IsSpdy3()) { |
| 3950 visitor.SimulateInFramer(kV2FrameData, sizeof(kV2FrameData)); | |
| 3951 } else if (IsSpdy3()) { | |
| 3952 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); | 3454 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); |
| 3953 } else { | 3455 } else { |
| 3954 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); | 3456 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); |
| 3955 } | 3457 } |
| 3956 | 3458 |
| 3957 if (!IsSpdy4()) { | 3459 if (!IsSpdy4()) { |
| 3958 EXPECT_EQ(1, visitor.setting_count_); | 3460 EXPECT_EQ(1, visitor.setting_count_); |
| 3959 EXPECT_EQ(1, visitor.error_count_); | 3461 EXPECT_EQ(1, visitor.error_count_); |
| 3960 } else { | 3462 } else { |
| 3961 // In SPDY 4+, duplicate settings are allowed; | 3463 // In SPDY 4+, duplicate settings are allowed; |
| 3962 // each setting replaces the previous value for that setting. | 3464 // each setting replaces the previous value for that setting. |
| 3963 EXPECT_EQ(3, visitor.setting_count_); | 3465 EXPECT_EQ(3, visitor.setting_count_); |
| 3964 EXPECT_EQ(0, visitor.error_count_); | 3466 EXPECT_EQ(0, visitor.error_count_); |
| 3965 EXPECT_EQ(1, visitor.settings_ack_sent_); | 3467 EXPECT_EQ(1, visitor.settings_ack_sent_); |
| 3966 } | 3468 } |
| 3967 } | 3469 } |
| 3968 | 3470 |
| 3969 // Tests handling of SETTINGS frame with a setting we don't recognize. | 3471 // Tests handling of SETTINGS frame with a setting we don't recognize. |
| 3970 TEST_P(SpdyFramerTest, ReadUnknownSettingsId) { | 3472 TEST_P(SpdyFramerTest, ReadUnknownSettingsId) { |
| 3971 SpdyFramer framer(spdy_version_); | 3473 SpdyFramer framer(spdy_version_); |
| 3972 | 3474 |
| 3973 const unsigned char kV2FrameData[] = { | |
| 3974 0x80, spdy_version_ch_, 0x00, 0x04, | |
| 3975 0x00, 0x00, 0x00, 0x1C, | |
| 3976 0x00, 0x00, 0x00, 0x01, | |
| 3977 0x10, 0x00, 0x00, 0x00, // 1st Setting | |
| 3978 0x00, 0x00, 0x00, 0x02, | |
| 3979 }; | |
| 3980 const unsigned char kV3FrameData[] = { | 3475 const unsigned char kV3FrameData[] = { |
| 3981 0x80, spdy_version_ch_, 0x00, 0x04, | 3476 0x80, spdy_version_ch_, 0x00, 0x04, |
| 3982 0x00, 0x00, 0x00, 0x1C, | 3477 0x00, 0x00, 0x00, 0x1C, |
| 3983 0x00, 0x00, 0x00, 0x01, | 3478 0x00, 0x00, 0x00, 0x01, |
| 3984 0x00, 0x00, 0x00, 0x10, // 1st Setting | 3479 0x00, 0x00, 0x00, 0x10, // 1st Setting |
| 3985 0x00, 0x00, 0x00, 0x02, | 3480 0x00, 0x00, 0x00, 0x02, |
| 3986 }; | 3481 }; |
| 3987 const unsigned char kV4FrameData[] = { | 3482 const unsigned char kV4FrameData[] = { |
| 3988 0x00, 0x00, 0x06, 0x04, | 3483 0x00, 0x00, 0x06, 0x04, |
| 3989 0x00, 0x00, 0x00, 0x00, | 3484 0x00, 0x00, 0x00, 0x00, |
| 3990 0x00, 0x00, 0x10, // 1st Setting | 3485 0x00, 0x00, 0x10, // 1st Setting |
| 3991 0x00, 0x00, 0x00, 0x02, | 3486 0x00, 0x00, 0x00, 0x02, |
| 3992 }; | 3487 }; |
| 3993 | 3488 |
| 3994 TestSpdyVisitor visitor(spdy_version_); | 3489 TestSpdyVisitor visitor(spdy_version_); |
| 3995 visitor.use_compression_ = false; | 3490 visitor.use_compression_ = false; |
| 3996 if (IsSpdy2()) { | 3491 if (IsSpdy3()) { |
| 3997 visitor.SimulateInFramer(kV2FrameData, sizeof(kV2FrameData)); | |
| 3998 } else if (IsSpdy3()) { | |
| 3999 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); | 3492 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); |
| 4000 } else { | 3493 } else { |
| 4001 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); | 3494 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); |
| 4002 } | 3495 } |
| 4003 | 3496 |
| 4004 if (!IsSpdy4()) { | 3497 if (!IsSpdy4()) { |
| 4005 EXPECT_EQ(0, visitor.setting_count_); | 3498 EXPECT_EQ(0, visitor.setting_count_); |
| 4006 EXPECT_EQ(1, visitor.error_count_); | 3499 EXPECT_EQ(1, visitor.error_count_); |
| 4007 } else { | 3500 } else { |
| 4008 // In SPDY 4+, we ignore unknown settings because of extensions. | 3501 // In SPDY 4+, we ignore unknown settings because of extensions. |
| 4009 EXPECT_EQ(0, visitor.setting_count_); | 3502 EXPECT_EQ(0, visitor.setting_count_); |
| 4010 EXPECT_EQ(0, visitor.error_count_); | 3503 EXPECT_EQ(0, visitor.error_count_); |
| 4011 } | 3504 } |
| 4012 } | 3505 } |
| 4013 | 3506 |
| 4014 // Tests handling of SETTINGS frame with entries out of order. | 3507 // Tests handling of SETTINGS frame with entries out of order. |
| 4015 TEST_P(SpdyFramerTest, ReadOutOfOrderSettings) { | 3508 TEST_P(SpdyFramerTest, ReadOutOfOrderSettings) { |
| 4016 SpdyFramer framer(spdy_version_); | 3509 SpdyFramer framer(spdy_version_); |
| 4017 | 3510 |
| 4018 const unsigned char kV2FrameData[] = { | |
| 4019 0x80, spdy_version_ch_, 0x00, 0x04, | |
| 4020 0x00, 0x00, 0x00, 0x1C, | |
| 4021 0x00, 0x00, 0x00, 0x03, | |
| 4022 0x02, 0x00, 0x00, 0x00, // 1st Setting | |
| 4023 0x00, 0x00, 0x00, 0x02, | |
| 4024 0x01, 0x00, 0x00, 0x00, // 2nd (out of order) Setting | |
| 4025 0x00, 0x00, 0x00, 0x03, | |
| 4026 0x03, 0x00, 0x00, 0x00, // 3rd (unprocessed) Setting | |
| 4027 0x00, 0x00, 0x00, 0x03, | |
| 4028 }; | |
| 4029 const unsigned char kV3FrameData[] = { | 3511 const unsigned char kV3FrameData[] = { |
| 4030 0x80, spdy_version_ch_, 0x00, 0x04, | 3512 0x80, spdy_version_ch_, 0x00, 0x04, |
| 4031 0x00, 0x00, 0x00, 0x1C, | 3513 0x00, 0x00, 0x00, 0x1C, |
| 4032 0x00, 0x00, 0x00, 0x03, | 3514 0x00, 0x00, 0x00, 0x03, |
| 4033 0x00, 0x00, 0x00, 0x02, // 1st Setting | 3515 0x00, 0x00, 0x00, 0x02, // 1st Setting |
| 4034 0x00, 0x00, 0x00, 0x02, | 3516 0x00, 0x00, 0x00, 0x02, |
| 4035 0x00, 0x00, 0x00, 0x01, // 2nd (out of order) Setting | 3517 0x00, 0x00, 0x00, 0x01, // 2nd (out of order) Setting |
| 4036 0x00, 0x00, 0x00, 0x03, | 3518 0x00, 0x00, 0x00, 0x03, |
| 4037 0x00, 0x00, 0x01, 0x03, // 3rd (unprocessed) Setting | 3519 0x00, 0x00, 0x01, 0x03, // 3rd (unprocessed) Setting |
| 4038 0x00, 0x00, 0x00, 0x03, | 3520 0x00, 0x00, 0x00, 0x03, |
| 4039 }; | 3521 }; |
| 4040 const unsigned char kV4FrameData[] = { | 3522 const unsigned char kV4FrameData[] = { |
| 4041 0x00, 0x00, 0x12, 0x04, | 3523 0x00, 0x00, 0x12, 0x04, |
| 4042 0x00, 0x00, 0x00, 0x00, | 3524 0x00, 0x00, 0x00, 0x00, |
| 4043 0x00, 0x00, 0x02, // 1st Setting | 3525 0x00, 0x00, 0x02, // 1st Setting |
| 4044 0x00, 0x00, 0x00, 0x02, | 3526 0x00, 0x00, 0x00, 0x02, |
| 4045 0x00, 0x01, // 2nd (out of order) Setting | 3527 0x00, 0x01, // 2nd (out of order) Setting |
| 4046 0x00, 0x00, 0x00, 0x03, | 3528 0x00, 0x00, 0x00, 0x03, |
| 4047 0x00, 0x03, // 3rd (unprocessed) Setting | 3529 0x00, 0x03, // 3rd (unprocessed) Setting |
| 4048 0x00, 0x00, 0x00, 0x03, | 3530 0x00, 0x00, 0x00, 0x03, |
| 4049 }; | 3531 }; |
| 4050 | 3532 |
| 4051 TestSpdyVisitor visitor(spdy_version_); | 3533 TestSpdyVisitor visitor(spdy_version_); |
| 4052 visitor.use_compression_ = false; | 3534 visitor.use_compression_ = false; |
| 4053 if (IsSpdy2()) { | 3535 if (IsSpdy3()) { |
| 4054 visitor.SimulateInFramer(kV2FrameData, sizeof(kV2FrameData)); | |
| 4055 } else if (IsSpdy3()) { | |
| 4056 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); | 3536 visitor.SimulateInFramer(kV3FrameData, sizeof(kV3FrameData)); |
| 4057 } else { | 3537 } else { |
| 4058 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); | 3538 visitor.SimulateInFramer(kV4FrameData, sizeof(kV4FrameData)); |
| 4059 } | 3539 } |
| 4060 | 3540 |
| 4061 if (!IsSpdy4()) { | 3541 if (!IsSpdy4()) { |
| 4062 EXPECT_EQ(1, visitor.setting_count_); | 3542 EXPECT_EQ(1, visitor.setting_count_); |
| 4063 EXPECT_EQ(1, visitor.error_count_); | 3543 EXPECT_EQ(1, visitor.error_count_); |
| 4064 } else { | 3544 } else { |
| 4065 // In SPDY 4+, settings are allowed in any order. | 3545 // In SPDY 4+, settings are allowed in any order. |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4158 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2))); | 3638 framer.SerializeWindowUpdate(SpdyWindowUpdateIR(1, 2))); |
| 4159 TestSpdyVisitor visitor(spdy_version_); | 3639 TestSpdyVisitor visitor(spdy_version_); |
| 4160 visitor.SimulateInFramer( | 3640 visitor.SimulateInFramer( |
| 4161 reinterpret_cast<unsigned char*>(control_frame->data()), | 3641 reinterpret_cast<unsigned char*>(control_frame->data()), |
| 4162 control_frame->size()); | 3642 control_frame->size()); |
| 4163 EXPECT_EQ(1u, visitor.last_window_update_stream_); | 3643 EXPECT_EQ(1u, visitor.last_window_update_stream_); |
| 4164 EXPECT_EQ(2u, visitor.last_window_update_delta_); | 3644 EXPECT_EQ(2u, visitor.last_window_update_delta_); |
| 4165 } | 3645 } |
| 4166 | 3646 |
| 4167 TEST_P(SpdyFramerTest, ReceiveCredentialFrame) { | 3647 TEST_P(SpdyFramerTest, ReceiveCredentialFrame) { |
| 4168 if (!IsSpdy3()) { | 3648 if (spdy_version_ > SPDY3) { |
| 4169 return; | 3649 return; |
| 4170 } | 3650 } |
| 4171 SpdyFramer framer(spdy_version_); | 3651 SpdyFramer framer(spdy_version_); |
| 4172 const unsigned char kV3FrameData[] = { // Also applies for V2. | 3652 const unsigned char kV3FrameData[] = { // Also applies for V2. |
| 4173 0x80, spdy_version_ch_, 0x00, 0x0A, | 3653 0x80, spdy_version_ch_, 0x00, 0x0A, |
| 4174 0x00, 0x00, 0x00, 0x33, | 3654 0x00, 0x00, 0x00, 0x33, |
| 4175 0x00, 0x03, 0x00, 0x00, | 3655 0x00, 0x03, 0x00, 0x00, |
| 4176 0x00, 0x05, 'p', 'r', | 3656 0x00, 0x05, 'p', 'r', |
| 4177 'o', 'o', 'f', 0x00, | 3657 'o', 'o', 'f', 0x00, |
| 4178 0x00, 0x00, 0x06, 'a', | 3658 0x00, 0x00, 0x06, 'a', |
| 4179 ' ', 'c', 'e', 'r', | 3659 ' ', 'c', 'e', 'r', |
| 4180 't', 0x00, 0x00, 0x00, | 3660 't', 0x00, 0x00, 0x00, |
| 4181 0x0C, 'a', 'n', 'o', | 3661 0x0C, 'a', 'n', 'o', |
| 4182 't', 'h', 'e', 'r', | 3662 't', 'h', 'e', 'r', |
| 4183 ' ', 'c', 'e', 'r', | 3663 ' ', 'c', 'e', 'r', |
| 4184 't', 0x00, 0x00, 0x00, | 3664 't', 0x00, 0x00, 0x00, |
| 4185 0x0A, 'f', 'i', 'n', | 3665 0x0A, 'f', 'i', 'n', |
| 4186 'a', 'l', ' ', 'c', | 3666 'a', 'l', ' ', 'c', |
| 4187 'e', 'r', 't', | 3667 'e', 'r', 't', |
| 4188 }; | 3668 }; |
| 4189 TestSpdyVisitor visitor(spdy_version_); | 3669 TestSpdyVisitor visitor(spdy_version_); |
| 4190 visitor.use_compression_ = false; | 3670 visitor.use_compression_ = false; |
| 4191 visitor.SimulateInFramer(kV3FrameData, arraysize(kV3FrameData)); | 3671 visitor.SimulateInFramer(kV3FrameData, arraysize(kV3FrameData)); |
| 4192 EXPECT_EQ(0, visitor.error_count_); | 3672 EXPECT_EQ(0, visitor.error_count_); |
| 4193 } | 3673 } |
| 4194 | 3674 |
| 4195 TEST_P(SpdyFramerTest, ReadCredentialFrameFollowedByAnotherFrame) { | 3675 TEST_P(SpdyFramerTest, ReadCredentialFrameFollowedByAnotherFrame) { |
| 4196 if (!IsSpdy3()) { | 3676 if (spdy_version_ > SPDY3) { |
| 4197 return; | 3677 return; |
| 4198 } | 3678 } |
| 4199 SpdyFramer framer(spdy_version_); | 3679 SpdyFramer framer(spdy_version_); |
| 4200 const unsigned char kV3FrameData[] = { // Also applies for V2. | 3680 const unsigned char kV3FrameData[] = { // Also applies for V2. |
| 4201 0x80, spdy_version_ch_, 0x00, 0x0A, | 3681 0x80, spdy_version_ch_, 0x00, 0x0A, |
| 4202 0x00, 0x00, 0x00, 0x33, | 3682 0x00, 0x00, 0x00, 0x33, |
| 4203 0x00, 0x03, 0x00, 0x00, | 3683 0x00, 0x03, 0x00, 0x00, |
| 4204 0x00, 0x05, 'p', 'r', | 3684 0x00, 0x05, 'p', 'r', |
| 4205 'o', 'o', 'f', 0x00, | 3685 'o', 'o', 'f', 0x00, |
| 4206 0x00, 0x00, 0x06, 'a', | 3686 0x00, 0x00, 0x06, 'a', |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4689 EXPECT_EQ(9u, framer.GetBlockedSize()); | 4169 EXPECT_EQ(9u, framer.GetBlockedSize()); |
| 4690 EXPECT_EQ(13u, framer.GetPushPromiseMinimumSize()); | 4170 EXPECT_EQ(13u, framer.GetPushPromiseMinimumSize()); |
| 4691 EXPECT_EQ(18u, framer.GetAltSvcMinimumSize()); | 4171 EXPECT_EQ(18u, framer.GetAltSvcMinimumSize()); |
| 4692 EXPECT_EQ(9u, framer.GetFrameMinimumSize()); | 4172 EXPECT_EQ(9u, framer.GetFrameMinimumSize()); |
| 4693 EXPECT_EQ(16393u, framer.GetFrameMaximumSize()); | 4173 EXPECT_EQ(16393u, framer.GetFrameMaximumSize()); |
| 4694 EXPECT_EQ(16384u, framer.GetDataFrameMaximumPayload()); | 4174 EXPECT_EQ(16384u, framer.GetDataFrameMaximumPayload()); |
| 4695 } else { | 4175 } else { |
| 4696 EXPECT_EQ(8u, framer.GetDataFrameMinimumSize()); | 4176 EXPECT_EQ(8u, framer.GetDataFrameMinimumSize()); |
| 4697 EXPECT_EQ(8u, framer.GetControlFrameHeaderSize()); | 4177 EXPECT_EQ(8u, framer.GetControlFrameHeaderSize()); |
| 4698 EXPECT_EQ(18u, framer.GetSynStreamMinimumSize()); | 4178 EXPECT_EQ(18u, framer.GetSynStreamMinimumSize()); |
| 4699 EXPECT_EQ(IsSpdy2() ? 14u : 12u, framer.GetSynReplyMinimumSize()); | 4179 EXPECT_EQ(12u, framer.GetSynReplyMinimumSize()); |
| 4700 EXPECT_EQ(16u, framer.GetRstStreamMinimumSize()); | 4180 EXPECT_EQ(16u, framer.GetRstStreamMinimumSize()); |
| 4701 EXPECT_EQ(12u, framer.GetSettingsMinimumSize()); | 4181 EXPECT_EQ(12u, framer.GetSettingsMinimumSize()); |
| 4702 EXPECT_EQ(12u, framer.GetPingSize()); | 4182 EXPECT_EQ(12u, framer.GetPingSize()); |
| 4703 EXPECT_EQ(IsSpdy2() ? 12u : 16u, framer.GetGoAwayMinimumSize()); | 4183 EXPECT_EQ(16u, framer.GetGoAwayMinimumSize()); |
| 4704 EXPECT_EQ(IsSpdy2() ? 14u : 12u, framer.GetHeadersMinimumSize()); | 4184 EXPECT_EQ(12u, framer.GetHeadersMinimumSize()); |
| 4705 EXPECT_EQ(16u, framer.GetWindowUpdateSize()); | 4185 EXPECT_EQ(16u, framer.GetWindowUpdateSize()); |
| 4706 EXPECT_EQ(8u, framer.GetFrameMinimumSize()); | 4186 EXPECT_EQ(8u, framer.GetFrameMinimumSize()); |
| 4707 EXPECT_EQ(16777223u, framer.GetFrameMaximumSize()); | 4187 EXPECT_EQ(16777223u, framer.GetFrameMaximumSize()); |
| 4708 EXPECT_EQ(16777215u, framer.GetDataFrameMaximumPayload()); | 4188 EXPECT_EQ(16777215u, framer.GetDataFrameMaximumPayload()); |
| 4709 } | 4189 } |
| 4710 } | 4190 } |
| 4711 | 4191 |
| 4712 TEST_P(SpdyFramerTest, StateToStringTest) { | 4192 TEST_P(SpdyFramerTest, StateToStringTest) { |
| 4713 EXPECT_STREQ("ERROR", | 4193 EXPECT_STREQ("ERROR", |
| 4714 SpdyFramer::StateToString(SpdyFramer::SPDY_ERROR)); | 4194 SpdyFramer::StateToString(SpdyFramer::SPDY_ERROR)); |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4937 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4417 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4938 } else { | 4418 } else { |
| 4939 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 4419 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
| 4940 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4420 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 4941 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4421 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4942 } | 4422 } |
| 4943 } | 4423 } |
| 4944 } | 4424 } |
| 4945 | 4425 |
| 4946 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { | 4426 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { |
| 4947 if (!IsSpdy2() && !IsSpdy3()) { | 4427 if (spdy_version_ > SPDY3) { |
| 4948 // SYN_STREAM not supported in SPDY>3 | 4428 // SYN_STREAM not supported in SPDY>3 |
| 4949 return; | 4429 return; |
| 4950 } | 4430 } |
| 4951 for (int flags = 0; flags < 256; ++flags) { | 4431 for (int flags = 0; flags < 256; ++flags) { |
| 4952 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4432 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
| 4953 | 4433 |
| 4954 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4434 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 4955 testing::StrictMock<test::MockDebugVisitor> debug_visitor; | 4435 testing::StrictMock<test::MockDebugVisitor> debug_visitor; |
| 4956 SpdyFramer framer(spdy_version_); | 4436 SpdyFramer framer(spdy_version_); |
| 4957 framer.set_visitor(&visitor); | 4437 framer.set_visitor(&visitor); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4991 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4471 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4992 } else { | 4472 } else { |
| 4993 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 4473 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
| 4994 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4474 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 4995 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4475 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 4996 } | 4476 } |
| 4997 } | 4477 } |
| 4998 } | 4478 } |
| 4999 | 4479 |
| 5000 TEST_P(SpdyFramerTest, SynReplyFrameFlags) { | 4480 TEST_P(SpdyFramerTest, SynReplyFrameFlags) { |
| 5001 if (!IsSpdy2() && !IsSpdy3()) { | 4481 if (spdy_version_ > SPDY3) { |
| 5002 // SYN_REPLY not supported in SPDY>3 | 4482 // SYN_REPLY not supported in SPDY>3 |
| 5003 return; | 4483 return; |
| 5004 } | 4484 } |
| 5005 for (int flags = 0; flags < 256; ++flags) { | 4485 for (int flags = 0; flags < 256; ++flags) { |
| 5006 SCOPED_TRACE(testing::Message() << "Flags " << flags); | 4486 SCOPED_TRACE(testing::Message() << "Flags " << flags); |
| 5007 | 4487 |
| 5008 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4488 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 5009 SpdyFramer framer(spdy_version_); | 4489 SpdyFramer framer(spdy_version_); |
| 5010 framer.set_visitor(&visitor); | 4490 framer.set_visitor(&visitor); |
| 5011 | 4491 |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5439 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4919 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 5440 } | 4920 } |
| 5441 } | 4921 } |
| 5442 } | 4922 } |
| 5443 | 4923 |
| 5444 // TODO(mlavan): Add TEST_P(SpdyFramerTest, AltSvcFrameFlags) | 4924 // TODO(mlavan): Add TEST_P(SpdyFramerTest, AltSvcFrameFlags) |
| 5445 | 4925 |
| 5446 // TODO(hkhalil): Add TEST_P(SpdyFramerTest, BlockedFrameFlags) | 4926 // TODO(hkhalil): Add TEST_P(SpdyFramerTest, BlockedFrameFlags) |
| 5447 | 4927 |
| 5448 TEST_P(SpdyFramerTest, EmptySynStream) { | 4928 TEST_P(SpdyFramerTest, EmptySynStream) { |
| 5449 if (!IsSpdy2() && !IsSpdy3()) { | 4929 if (spdy_version_ > SPDY3) { |
| 5450 // SYN_STREAM not supported in SPDY>3. | 4930 // SYN_STREAM not supported in SPDY>3. |
| 5451 return; | 4931 return; |
| 5452 } | 4932 } |
| 5453 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 4933 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 5454 testing::StrictMock<test::MockDebugVisitor> debug_visitor; | 4934 testing::StrictMock<test::MockDebugVisitor> debug_visitor; |
| 5455 SpdyFramer framer(spdy_version_); | 4935 SpdyFramer framer(spdy_version_); |
| 5456 framer.set_visitor(&visitor); | 4936 framer.set_visitor(&visitor); |
| 5457 framer.set_debug_visitor(&debug_visitor); | 4937 framer.set_debug_visitor(&debug_visitor); |
| 5458 | 4938 |
| 5459 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(1, SYN_STREAM, _, _)); | 4939 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(1, SYN_STREAM, _, _)); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 5473 | 4953 |
| 5474 framer.ProcessInput(frame->data(), framer.GetSynStreamMinimumSize()); | 4954 framer.ProcessInput(frame->data(), framer.GetSynStreamMinimumSize()); |
| 5475 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 4955 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
| 5476 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 4956 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 5477 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 4957 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 5478 } | 4958 } |
| 5479 | 4959 |
| 5480 TEST_P(SpdyFramerTest, SettingsFlagsAndId) { | 4960 TEST_P(SpdyFramerTest, SettingsFlagsAndId) { |
| 5481 const uint32 kId = 0x020304; | 4961 const uint32 kId = 0x020304; |
| 5482 const uint32 kFlags = 0x01; | 4962 const uint32 kFlags = 0x01; |
| 5483 const uint32 kWireFormat = htonl(IsSpdy2() ? 0x04030201 : 0x01020304); | 4963 const uint32 kWireFormat = htonl(0x01020304); |
| 5484 | 4964 |
| 5485 SettingsFlagsAndId id_and_flags = | 4965 SettingsFlagsAndId id_and_flags = |
| 5486 SettingsFlagsAndId::FromWireFormat(spdy_version_, kWireFormat); | 4966 SettingsFlagsAndId::FromWireFormat(spdy_version_, kWireFormat); |
| 5487 EXPECT_EQ(kId, id_and_flags.id()); | 4967 EXPECT_EQ(kId, id_and_flags.id()); |
| 5488 EXPECT_EQ(kFlags, id_and_flags.flags()); | 4968 EXPECT_EQ(kFlags, id_and_flags.flags()); |
| 5489 EXPECT_EQ(kWireFormat, id_and_flags.GetWireFormat(spdy_version_)); | 4969 EXPECT_EQ(kWireFormat, id_and_flags.GetWireFormat(spdy_version_)); |
| 5490 } | 4970 } |
| 5491 | 4971 |
| 5492 // Test handling of a RST_STREAM with out-of-bounds status codes. | 4972 // Test handling of a RST_STREAM with out-of-bounds status codes. |
| 5493 TEST_P(SpdyFramerTest, RstStreamStatusBounds) { | 4973 TEST_P(SpdyFramerTest, RstStreamStatusBounds) { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5550 reinterpret_cast<const char*>(kV3RstStreamNumStatusCodes), | 5030 reinterpret_cast<const char*>(kV3RstStreamNumStatusCodes), |
| 5551 arraysize(kV3RstStreamNumStatusCodes)); | 5031 arraysize(kV3RstStreamNumStatusCodes)); |
| 5552 } | 5032 } |
| 5553 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5033 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
| 5554 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5034 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 5555 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5035 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 5556 } | 5036 } |
| 5557 | 5037 |
| 5558 // Test handling of GOAWAY frames with out-of-bounds status code. | 5038 // Test handling of GOAWAY frames with out-of-bounds status code. |
| 5559 TEST_P(SpdyFramerTest, GoAwayStatusBounds) { | 5039 TEST_P(SpdyFramerTest, GoAwayStatusBounds) { |
| 5560 if (spdy_version_ <= SPDY2) { | |
| 5561 return; | |
| 5562 } | |
| 5563 SpdyFramer framer(spdy_version_); | 5040 SpdyFramer framer(spdy_version_); |
| 5564 | 5041 |
| 5565 const unsigned char kV3FrameData[] = { | 5042 const unsigned char kV3FrameData[] = { |
| 5566 0x80, spdy_version_ch_, 0x00, 0x07, | 5043 0x80, spdy_version_ch_, 0x00, 0x07, |
| 5567 0x00, 0x00, 0x00, 0x08, | 5044 0x00, 0x00, 0x00, 0x08, |
| 5568 0x00, 0x00, 0x00, 0x01, // Stream Id | 5045 0x00, 0x00, 0x00, 0x01, // Stream Id |
| 5569 0xff, 0xff, 0xff, 0xff, // Status | 5046 0xff, 0xff, 0xff, 0xff, // Status |
| 5570 }; | 5047 }; |
| 5571 const unsigned char kV4FrameData[] = { | 5048 const unsigned char kV4FrameData[] = { |
| 5572 0x00, 0x00, 0x0a, 0x07, | 5049 0x00, 0x00, 0x0a, 0x07, |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 5587 framer.ProcessInput(reinterpret_cast<const char*>(kV4FrameData), | 5064 framer.ProcessInput(reinterpret_cast<const char*>(kV4FrameData), |
| 5588 arraysize(kV4FrameData)); | 5065 arraysize(kV4FrameData)); |
| 5589 } | 5066 } |
| 5590 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5067 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
| 5591 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5068 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 5592 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5069 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 5593 } | 5070 } |
| 5594 | 5071 |
| 5595 // Tests handling of a GOAWAY frame with out-of-bounds stream ID. | 5072 // Tests handling of a GOAWAY frame with out-of-bounds stream ID. |
| 5596 TEST_P(SpdyFramerTest, GoAwayStreamIdBounds) { | 5073 TEST_P(SpdyFramerTest, GoAwayStreamIdBounds) { |
| 5597 const unsigned char kV2FrameData[] = { | |
| 5598 0x80, spdy_version_ch_, 0x00, 0x07, | |
| 5599 0x00, 0x00, 0x00, 0x04, | |
| 5600 0xff, 0xff, 0xff, 0xff, | |
| 5601 }; | |
| 5602 const unsigned char kV3FrameData[] = { | 5074 const unsigned char kV3FrameData[] = { |
| 5603 0x80, spdy_version_ch_, 0x00, 0x07, | 5075 0x80, spdy_version_ch_, 0x00, 0x07, |
| 5604 0x00, 0x00, 0x00, 0x08, | 5076 0x00, 0x00, 0x00, 0x08, |
| 5605 0xff, 0xff, 0xff, 0xff, | 5077 0xff, 0xff, 0xff, 0xff, |
| 5606 0x00, 0x00, 0x00, 0x00, | 5078 0x00, 0x00, 0x00, 0x00, |
| 5607 }; | 5079 }; |
| 5608 const unsigned char kV4FrameData[] = { | 5080 const unsigned char kV4FrameData[] = { |
| 5609 0x00, 0x00, 0x08, 0x07, | 5081 0x00, 0x00, 0x08, 0x07, |
| 5610 0x00, 0x00, 0x00, 0x00, | 5082 0x00, 0x00, 0x00, 0x00, |
| 5611 0x00, 0xff, 0xff, 0xff, | 5083 0x00, 0xff, 0xff, 0xff, |
| 5612 0xff, 0x00, 0x00, 0x00, | 5084 0xff, 0x00, 0x00, 0x00, |
| 5613 0x00, | 5085 0x00, |
| 5614 }; | 5086 }; |
| 5615 | 5087 |
| 5616 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; | 5088 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; |
| 5617 SpdyFramer framer(spdy_version_); | 5089 SpdyFramer framer(spdy_version_); |
| 5618 framer.set_visitor(&visitor); | 5090 framer.set_visitor(&visitor); |
| 5619 | 5091 |
| 5620 EXPECT_CALL(visitor, OnGoAway(0x7fffffff, GOAWAY_OK)); | 5092 EXPECT_CALL(visitor, OnGoAway(0x7fffffff, GOAWAY_OK)); |
| 5621 if (IsSpdy2()) { | 5093 if (IsSpdy3()) { |
| 5622 framer.ProcessInput(reinterpret_cast<const char*>(kV2FrameData), | |
| 5623 arraysize(kV2FrameData)); | |
| 5624 } else if (IsSpdy3()) { | |
| 5625 framer.ProcessInput(reinterpret_cast<const char*>(kV3FrameData), | 5094 framer.ProcessInput(reinterpret_cast<const char*>(kV3FrameData), |
| 5626 arraysize(kV3FrameData)); | 5095 arraysize(kV3FrameData)); |
| 5627 } else { | 5096 } else { |
| 5628 framer.ProcessInput(reinterpret_cast<const char*>(kV4FrameData), | 5097 framer.ProcessInput(reinterpret_cast<const char*>(kV4FrameData), |
| 5629 arraysize(kV4FrameData)); | 5098 arraysize(kV4FrameData)); |
| 5630 } | 5099 } |
| 5631 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); | 5100 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); |
| 5632 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) | 5101 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) |
| 5633 << SpdyFramer::ErrorCodeToString(framer.error_code()); | 5102 << SpdyFramer::ErrorCodeToString(framer.error_code()); |
| 5634 } | 5103 } |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5925 TestSpdyVisitor visitor(spdy_version_); | 5394 TestSpdyVisitor visitor(spdy_version_); |
| 5926 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); | 5395 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); |
| 5927 | 5396 |
| 5928 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); | 5397 EXPECT_EQ(SpdyFramer::SPDY_ERROR, visitor.framer_.state()); |
| 5929 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, | 5398 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, |
| 5930 visitor.framer_.error_code()) | 5399 visitor.framer_.error_code()) |
| 5931 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); | 5400 << SpdyFramer::ErrorCodeToString(visitor.framer_.error_code()); |
| 5932 } | 5401 } |
| 5933 | 5402 |
| 5934 } // namespace net | 5403 } // namespace net |
| OLD | NEW |