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

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

Issue 202403002: Land recent SPDY changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync and rebase. Back out commits included for trybot benefit, but separately landed upstream. Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | net/spdy/spdy_network_transaction_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 SpdyFramer* framer, const SpdyFrameType& frame) { 56 SpdyFramer* framer, const SpdyFrameType& frame) {
57 DecompressionVisitor visitor(framer->protocol_version()); 57 DecompressionVisitor visitor(framer->protocol_version());
58 framer->set_visitor(&visitor); 58 framer->set_visitor(&visitor);
59 CHECK_EQ(frame.size(), framer->ProcessInput(frame.data(), frame.size())); 59 CHECK_EQ(frame.size(), framer->ProcessInput(frame.data(), frame.size()));
60 CHECK_EQ(SpdyFramer::SPDY_RESET, framer->state()); 60 CHECK_EQ(SpdyFramer::SPDY_RESET, framer->state());
61 framer->set_visitor(NULL); 61 framer->set_visitor(NULL);
62 62
63 char* buffer = visitor.ReleaseBuffer(); 63 char* buffer = visitor.ReleaseBuffer();
64 CHECK(buffer != NULL); 64 CHECK(buffer != NULL);
65 SpdyFrame* decompressed_frame = new SpdyFrame(buffer, visitor.size(), true); 65 SpdyFrame* decompressed_frame = new SpdyFrame(buffer, visitor.size(), true);
66 if (framer->protocol_version() == 4) { 66 SetFrameLength(decompressed_frame,
67 SetFrameLength(decompressed_frame, 67 visitor.size() - framer->GetControlFrameHeaderSize(),
68 visitor.size(), 68 framer->protocol_version());
69 framer->protocol_version());
70 } else {
71 SetFrameLength(decompressed_frame,
72 visitor.size() - framer->GetControlFrameHeaderSize(),
73 framer->protocol_version());
74 }
75 return decompressed_frame; 69 return decompressed_frame;
76 } 70 }
77 71
78 class DecompressionVisitor : public SpdyFramerVisitorInterface { 72 class DecompressionVisitor : public SpdyFramerVisitorInterface {
79 public: 73 public:
80 explicit DecompressionVisitor(SpdyMajorVersion version) 74 explicit DecompressionVisitor(SpdyMajorVersion version)
81 : version_(version), size_(0), finished_(false) {} 75 : version_(version), size_(0), finished_(false) {}
82 76
83 void ResetBuffer() { 77 void ResetBuffer() {
84 CHECK(buffer_.get() == NULL); 78 CHECK(buffer_.get() == NULL);
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
567 LOG(ERROR) << "Expected header named '" << it->first 561 LOG(ERROR) << "Expected header named '" << it->first
568 << "' to have a value of '" << it->second 562 << "' to have a value of '" << it->second
569 << "'. The actual value received was '" << it2->second 563 << "'. The actual value received was '" << it2->second
570 << "'."; 564 << "'.";
571 return false; 565 return false;
572 } 566 }
573 } 567 }
574 return true; 568 return true;
575 } 569 }
576 570
577 void AddSpdySettingFromWireFormat(SettingsMap* settings,
578 uint32 key,
579 uint32 value) {
580 SettingsFlagsAndId flags_and_id =
581 SettingsFlagsAndId::FromWireFormat(spdy_version_, key);
582 SpdySettingsIds id = static_cast<SpdySettingsIds>(flags_and_id.id());
583 SpdySettingsFlags flags =
584 static_cast<SpdySettingsFlags>(flags_and_id.flags());
585 CHECK(settings->find(id) == settings->end());
586 settings->insert(std::make_pair(id, SettingsFlagsAndValue(flags, value)));
587 }
588
589 bool IsSpdy2() { return spdy_version_ == SPDY2; } 571 bool IsSpdy2() { return spdy_version_ == SPDY2; }
590 bool IsSpdy3() { return spdy_version_ == SPDY3; } 572 bool IsSpdy3() { return spdy_version_ == SPDY3; }
591 bool IsSpdy4() { return spdy_version_ == SPDY4; } 573 bool IsSpdy4() { return spdy_version_ == SPDY4; }
592 574
593 // Version of SPDY protocol to be used. 575 // Version of SPDY protocol to be used.
594 SpdyMajorVersion spdy_version_; 576 SpdyMajorVersion spdy_version_;
595 unsigned char spdy_version_ch_; 577 unsigned char spdy_version_ch_;
596 }; 578 };
597 579
598 // All tests are run with 3 different SPDY versions: SPDY/2, SPDY/3, SPDY/4. 580 // All tests are run with 3 different SPDY versions: SPDY/2, SPDY/3, SPDY/4.
(...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after
1046 1028
1047 0x80, spdy_version_ch_, 0x00, 0x03, // RST_STREAM on Stream #3 1029 0x80, spdy_version_ch_, 0x00, 0x03, // RST_STREAM on Stream #3
1048 0x00, 0x00, 0x00, 0x08, 1030 0x00, 0x00, 0x00, 0x08,
1049 0x00, 0x00, 0x00, 0x03, 1031 0x00, 0x00, 0x00, 0x03,
1050 0x00, 0x00, 0x00, 0x00, 1032 0x00, 0x00, 0x00, 0x00,
1051 }; 1033 };
1052 1034
1053 // SYN_STREAM doesn't exist in SPDY4, so instead we send 1035 // SYN_STREAM doesn't exist in SPDY4, so instead we send
1054 // HEADERS frames with PRIORITY and END_HEADERS set. 1036 // HEADERS frames with PRIORITY and END_HEADERS set.
1055 const unsigned char kV4Input[] = { 1037 const unsigned char kV4Input[] = {
1056 0x00, 0x0d, 0x08, 0x0c, // HEADERS: PRIORITY | END_HEADERS 1038 0x00, 0x05, 0x01, 0x0c, // HEADERS: PRIORITY | END_HEADERS
1057 0x00, 0x00, 0x00, 0x01, // Stream 1 1039 0x00, 0x00, 0x00, 0x01, // Stream 1
1058 0x00, 0x00, 0x00, 0x00, // Priority 0 1040 0x00, 0x00, 0x00, 0x00, // Priority 0
1059 0x82, // :method: GET 1041 0x82, // :method: GET
1060 1042
1061 0x00, 0x09, 0x08, 0x04, // HEADERS: END_HEADERS 1043 0x00, 0x01, 0x01, 0x04, // HEADERS: END_HEADERS
1062 0x00, 0x00, 0x00, 0x01, // Stream 1 1044 0x00, 0x00, 0x00, 0x01, // Stream 1
1063 0x8c, // :status: 200 1045 0x8c, // :status: 200
1064 1046
1065 0x00, 0x14, 0x00, 0x00, // DATA on Stream #1 1047 0x00, 0x0c, 0x00, 0x00, // DATA on Stream #1
1066 0x00, 0x00, 0x00, 0x01, 1048 0x00, 0x00, 0x00, 0x01,
1067 0xde, 0xad, 0xbe, 0xef, 1049 0xde, 0xad, 0xbe, 0xef,
1068 0xde, 0xad, 0xbe, 0xef, 1050 0xde, 0xad, 0xbe, 0xef,
1069 0xde, 0xad, 0xbe, 0xef, 1051 0xde, 0xad, 0xbe, 0xef,
1070 1052
1071 0x00, 0x0d, 0x08, 0x0c, // HEADERS: PRIORITY | END_HEADERS 1053 0x00, 0x05, 0x01, 0x0c, // HEADERS: PRIORITY | END_HEADERS
1072 0x00, 0x00, 0x00, 0x03, // Stream 3 1054 0x00, 0x00, 0x00, 0x03, // Stream 3
1073 0x00, 0x00, 0x00, 0x00, // Priority 0 1055 0x00, 0x00, 0x00, 0x00, // Priority 0
1074 0x82, // :method: GET 1056 0x82, // :method: GET
1075 1057
1076 0x00, 0x10, 0x00, 0x00, // DATA on Stream #3 1058 0x00, 0x08, 0x00, 0x00, // DATA on Stream #3
1077 0x00, 0x00, 0x00, 0x03, 1059 0x00, 0x00, 0x00, 0x03,
1078 0xde, 0xad, 0xbe, 0xef, 1060 0xde, 0xad, 0xbe, 0xef,
1079 0xde, 0xad, 0xbe, 0xef, 1061 0xde, 0xad, 0xbe, 0xef,
1080 1062
1081 0x00, 0x0c, 0x00, 0x00, // DATA on Stream #1 1063 0x00, 0x04, 0x00, 0x00, // DATA on Stream #1
1082 0x00, 0x00, 0x00, 0x01, 1064 0x00, 0x00, 0x00, 0x01,
1083 0xde, 0xad, 0xbe, 0xef, 1065 0xde, 0xad, 0xbe, 0xef,
1084 1066
1085 0x00, 0x0c, 0x03, 0x00, // RST_STREAM on Stream #1 1067 0x00, 0x04, 0x03, 0x00, // RST_STREAM on Stream #1
1086 0x00, 0x00, 0x00, 0x01, 1068 0x00, 0x00, 0x00, 0x01,
1087 0x00, 0x00, 0x00, 0x00, 1069 0x00, 0x00, 0x00, 0x00,
1088 1070
1089 0x00, 0x08, 0x00, 0x00, // DATA on Stream #3 1071 0x00, 0x00, 0x00, 0x00, // DATA on Stream #3
1090 0x00, 0x00, 0x00, 0x03, 1072 0x00, 0x00, 0x00, 0x03,
1091 1073
1092 0x00, 0x17, 0x03, 0x00, // RST_STREAM on Stream #3 1074 0x00, 0x0f, 0x03, 0x00, // RST_STREAM on Stream #3
1093 0x00, 0x00, 0x00, 0x03, 1075 0x00, 0x00, 0x00, 0x03,
1094 0x00, 0x00, 0x00, 0x00, 1076 0x00, 0x00, 0x00, 0x00,
1095 0x52, 0x45, 0x53, 0x45, // opaque data 1077 0x52, 0x45, 0x53, 0x45, // opaque data
1096 0x54, 0x53, 0x54, 0x52, 1078 0x54, 0x53, 0x54, 0x52,
1097 0x45, 0x41, 0x4d, 1079 0x45, 0x41, 0x4d,
1098 }; 1080 };
1099 1081
1100 TestSpdyVisitor visitor(spdy_version_); 1082 TestSpdyVisitor visitor(spdy_version_);
1101 if (IsSpdy2()) { 1083 if (IsSpdy2()) {
1102 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); 1084 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input));
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 0xde, 0xad, 0xbe, 0xef, 1163 0xde, 0xad, 0xbe, 0xef,
1182 1164
1183 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1, with EOF 1165 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1, with EOF
1184 0x01, 0x00, 0x00, 0x04, 1166 0x01, 0x00, 0x00, 0x04,
1185 0xde, 0xad, 0xbe, 0xef, 1167 0xde, 0xad, 0xbe, 0xef,
1186 }; 1168 };
1187 1169
1188 // SYN_STREAM and SYN_REPLY don't exist in SPDY4, so instead we send 1170 // SYN_STREAM and SYN_REPLY don't exist in SPDY4, so instead we send
1189 // HEADERS frames with PRIORITY(SYN_STREAM only) and END_HEADERS set. 1171 // HEADERS frames with PRIORITY(SYN_STREAM only) and END_HEADERS set.
1190 const unsigned char kV4Input[] = { 1172 const unsigned char kV4Input[] = {
1191 0x00, 0x0d, 0x08, 0x0c, // HEADERS: PRIORITY | END_HEADERS 1173 0x00, 0x05, 0x01, 0x0c, // HEADERS: PRIORITY | END_HEADERS
1192 0x00, 0x00, 0x00, 0x01, // Stream 1 1174 0x00, 0x00, 0x00, 0x01, // Stream 1
1193 0x00, 0x00, 0x00, 0x00, // Priority 0 1175 0x00, 0x00, 0x00, 0x00, // Priority 0
1194 0x82, // :method: GET 1176 0x82, // :method: GET
1195 1177
1196 0x00, 0x09, 0x08, 0x04, // HEADERS: END_HEADERS 1178 0x00, 0x01, 0x01, 0x04, // HEADERS: END_HEADERS
1197 0x00, 0x00, 0x00, 0x01, // Stream 1 1179 0x00, 0x00, 0x00, 0x01, // Stream 1
1198 0x8c, // :status: 200 1180 0x8c, // :status: 200
1199 1181
1200 0x00, 0x14, 0x00, 0x00, // DATA on Stream #1 1182 0x00, 0x0c, 0x00, 0x00, // DATA on Stream #1
1201 0x00, 0x00, 0x00, 0x01, 1183 0x00, 0x00, 0x00, 0x01,
1202 0xde, 0xad, 0xbe, 0xef, 1184 0xde, 0xad, 0xbe, 0xef,
1203 0xde, 0xad, 0xbe, 0xef, 1185 0xde, 0xad, 0xbe, 0xef,
1204 0xde, 0xad, 0xbe, 0xef, 1186 0xde, 0xad, 0xbe, 0xef,
1205 1187
1206 0x00, 0x0c, 0x00, 0x01, // DATA on Stream #1, with FIN 1188 0x00, 0x04, 0x00, 0x01, // DATA on Stream #1, with FIN
1207 0x00, 0x00, 0x00, 0x01, 1189 0x00, 0x00, 0x00, 0x01,
1208 0xde, 0xad, 0xbe, 0xef, 1190 0xde, 0xad, 0xbe, 0xef,
1209 }; 1191 };
1210 1192
1211 TestSpdyVisitor visitor(spdy_version_); 1193 TestSpdyVisitor visitor(spdy_version_);
1212 if (IsSpdy2()) { 1194 if (IsSpdy2()) {
1213 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); 1195 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input));
1214 } else if (IsSpdy3()) { 1196 } else if (IsSpdy3()) {
1215 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); 1197 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input));
1216 } else { 1198 } else {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1267 0x00, 0x00, 0x00, 0x01, 1249 0x00, 0x00, 0x00, 0x01,
1268 0x00, 0x00, 0x00, 0x01, 1250 0x00, 0x00, 0x00, 0x01,
1269 0x00, 0x00, 0x00, 0x02, 1251 0x00, 0x00, 0x00, 0x02,
1270 'a', 'a', 0x00, 0x00, 1252 'a', 'a', 0x00, 0x00,
1271 0x00, 0x02, 'b', 'b', 1253 0x00, 0x02, 'b', 'b',
1272 }; 1254 };
1273 1255
1274 // SYN_STREAM and SYN_REPLY don't exist in SPDY4, so instead we send 1256 // SYN_STREAM and SYN_REPLY don't exist in SPDY4, so instead we send
1275 // HEADERS frames with PRIORITY(SYN_STREAM only) and END_HEADERS set. 1257 // HEADERS frames with PRIORITY(SYN_STREAM only) and END_HEADERS set.
1276 const unsigned char kV4Input[] = { 1258 const unsigned char kV4Input[] = {
1277 0x00, 0x0d, 0x08, 0x0c, // HEADERS: PRIORITY | END_HEADERS 1259 0x00, 0x05, 0x01, 0x0c, // HEADERS: PRIORITY | END_HEADERS
1278 0x00, 0x00, 0x00, 0x01, // Stream 1 1260 0x00, 0x00, 0x00, 0x01, // Stream 1
1279 0x00, 0x00, 0x00, 0x00, // Priority 0 1261 0x00, 0x00, 0x00, 0x00, // Priority 0
1280 0x82, // :method: GET 1262 0x82, // :method: GET
1281 1263
1282 0x00, 0x09, 0x08, 0x05, // HEADERS: FIN | END_HEADERS 1264 0x00, 0x01, 0x01, 0x05, // HEADERS: FIN | END_HEADERS
1283 0x00, 0x00, 0x00, 0x01, // Stream 1 1265 0x00, 0x00, 0x00, 0x01, // Stream 1
1284 0x8c, // :status: 200 1266 0x8c, // :status: 200
1285 }; 1267 };
1286 1268
1287 TestSpdyVisitor visitor(spdy_version_); 1269 TestSpdyVisitor visitor(spdy_version_);
1288 if (IsSpdy2()) { 1270 if (IsSpdy2()) {
1289 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input)); 1271 visitor.SimulateInFramer(kV2Input, sizeof(kV2Input));
1290 } else if (IsSpdy3()) { 1272 } else if (IsSpdy3()) {
1291 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input)); 1273 visitor.SimulateInFramer(kV3Input, sizeof(kV3Input));
1292 } else { 1274 } else {
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
1475 net::SpdyWindowUpdateIR(1, 0x12345678))); 1457 net::SpdyWindowUpdateIR(1, 0x12345678)));
1476 1458
1477 const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678"; 1459 const char kDescription[] = "WINDOW_UPDATE frame, stream 1, delta 0x12345678";
1478 const unsigned char kV3FrameData[] = { // Also applies for V2. 1460 const unsigned char kV3FrameData[] = { // Also applies for V2.
1479 0x80, spdy_version_ch_, 0x00, 0x09, 1461 0x80, spdy_version_ch_, 0x00, 0x09,
1480 0x00, 0x00, 0x00, 0x08, 1462 0x00, 0x00, 0x00, 0x08,
1481 0x00, 0x00, 0x00, 0x01, 1463 0x00, 0x00, 0x00, 0x01,
1482 0x12, 0x34, 0x56, 0x78 1464 0x12, 0x34, 0x56, 0x78
1483 }; 1465 };
1484 const unsigned char kV4FrameData[] = { 1466 const unsigned char kV4FrameData[] = {
1485 0x00, 0x0c, 0x09, 0x00, 1467 0x00, 0x04, 0x08, 0x00,
1486 0x00, 0x00, 0x00, 0x01, 1468 0x00, 0x00, 0x00, 0x01,
1487 0x12, 0x34, 0x56, 0x78 1469 0x12, 0x34, 0x56, 0x78
1488 }; 1470 };
1489 1471
1490 if (IsSpdy4()) { 1472 if (IsSpdy4()) {
1491 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 1473 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
1492 } else { 1474 } else {
1493 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1475 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
1494 } 1476 }
1495 } 1477 }
1496 1478
1497 TEST_P(SpdyFramerTest, CreateDataFrame) { 1479 TEST_P(SpdyFramerTest, CreateDataFrame) {
1498 SpdyFramer framer(spdy_version_); 1480 SpdyFramer framer(spdy_version_);
1499 1481
1500 { 1482 {
1501 const char kDescription[] = "'hello' data frame, no FIN"; 1483 const char kDescription[] = "'hello' data frame, no FIN";
1502 const unsigned char kV3FrameData[] = { // Also applies for V2. 1484 const unsigned char kV3FrameData[] = { // Also applies for V2.
1503 0x00, 0x00, 0x00, 0x01, 1485 0x00, 0x00, 0x00, 0x01,
1504 0x00, 0x00, 0x00, 0x05, 1486 0x00, 0x00, 0x00, 0x05,
1505 'h', 'e', 'l', 'l', 1487 'h', 'e', 'l', 'l',
1506 'o' 1488 'o'
1507 }; 1489 };
1508 const unsigned char kV4FrameData[] = { 1490 const unsigned char kV4FrameData[] = {
1509 0x00, 0x0d, 0x00, 0x00, 1491 0x00, 0x05, 0x00, 0x00,
1510 0x00, 0x00, 0x00, 0x01, 1492 0x00, 0x00, 0x00, 0x01,
1511 'h', 'e', 'l', 'l', 1493 'h', 'e', 'l', 'l',
1512 'o' 1494 'o'
1513 }; 1495 };
1514 const char bytes[] = "hello"; 1496 const char bytes[] = "hello";
1515 1497
1516 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes))); 1498 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes)));
1517 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1499 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
1518 if (IsSpdy4()) { 1500 if (IsSpdy4()) {
1519 CompareFrame( 1501 CompareFrame(
1520 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 1502 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
1521 } else { 1503 } else {
1522 CompareFrame( 1504 CompareFrame(
1523 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1505 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
1524 } 1506 }
1525 1507
1526 SpdyDataIR data_header_ir(1); 1508 SpdyDataIR data_header_ir(1);
1527 data_header_ir.SetDataShallow(base::StringPiece(bytes, strlen(bytes))); 1509 data_header_ir.SetDataShallow(base::StringPiece(bytes, strlen(bytes)));
1528 frame.reset(framer.SerializeDataFrameHeader(data_header_ir)); 1510 frame.reset(framer.SerializeDataFrameHeader(data_header_ir));
1529 CompareCharArraysWithHexError( 1511 CompareCharArraysWithHexError(
1530 kDescription, 1512 kDescription,
1531 reinterpret_cast<const unsigned char*>(frame->data()), 1513 reinterpret_cast<const unsigned char*>(frame->data()),
1532 framer.GetDataFrameMinimumSize(), 1514 framer.GetDataFrameMinimumSize(),
1533 IsSpdy4() ? kV4FrameData : kV3FrameData, 1515 IsSpdy4() ? kV4FrameData : kV3FrameData,
1534 framer.GetDataFrameMinimumSize()); 1516 framer.GetDataFrameMinimumSize());
1535 } 1517 }
1536 1518
1537 { 1519 {
1520 const char kDescription[] = "'hello' data frame with padding, no FIN";
1521 const unsigned char kV3FrameData[] = { // Also applies for V2.
1522 0x00, 0x00, 0x00, 0x01,
1523 0x00, 0x00, 0x00, 0x05,
1524 'h', 'e', 'l', 'l',
1525 'o'
1526 };
1527
1528 const unsigned char kV4FrameData[] = {
1529 0x00, 0x0d, 0x00, 0x10, // Length = 13. PAD_LOW set.
1530 0x00, 0x00, 0x00, 0x01,
1531 0x07, // Pad Low field.
1532 'h', 'e', 'l', 'l', // Data
1533 'o',
1534 '0', '0', '0', '0', // Padding
1535 '0', '0', '0'
1536 };
1537 const char bytes[] = "hello";
1538
1539 SpdyDataIR data_ir(1, StringPiece(bytes, strlen(bytes)));
1540 // 7 zeros and the pad low field make the overal padding to be 8 bytes.
1541 data_ir.set_padding_len(8);
1542 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
1543 if (IsSpdy4()) {
1544 CompareFrame(
1545 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
1546 } else {
1547 CompareFrame(
1548 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
1549 }
1550 }
1551
1552 {
1538 const char kDescription[] = "Data frame with negative data byte, no FIN"; 1553 const char kDescription[] = "Data frame with negative data byte, no FIN";
1539 const unsigned char kV3FrameData[] = { // Also applies for V2. 1554 const unsigned char kV3FrameData[] = { // Also applies for V2.
1540 0x00, 0x00, 0x00, 0x01, 1555 0x00, 0x00, 0x00, 0x01,
1541 0x00, 0x00, 0x00, 0x01, 1556 0x00, 0x00, 0x00, 0x01,
1542 0xff 1557 0xff
1543 }; 1558 };
1544 const unsigned char kV4FrameData[] = { 1559 const unsigned char kV4FrameData[] = {
1545 0x00, 0x09, 0x00, 0x00, 1560 0x00, 0x01, 0x00, 0x00,
1546 0x00, 0x00, 0x00, 0x01, 1561 0x00, 0x00, 0x00, 0x01,
1547 0xff 1562 0xff
1548 }; 1563 };
1549 net::SpdyDataIR data_ir(1, StringPiece("\xff", 1)); 1564 net::SpdyDataIR data_ir(1, StringPiece("\xff", 1));
1550 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1565 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
1551 if (IsSpdy4()) { 1566 if (IsSpdy4()) {
1552 CompareFrame( 1567 CompareFrame(
1553 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 1568 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
1554 } else { 1569 } else {
1555 CompareFrame( 1570 CompareFrame(
1556 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1571 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
1557 } 1572 }
1558 } 1573 }
1559 1574
1560 { 1575 {
1561 const char kDescription[] = "'hello' data frame, with FIN"; 1576 const char kDescription[] = "'hello' data frame, with FIN";
1562 const unsigned char kV3FrameData[] = { // Also applies for V2. 1577 const unsigned char kV3FrameData[] = { // Also applies for V2.
1563 0x00, 0x00, 0x00, 0x01, 1578 0x00, 0x00, 0x00, 0x01,
1564 0x01, 0x00, 0x00, 0x05, 1579 0x01, 0x00, 0x00, 0x05,
1565 'h', 'e', 'l', 'l', 1580 'h', 'e', 'l', 'l',
1566 'o' 1581 'o'
1567 }; 1582 };
1568 const unsigned char kV4FrameData[] = { 1583 const unsigned char kV4FrameData[] = {
1569 0x00, 0x0d, 0x00, 0x01, 1584 0x00, 0x05, 0x00, 0x01,
1570 0x00, 0x00, 0x00, 0x01, 1585 0x00, 0x00, 0x00, 0x01,
1571 'h', 'e', 'l', 'l', 1586 'h', 'e', 'l', 'l',
1572 'o' 1587 'o'
1573 }; 1588 };
1574 net::SpdyDataIR data_ir(1, StringPiece("hello", 5)); 1589 net::SpdyDataIR data_ir(1, StringPiece("hello", 5));
1575 data_ir.set_fin(true); 1590 data_ir.set_fin(true);
1576 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1591 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
1577 if (IsSpdy4()) { 1592 if (IsSpdy4()) {
1578 CompareFrame( 1593 CompareFrame(
1579 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 1594 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
1580 } else { 1595 } else {
1581 CompareFrame( 1596 CompareFrame(
1582 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1597 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
1583 } 1598 }
1584 } 1599 }
1585 1600
1586 { 1601 {
1587 const char kDescription[] = "Empty data frame"; 1602 const char kDescription[] = "Empty data frame";
1588 const unsigned char kV3FrameData[] = { // Also applies for V2. 1603 const unsigned char kV3FrameData[] = { // Also applies for V2.
1589 0x00, 0x00, 0x00, 0x01, 1604 0x00, 0x00, 0x00, 0x01,
1590 0x00, 0x00, 0x00, 0x00, 1605 0x00, 0x00, 0x00, 0x00,
1591 }; 1606 };
1592 const unsigned char kV4FrameData[] = { 1607 const unsigned char kV4FrameData[] = {
1593 0x00, 0x08, 0x00, 0x00, 1608 0x00, 0x00, 0x00, 0x00,
1594 0x00, 0x00, 0x00, 0x01, 1609 0x00, 0x00, 0x00, 0x01,
1595 }; 1610 };
1596 net::SpdyDataIR data_ir(1, StringPiece()); 1611 net::SpdyDataIR data_ir(1, StringPiece());
1597 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1612 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
1598 if (IsSpdy4()) { 1613 if (IsSpdy4()) {
1599 CompareFrame( 1614 CompareFrame(
1600 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 1615 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
1601 } else { 1616 } else {
1602 CompareFrame( 1617 CompareFrame(
1603 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 1618 kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
1604 } 1619 }
1605 } 1620 }
1606 1621
1607 { 1622 {
1608 const char kDescription[] = "Data frame with max stream ID"; 1623 const char kDescription[] = "Data frame with max stream ID";
1609 const unsigned char kV3FrameData[] = { // Also applies for V2. 1624 const unsigned char kV3FrameData[] = { // Also applies for V2.
1610 0x7f, 0xff, 0xff, 0xff, 1625 0x7f, 0xff, 0xff, 0xff,
1611 0x01, 0x00, 0x00, 0x05, 1626 0x01, 0x00, 0x00, 0x05,
1612 'h', 'e', 'l', 'l', 1627 'h', 'e', 'l', 'l',
1613 'o' 1628 'o'
1614 }; 1629 };
1615 const unsigned char kV4FrameData[] = { 1630 const unsigned char kV4FrameData[] = {
1616 0x00, 0x0d, 0x00, 0x01, 1631 0x00, 0x05, 0x00, 0x01,
1617 0x7f, 0xff, 0xff, 0xff, 1632 0x7f, 0xff, 0xff, 0xff,
1618 'h', 'e', 'l', 'l', 1633 'h', 'e', 'l', 'l',
1619 'o' 1634 'o'
1620 }; 1635 };
1621 net::SpdyDataIR data_ir(0x7fffffff, "hello"); 1636 net::SpdyDataIR data_ir(0x7fffffff, "hello");
1622 data_ir.set_fin(true); 1637 data_ir.set_fin(true);
1623 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 1638 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
1624 if (IsSpdy4()) { 1639 if (IsSpdy4()) {
1625 CompareFrame( 1640 CompareFrame(
1626 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 1641 kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1683 0x00, 0x02, 0x00, 0x00, 1698 0x00, 0x02, 0x00, 0x00,
1684 0x00, 0x03, 'b', 'a', 1699 0x00, 0x03, 'b', 'a',
1685 'r', 0x00, 0x00, 0x00, 1700 'r', 0x00, 0x00, 0x00,
1686 0x03, 'f', 'o', 'o', 1701 0x03, 'f', 'o', 'o',
1687 0x00, 0x00, 0x00, 0x03, 1702 0x00, 0x00, 0x00, 0x03,
1688 'f', 'o', 'o', 0x00, 1703 'f', 'o', 'o', 0x00,
1689 0x00, 0x00, 0x03, 'b', 1704 0x00, 0x00, 0x03, 'b',
1690 'a', 'r' 1705 'a', 'r'
1691 }; 1706 };
1692 const unsigned char kV4FrameData[] = { 1707 const unsigned char kV4FrameData[] = {
1693 0x00, 0x1e, 0x08, 0x0c, // HEADERS: PRIORITY | END_HEADERS 1708 0x00, 0x16, 0x01, 0x0c, // HEADERS: PRIORITY | END_HEADERS
1694 0x00, 0x00, 0x00, 0x01, // Stream 1 1709 0x00, 0x00, 0x00, 0x01, // Stream 1
1695 0x00, 0x00, 0x00, 0x07, // Priority 7 1710 0x00, 0x00, 0x00, 0x07, // Priority 7
1696 0x40, 0x03, 0x62, 0x61, // @.ba 1711 0x40, 0x03, 0x62, 0x61, // @.ba
1697 0x72, 0x03, 0x66, 0x6f, // r.fo 1712 0x72, 0x03, 0x66, 0x6f, // r.fo
1698 0x6f, 0x40, 0x03, 0x66, // o@.f 1713 0x6f, 0x40, 0x03, 0x66, // o@.f
1699 0x6f, 0x6f, 0x03, 0x62, // oo.b 1714 0x6f, 0x6f, 0x03, 0x62, // oo.b
1700 0x61, 0x72, // ar 1715 0x61, 0x72, // ar
1701 }; 1716 };
1702 SpdySynStreamIR syn_stream(1); 1717 SpdySynStreamIR syn_stream(1);
1703 syn_stream.set_priority(framer.GetLowestPriority()); 1718 syn_stream.set_priority(framer.GetLowestPriority());
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1738 0x00, 0x00, 0x00, 0x00, 1753 0x00, 0x00, 0x00, 0x00,
1739 0x00, 0x02, 0x00, 0x00, 1754 0x00, 0x02, 0x00, 0x00,
1740 0x00, 0x00, 0x00, 0x00, 1755 0x00, 0x00, 0x00, 0x00,
1741 0x00, 0x03, 'f', 'o', 1756 0x00, 0x03, 'f', 'o',
1742 'o', 0x00, 0x00, 0x00, 1757 'o', 0x00, 0x00, 0x00,
1743 0x03, 'f', 'o', 'o', 1758 0x03, 'f', 'o', 'o',
1744 0x00, 0x00, 0x00, 0x03, 1759 0x00, 0x00, 0x00, 0x03,
1745 'b', 'a', 'r' 1760 'b', 'a', 'r'
1746 }; 1761 };
1747 const unsigned char kV4FrameData[] = { 1762 const unsigned char kV4FrameData[] = {
1748 0x00, 0x1b, 0x08, 0x0d, // HEADERS: PRIORITY | FIN | END_HEADERS 1763 0x00, 0x13, 0x01, 0x0d, // HEADERS: PRIORITY | FIN | END_HEADERS
1749 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff 1764 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff
1750 0x00, 0x00, 0x00, 0x00, // Priority 0 1765 0x00, 0x00, 0x00, 0x00, // Priority 0
1751 0x40, 0x00, 0x03, 0x66, // @..f 1766 0x40, 0x00, 0x03, 0x66, // @..f
1752 0x6f, 0x6f, 0x40, 0x03, // oo@. 1767 0x6f, 0x6f, 0x40, 0x03, // oo@.
1753 0x66, 0x6f, 0x6f, 0x03, // foo. 1768 0x66, 0x6f, 0x6f, 0x03, // foo.
1754 0x62, 0x61, 0x72, // bar 1769 0x62, 0x61, 0x72, // bar
1755 }; 1770 };
1756 SpdySynStreamIR syn_stream(0x7fffffff); 1771 SpdySynStreamIR syn_stream(0x7fffffff);
1757 syn_stream.set_associated_to_stream_id(0x7fffffff); 1772 syn_stream.set_associated_to_stream_id(0x7fffffff);
1758 syn_stream.set_priority(framer.GetHighestPriority()); 1773 syn_stream.set_priority(framer.GetHighestPriority());
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1795 kPri, 0x00, 0x00, 0x00, 1810 kPri, 0x00, 0x00, 0x00,
1796 0x00, 0x02, 0x00, 0x00, 1811 0x00, 0x02, 0x00, 0x00,
1797 0x00, 0x03, 'b', 'a', 1812 0x00, 0x03, 'b', 'a',
1798 'r', 0x00, 0x00, 0x00, 1813 'r', 0x00, 0x00, 0x00,
1799 0x03, 'f', 'o', 'o', 1814 0x03, 'f', 'o', 'o',
1800 0x00, 0x00, 0x00, 0x03, 1815 0x00, 0x00, 0x00, 0x03,
1801 'f', 'o', 'o', 0x00, 1816 'f', 'o', 'o', 0x00,
1802 0x00, 0x00, 0x00 1817 0x00, 0x00, 0x00
1803 }; 1818 };
1804 const unsigned char kV4FrameData[] = { 1819 const unsigned char kV4FrameData[] = {
1805 0x00, 0x1b, 0x08, 0x0d, // HEADERS: PRIORITY | FIN | END_HEADERS 1820 0x00, 0x13, 0x01, 0x0d, // HEADERS: PRIORITY | FIN | END_HEADERS
1806 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff 1821 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff
1807 0x00, 0x00, 0x00, 0x01, // Priority 1 1822 0x00, 0x00, 0x00, 0x01, // Priority 1
1808 0x40, 0x03, 0x62, 0x61, // @.ba 1823 0x40, 0x03, 0x62, 0x61, // @.ba
1809 0x72, 0x03, 0x66, 0x6f, // r.fo 1824 0x72, 0x03, 0x66, 0x6f, // r.fo
1810 0x6f, 0x40, 0x03, 0x66, // o@.f 1825 0x6f, 0x40, 0x03, 0x66, // o@.f
1811 0x6f, 0x6f, 0x00, // oo. 1826 0x6f, 0x6f, 0x00, // oo.
1812 }; 1827 };
1813 SpdySynStreamIR syn_stream(0x7fffffff); 1828 SpdySynStreamIR syn_stream(0x7fffffff);
1814 syn_stream.set_associated_to_stream_id(0x7fffffff); 1829 syn_stream.set_associated_to_stream_id(0x7fffffff);
1815 syn_stream.set_priority(1); 1830 syn_stream.set_priority(1);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1916 0x00, 0x00, 0x00, 0x02, 1931 0x00, 0x00, 0x00, 0x02,
1917 0x00, 0x00, 0x00, 0x03, 1932 0x00, 0x00, 0x00, 0x03,
1918 'b', 'a', 'r', 0x00, 1933 'b', 'a', 'r', 0x00,
1919 0x00, 0x00, 0x03, 'f', 1934 0x00, 0x00, 0x03, 'f',
1920 'o', 'o', 0x00, 0x00, 1935 'o', 'o', 0x00, 0x00,
1921 0x00, 0x03, 'f', 'o', 1936 0x00, 0x03, 'f', 'o',
1922 'o', 0x00, 0x00, 0x00, 1937 'o', 0x00, 0x00, 0x00,
1923 0x03, 'b', 'a', 'r' 1938 0x03, 'b', 'a', 'r'
1924 }; 1939 };
1925 const unsigned char kV4FrameData[] = { 1940 const unsigned char kV4FrameData[] = {
1926 0x00, 0x1a, 0x08, 0x04, // HEADER: END_HEADERS 1941 0x00, 0x12, 0x01, 0x04, // HEADER: END_HEADERS
1927 0x00, 0x00, 0x00, 0x01, // Stream 1 1942 0x00, 0x00, 0x00, 0x01, // Stream 1
1928 0x40, 0x03, 0x62, 0x61, // @.ba 1943 0x40, 0x03, 0x62, 0x61, // @.ba
1929 0x72, 0x03, 0x66, 0x6f, // r.fo 1944 0x72, 0x03, 0x66, 0x6f, // r.fo
1930 0x6f, 0x40, 0x03, 0x66, // o@.f 1945 0x6f, 0x40, 0x03, 0x66, // o@.f
1931 0x6f, 0x6f, 0x03, 0x62, // oo.b 1946 0x6f, 0x6f, 0x03, 0x62, // oo.b
1932 0x61, 0x72, // ar 1947 0x61, 0x72, // ar
1933 }; 1948 };
1934 SpdySynReplyIR syn_reply(1); 1949 SpdySynReplyIR syn_reply(1);
1935 syn_reply.SetHeader("bar", "foo"); 1950 syn_reply.SetHeader("bar", "foo");
1936 syn_reply.SetHeader("foo", "bar"); 1951 syn_reply.SetHeader("foo", "bar");
(...skipping 29 matching lines...) Expand all
1966 0x00, 0x00, 0x00, 0x02, 1981 0x00, 0x00, 0x00, 0x02,
1967 0x00, 0x00, 0x00, 0x00, 1982 0x00, 0x00, 0x00, 0x00,
1968 0x00, 0x00, 0x00, 0x03, 1983 0x00, 0x00, 0x00, 0x03,
1969 'f', 'o', 'o', 0x00, 1984 'f', 'o', 'o', 0x00,
1970 0x00, 0x00, 0x03, 'f', 1985 0x00, 0x00, 0x03, 'f',
1971 'o', 'o', 0x00, 0x00, 1986 'o', 'o', 0x00, 0x00,
1972 0x00, 0x03, 'b', 'a', 1987 0x00, 0x03, 'b', 'a',
1973 'r' 1988 'r'
1974 }; 1989 };
1975 const unsigned char kV4FrameData[] = { 1990 const unsigned char kV4FrameData[] = {
1976 0x00, 0x17, 0x08, 0x05, // HEADER: FIN | END_HEADERS 1991 0x00, 0x0f, 0x01, 0x05, // HEADER: FIN | END_HEADERS
1977 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff 1992 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff
1978 0x40, 0x00, 0x03, 0x66, // @..f 1993 0x40, 0x00, 0x03, 0x66, // @..f
1979 0x6f, 0x6f, 0x40, 0x03, // oo@. 1994 0x6f, 0x6f, 0x40, 0x03, // oo@.
1980 0x66, 0x6f, 0x6f, 0x03, // foo. 1995 0x66, 0x6f, 0x6f, 0x03, // foo.
1981 0x62, 0x61, 0x72, // bar 1996 0x62, 0x61, 0x72, // bar
1982 }; 1997 };
1983 SpdySynReplyIR syn_reply(0x7fffffff); 1998 SpdySynReplyIR syn_reply(0x7fffffff);
1984 syn_reply.set_fin(true); 1999 syn_reply.set_fin(true);
1985 syn_reply.SetHeader("", "foo"); 2000 syn_reply.SetHeader("", "foo");
1986 syn_reply.SetHeader("foo", "bar"); 2001 syn_reply.SetHeader("foo", "bar");
(...skipping 29 matching lines...) Expand all
2016 0x00, 0x00, 0x00, 0x02, 2031 0x00, 0x00, 0x00, 0x02,
2017 0x00, 0x00, 0x00, 0x03, 2032 0x00, 0x00, 0x00, 0x03,
2018 'b', 'a', 'r', 0x00, 2033 'b', 'a', 'r', 0x00,
2019 0x00, 0x00, 0x03, 'f', 2034 0x00, 0x00, 0x03, 'f',
2020 'o', 'o', 0x00, 0x00, 2035 'o', 'o', 0x00, 0x00,
2021 0x00, 0x03, 'f', 'o', 2036 0x00, 0x03, 'f', 'o',
2022 'o', 0x00, 0x00, 0x00, 2037 'o', 0x00, 0x00, 0x00,
2023 0x00 2038 0x00
2024 }; 2039 };
2025 const unsigned char kV4FrameData[] = { 2040 const unsigned char kV4FrameData[] = {
2026 0x00, 0x17, 0x08, 0x05, // HEADER: FIN | END_HEADERS 2041 0x00, 0x0f, 0x01, 0x05, // HEADER: FIN | END_HEADERS
2027 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff 2042 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff
2028 0x40, 0x03, 0x62, 0x61, // @.ba 2043 0x40, 0x03, 0x62, 0x61, // @.ba
2029 0x72, 0x03, 0x66, 0x6f, // r.fo 2044 0x72, 0x03, 0x66, 0x6f, // r.fo
2030 0x6f, 0x40, 0x03, 0x66, // o@.f 2045 0x6f, 0x40, 0x03, 0x66, // o@.f
2031 0x6f, 0x6f, 0x00, // oo. 2046 0x6f, 0x6f, 0x00, // oo.
2032 }; 2047 };
2033 SpdySynReplyIR syn_reply(0x7fffffff); 2048 SpdySynReplyIR syn_reply(0x7fffffff);
2034 syn_reply.set_fin(true); 2049 syn_reply.set_fin(true);
2035 syn_reply.SetHeader("bar", "foo"); 2050 syn_reply.SetHeader("bar", "foo");
2036 syn_reply.SetHeader("foo", ""); 2051 syn_reply.SetHeader("foo", "");
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2109 2124
2110 { 2125 {
2111 const char kDescription[] = "RST_STREAM frame"; 2126 const char kDescription[] = "RST_STREAM frame";
2112 const unsigned char kV3FrameData[] = { // Also applies for V2. 2127 const unsigned char kV3FrameData[] = { // Also applies for V2.
2113 0x80, spdy_version_ch_, 0x00, 0x03, 2128 0x80, spdy_version_ch_, 0x00, 0x03,
2114 0x00, 0x00, 0x00, 0x08, 2129 0x00, 0x00, 0x00, 0x08,
2115 0x00, 0x00, 0x00, 0x01, 2130 0x00, 0x00, 0x00, 0x01,
2116 0x00, 0x00, 0x00, 0x01, 2131 0x00, 0x00, 0x00, 0x01,
2117 }; 2132 };
2118 const unsigned char kV4FrameData[] = { 2133 const unsigned char kV4FrameData[] = {
2119 0x00, 0x0f, 0x03, 0x00, 2134 0x00, 0x07, 0x03, 0x00,
2120 0x00, 0x00, 0x00, 0x01, 2135 0x00, 0x00, 0x00, 0x01,
2121 0x00, 0x00, 0x00, 0x01, 2136 0x00, 0x00, 0x00, 0x01,
2122 0x52, 0x53, 0x54 2137 0x52, 0x53, 0x54
2123 }; 2138 };
2124 net::SpdyRstStreamIR rst_stream(1, RST_STREAM_PROTOCOL_ERROR, "RST"); 2139 net::SpdyRstStreamIR rst_stream(1, RST_STREAM_PROTOCOL_ERROR, "RST");
2125 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); 2140 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream));
2126 if (IsSpdy4()) { 2141 if (IsSpdy4()) {
2127 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 2142 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
2128 } else { 2143 } else {
2129 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2144 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
2130 } 2145 }
2131 } 2146 }
2132 2147
2133 { 2148 {
2134 const char kDescription[] = "RST_STREAM frame with max stream ID"; 2149 const char kDescription[] = "RST_STREAM frame with max stream ID";
2135 const unsigned char kV3FrameData[] = { // Also applies for V2. 2150 const unsigned char kV3FrameData[] = { // Also applies for V2.
2136 0x80, spdy_version_ch_, 0x00, 0x03, 2151 0x80, spdy_version_ch_, 0x00, 0x03,
2137 0x00, 0x00, 0x00, 0x08, 2152 0x00, 0x00, 0x00, 0x08,
2138 0x7f, 0xff, 0xff, 0xff, 2153 0x7f, 0xff, 0xff, 0xff,
2139 0x00, 0x00, 0x00, 0x01, 2154 0x00, 0x00, 0x00, 0x01,
2140 }; 2155 };
2141 const unsigned char kV4FrameData[] = { 2156 const unsigned char kV4FrameData[] = {
2142 0x00, 0x0c, 0x03, 0x00, 2157 0x00, 0x04, 0x03, 0x00,
2143 0x7f, 0xff, 0xff, 0xff, 2158 0x7f, 0xff, 0xff, 0xff,
2144 0x00, 0x00, 0x00, 0x01, 2159 0x00, 0x00, 0x00, 0x01,
2145 }; 2160 };
2146 net::SpdyRstStreamIR rst_stream(0x7FFFFFFF, 2161 net::SpdyRstStreamIR rst_stream(0x7FFFFFFF,
2147 RST_STREAM_PROTOCOL_ERROR, 2162 RST_STREAM_PROTOCOL_ERROR,
2148 ""); 2163 "");
2149 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); 2164 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream));
2150 if (IsSpdy4()) { 2165 if (IsSpdy4()) {
2151 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 2166 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
2152 } else { 2167 } else {
2153 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2168 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
2154 } 2169 }
2155 } 2170 }
2156 2171
2157 { 2172 {
2158 const char kDescription[] = "RST_STREAM frame with max status code"; 2173 const char kDescription[] = "RST_STREAM frame with max status code";
2159 const unsigned char kV3FrameData[] = { // Also applies for V2. 2174 const unsigned char kV3FrameData[] = { // Also applies for V2.
2160 0x80, spdy_version_ch_, 0x00, 0x03, 2175 0x80, spdy_version_ch_, 0x00, 0x03,
2161 0x00, 0x00, 0x00, 0x08, 2176 0x00, 0x00, 0x00, 0x08,
2162 0x7f, 0xff, 0xff, 0xff, 2177 0x7f, 0xff, 0xff, 0xff,
2163 0x00, 0x00, 0x00, 0x06, 2178 0x00, 0x00, 0x00, 0x06,
2164 }; 2179 };
2165 const unsigned char kV4FrameData[] = { 2180 const unsigned char kV4FrameData[] = {
2166 0x00, 0x0c, 0x03, 0x00, 2181 0x00, 0x04, 0x03, 0x00,
2167 0x7f, 0xff, 0xff, 0xff, 2182 0x7f, 0xff, 0xff, 0xff,
2168 0x00, 0x00, 0x00, 0x06, 2183 0x00, 0x00, 0x00, 0x06,
2169 }; 2184 };
2170 net::SpdyRstStreamIR rst_stream(0x7FFFFFFF, 2185 net::SpdyRstStreamIR rst_stream(0x7FFFFFFF,
2171 RST_STREAM_INTERNAL_ERROR, 2186 RST_STREAM_INTERNAL_ERROR,
2172 ""); 2187 "");
2173 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream)); 2188 scoped_ptr<SpdyFrame> frame(framer.SerializeRstStream(rst_stream));
2174 if (IsSpdy4()) { 2189 if (IsSpdy4()) {
2175 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 2190 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
2176 } else { 2191 } else {
2177 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2192 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
2178 } 2193 }
2179 } 2194 }
2180 } 2195 }
2181 2196
2182 TEST_P(SpdyFramerTest, CreateSettings) { 2197 TEST_P(SpdyFramerTest, CreateSettings) {
2183 SpdyFramer framer(spdy_version_); 2198 SpdyFramer framer(spdy_version_);
2184 2199
2185 { 2200 {
2186 const char kDescription[] = "Network byte order SETTINGS frame"; 2201 const char kDescription[] = "Network byte order SETTINGS frame";
2187 2202
2188 const unsigned char kV2FrameData[] = { 2203 const unsigned char kV2FrameData[] = {
2189 0x80, spdy_version_ch_, 0x00, 0x04, 2204 0x80, spdy_version_ch_, 0x00, 0x04,
2190 0x00, 0x00, 0x00, 0x0c, 2205 0x00, 0x00, 0x00, 0x0c,
2191 0x00, 0x00, 0x00, 0x01, 2206 0x00, 0x00, 0x00, 0x01,
2192 0x04, 0x03, 0x02, 0x01, 2207 0x07, 0x00, 0x00, 0x01,
2193 0x0a, 0x0b, 0x0c, 0x0d, 2208 0x0a, 0x0b, 0x0c, 0x0d,
2194 }; 2209 };
2195 const unsigned char kV3FrameData[] = { 2210 const unsigned char kV3FrameData[] = {
2196 0x80, spdy_version_ch_, 0x00, 0x04, 2211 0x80, spdy_version_ch_, 0x00, 0x04,
2197 0x00, 0x00, 0x00, 0x0c, 2212 0x00, 0x00, 0x00, 0x0c,
2198 0x00, 0x00, 0x00, 0x01, 2213 0x00, 0x00, 0x00, 0x01,
2199 0x01, 0x02, 0x03, 0x04, 2214 0x01, 0x00, 0x00, 0x07,
2200 0x0a, 0x0b, 0x0c, 0x0d, 2215 0x0a, 0x0b, 0x0c, 0x0d,
2201 }; 2216 };
2202 const unsigned char kV4FrameData[] = { 2217 const unsigned char kV4FrameData[] = {
2203 0x00, 0x0d, 0x04, 0x00, 2218 0x00, 0x05, 0x04, 0x00,
2204 0x00, 0x00, 0x00, 0x00, 2219 0x00, 0x00, 0x00, 0x00,
2205 0x01, 0x0a, 0x0b, 0x0c, 2220 0x04, 0x0a, 0x0b, 0x0c,
2206 0x0d, 2221 0x0d,
2207 }; 2222 };
2208 2223
2209 uint32 kValue = 0x0a0b0c0d; 2224 uint32 kValue = 0x0a0b0c0d;
2210 SpdySettingsIR settings_ir; 2225 SpdySettingsIR settings_ir;
2211 2226
2212 SpdySettingsFlags kFlags = static_cast<SpdySettingsFlags>(0x01); 2227 SpdySettingsFlags kFlags = static_cast<SpdySettingsFlags>(0x01);
2213 SpdySettingsIds kId = static_cast<SpdySettingsIds>(0x020304); 2228 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE;
2214 if (IsSpdy4()) {
2215 kId = static_cast<SpdySettingsIds>(0x01);
2216 }
2217 SettingsMap settings; 2229 SettingsMap settings;
2218 settings[kId] = SettingsFlagsAndValue(kFlags, kValue); 2230 settings[kId] = SettingsFlagsAndValue(kFlags, kValue);
2219 EXPECT_EQ(kFlags, settings[kId].first); 2231 EXPECT_EQ(kFlags, settings[kId].first);
2220 EXPECT_EQ(kValue, settings[kId].second); 2232 EXPECT_EQ(kValue, settings[kId].second);
2221 settings_ir.AddSetting(kId, 2233 settings_ir.AddSetting(kId,
2222 kFlags & SETTINGS_FLAG_PLEASE_PERSIST, 2234 kFlags & SETTINGS_FLAG_PLEASE_PERSIST,
2223 kFlags & SETTINGS_FLAG_PERSISTED, 2235 kFlags & SETTINGS_FLAG_PERSISTED,
2224 kValue); 2236 kValue);
2225 2237
2226 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); 2238 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir));
2227 if (IsSpdy2()) { 2239 if (IsSpdy2()) {
2228 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); 2240 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData));
2229 } else if (IsSpdy3()) { 2241 } else if (IsSpdy3()) {
2230 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2242 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
2231 } else { 2243 } else {
2232 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 2244 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
2233 } 2245 }
2234 } 2246 }
2235 2247
2236 { 2248 {
2237 const char kDescription[] = "Basic SETTINGS frame"; 2249 const char kDescription[] = "Basic SETTINGS frame";
2238 2250
2239 SettingsMap settings; 2251 const unsigned char kV2FrameData[] = {
2240 AddSpdySettingFromWireFormat(
2241 &settings, 0x00000000, 0x00000001); // 1st Setting
2242 AddSpdySettingFromWireFormat(
2243 &settings, 0x01000001, 0x00000002); // 2nd Setting
2244 AddSpdySettingFromWireFormat(
2245 &settings, 0x02000002, 0x00000003); // 3rd Setting
2246 AddSpdySettingFromWireFormat(
2247 &settings, 0x03000003, 0xff000004); // 4th Setting
2248
2249 const unsigned char kV3FrameData[] = { // Also applies for V2.
2250 0x80, spdy_version_ch_, 0x00, 0x04, 2252 0x80, spdy_version_ch_, 0x00, 0x04,
2251 0x00, 0x00, 0x00, 0x24, 2253 0x00, 0x00, 0x00, 0x24,
2252 0x00, 0x00, 0x00, 0x04, 2254 0x00, 0x00, 0x00, 0x04,
2253 0x00, 0x00, 0x00, 0x00, // 1st Setting 2255 0x01, 0x00, 0x00, 0x00, // 1st Setting
2254 0x00, 0x00, 0x00, 0x01, 2256 0x00, 0x00, 0x00, 0x05,
2255 0x01, 0x00, 0x00, 0x01, // 2nd Setting 2257 0x02, 0x00, 0x00, 0x00, // 2nd Setting
2256 0x00, 0x00, 0x00, 0x02, 2258 0x00, 0x00, 0x00, 0x06,
2257 0x02, 0x00, 0x00, 0x02, // 3rd Setting 2259 0x03, 0x00, 0x00, 0x00, // 3rd Setting
2258 0x00, 0x00, 0x00, 0x03, 2260 0x00, 0x00, 0x00, 0x07,
2259 0x03, 0x00, 0x00, 0x03, // 4th Setting 2261 0x04, 0x00, 0x00, 0x00, // 4th Setting
2260 0xff, 0x00, 0x00, 0x04, 2262 0x00, 0x00, 0x00, 0x08,
2261 }; 2263 };
2264 const unsigned char kV3FrameData[] = {
2265 0x80, spdy_version_ch_, 0x00, 0x04,
2266 0x00, 0x00, 0x00, 0x24,
2267 0x00, 0x00, 0x00, 0x04,
2268 0x00, 0x00, 0x00, 0x01, // 1st Setting
2269 0x00, 0x00, 0x00, 0x05,
2270 0x00, 0x00, 0x00, 0x02, // 2nd Setting
2271 0x00, 0x00, 0x00, 0x06,
2272 0x00, 0x00, 0x00, 0x03, // 3rd Setting
2273 0x00, 0x00, 0x00, 0x07,
2274 0x00, 0x00, 0x00, 0x04, // 4th Setting
2275 0x00, 0x00, 0x00, 0x08,
2276 };
2277 // These end up seemingly out of order because of the way that our internal
2278 // ordering for settings_ir works. HTTP2 has no requirement on ordering on
2279 // the wire.
2262 const unsigned char kV4FrameData[] = { 2280 const unsigned char kV4FrameData[] = {
2263 0x00, 0x1c, 0x04, 0x00, 2281 0x00, 0x14, 0x04, 0x00,
2264 0x00, 0x00, 0x00, 0x00, 2282 0x00, 0x00, 0x00, 0x00,
2283 0x03, // 3rd Setting
2284 0x00, 0x00, 0x00, 0x07,
2285 0x04, // 4th Setting
2286 0x00, 0x00, 0x00, 0x08,
2265 0x01, // 1st Setting 2287 0x01, // 1st Setting
2266 0x00, 0x00, 0x00, 0x01, 2288 0x00, 0x00, 0x00, 0x05,
2267 0x02, // 2nd Setting 2289 0x02, // 2nd Setting
2268 0x00, 0x00, 0x00, 0x02, 2290 0x00, 0x00, 0x00, 0x06,
2269 0x03, // 3rd Setting
2270 0x00, 0x00, 0x00, 0x03,
2271 0x04, // 4th Setting
2272 0xff, 0x00, 0x00, 0x04,
2273 }; 2291 };
2292
2274 SpdySettingsIR settings_ir; 2293 SpdySettingsIR settings_ir;
2275 if (!IsSpdy4()) { 2294 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 1),
2276 for (SettingsMap::const_iterator it = settings.begin(); 2295 false, // persist
2277 it != settings.end(); 2296 false, // persisted
2278 ++it) { 2297 5);
2279 settings_ir.AddSetting(it->first, 2298 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 2),
2280 it->second.first & SETTINGS_FLAG_PLEASE_PERSIST, 2299 false, // persist
2281 it->second.first & SETTINGS_FLAG_PERSISTED, 2300 false, // persisted
2282 it->second.second); 2301 6);
2283 } 2302 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 3),
2303 false, // persist
2304 false, // persisted
2305 7);
2306 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 4),
2307 false, // persist
2308 false, // persisted
2309 8);
2310 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir));
2311
2312 if (IsSpdy2()) {
2313 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData));
2314 } else if (IsSpdy3()) {
2315 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
2284 } else { 2316 } else {
2285 SpdySettingsIds kId = static_cast<SpdySettingsIds>(0x01);
2286 settings_ir.AddSetting(kId, 0, 0, 0x00000001);
2287 kId = static_cast<SpdySettingsIds>(0x02);
2288 settings_ir.AddSetting(kId, 0, 0, 0x00000002);
2289 kId = static_cast<SpdySettingsIds>(0x03);
2290 settings_ir.AddSetting(kId, 0, 0, 0x00000003);
2291 kId = static_cast<SpdySettingsIds>(0x04);
2292 settings_ir.AddSetting(kId, 0, 0, 0xff000004);
2293 }
2294 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir));
2295 if (IsSpdy4()) {
2296 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 2317 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
2297 } else {
2298 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
2299 } 2318 }
2300 } 2319 }
2301 2320
2302 { 2321 {
2303 const char kDescription[] = "Empty SETTINGS frame"; 2322 const char kDescription[] = "Empty SETTINGS frame";
2304 2323
2305 const unsigned char kV3FrameData[] = { // Also applies for V2. 2324 const unsigned char kV3FrameData[] = { // Also applies for V2.
2306 0x80, spdy_version_ch_, 0x00, 0x04, 2325 0x80, spdy_version_ch_, 0x00, 0x04,
2307 0x00, 0x00, 0x00, 0x04, 2326 0x00, 0x00, 0x00, 0x04,
2308 0x00, 0x00, 0x00, 0x00, 2327 0x00, 0x00, 0x00, 0x00,
2309 }; 2328 };
2310 const unsigned char kV4FrameData[] = { 2329 const unsigned char kV4FrameData[] = {
2311 0x00, 0x08, 0x04, 0x00, 2330 0x00, 0x00, 0x04, 0x00,
2312 0x00, 0x00, 0x00, 0x00, 2331 0x00, 0x00, 0x00, 0x00,
2313 }; 2332 };
2314 SpdySettingsIR settings_ir; 2333 SpdySettingsIR settings_ir;
2315 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); 2334 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir));
2316 if (IsSpdy4()) { 2335 if (IsSpdy4()) {
2317 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 2336 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
2318 } else { 2337 } else {
2319 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2338 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
2320 } 2339 }
2321 } 2340 }
2322 } 2341 }
2323 2342
2324 TEST_P(SpdyFramerTest, CreatePingFrame) { 2343 TEST_P(SpdyFramerTest, CreatePingFrame) {
2325 SpdyFramer framer(spdy_version_); 2344 SpdyFramer framer(spdy_version_);
2326 2345
2327 { 2346 {
2328 const char kDescription[] = "PING frame"; 2347 const char kDescription[] = "PING frame";
2329 const unsigned char kV3FrameData[] = { // Also applies for V2. 2348 const unsigned char kV3FrameData[] = { // Also applies for V2.
2330 0x80, spdy_version_ch_, 0x00, 0x06, 2349 0x80, spdy_version_ch_, 0x00, 0x06,
2331 0x00, 0x00, 0x00, 0x04, 2350 0x00, 0x00, 0x00, 0x04,
2332 0x12, 0x34, 0x56, 0x78, 2351 0x12, 0x34, 0x56, 0x78,
2333 }; 2352 };
2334 const unsigned char kV4FrameData[] = { 2353 const unsigned char kV4FrameData[] = {
2335 0x00, 0x10, 0x06, 0x00, 2354 0x00, 0x08, 0x06, 0x00,
2336 0x00, 0x00, 0x00, 0x00, 2355 0x00, 0x00, 0x00, 0x00,
2337 0x12, 0x34, 0x56, 0x78, 2356 0x12, 0x34, 0x56, 0x78,
2338 0x9a, 0xbc, 0xde, 0xff, 2357 0x9a, 0xbc, 0xde, 0xff,
2339 }; 2358 };
2340 const unsigned char kV4FrameDataWithAck[] = { 2359 const unsigned char kV4FrameDataWithAck[] = {
2341 0x00, 0x10, 0x06, 0x01, 2360 0x00, 0x08, 0x06, 0x01,
2342 0x00, 0x00, 0x00, 0x00, 2361 0x00, 0x00, 0x00, 0x00,
2343 0x12, 0x34, 0x56, 0x78, 2362 0x12, 0x34, 0x56, 0x78,
2344 0x9a, 0xbc, 0xde, 0xff, 2363 0x9a, 0xbc, 0xde, 0xff,
2345 }; 2364 };
2346 scoped_ptr<SpdyFrame> frame; 2365 scoped_ptr<SpdyFrame> frame;
2347 if (IsSpdy4()) { 2366 if (IsSpdy4()) {
2348 const SpdyPingId kPingId = 0x123456789abcdeffULL; 2367 const SpdyPingId kPingId = 0x123456789abcdeffULL;
2349 SpdyPingIR ping_ir(kPingId); 2368 SpdyPingIR ping_ir(kPingId);
2350 // Tests SpdyPingIR when the ping is not an ack. 2369 // Tests SpdyPingIR when the ping is not an ack.
2351 ASSERT_FALSE(ping_ir.is_ack()); 2370 ASSERT_FALSE(ping_ir.is_ack());
(...skipping 23 matching lines...) Expand all
2375 0x00, 0x00, 0x00, 0x04, 2394 0x00, 0x00, 0x00, 0x04,
2376 0x00, 0x00, 0x00, 0x00, // Stream Id 2395 0x00, 0x00, 0x00, 0x00, // Stream Id
2377 }; 2396 };
2378 const unsigned char kV3FrameData[] = { 2397 const unsigned char kV3FrameData[] = {
2379 0x80, spdy_version_ch_, 0x00, 0x07, 2398 0x80, spdy_version_ch_, 0x00, 0x07,
2380 0x00, 0x00, 0x00, 0x08, 2399 0x00, 0x00, 0x00, 0x08,
2381 0x00, 0x00, 0x00, 0x00, // Stream Id 2400 0x00, 0x00, 0x00, 0x00, // Stream Id
2382 0x00, 0x00, 0x00, 0x00, // Status 2401 0x00, 0x00, 0x00, 0x00, // Status
2383 }; 2402 };
2384 const unsigned char kV4FrameData[] = { 2403 const unsigned char kV4FrameData[] = {
2385 0x00, 0x12, 0x07, 0x00, 2404 0x00, 0x0a, 0x07, 0x00,
2386 0x00, 0x00, 0x00, 0x00, 2405 0x00, 0x00, 0x00, 0x00,
2387 0x00, 0x00, 0x00, 0x00, // Stream id 2406 0x00, 0x00, 0x00, 0x00, // Stream id
2388 0x00, 0x00, 0x00, 0x00, // Status 2407 0x00, 0x00, 0x00, 0x00, // Status
2389 0x47, 0x41, // Opaque Description 2408 0x47, 0x41, // Opaque Description
2390 }; 2409 };
2391 SpdyGoAwayIR goaway_ir(0, GOAWAY_OK, "GA"); 2410 SpdyGoAwayIR goaway_ir(0, GOAWAY_OK, "GA");
2392 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); 2411 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir));
2393 if (IsSpdy2()) { 2412 if (IsSpdy2()) {
2394 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); 2413 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData));
2395 } else if (IsSpdy3()) { 2414 } else if (IsSpdy3()) {
(...skipping 10 matching lines...) Expand all
2406 0x00, 0x00, 0x00, 0x04, 2425 0x00, 0x00, 0x00, 0x04,
2407 0x7f, 0xff, 0xff, 0xff, // Stream Id 2426 0x7f, 0xff, 0xff, 0xff, // Stream Id
2408 }; 2427 };
2409 const unsigned char kV3FrameData[] = { 2428 const unsigned char kV3FrameData[] = {
2410 0x80, spdy_version_ch_, 0x00, 0x07, 2429 0x80, spdy_version_ch_, 0x00, 0x07,
2411 0x00, 0x00, 0x00, 0x08, 2430 0x00, 0x00, 0x00, 0x08,
2412 0x7f, 0xff, 0xff, 0xff, // Stream Id 2431 0x7f, 0xff, 0xff, 0xff, // Stream Id
2413 0x00, 0x00, 0x00, 0x02, // Status 2432 0x00, 0x00, 0x00, 0x02, // Status
2414 }; 2433 };
2415 const unsigned char kV4FrameData[] = { 2434 const unsigned char kV4FrameData[] = {
2416 0x00, 0x12, 0x07, 0x00, 2435 0x00, 0x0a, 0x07, 0x00,
2417 0x00, 0x00, 0x00, 0x00, 2436 0x00, 0x00, 0x00, 0x00,
2418 0x7f, 0xff, 0xff, 0xff, // Stream Id 2437 0x7f, 0xff, 0xff, 0xff, // Stream Id
2419 0x00, 0x00, 0x00, 0x02, // Status 2438 0x00, 0x00, 0x00, 0x02, // Status
2420 0x47, 0x41, // Opaque Description 2439 0x47, 0x41, // Opaque Description
2421 }; 2440 };
2422 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, GOAWAY_INTERNAL_ERROR, "GA"); 2441 SpdyGoAwayIR goaway_ir(0x7FFFFFFF, GOAWAY_INTERNAL_ERROR, "GA");
2423 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir)); 2442 scoped_ptr<SpdyFrame> frame(framer.SerializeGoAway(goaway_ir));
2424 if (IsSpdy2()) { 2443 if (IsSpdy2()) {
2425 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); 2444 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData));
2426 } else if (IsSpdy3()) { 2445 } else if (IsSpdy3()) {
(...skipping 29 matching lines...) Expand all
2456 0x00, 0x00, 0x00, 0x02, 2475 0x00, 0x00, 0x00, 0x02,
2457 0x00, 0x00, 0x00, 0x03, 2476 0x00, 0x00, 0x00, 0x03,
2458 'b', 'a', 'r', 0x00, 2477 'b', 'a', 'r', 0x00,
2459 0x00, 0x00, 0x03, 'f', 2478 0x00, 0x00, 0x03, 'f',
2460 'o', 'o', 0x00, 0x00, 2479 'o', 'o', 0x00, 0x00,
2461 0x00, 0x03, 'f', 'o', 2480 0x00, 0x03, 'f', 'o',
2462 'o', 0x00, 0x00, 0x00, 2481 'o', 0x00, 0x00, 0x00,
2463 0x03, 'b', 'a', 'r' 2482 0x03, 'b', 'a', 'r'
2464 }; 2483 };
2465 const unsigned char kV4FrameData[] = { 2484 const unsigned char kV4FrameData[] = {
2466 0x00, 0x1a, 0x08, 0x04, // Headers: END_HEADERS 2485 0x00, 0x12, 0x01, 0x04, // Headers: END_HEADERS
2467 0x00, 0x00, 0x00, 0x01, // Stream 1 2486 0x00, 0x00, 0x00, 0x01, // Stream 1
2468 0x40, 0x03, 0x62, 0x61, // @.ba 2487 0x40, 0x03, 0x62, 0x61, // @.ba
2469 0x72, 0x03, 0x66, 0x6f, // r.fo 2488 0x72, 0x03, 0x66, 0x6f, // r.fo
2470 0x6f, 0x40, 0x03, 0x66, // o@.f 2489 0x6f, 0x40, 0x03, 0x66, // o@.f
2471 0x6f, 0x6f, 0x03, 0x62, // oo.b 2490 0x6f, 0x6f, 0x03, 0x62, // oo.b
2472 0x61, 0x72, // ar 2491 0x61, 0x72, // ar
2473 }; 2492 };
2474 SpdyHeadersIR headers_ir(1); 2493 SpdyHeadersIR headers_ir(1);
2475 headers_ir.SetHeader("bar", "foo"); 2494 headers_ir.SetHeader("bar", "foo");
2476 headers_ir.SetHeader("foo", "bar"); 2495 headers_ir.SetHeader("foo", "bar");
(...skipping 29 matching lines...) Expand all
2506 0x00, 0x00, 0x00, 0x02, 2525 0x00, 0x00, 0x00, 0x02,
2507 0x00, 0x00, 0x00, 0x00, 2526 0x00, 0x00, 0x00, 0x00,
2508 0x00, 0x00, 0x00, 0x03, 2527 0x00, 0x00, 0x00, 0x03,
2509 'f', 'o', 'o', 0x00, 2528 'f', 'o', 'o', 0x00,
2510 0x00, 0x00, 0x03, 'f', 2529 0x00, 0x00, 0x03, 'f',
2511 'o', 'o', 0x00, 0x00, 2530 'o', 'o', 0x00, 0x00,
2512 0x00, 0x03, 'b', 'a', 2531 0x00, 0x03, 'b', 'a',
2513 'r' 2532 'r'
2514 }; 2533 };
2515 const unsigned char kV4FrameData[] = { 2534 const unsigned char kV4FrameData[] = {
2516 0x00, 0x17, 0x08, 0x05, // HEADER: FIN | END_HEADERS 2535 0x00, 0x0f, 0x01, 0x05, // HEADER: FIN | END_HEADERS
2517 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff 2536 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff
2518 0x40, 0x00, 0x03, 0x66, // @..f 2537 0x40, 0x00, 0x03, 0x66, // @..f
2519 0x6f, 0x6f, 0x40, 0x03, // oo@. 2538 0x6f, 0x6f, 0x40, 0x03, // oo@.
2520 0x66, 0x6f, 0x6f, 0x03, // foo. 2539 0x66, 0x6f, 0x6f, 0x03, // foo.
2521 0x62, 0x61, 0x72, // bar 2540 0x62, 0x61, 0x72, // bar
2522 }; 2541 };
2523 SpdyHeadersIR headers_ir(0x7fffffff); 2542 SpdyHeadersIR headers_ir(0x7fffffff);
2524 headers_ir.set_fin(true); 2543 headers_ir.set_fin(true);
2525 headers_ir.SetHeader("", "foo"); 2544 headers_ir.SetHeader("", "foo");
2526 headers_ir.SetHeader("foo", "bar"); 2545 headers_ir.SetHeader("foo", "bar");
(...skipping 29 matching lines...) Expand all
2556 0x00, 0x00, 0x00, 0x02, 2575 0x00, 0x00, 0x00, 0x02,
2557 0x00, 0x00, 0x00, 0x03, 2576 0x00, 0x00, 0x00, 0x03,
2558 'b', 'a', 'r', 0x00, 2577 'b', 'a', 'r', 0x00,
2559 0x00, 0x00, 0x03, 'f', 2578 0x00, 0x00, 0x03, 'f',
2560 'o', 'o', 0x00, 0x00, 2579 'o', 'o', 0x00, 0x00,
2561 0x00, 0x03, 'f', 'o', 2580 0x00, 0x03, 'f', 'o',
2562 'o', 0x00, 0x00, 0x00, 2581 'o', 0x00, 0x00, 0x00,
2563 0x00 2582 0x00
2564 }; 2583 };
2565 const unsigned char kV4FrameData[] = { 2584 const unsigned char kV4FrameData[] = {
2566 0x00, 0x17, 0x08, 0x05, // HEADER: FIN | END_HEADERS 2585 0x00, 0x0f, 0x01, 0x05, // HEADER: FIN | END_HEADERS
2567 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff 2586 0x7f, 0xff, 0xff, 0xff, // Stream 0x7fffffff
2568 0x40, 0x03, 0x62, 0x61, // @.ba 2587 0x40, 0x03, 0x62, 0x61, // @.ba
2569 0x72, 0x03, 0x66, 0x6f, // r.fo 2588 0x72, 0x03, 0x66, 0x6f, // r.fo
2570 0x6f, 0x40, 0x03, 0x66, // o@.f 2589 0x6f, 0x40, 0x03, 0x66, // o@.f
2571 0x6f, 0x6f, 0x00, // oo. 2590 0x6f, 0x6f, 0x00, // oo.
2572 }; 2591 };
2573 SpdyHeadersIR headers_ir(0x7fffffff); 2592 SpdyHeadersIR headers_ir(0x7fffffff);
2574 headers_ir.set_fin(true); 2593 headers_ir.set_fin(true);
2575 headers_ir.SetHeader("bar", "foo"); 2594 headers_ir.SetHeader("bar", "foo");
2576 headers_ir.SetHeader("foo", ""); 2595 headers_ir.SetHeader("foo", "");
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
2649 2668
2650 { 2669 {
2651 const char kDescription[] = "WINDOW_UPDATE frame"; 2670 const char kDescription[] = "WINDOW_UPDATE frame";
2652 const unsigned char kV3FrameData[] = { // Also applies for V2. 2671 const unsigned char kV3FrameData[] = { // Also applies for V2.
2653 0x80, spdy_version_ch_, 0x00, 0x09, 2672 0x80, spdy_version_ch_, 0x00, 0x09,
2654 0x00, 0x00, 0x00, 0x08, 2673 0x00, 0x00, 0x00, 0x08,
2655 0x00, 0x00, 0x00, 0x01, 2674 0x00, 0x00, 0x00, 0x01,
2656 0x00, 0x00, 0x00, 0x01, 2675 0x00, 0x00, 0x00, 0x01,
2657 }; 2676 };
2658 const unsigned char kV4FrameData[] = { 2677 const unsigned char kV4FrameData[] = {
2659 0x00, 0x0c, 0x09, 0x00, 2678 0x00, 0x04, 0x08, 0x00,
2660 0x00, 0x00, 0x00, 0x01, 2679 0x00, 0x00, 0x00, 0x01,
2661 0x00, 0x00, 0x00, 0x01, 2680 0x00, 0x00, 0x00, 0x01,
2662 }; 2681 };
2663 scoped_ptr<SpdyFrame> frame( 2682 scoped_ptr<SpdyFrame> frame(
2664 framer.SerializeWindowUpdate(net::SpdyWindowUpdateIR(1, 1))); 2683 framer.SerializeWindowUpdate(net::SpdyWindowUpdateIR(1, 1)));
2665 if (IsSpdy4()) { 2684 if (IsSpdy4()) {
2666 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 2685 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
2667 } else { 2686 } else {
2668 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2687 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
2669 } 2688 }
2670 } 2689 }
2671 2690
2672 { 2691 {
2673 const char kDescription[] = "WINDOW_UPDATE frame with max stream ID"; 2692 const char kDescription[] = "WINDOW_UPDATE frame with max stream ID";
2674 const unsigned char kV3FrameData[] = { // Also applies for V2. 2693 const unsigned char kV3FrameData[] = { // Also applies for V2.
2675 0x80, spdy_version_ch_, 0x00, 0x09, 2694 0x80, spdy_version_ch_, 0x00, 0x09,
2676 0x00, 0x00, 0x00, 0x08, 2695 0x00, 0x00, 0x00, 0x08,
2677 0x7f, 0xff, 0xff, 0xff, 2696 0x7f, 0xff, 0xff, 0xff,
2678 0x00, 0x00, 0x00, 0x01, 2697 0x00, 0x00, 0x00, 0x01,
2679 }; 2698 };
2680 const unsigned char kV4FrameData[] = { 2699 const unsigned char kV4FrameData[] = {
2681 0x00, 0x0c, 0x09, 0x00, 2700 0x00, 0x04, 0x08, 0x00,
2682 0x7f, 0xff, 0xff, 0xff, 2701 0x7f, 0xff, 0xff, 0xff,
2683 0x00, 0x00, 0x00, 0x01, 2702 0x00, 0x00, 0x00, 0x01,
2684 }; 2703 };
2685 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( 2704 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate(
2686 net::SpdyWindowUpdateIR(0x7FFFFFFF, 1))); 2705 net::SpdyWindowUpdateIR(0x7FFFFFFF, 1)));
2687 if (IsSpdy4()) { 2706 if (IsSpdy4()) {
2688 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 2707 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
2689 } else { 2708 } else {
2690 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2709 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
2691 } 2710 }
2692 } 2711 }
2693 2712
2694 { 2713 {
2695 const char kDescription[] = "WINDOW_UPDATE frame with max window delta"; 2714 const char kDescription[] = "WINDOW_UPDATE frame with max window delta";
2696 const unsigned char kV3FrameData[] = { // Also applies for V2. 2715 const unsigned char kV3FrameData[] = { // Also applies for V2.
2697 0x80, spdy_version_ch_, 0x00, 0x09, 2716 0x80, spdy_version_ch_, 0x00, 0x09,
2698 0x00, 0x00, 0x00, 0x08, 2717 0x00, 0x00, 0x00, 0x08,
2699 0x00, 0x00, 0x00, 0x01, 2718 0x00, 0x00, 0x00, 0x01,
2700 0x7f, 0xff, 0xff, 0xff, 2719 0x7f, 0xff, 0xff, 0xff,
2701 }; 2720 };
2702 const unsigned char kV4FrameData[] = { 2721 const unsigned char kV4FrameData[] = {
2703 0x00, 0x0c, 0x09, 0x00, 2722 0x00, 0x04, 0x08, 0x00,
2704 0x00, 0x00, 0x00, 0x01, 2723 0x00, 0x00, 0x00, 0x01,
2705 0x7f, 0xff, 0xff, 0xff, 2724 0x7f, 0xff, 0xff, 0xff,
2706 }; 2725 };
2707 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate( 2726 scoped_ptr<SpdyFrame> frame(framer.SerializeWindowUpdate(
2708 net::SpdyWindowUpdateIR(1, 0x7FFFFFFF))); 2727 net::SpdyWindowUpdateIR(1, 0x7FFFFFFF)));
2709 if (IsSpdy4()) { 2728 if (IsSpdy4()) {
2710 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 2729 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
2711 } else { 2730 } else {
2712 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2731 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
2713 } 2732 }
2714 } 2733 }
2715 } 2734 }
2716 2735
2717 TEST_P(SpdyFramerTest, SerializeBlocked) { 2736 TEST_P(SpdyFramerTest, SerializeBlocked) {
2718 if (spdy_version_ < SPDY4) { 2737 if (spdy_version_ < SPDY4) {
2719 return; 2738 return;
2720 } 2739 }
2721 2740
2722 SpdyFramer framer(spdy_version_); 2741 SpdyFramer framer(spdy_version_);
2723 2742
2724 const char kDescription[] = "BLOCKED frame"; 2743 const char kDescription[] = "BLOCKED frame";
2725 const unsigned char kFrameData[] = { 2744 const unsigned char kFrameData[] = {
2726 0x00, 0x08, 0x0b, 0x00, 2745 0x00, 0x00, 0x0a, 0x00,
2727 0x00, 0x00, 0x00, 0x00, 2746 0x00, 0x00, 0x00, 0x00,
2728 }; 2747 };
2729 SpdyBlockedIR blocked_ir(0); 2748 SpdyBlockedIR blocked_ir(0);
2730 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); 2749 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir));
2731 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData)); 2750 CompareFrame(kDescription, *frame, kFrameData, arraysize(kFrameData));
2732 } 2751 }
2733 2752
2734 TEST_P(SpdyFramerTest, CreateBlocked) { 2753 TEST_P(SpdyFramerTest, CreateBlocked) {
2735 if (spdy_version_ < SPDY4) { 2754 if (spdy_version_ < SPDY4) {
2736 return; 2755 return;
(...skipping 16 matching lines...) Expand all
2753 TEST_P(SpdyFramerTest, CreatePushPromise) { 2772 TEST_P(SpdyFramerTest, CreatePushPromise) {
2754 if (spdy_version_ < SPDY4) { 2773 if (spdy_version_ < SPDY4) {
2755 return; 2774 return;
2756 } 2775 }
2757 2776
2758 SpdyFramer framer(spdy_version_); 2777 SpdyFramer framer(spdy_version_);
2759 2778
2760 const char kDescription[] = "PUSH_PROMISE frame"; 2779 const char kDescription[] = "PUSH_PROMISE frame";
2761 2780
2762 const unsigned char kFrameData[] = { 2781 const unsigned char kFrameData[] = {
2763 0x00, 0x1e, 0x0c, 0x04, // PUSH_PROMISE: END_HEADERS 2782 0x00, 0x16, 0x05, 0x04, // PUSH_PROMISE: END_HEADERS
2764 0x00, 0x00, 0x00, 0x2a, // Stream 42 2783 0x00, 0x00, 0x00, 0x2a, // Stream 42
2765 0x00, 0x00, 0x00, 0x39, // Promised stream 57 2784 0x00, 0x00, 0x00, 0x39, // Promised stream 57
2766 0x40, 0x03, 0x62, 0x61, // @.ba 2785 0x40, 0x03, 0x62, 0x61, // @.ba
2767 0x72, 0x03, 0x66, 0x6f, // r.fo 2786 0x72, 0x03, 0x66, 0x6f, // r.fo
2768 0x6f, 0x40, 0x03, 0x66, // o@.f 2787 0x6f, 0x40, 0x03, 0x66, // o@.f
2769 0x6f, 0x6f, 0x03, 0x62, // oo.b 2788 0x6f, 0x6f, 0x03, 0x62, // oo.b
2770 0x61, 0x72, // ar 2789 0x61, 0x72, // ar
2771 }; 2790 };
2772 2791
2773 SpdyPushPromiseIR push_promise(42, 57); 2792 SpdyPushPromiseIR push_promise(42, 57);
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
3020 const unsigned char length = 1 + SpdyFramer::kControlFrameBufferSize; 3039 const unsigned char length = 1 + SpdyFramer::kControlFrameBufferSize;
3021 const unsigned char kV3FrameData[] = { // Also applies for V2. 3040 const unsigned char kV3FrameData[] = { // Also applies for V2.
3022 0x80, spdy_version_ch_, 0x00, 0x07, 3041 0x80, spdy_version_ch_, 0x00, 0x07,
3023 0x00, 0x00, 0x00, length, 3042 0x00, 0x00, 0x00, length,
3024 0x00, 0x00, 0x00, 0x00, // Stream ID 3043 0x00, 0x00, 0x00, 0x00, // Stream ID
3025 0x00, 0x00, 0x00, 0x00, // Status 3044 0x00, 0x00, 0x00, 0x00, // Status
3026 }; 3045 };
3027 3046
3028 // SPDY version 4 and up GOAWAY frames are only bound to a minimal length, 3047 // SPDY version 4 and up GOAWAY frames are only bound to a minimal length,
3029 // since it may carry opaque data. Verify that minimal length is tested. 3048 // since it may carry opaque data. Verify that minimal length is tested.
3030 const unsigned char less_than_min_length = framer.GetGoAwayMinimumSize() - 1; 3049 const unsigned char less_than_min_length =
3050 framer.GetGoAwayMinimumSize() - framer.GetControlFrameHeaderSize() - 1;
3031 const unsigned char kV4FrameData[] = { 3051 const unsigned char kV4FrameData[] = {
3032 0x00, static_cast<uint8>(less_than_min_length), 0x07, 0x00, 3052 0x00, static_cast<uint8>(less_than_min_length), 0x07, 0x00,
3033 0x00, 0x00, 0x00, 0x00, 3053 0x00, 0x00, 0x00, 0x00,
3034 0x00, 0x00, 0x00, 0x00, // Stream Id 3054 0x00, 0x00, 0x00, 0x00, // Stream Id
3035 0x00, 0x00, 0x00, 0x00, // Status 3055 0x00, 0x00, 0x00, 0x00, // Status
3036 }; 3056 };
3037 const size_t pad_length = 3057 const size_t pad_length =
3038 length + framer.GetControlFrameHeaderSize() - 3058 length + framer.GetControlFrameHeaderSize() -
3039 (IsSpdy4() ? sizeof(kV4FrameData) : sizeof(kV3FrameData)); 3059 (IsSpdy4() ? sizeof(kV4FrameData) : sizeof(kV3FrameData));
3040 string pad('A', pad_length); 3060 string pad('A', pad_length);
(...skipping 18 matching lines...) Expand all
3059 TEST_P(SpdyFramerTest, ReadZeroLenSettingsFrame) { 3079 TEST_P(SpdyFramerTest, ReadZeroLenSettingsFrame) {
3060 SpdyFramer framer(spdy_version_); 3080 SpdyFramer framer(spdy_version_);
3061 SpdySettingsIR settings_ir; 3081 SpdySettingsIR settings_ir;
3062 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir)); 3082 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir));
3063 SetFrameLength(control_frame.get(), 0, spdy_version_); 3083 SetFrameLength(control_frame.get(), 0, spdy_version_);
3064 TestSpdyVisitor visitor(spdy_version_); 3084 TestSpdyVisitor visitor(spdy_version_);
3065 visitor.use_compression_ = false; 3085 visitor.use_compression_ = false;
3066 visitor.SimulateInFramer( 3086 visitor.SimulateInFramer(
3067 reinterpret_cast<unsigned char*>(control_frame->data()), 3087 reinterpret_cast<unsigned char*>(control_frame->data()),
3068 framer.GetControlFrameHeaderSize()); 3088 framer.GetControlFrameHeaderSize());
3069 // Should generate an error, since zero-len settings frames are unsupported. 3089 if (spdy_version_ < 4) {
3070 EXPECT_EQ(1, visitor.error_count_); 3090 // Should generate an error, since zero-len settings frames are unsupported.
3091 EXPECT_EQ(1, visitor.error_count_);
3092 } else {
3093 // Zero-len settings frames are permitted as of SPDY 4.
3094 EXPECT_EQ(0, visitor.error_count_);
3095 }
3071 } 3096 }
3072 3097
3073 // Tests handling of SETTINGS frames with invalid length. 3098 // Tests handling of SETTINGS frames with invalid length.
3074 TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) { 3099 TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) {
3075 SpdyFramer framer(spdy_version_); 3100 SpdyFramer framer(spdy_version_);
3076 SpdySettingsIR settings_ir; 3101 SpdySettingsIR settings_ir;
3077 3102
3078 // Add a setting to pad the frame so that we don't get a buffer overflow when 3103 // Add a setting to pad the frame so that we don't get a buffer overflow when
3079 // calling SimulateInFramer() below. 3104 // calling SimulateInFramer() below.
3080 SettingsMap settings; 3105 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE,
3081 settings[SETTINGS_UPLOAD_BANDWIDTH] = 3106 false,
3082 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, 0x00000002);
3083 settings_ir.AddSetting(SETTINGS_UPLOAD_BANDWIDTH,
3084 true, // please persist
3085 false, 3107 false,
3086 0x00000002); 3108 0x00000002);
3087 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir)); 3109 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir));
3088 const size_t kNewLength = 14; 3110 const size_t kNewLength = 14;
3089 SetFrameLength(control_frame.get(), kNewLength, spdy_version_); 3111 SetFrameLength(control_frame.get(), kNewLength, spdy_version_);
3090 TestSpdyVisitor visitor(spdy_version_); 3112 TestSpdyVisitor visitor(spdy_version_);
3091 visitor.use_compression_ = false; 3113 visitor.use_compression_ = false;
3092 visitor.SimulateInFramer( 3114 visitor.SimulateInFramer(
3093 reinterpret_cast<unsigned char*>(control_frame->data()), 3115 reinterpret_cast<unsigned char*>(control_frame->data()),
3094 framer.GetControlFrameHeaderSize() + kNewLength); 3116 framer.GetControlFrameHeaderSize() + kNewLength);
3095 // Should generate an error, since its not possible to have a 3117 // Should generate an error, since its not possible to have a
3096 // settings frame of length kNewLength. 3118 // settings frame of length kNewLength.
3097 EXPECT_EQ(1, visitor.error_count_); 3119 EXPECT_EQ(1, visitor.error_count_);
3098 } 3120 }
3099 3121
3100 // Tests handling of SETTINGS frames larger than the frame buffer size. 3122 // Tests handling of SETTINGS frames larger than the frame buffer size.
3101 TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) { 3123 TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) {
3102 SpdyFramer framer(spdy_version_); 3124 SpdyFramer framer(spdy_version_);
3103 SpdySettingsIR settings_ir; 3125 SpdySettingsIR settings_ir;
3104 SettingsMap settings; 3126 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 1),
3105 3127 false, // persist
3106 SpdySettingsFlags flags = SETTINGS_FLAG_PLEASE_PERSIST; 3128 false, // persisted
3107 settings[SETTINGS_UPLOAD_BANDWIDTH] = 3129 5);
3108 SettingsFlagsAndValue(flags, 0x00000002); 3130 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 2),
3109 settings[SETTINGS_DOWNLOAD_BANDWIDTH] = 3131 false, // persist
3110 SettingsFlagsAndValue(flags, 0x00000003); 3132 false, // persisted
3111 settings[SETTINGS_ROUND_TRIP_TIME] = SettingsFlagsAndValue(flags, 0x00000004); 3133 6);
3112 for (SettingsMap::const_iterator it = settings.begin(); 3134 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 3),
3113 it != settings.end(); 3135 false, // persist
3114 ++it) { 3136 false, // persisted
3115 settings_ir.AddSetting(it->first, 3137 7);
3116 it->second.first & SETTINGS_FLAG_PLEASE_PERSIST,
3117 it->second.first & SETTINGS_FLAG_PERSISTED,
3118 it->second.second);
3119 }
3120 3138
3121 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir)); 3139 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir));
3122 EXPECT_LT(SpdyFramer::kControlFrameBufferSize, 3140 EXPECT_LT(SpdyFramer::kControlFrameBufferSize,
3123 control_frame->size()); 3141 control_frame->size());
3124 TestSpdyVisitor visitor(spdy_version_); 3142 TestSpdyVisitor visitor(spdy_version_);
3125 visitor.use_compression_ = false; 3143 visitor.use_compression_ = false;
3126 3144
3127 // Read all at once. 3145 // Read all at once.
3128 visitor.SimulateInFramer( 3146 visitor.SimulateInFramer(
3129 reinterpret_cast<unsigned char*>(control_frame->data()), 3147 reinterpret_cast<unsigned char*>(control_frame->data()),
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
3173 0x00, 0x00, 0x00, 0x1C, 3191 0x00, 0x00, 0x00, 0x1C,
3174 0x00, 0x00, 0x00, 0x03, 3192 0x00, 0x00, 0x00, 0x03,
3175 0x00, 0x00, 0x00, 0x01, // 1st Setting 3193 0x00, 0x00, 0x00, 0x01, // 1st Setting
3176 0x00, 0x00, 0x00, 0x02, 3194 0x00, 0x00, 0x00, 0x02,
3177 0x00, 0x00, 0x00, 0x01, // 2nd (duplicate) Setting 3195 0x00, 0x00, 0x00, 0x01, // 2nd (duplicate) Setting
3178 0x00, 0x00, 0x00, 0x03, 3196 0x00, 0x00, 0x00, 0x03,
3179 0x00, 0x00, 0x00, 0x03, // 3rd (unprocessed) Setting 3197 0x00, 0x00, 0x00, 0x03, // 3rd (unprocessed) Setting
3180 0x00, 0x00, 0x00, 0x03, 3198 0x00, 0x00, 0x00, 0x03,
3181 }; 3199 };
3182 const unsigned char kV4FrameData[] = { 3200 const unsigned char kV4FrameData[] = {
3183 0x00, 0x17, 0x04, 0x00, 3201 0x00, 0x0f, 0x04, 0x00,
3184 0x00, 0x00, 0x00, 0x00, 3202 0x00, 0x00, 0x00, 0x00,
3185 0x01, // 1st Setting 3203 0x01, // 1st Setting
3186 0x00, 0x00, 0x00, 0x02, 3204 0x00, 0x00, 0x00, 0x02,
3187 0x01, // 2nd (duplicate) Setting 3205 0x01, // 2nd (duplicate) Setting
3188 0x00, 0x00, 0x00, 0x03, 3206 0x00, 0x00, 0x00, 0x03,
3189 0x03, // 3rd (unprocessed) Setting 3207 0x03, // 3rd (unprocessed) Setting
3190 0x00, 0x00, 0x00, 0x03, 3208 0x00, 0x00, 0x00, 0x03,
3191 }; 3209 };
3192 3210
3193 TestSpdyVisitor visitor(spdy_version_); 3211 TestSpdyVisitor visitor(spdy_version_);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
3232 0x00, 0x00, 0x00, 0x1C, 3250 0x00, 0x00, 0x00, 0x1C,
3233 0x00, 0x00, 0x00, 0x03, 3251 0x00, 0x00, 0x00, 0x03,
3234 0x00, 0x00, 0x00, 0x02, // 1st Setting 3252 0x00, 0x00, 0x00, 0x02, // 1st Setting
3235 0x00, 0x00, 0x00, 0x02, 3253 0x00, 0x00, 0x00, 0x02,
3236 0x00, 0x00, 0x00, 0x01, // 2nd (out of order) Setting 3254 0x00, 0x00, 0x00, 0x01, // 2nd (out of order) Setting
3237 0x00, 0x00, 0x00, 0x03, 3255 0x00, 0x00, 0x00, 0x03,
3238 0x00, 0x00, 0x01, 0x03, // 3rd (unprocessed) Setting 3256 0x00, 0x00, 0x01, 0x03, // 3rd (unprocessed) Setting
3239 0x00, 0x00, 0x00, 0x03, 3257 0x00, 0x00, 0x00, 0x03,
3240 }; 3258 };
3241 const unsigned char kV4FrameData[] = { 3259 const unsigned char kV4FrameData[] = {
3242 0x00, 0x17, 0x04, 0x00, 3260 0x00, 0x0f, 0x04, 0x00,
3243 0x00, 0x00, 0x00, 0x00, 3261 0x00, 0x00, 0x00, 0x00,
3244 0x02, // 1st Setting 3262 0x02, // 1st Setting
3245 0x00, 0x00, 0x00, 0x02, 3263 0x00, 0x00, 0x00, 0x02,
3246 0x01, // 2nd (out of order) Setting 3264 0x01, // 2nd (out of order) Setting
3247 0x00, 0x00, 0x00, 0x03, 3265 0x00, 0x00, 0x00, 0x03,
3248 0x03, // 3rd (unprocessed) Setting 3266 0x03, // 3rd (unprocessed) Setting
3249 0x00, 0x00, 0x00, 0x03, 3267 0x00, 0x00, 0x00, 0x03,
3250 }; 3268 };
3251 3269
3252 TestSpdyVisitor visitor(spdy_version_); 3270 TestSpdyVisitor visitor(spdy_version_);
(...skipping 17 matching lines...) Expand all
3270 } 3288 }
3271 } 3289 }
3272 3290
3273 TEST_P(SpdyFramerTest, ProcessSettingsAckFrame) { 3291 TEST_P(SpdyFramerTest, ProcessSettingsAckFrame) {
3274 if (spdy_version_ < 4) { 3292 if (spdy_version_ < 4) {
3275 return; 3293 return;
3276 } 3294 }
3277 SpdyFramer framer(spdy_version_); 3295 SpdyFramer framer(spdy_version_);
3278 3296
3279 const unsigned char kFrameData[] = { 3297 const unsigned char kFrameData[] = {
3280 0x00, 0x08, 0x04, 0x01, 3298 0x00, 0x00, 0x04, 0x01,
3281 0x00, 0x00, 0x00, 0x00, 3299 0x00, 0x00, 0x00, 0x00,
3282 }; 3300 };
3283 3301
3284 TestSpdyVisitor visitor(spdy_version_); 3302 TestSpdyVisitor visitor(spdy_version_);
3285 visitor.use_compression_ = false; 3303 visitor.use_compression_ = false;
3286 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData)); 3304 visitor.SimulateInFramer(kFrameData, sizeof(kFrameData));
3287 3305
3288 EXPECT_EQ(0, visitor.error_count_); 3306 EXPECT_EQ(0, visitor.error_count_);
3289 EXPECT_EQ(0, visitor.setting_count_); 3307 EXPECT_EQ(0, visitor.setting_count_);
3290 EXPECT_EQ(1, visitor.settings_ack_received_); 3308 EXPECT_EQ(1, visitor.settings_ack_received_);
3291 } 3309 }
3292 3310
3311
3312 TEST_P(SpdyFramerTest, ProcessDataFrameWithPadding) {
3313 if (spdy_version_ < 4) {
3314 return;
3315 }
3316
3317 const int kPaddingLen = 512; // So we get two bytes for padding length field.
3318 const char data_payload[] = "hello";
3319
3320 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3321 SpdyFramer framer(spdy_version_);
3322 framer.set_visitor(&visitor);
3323
3324 SpdyDataIR data_ir(1, StringPiece(data_payload, strlen(data_payload)));
3325 data_ir.set_padding_len(kPaddingLen);
3326 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
3327 ASSERT_TRUE(frame.get() != NULL);
3328
3329 int bytes_consumed = 0;
3330
3331 // Send the frame header.
3332 EXPECT_CALL(visitor, OnDataFrameHeader(1,
3333 kPaddingLen + strlen(data_payload),
3334 false));
3335 CHECK_EQ(8u, framer.ProcessInput(frame->data(), 8));
3336 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_PADDING_LENGTH);
3337 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3338 bytes_consumed += 8;
3339
3340 // Send the first byte of the padding length field.
3341 CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1));
3342 CHECK_EQ(framer.state(), SpdyFramer::SPDY_READ_PADDING_LENGTH);
3343 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3344 bytes_consumed += 1;
3345
3346 // Send the second byte of the padding length field.
3347 CHECK_EQ(1u, framer.ProcessInput(frame->data() + bytes_consumed, 1));
3348 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME);
3349 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3350 bytes_consumed += 1;
3351
3352 // Send the first two bytes of the data payload.
3353 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 2, false));
3354 CHECK_EQ(2u, framer.ProcessInput(frame->data() + bytes_consumed, 2));
3355 CHECK_EQ(framer.state(), SpdyFramer::SPDY_FORWARD_STREAM_FRAME);
3356 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3357 bytes_consumed += 2;
3358
3359 // Send the rest three bytes of the data payload.
3360 EXPECT_CALL(visitor, OnStreamFrameData(1, _, 3, false));
3361 CHECK_EQ(3u, framer.ProcessInput(frame->data() + bytes_consumed, 3));
3362 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING);
3363 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3364 bytes_consumed += 3;
3365
3366 // Send the first 100 bytes of the padding payload.
3367 EXPECT_CALL(visitor, OnStreamFrameData(1, NULL, 100, false));
3368 CHECK_EQ(100u, framer.ProcessInput(frame->data() + bytes_consumed, 100));
3369 CHECK_EQ(framer.state(), SpdyFramer::SPDY_CONSUME_PADDING);
3370 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3371 bytes_consumed += 100;
3372
3373 // Send rest of the padding payload.
3374 EXPECT_CALL(visitor, OnStreamFrameData(1, NULL, 410, false));
3375 CHECK_EQ(410u, framer.ProcessInput(frame->data() + bytes_consumed, 410));
3376 CHECK_EQ(framer.state(), SpdyFramer::SPDY_RESET);
3377 CHECK_EQ(framer.error_code(), SpdyFramer::SPDY_NO_ERROR);
3378 }
3379
3293 TEST_P(SpdyFramerTest, ReadWindowUpdate) { 3380 TEST_P(SpdyFramerTest, ReadWindowUpdate) {
3294 SpdyFramer framer(spdy_version_); 3381 SpdyFramer framer(spdy_version_);
3295 scoped_ptr<SpdyFrame> control_frame( 3382 scoped_ptr<SpdyFrame> control_frame(
3296 framer.SerializeWindowUpdate(net::SpdyWindowUpdateIR(1, 2))); 3383 framer.SerializeWindowUpdate(net::SpdyWindowUpdateIR(1, 2)));
3297 TestSpdyVisitor visitor(spdy_version_); 3384 TestSpdyVisitor visitor(spdy_version_);
3298 visitor.SimulateInFramer( 3385 visitor.SimulateInFramer(
3299 reinterpret_cast<unsigned char*>(control_frame->data()), 3386 reinterpret_cast<unsigned char*>(control_frame->data()),
3300 control_frame->size()); 3387 control_frame->size());
3301 EXPECT_EQ(1u, visitor.last_window_update_stream_); 3388 EXPECT_EQ(1u, visitor.last_window_update_stream_);
3302 EXPECT_EQ(2u, visitor.last_window_update_delta_); 3389 EXPECT_EQ(2u, visitor.last_window_update_delta_);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
3371 TEST_P(SpdyFramerTest, CreateContinuation) { 3458 TEST_P(SpdyFramerTest, CreateContinuation) {
3372 if (spdy_version_ < SPDY4) { 3459 if (spdy_version_ < SPDY4) {
3373 return; 3460 return;
3374 } 3461 }
3375 3462
3376 SpdyFramer framer(spdy_version_); 3463 SpdyFramer framer(spdy_version_);
3377 3464
3378 const char kDescription[] = "CONTINUATION frame"; 3465 const char kDescription[] = "CONTINUATION frame";
3379 3466
3380 const unsigned char kFrameData[] = { 3467 const unsigned char kFrameData[] = {
3381 0x00, 0x1a, 0x0d, 0x00, // CONTINUATION 3468 0x00, 0x12, 0x09, 0x00, // CONTINUATION
3382 0x00, 0x00, 0x00, 0x2a, // Stream 42 3469 0x00, 0x00, 0x00, 0x2a, // Stream 42
3383 0x40, 0x03, 0x62, 0x61, // @.ba 3470 0x40, 0x03, 0x62, 0x61, // @.ba
3384 0x72, 0x03, 0x66, 0x6f, // r.fo 3471 0x72, 0x03, 0x66, 0x6f, // r.fo
3385 0x6f, 0x40, 0x03, 0x66, // o@.f 3472 0x6f, 0x40, 0x03, 0x66, // o@.f
3386 0x6f, 0x6f, 0x03, 0x62, // oo.b 3473 0x6f, 0x6f, 0x03, 0x62, // oo.b
3387 0x61, 0x72, // ar 3474 0x61, 0x72, // ar
3388 }; 3475 };
3389 3476
3390 SpdyContinuationIR continuation(42); 3477 SpdyContinuationIR continuation(42);
3391 continuation.SetHeader("bar", "foo"); 3478 continuation.SetHeader("bar", "foo");
(...skipping 25 matching lines...) Expand all
3417 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_); 3504 EXPECT_EQ(57u, visitor.last_push_promise_promised_stream_);
3418 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); 3505 EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_));
3419 } 3506 }
3420 3507
3421 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) { 3508 TEST_P(SpdyFramerTest, ReadHeadersWithContinuation) {
3422 if (spdy_version_ < 4) { 3509 if (spdy_version_ < 4) {
3423 return; 3510 return;
3424 } 3511 }
3425 3512
3426 const unsigned char kInput[] = { 3513 const unsigned char kInput[] = {
3427 0x00, 0x18, 0x08, 0x00, // HEADERS 3514 0x00, 0x10, 0x01, 0x00, // HEADERS
3428 0x00, 0x00, 0x00, 0x01, // Stream 1 3515 0x00, 0x00, 0x00, 0x01, // Stream 1
3429 0x40, 0x06, 0x43, 0x6f, 3516 0x40, 0x06, 0x43, 0x6f,
3430 0x6f, 0x6b, 0x69, 0x65, 3517 0x6f, 0x6b, 0x69, 0x65,
3431 0x07, 0x66, 0x6f, 0x6f, 3518 0x07, 0x66, 0x6f, 0x6f,
3432 0x3d, 0x62, 0x61, 0x72, 3519 0x3d, 0x62, 0x61, 0x72,
3433 3520
3434 0x00, 0x1c, 0x0D, 0x00, // CONTINUATION 3521 0x00, 0x14, 0x09, 0x00, // CONTINUATION
3435 0x00, 0x00, 0x00, 0x01, // Stream 1 3522 0x00, 0x00, 0x00, 0x01, // Stream 1
3436 0x40, 0x06, 0x43, 0x6f, 3523 0x40, 0x06, 0x43, 0x6f,
3437 0x6f, 0x6b, 0x69, 0x65, 3524 0x6f, 0x6b, 0x69, 0x65,
3438 0x08, 0x62, 0x61, 0x7a, 3525 0x08, 0x62, 0x61, 0x7a,
3439 0x3d, 0x62, 0x69, 0x6e, 3526 0x3d, 0x62, 0x69, 0x6e,
3440 0x67, 0x40, 0x06, 0x43, 3527 0x67, 0x40, 0x06, 0x43,
3441 3528
3442 0x00, 0x1a, 0x0D, 0x04, // CONTINUATION: END_HEADERS 3529 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS
3443 0x00, 0x00, 0x00, 0x01, // Stream 1 3530 0x00, 0x00, 0x00, 0x01, // Stream 1
3444 0x6f, 0x6f, 0x6b, 0x69, 3531 0x6f, 0x6f, 0x6b, 0x69,
3445 0x65, 0x00, 0x40, 0x04, 3532 0x65, 0x00, 0x40, 0x04,
3446 0x6e, 0x61, 0x6d, 0x65, 3533 0x6e, 0x61, 0x6d, 0x65,
3447 0x05, 0x76, 0x61, 0x6c, 3534 0x05, 0x76, 0x61, 0x6c,
3448 0x75, 0x65, 3535 0x75, 0x65,
3449 }; 3536 };
3450 3537
3451 SpdyFramer framer(spdy_version_); 3538 SpdyFramer framer(spdy_version_);
3452 TestSpdyVisitor visitor(spdy_version_); 3539 TestSpdyVisitor visitor(spdy_version_);
3453 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3540 visitor.SimulateInFramer(kInput, sizeof(kInput));
3454 3541
3455 EXPECT_EQ(0, visitor.error_count_); 3542 EXPECT_EQ(0, visitor.error_count_);
3456 EXPECT_EQ(1, visitor.headers_frame_count_); 3543 EXPECT_EQ(1, visitor.headers_frame_count_);
3457 EXPECT_EQ(2, visitor.continuation_count_); 3544 EXPECT_EQ(2, visitor.continuation_count_);
3458 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_); 3545 EXPECT_EQ(1, visitor.zero_length_control_frame_header_data_count_);
3459 EXPECT_EQ(0, visitor.zero_length_data_frame_count_); 3546 EXPECT_EQ(0, visitor.zero_length_data_frame_count_);
3460 3547
3461 EXPECT_THAT(visitor.headers_, ElementsAre( 3548 EXPECT_THAT(visitor.headers_, ElementsAre(
3462 Pair("Cookie", "foo=bar; baz=bing; "), 3549 Pair("Cookie", "foo=bar; baz=bing; "),
3463 Pair("name", "value"))); 3550 Pair("name", "value")));
3464 } 3551 }
3465 3552
3466 TEST_P(SpdyFramerTest, ReadHeadersWithContinuationAndFin) { 3553 TEST_P(SpdyFramerTest, ReadHeadersWithContinuationAndFin) {
3467 if (spdy_version_ < 4) { 3554 if (spdy_version_ < 4) {
3468 return; 3555 return;
3469 } 3556 }
3470 3557
3471 const unsigned char kInput[] = { 3558 const unsigned char kInput[] = {
3472 0x00, 0x18, 0x08, 0x01, // HEADERS: FIN 3559 0x00, 0x10, 0x01, 0x01, // HEADERS: FIN
3473 0x00, 0x00, 0x00, 0x01, // Stream 1 3560 0x00, 0x00, 0x00, 0x01, // Stream 1
3474 0x40, 0x06, 0x43, 0x6f, 3561 0x40, 0x06, 0x43, 0x6f,
3475 0x6f, 0x6b, 0x69, 0x65, 3562 0x6f, 0x6b, 0x69, 0x65,
3476 0x07, 0x66, 0x6f, 0x6f, 3563 0x07, 0x66, 0x6f, 0x6f,
3477 0x3d, 0x62, 0x61, 0x72, 3564 0x3d, 0x62, 0x61, 0x72,
3478 3565
3479 0x00, 0x1c, 0x0D, 0x00, // CONTINUATION 3566 0x00, 0x14, 0x09, 0x00, // CONTINUATION
3480 0x00, 0x00, 0x00, 0x01, // Stream 1 3567 0x00, 0x00, 0x00, 0x01, // Stream 1
3481 0x40, 0x06, 0x43, 0x6f, 3568 0x40, 0x06, 0x43, 0x6f,
3482 0x6f, 0x6b, 0x69, 0x65, 3569 0x6f, 0x6b, 0x69, 0x65,
3483 0x08, 0x62, 0x61, 0x7a, 3570 0x08, 0x62, 0x61, 0x7a,
3484 0x3d, 0x62, 0x69, 0x6e, 3571 0x3d, 0x62, 0x69, 0x6e,
3485 0x67, 0x40, 0x06, 0x43, 3572 0x67, 0x40, 0x06, 0x43,
3486 3573
3487 0x00, 0x1a, 0x0D, 0x04, // CONTINUATION: END_HEADERS 3574 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS
3488 0x00, 0x00, 0x00, 0x01, // Stream 1 3575 0x00, 0x00, 0x00, 0x01, // Stream 1
3489 0x6f, 0x6f, 0x6b, 0x69, 3576 0x6f, 0x6f, 0x6b, 0x69,
3490 0x65, 0x00, 0x40, 0x04, 3577 0x65, 0x00, 0x40, 0x04,
3491 0x6e, 0x61, 0x6d, 0x65, 3578 0x6e, 0x61, 0x6d, 0x65,
3492 0x05, 0x76, 0x61, 0x6c, 3579 0x05, 0x76, 0x61, 0x6c,
3493 0x75, 0x65, 3580 0x75, 0x65,
3494 }; 3581 };
3495 3582
3496 SpdyFramer framer(spdy_version_); 3583 SpdyFramer framer(spdy_version_);
3497 TestSpdyVisitor visitor(spdy_version_); 3584 TestSpdyVisitor visitor(spdy_version_);
(...skipping 10 matching lines...) Expand all
3508 Pair("Cookie", "foo=bar; baz=bing; "), 3595 Pair("Cookie", "foo=bar; baz=bing; "),
3509 Pair("name", "value"))); 3596 Pair("name", "value")));
3510 } 3597 }
3511 3598
3512 TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) { 3599 TEST_P(SpdyFramerTest, ReadPushPromiseWithContinuation) {
3513 if (spdy_version_ < 4) { 3600 if (spdy_version_ < 4) {
3514 return; 3601 return;
3515 } 3602 }
3516 3603
3517 const unsigned char kInput[] = { 3604 const unsigned char kInput[] = {
3518 0x00, 0x1c, 0x0C, 0x00, // PUSH_PROMISE 3605 0x00, 0x14, 0x05, 0x00, // PUSH_PROMISE
3519 0x00, 0x00, 0x00, 0x01, // Stream 1 3606 0x00, 0x00, 0x00, 0x01, // Stream 1
3520 0x00, 0x00, 0x00, 0x2A, // Promised stream 42 3607 0x00, 0x00, 0x00, 0x2A, // Promised stream 42
3521 0x40, 0x06, 0x43, 0x6f, 3608 0x40, 0x06, 0x43, 0x6f,
3522 0x6f, 0x6b, 0x69, 0x65, 3609 0x6f, 0x6b, 0x69, 0x65,
3523 0x07, 0x66, 0x6f, 0x6f, 3610 0x07, 0x66, 0x6f, 0x6f,
3524 0x3d, 0x62, 0x61, 0x72, 3611 0x3d, 0x62, 0x61, 0x72,
3525 3612
3526 0x00, 0x1c, 0x0D, 0x00, // CONTINUATION 3613 0x00, 0x14, 0x09, 0x00, // CONTINUATION
3527 0x00, 0x00, 0x00, 0x01, // Stream 1 3614 0x00, 0x00, 0x00, 0x01, // Stream 1
3528 0x40, 0x06, 0x43, 0x6f, 3615 0x40, 0x06, 0x43, 0x6f,
3529 0x6f, 0x6b, 0x69, 0x65, 3616 0x6f, 0x6b, 0x69, 0x65,
3530 0x08, 0x62, 0x61, 0x7a, 3617 0x08, 0x62, 0x61, 0x7a,
3531 0x3d, 0x62, 0x69, 0x6e, 3618 0x3d, 0x62, 0x69, 0x6e,
3532 0x67, 0x40, 0x06, 0x43, 3619 0x67, 0x40, 0x06, 0x43,
3533 3620
3534 0x00, 0x1a, 0x0D, 0x04, // CONTINUATION: END_HEADERS 3621 0x00, 0x12, 0x09, 0x04, // CONTINUATION: END_HEADERS
3535 0x00, 0x00, 0x00, 0x01, // Stream 1 3622 0x00, 0x00, 0x00, 0x01, // Stream 1
3536 0x6f, 0x6f, 0x6b, 0x69, 3623 0x6f, 0x6f, 0x6b, 0x69,
3537 0x65, 0x00, 0x40, 0x04, 3624 0x65, 0x00, 0x40, 0x04,
3538 0x6e, 0x61, 0x6d, 0x65, 3625 0x6e, 0x61, 0x6d, 0x65,
3539 0x05, 0x76, 0x61, 0x6c, 3626 0x05, 0x76, 0x61, 0x6c,
3540 0x75, 0x65, 3627 0x75, 0x65,
3541 }; 3628 };
3542 3629
3543 SpdyFramer framer(spdy_version_); 3630 SpdyFramer framer(spdy_version_);
3544 TestSpdyVisitor visitor(spdy_version_); 3631 TestSpdyVisitor visitor(spdy_version_);
(...skipping 10 matching lines...) Expand all
3555 Pair("Cookie", "foo=bar; baz=bing; "), 3642 Pair("Cookie", "foo=bar; baz=bing; "),
3556 Pair("name", "value"))); 3643 Pair("name", "value")));
3557 } 3644 }
3558 3645
3559 TEST_P(SpdyFramerTest, ReadContinuationWithWrongStreamId) { 3646 TEST_P(SpdyFramerTest, ReadContinuationWithWrongStreamId) {
3560 if (spdy_version_ < 4) { 3647 if (spdy_version_ < 4) {
3561 return; 3648 return;
3562 } 3649 }
3563 3650
3564 const unsigned char kInput[] = { 3651 const unsigned char kInput[] = {
3565 0x00, 0x18, 0x08, 0x00, // HEADERS 3652 0x00, 0x10, 0x01, 0x00, // HEADERS
3566 0x00, 0x00, 0x00, 0x01, // Stream 1 3653 0x00, 0x00, 0x00, 0x01, // Stream 1
3567 0x40, 0x06, 0x43, 0x6f, 3654 0x40, 0x06, 0x43, 0x6f,
3568 0x6f, 0x6b, 0x69, 0x65, 3655 0x6f, 0x6b, 0x69, 0x65,
3569 0x07, 0x66, 0x6f, 0x6f, 3656 0x07, 0x66, 0x6f, 0x6f,
3570 0x3d, 0x62, 0x61, 0x72, 3657 0x3d, 0x62, 0x61, 0x72,
3571 3658
3572 0x00, 0x1c, 0x0D, 0x00, // CONTINUATION 3659 0x00, 0x14, 0x09, 0x00, // CONTINUATION
3573 0x00, 0x00, 0x00, 0x02, // Stream 2 3660 0x00, 0x00, 0x00, 0x02, // Stream 2
3574 0x40, 0x06, 0x43, 0x6f, 3661 0x40, 0x06, 0x43, 0x6f,
3575 0x6f, 0x6b, 0x69, 0x65, 3662 0x6f, 0x6b, 0x69, 0x65,
3576 0x08, 0x62, 0x61, 0x7a, 3663 0x08, 0x62, 0x61, 0x7a,
3577 0x3d, 0x62, 0x69, 0x6e, 3664 0x3d, 0x62, 0x69, 0x6e,
3578 0x67, 0x40, 0x06, 0x43, 3665 0x67, 0x40, 0x06, 0x43,
3579 }; 3666 };
3580 3667
3581 SpdyFramer framer(spdy_version_); 3668 SpdyFramer framer(spdy_version_);
3582 TestSpdyVisitor visitor(spdy_version_); 3669 TestSpdyVisitor visitor(spdy_version_);
3583 framer.set_visitor(&visitor); 3670 framer.set_visitor(&visitor);
3584 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3671 visitor.SimulateInFramer(kInput, sizeof(kInput));
3585 3672
3586 EXPECT_EQ(1, visitor.error_count_); 3673 EXPECT_EQ(1, visitor.error_count_);
3587 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME, 3674 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME,
3588 visitor.framer_.error_code()) 3675 visitor.framer_.error_code())
3589 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3676 << SpdyFramer::ErrorCodeToString(framer.error_code());
3590 EXPECT_EQ(1, visitor.headers_frame_count_); 3677 EXPECT_EQ(1, visitor.headers_frame_count_);
3591 EXPECT_EQ(0, visitor.continuation_count_); 3678 EXPECT_EQ(0, visitor.continuation_count_);
3592 EXPECT_EQ(0u, visitor.header_buffer_length_); 3679 EXPECT_EQ(0u, visitor.header_buffer_length_);
3593 } 3680 }
3594 3681
3595 TEST_P(SpdyFramerTest, ReadContinuationOutOfOrder) { 3682 TEST_P(SpdyFramerTest, ReadContinuationOutOfOrder) {
3596 if (spdy_version_ < 4) { 3683 if (spdy_version_ < 4) {
3597 return; 3684 return;
3598 } 3685 }
3599 3686
3600 const unsigned char kInput[] = { 3687 const unsigned char kInput[] = {
3601 0x00, 0x18, 0x0D, 0x00, // CONTINUATION 3688 0x00, 0x10, 0x09, 0x00, // CONTINUATION
3602 0x00, 0x00, 0x00, 0x01, // Stream 1 3689 0x00, 0x00, 0x00, 0x01, // Stream 1
3603 0x40, 0x06, 0x43, 0x6f, 3690 0x40, 0x06, 0x43, 0x6f,
3604 0x6f, 0x6b, 0x69, 0x65, 3691 0x6f, 0x6b, 0x69, 0x65,
3605 0x07, 0x66, 0x6f, 0x6f, 3692 0x07, 0x66, 0x6f, 0x6f,
3606 0x3d, 0x62, 0x61, 0x72, 3693 0x3d, 0x62, 0x61, 0x72,
3607 }; 3694 };
3608 3695
3609 SpdyFramer framer(spdy_version_); 3696 SpdyFramer framer(spdy_version_);
3610 TestSpdyVisitor visitor(spdy_version_); 3697 TestSpdyVisitor visitor(spdy_version_);
3611 framer.set_visitor(&visitor); 3698 framer.set_visitor(&visitor);
3612 visitor.SimulateInFramer(kInput, sizeof(kInput)); 3699 visitor.SimulateInFramer(kInput, sizeof(kInput));
3613 3700
3614 EXPECT_EQ(1, visitor.error_count_); 3701 EXPECT_EQ(1, visitor.error_count_);
3615 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME, 3702 EXPECT_EQ(SpdyFramer::SPDY_UNEXPECTED_FRAME,
3616 visitor.framer_.error_code()) 3703 visitor.framer_.error_code())
3617 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3704 << SpdyFramer::ErrorCodeToString(framer.error_code());
3618 EXPECT_EQ(0, visitor.continuation_count_); 3705 EXPECT_EQ(0, visitor.continuation_count_);
3619 EXPECT_EQ(0u, visitor.header_buffer_length_); 3706 EXPECT_EQ(0u, visitor.header_buffer_length_);
3620 } 3707 }
3621 3708
3622 TEST_P(SpdyFramerTest, ExpectContinuationReceiveData) { 3709 TEST_P(SpdyFramerTest, ExpectContinuationReceiveData) {
3623 if (spdy_version_ < 4) { 3710 if (spdy_version_ < 4) {
3624 return; 3711 return;
3625 } 3712 }
3626 3713
3627 const unsigned char kInput[] = { 3714 const unsigned char kInput[] = {
3628 0x00, 0x18, 0x08, 0x00, // HEADERS 3715 0x00, 0x10, 0x01, 0x00, // HEADERS
3629 0x00, 0x00, 0x00, 0x01, // Stream 1 3716 0x00, 0x00, 0x00, 0x01, // Stream 1
3630 0x40, 0x06, 0x43, 0x6f, 3717 0x40, 0x06, 0x43, 0x6f,
3631 0x6f, 0x6b, 0x69, 0x65, 3718 0x6f, 0x6b, 0x69, 0x65,
3632 0x07, 0x66, 0x6f, 0x6f, 3719 0x07, 0x66, 0x6f, 0x6f,
3633 0x3d, 0x62, 0x61, 0x72, 3720 0x3d, 0x62, 0x61, 0x72,
3634 3721
3635 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1 3722 0x00, 0x00, 0x00, 0x01, // DATA on Stream #1
3636 0x00, 0x00, 0x00, 0x04, 3723 0x00, 0x00, 0x00, 0x04,
3637 0xde, 0xad, 0xbe, 0xef, 3724 0xde, 0xad, 0xbe, 0xef,
3638 }; 3725 };
(...skipping 12 matching lines...) Expand all
3651 EXPECT_EQ(0u, visitor.header_buffer_length_); 3738 EXPECT_EQ(0u, visitor.header_buffer_length_);
3652 EXPECT_EQ(0, visitor.data_frame_count_); 3739 EXPECT_EQ(0, visitor.data_frame_count_);
3653 } 3740 }
3654 3741
3655 TEST_P(SpdyFramerTest, ExpectContinuationReceiveControlFrame) { 3742 TEST_P(SpdyFramerTest, ExpectContinuationReceiveControlFrame) {
3656 if (spdy_version_ < 4) { 3743 if (spdy_version_ < 4) {
3657 return; 3744 return;
3658 } 3745 }
3659 3746
3660 const unsigned char kInput[] = { 3747 const unsigned char kInput[] = {
3661 0x00, 0x18, 0x08, 0x00, // HEADERS 3748 0x00, 0x10, 0x01, 0x00, // HEADERS
3662 0x00, 0x00, 0x00, 0x01, // Stream 1 3749 0x00, 0x00, 0x00, 0x01, // Stream 1
3663 0x40, 0x06, 0x43, 0x6f, 3750 0x40, 0x06, 0x43, 0x6f,
3664 0x6f, 0x6b, 0x69, 0x65, 3751 0x6f, 0x6b, 0x69, 0x65,
3665 0x07, 0x66, 0x6f, 0x6f, 3752 0x07, 0x66, 0x6f, 0x6f,
3666 0x3d, 0x62, 0x61, 0x72, 3753 0x3d, 0x62, 0x61, 0x72,
3667 3754
3668 0x00, 0x1c, 0x08, 0x00, // HEADERS 3755 0x00, 0x14, 0x08, 0x00, // HEADERS
3669 0x00, 0x00, 0x00, 0x01, // Stream 1 3756 0x00, 0x00, 0x00, 0x01, // Stream 1
3670 0x40, 0x06, 0x43, 0x6f, // (Note this is a valid continued encoding). 3757 0x40, 0x06, 0x43, 0x6f, // (Note this is a valid continued encoding).
3671 0x6f, 0x6b, 0x69, 0x65, 3758 0x6f, 0x6b, 0x69, 0x65,
3672 0x08, 0x62, 0x61, 0x7a, 3759 0x08, 0x62, 0x61, 0x7a,
3673 0x3d, 0x62, 0x69, 0x6e, 3760 0x3d, 0x62, 0x69, 0x6e,
3674 0x67, 0x40, 0x06, 0x43, 3761 0x67, 0x40, 0x06, 0x43,
3675 }; 3762 };
3676 3763
3677 SpdyFramer framer(spdy_version_); 3764 SpdyFramer framer(spdy_version_);
3678 TestSpdyVisitor visitor(spdy_version_); 3765 TestSpdyVisitor visitor(spdy_version_);
(...skipping 13 matching lines...) Expand all
3692 TEST_P(SpdyFramerTest, ReadGarbage) { 3779 TEST_P(SpdyFramerTest, ReadGarbage) {
3693 SpdyFramer framer(spdy_version_); 3780 SpdyFramer framer(spdy_version_);
3694 unsigned char garbage_frame[256]; 3781 unsigned char garbage_frame[256];
3695 memset(garbage_frame, ~0, sizeof(garbage_frame)); 3782 memset(garbage_frame, ~0, sizeof(garbage_frame));
3696 TestSpdyVisitor visitor(spdy_version_); 3783 TestSpdyVisitor visitor(spdy_version_);
3697 visitor.use_compression_ = false; 3784 visitor.use_compression_ = false;
3698 visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame)); 3785 visitor.SimulateInFramer(garbage_frame, sizeof(garbage_frame));
3699 EXPECT_EQ(1, visitor.error_count_); 3786 EXPECT_EQ(1, visitor.error_count_);
3700 } 3787 }
3701 3788
3789 TEST_P(SpdyFramerTest, ReadGarbageWithValidLength) {
3790 if (!IsSpdy4()) {
3791 return;
3792 }
3793 SpdyFramer framer(spdy_version_);
3794 const unsigned char kFrameData[] = {
3795 0x00, 0x10, 0xff, 0xff,
3796 0xff, 0xff, 0xff, 0xff,
3797 0xff, 0xff, 0xff, 0xff,
3798 0xff, 0xff, 0xff, 0xff,
3799 };
3800 TestSpdyVisitor visitor(spdy_version_);
3801 visitor.use_compression_ = false;
3802 visitor.SimulateInFramer(kFrameData, arraysize(kFrameData));
3803 EXPECT_EQ(1, visitor.error_count_);
3804 }
3805
3702 TEST_P(SpdyFramerTest, ReadGarbageWithValidVersion) { 3806 TEST_P(SpdyFramerTest, ReadGarbageWithValidVersion) {
3703 if (IsSpdy4()) { 3807 if (IsSpdy4()) {
3704 // Not valid for SPDY 4 since there is no version field. 3808 // Not valid for SPDY 4 since there is no version field.
3705 return; 3809 return;
3706 } 3810 }
3707 SpdyFramer framer(spdy_version_); 3811 SpdyFramer framer(spdy_version_);
3708 const unsigned char kFrameData[] = { 3812 const unsigned char kFrameData[] = {
3709 0x80, spdy_version_ch_, 0xff, 0xff, 3813 0x80, spdy_version_ch_, 0xff, 0xff,
3710 0xff, 0xff, 0xff, 0xff, 3814 0xff, 0xff, 0xff, 0xff,
3711 }; 3815 };
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
3885 3989
3886 EXPECT_CALL(visitor, OnError(_)); 3990 EXPECT_CALL(visitor, OnError(_));
3887 framer.ProcessInput("HTTP/1.0", 8); 3991 framer.ProcessInput("HTTP/1.0", 8);
3888 EXPECT_TRUE(framer.probable_http_response()); 3992 EXPECT_TRUE(framer.probable_http_response());
3889 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state()); 3993 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3890 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code()) 3994 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code())
3891 << SpdyFramer::ErrorCodeToString(framer.error_code()); 3995 << SpdyFramer::ErrorCodeToString(framer.error_code());
3892 } 3996 }
3893 } 3997 }
3894 3998
3895 TEST_P(SpdyFramerTest, DataFrameFlags) { 3999 TEST_P(SpdyFramerTest, DataFrameFlagsV2V3) {
4000 if (spdy_version_ >= 4) {
4001 return;
4002 }
4003
3896 for (int flags = 0; flags < 256; ++flags) { 4004 for (int flags = 0; flags < 256; ++flags) {
3897 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4005 SCOPED_TRACE(testing::Message() << "Flags " << flags);
3898 4006
3899 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4007 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3900 SpdyFramer framer(spdy_version_); 4008 SpdyFramer framer(spdy_version_);
3901 framer.set_visitor(&visitor); 4009 framer.set_visitor(&visitor);
3902 4010
3903 net::SpdyDataIR data_ir(1, StringPiece("hello", 5)); 4011 net::SpdyDataIR data_ir(1, StringPiece("hello", 5));
3904 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir)); 4012 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
3905 SetFrameFlags(frame.get(), flags, spdy_version_); 4013 SetFrameFlags(frame.get(), flags, spdy_version_);
(...skipping 15 matching lines...) Expand all
3921 framer.error_code()) 4029 framer.error_code())
3922 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4030 << SpdyFramer::ErrorCodeToString(framer.error_code());
3923 } else { 4031 } else {
3924 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); 4032 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
3925 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4033 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
3926 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4034 << SpdyFramer::ErrorCodeToString(framer.error_code());
3927 } 4035 }
3928 } 4036 }
3929 } 4037 }
3930 4038
4039 TEST_P(SpdyFramerTest, DataFrameFlagsV4) {
4040 if (spdy_version_ < 4) {
4041 return;
4042 }
4043
4044 uint8 valid_data_flags = DATA_FLAG_FIN | DATA_FLAG_END_SEGMENT |
4045 DATA_FLAG_PAD_LOW | DATA_FLAG_PAD_HIGH;
4046
4047 for (int flags = 0; flags < 256; ++flags) {
4048 SCOPED_TRACE(testing::Message() << "Flags " << flags);
4049
4050 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4051 SpdyFramer framer(spdy_version_);
4052 framer.set_visitor(&visitor);
4053
4054 net::SpdyDataIR data_ir(1, StringPiece("hello", 5));
4055 scoped_ptr<SpdyFrame> frame(framer.SerializeData(data_ir));
4056 SetFrameFlags(frame.get(), flags, spdy_version_);
4057
4058 if (flags & ~valid_data_flags) {
4059 EXPECT_CALL(visitor, OnError(_));
4060 } else {
4061 EXPECT_CALL(visitor, OnDataFrameHeader(1, 5, flags & DATA_FLAG_FIN));
4062 if ((flags & DATA_FLAG_PAD_LOW) || (flags & DATA_FLAG_PAD_HIGH)) {
4063 // Expect Error since we don't set pad_high and pad_low in payload.
4064 EXPECT_CALL(visitor, OnError(_));
4065 } else {
4066 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, false));
4067 if (flags & DATA_FLAG_FIN) {
4068 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, true));
4069 }
4070 }
4071 }
4072
4073 framer.ProcessInput(frame->data(), frame->size());
4074 if ((flags & ~valid_data_flags) || (flags & DATA_FLAG_PAD_LOW) ||
4075 (flags & DATA_FLAG_PAD_HIGH)) {
4076 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
4077 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS,
4078 framer.error_code())
4079 << SpdyFramer::ErrorCodeToString(framer.error_code());
4080 } else {
4081 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
4082 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4083 << SpdyFramer::ErrorCodeToString(framer.error_code());
4084 }
4085 }
4086 }
4087
3931 TEST_P(SpdyFramerTest, SynStreamFrameFlags) { 4088 TEST_P(SpdyFramerTest, SynStreamFrameFlags) {
3932 for (int flags = 0; flags < 256; ++flags) { 4089 for (int flags = 0; flags < 256; ++flags) {
3933 SCOPED_TRACE(testing::Message() << "Flags " << flags); 4090 SCOPED_TRACE(testing::Message() << "Flags " << flags);
3934 4091
3935 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4092 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
3936 testing::StrictMock<test::MockDebugVisitor> debug_visitor; 4093 testing::StrictMock<test::MockDebugVisitor> debug_visitor;
3937 SpdyFramer framer(spdy_version_); 4094 SpdyFramer framer(spdy_version_);
3938 framer.set_visitor(&visitor); 4095 framer.set_visitor(&visitor);
3939 framer.set_debug_visitor(&debug_visitor); 4096 framer.set_debug_visitor(&debug_visitor);
3940 4097
(...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after
4430 SpdyFramer framer(spdy_version_); 4587 SpdyFramer framer(spdy_version_);
4431 framer.set_visitor(&visitor); 4588 framer.set_visitor(&visitor);
4432 framer.set_debug_visitor(&debug_visitor); 4589 framer.set_debug_visitor(&debug_visitor);
4433 4590
4434 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(1, SYN_STREAM, _, _)); 4591 EXPECT_CALL(debug_visitor, OnSendCompressedFrame(1, SYN_STREAM, _, _));
4435 4592
4436 SpdySynStreamIR syn_stream(1); 4593 SpdySynStreamIR syn_stream(1);
4437 syn_stream.set_priority(1); 4594 syn_stream.set_priority(1);
4438 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream)); 4595 scoped_ptr<SpdyFrame> frame(framer.SerializeSynStream(syn_stream));
4439 // Adjust size to remove the name/value block. 4596 // Adjust size to remove the name/value block.
4440 if (IsSpdy4()) { 4597 SetFrameLength(
4441 SetFrameLength( 4598 frame.get(),
4442 frame.get(), 4599 framer.GetSynStreamMinimumSize() - framer.GetControlFrameHeaderSize(),
4443 framer.GetSynStreamMinimumSize(), 4600 spdy_version_);
4444 spdy_version_);
4445 } else {
4446 SetFrameLength(
4447 frame.get(),
4448 framer.GetSynStreamMinimumSize() - framer.GetControlFrameHeaderSize(),
4449 spdy_version_);
4450 }
4451 4601
4452 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(1, SYN_STREAM, _)); 4602 EXPECT_CALL(debug_visitor, OnReceiveCompressedFrame(1, SYN_STREAM, _));
4453 EXPECT_CALL(visitor, OnSynStream(1, 0, 1, false, false)); 4603 EXPECT_CALL(visitor, OnSynStream(1, 0, 1, false, false));
4454 EXPECT_CALL(visitor, OnControlFrameHeaderData(1, NULL, 0)); 4604 EXPECT_CALL(visitor, OnControlFrameHeaderData(1, NULL, 0));
4455 4605
4456 framer.ProcessInput(frame->data(), framer.GetSynStreamMinimumSize()); 4606 framer.ProcessInput(frame->data(), framer.GetSynStreamMinimumSize());
4457 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); 4607 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
4458 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4608 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4459 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4609 << SpdyFramer::ErrorCodeToString(framer.error_code());
4460 } 4610 }
(...skipping 14 matching lines...) Expand all
4475 TEST_P(SpdyFramerTest, RstStreamStatusBounds) { 4625 TEST_P(SpdyFramerTest, RstStreamStatusBounds) {
4476 DCHECK_GE(0xff, RST_STREAM_NUM_STATUS_CODES); 4626 DCHECK_GE(0xff, RST_STREAM_NUM_STATUS_CODES);
4477 4627
4478 const unsigned char kV3RstStreamInvalid[] = { 4628 const unsigned char kV3RstStreamInvalid[] = {
4479 0x80, spdy_version_ch_, 0x00, 0x03, 4629 0x80, spdy_version_ch_, 0x00, 0x03,
4480 0x00, 0x00, 0x00, 0x08, 4630 0x00, 0x00, 0x00, 0x08,
4481 0x00, 0x00, 0x00, 0x01, 4631 0x00, 0x00, 0x00, 0x01,
4482 0x00, 0x00, 0x00, RST_STREAM_INVALID 4632 0x00, 0x00, 0x00, RST_STREAM_INVALID
4483 }; 4633 };
4484 const unsigned char kV4RstStreamInvalid[] = { 4634 const unsigned char kV4RstStreamInvalid[] = {
4485 0x00, 0x0c, 0x03, 0x00, 4635 0x00, 0x04, 0x03, 0x00,
4486 0x00, 0x00, 0x00, 0x01, 4636 0x00, 0x00, 0x00, 0x01,
4487 0x00, 0x00, 0x00, RST_STREAM_INVALID 4637 0x00, 0x00, 0x00, RST_STREAM_INVALID
4488 }; 4638 };
4489 4639
4490 const unsigned char kV3RstStreamNumStatusCodes[] = { 4640 const unsigned char kV3RstStreamNumStatusCodes[] = {
4491 0x80, spdy_version_ch_, 0x00, 0x03, 4641 0x80, spdy_version_ch_, 0x00, 0x03,
4492 0x00, 0x00, 0x00, 0x08, 4642 0x00, 0x00, 0x00, 0x08,
4493 0x00, 0x00, 0x00, 0x01, 4643 0x00, 0x00, 0x00, 0x01,
4494 0x00, 0x00, 0x00, RST_STREAM_NUM_STATUS_CODES 4644 0x00, 0x00, 0x00, RST_STREAM_NUM_STATUS_CODES
4495 }; 4645 };
4496 const unsigned char kV4RstStreamNumStatusCodes[] = { 4646 const unsigned char kV4RstStreamNumStatusCodes[] = {
4497 0x00, 0x0c, 0x03, 0x00, 4647 0x00, 0x04, 0x03, 0x00,
4498 0x00, 0x00, 0x00, 0x01, 4648 0x00, 0x00, 0x00, 0x01,
4499 0x00, 0x00, 0x00, RST_STREAM_NUM_STATUS_CODES 4649 0x00, 0x00, 0x00, RST_STREAM_NUM_STATUS_CODES
4500 }; 4650 };
4501 4651
4502 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4652 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4503 SpdyFramer framer(spdy_version_); 4653 SpdyFramer framer(spdy_version_);
4504 framer.set_visitor(&visitor); 4654 framer.set_visitor(&visitor);
4505 4655
4506 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INVALID)); 4656 EXPECT_CALL(visitor, OnRstStream(1, RST_STREAM_INVALID));
4507 if (IsSpdy4()) { 4657 if (IsSpdy4()) {
(...skipping 29 matching lines...) Expand all
4537 0x00, 0x00, 0x00, 0x04, 4687 0x00, 0x00, 0x00, 0x04,
4538 0xff, 0xff, 0xff, 0xff, 4688 0xff, 0xff, 0xff, 0xff,
4539 }; 4689 };
4540 const unsigned char kV3FrameData[] = { 4690 const unsigned char kV3FrameData[] = {
4541 0x80, spdy_version_ch_, 0x00, 0x07, 4691 0x80, spdy_version_ch_, 0x00, 0x07,
4542 0x00, 0x00, 0x00, 0x08, 4692 0x00, 0x00, 0x00, 0x08,
4543 0xff, 0xff, 0xff, 0xff, 4693 0xff, 0xff, 0xff, 0xff,
4544 0x00, 0x00, 0x00, 0x00, 4694 0x00, 0x00, 0x00, 0x00,
4545 }; 4695 };
4546 const unsigned char kV4FrameData[] = { 4696 const unsigned char kV4FrameData[] = {
4547 0x00, 0x10, 0x07, 0x00, 4697 0x00, 0x08, 0x07, 0x00,
4548 0x00, 0x00, 0x00, 0x00, 4698 0x00, 0x00, 0x00, 0x00,
4549 0xff, 0xff, 0xff, 0xff, 4699 0xff, 0xff, 0xff, 0xff,
4550 0x00, 0x00, 0x00, 0x00, 4700 0x00, 0x00, 0x00, 0x00,
4551 }; 4701 };
4552 4702
4553 testing::StrictMock<test::MockSpdyFramerVisitor> visitor; 4703 testing::StrictMock<test::MockSpdyFramerVisitor> visitor;
4554 SpdyFramer framer(spdy_version_); 4704 SpdyFramer framer(spdy_version_);
4555 framer.set_visitor(&visitor); 4705 framer.set_visitor(&visitor);
4556 4706
4557 EXPECT_CALL(visitor, OnGoAway(0x7fffffff, GOAWAY_OK)); 4707 EXPECT_CALL(visitor, OnGoAway(0x7fffffff, GOAWAY_OK));
(...skipping 28 matching lines...) Expand all
4586 SpdyBlockedIR blocked_ir(0); 4736 SpdyBlockedIR blocked_ir(0);
4587 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); 4737 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir));
4588 framer.ProcessInput(frame->data(), framer.GetBlockedSize()); 4738 framer.ProcessInput(frame->data(), framer.GetBlockedSize());
4589 4739
4590 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); 4740 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
4591 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4741 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4592 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4742 << SpdyFramer::ErrorCodeToString(framer.error_code());
4593 } 4743 }
4594 4744
4595 } // namespace net 4745 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | net/spdy/spdy_network_transaction_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698