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

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

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

Powered by Google App Engine
This is Rietveld 408576698