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

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

Issue 2367973002: Log compressed size of HTTP/2 requests. (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/spdy/spdy_headers_block_parser.cc ('k') | net/spdy/spdy_headers_handler_interface.h » ('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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "net/spdy/spdy_headers_block_parser.h" 5 #include "net/spdy/spdy_headers_block_parser.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <string> 8 #include <string>
9 9
10 #include "base/strings/string_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
11 #include "base/sys_byteorder.h" 11 #include "base/sys_byteorder.h"
12 #include "net/spdy/spdy_flags.h"
12 #include "net/spdy/spdy_test_utils.h" 13 #include "net/spdy/spdy_test_utils.h"
13 #include "net/test/gtest_util.h" 14 #include "net/test/gtest_util.h"
14 #include "testing/gmock/include/gmock/gmock.h" 15 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h" 16 #include "testing/gtest/include/gtest/gtest.h"
16 17
18 using testing::_;
19
17 namespace net { 20 namespace net {
18 21
19 using base::IntToString; 22 using base::IntToString;
20 using base::StringPiece; 23 using base::StringPiece;
21 using base::UintToString; 24 using base::UintToString;
22 using std::string; 25 using std::string;
23 26
24 // A mock the handler class to check that we parse out the correct headers 27 // A mock the handler class to check that we parse out the correct headers
25 // and call the callback methods when we should. 28 // and call the callback methods when we should.
26 class MockSpdyHeadersHandler : public SpdyHeadersHandlerInterface { 29 class MockSpdyHeadersHandler : public SpdyHeadersHandlerInterface {
27 public: 30 public:
28 MOCK_METHOD0(OnHeaderBlockStart, void()); 31 MOCK_METHOD0(OnHeaderBlockStart, void());
29 MOCK_METHOD1(OnHeaderBlockEnd, void(size_t bytes)); 32 MOCK_METHOD1(OnHeaderBlockEnd, void(size_t bytes));
33 MOCK_METHOD2(OnHeaderBlockEnd, void(size_t bytes, size_t compressed_bytes));
30 MOCK_METHOD2(OnHeader, void(StringPiece key, StringPiece value)); 34 MOCK_METHOD2(OnHeader, void(StringPiece key, StringPiece value));
31 }; 35 };
32 36
33 class SpdyHeadersBlockParserTest : 37 class SpdyHeadersBlockParserTest :
34 public ::testing::TestWithParam<SpdyMajorVersion> { 38 public ::testing::TestWithParam<SpdyMajorVersion> {
35 public: 39 public:
36 ~SpdyHeadersBlockParserTest() override {} 40 ~SpdyHeadersBlockParserTest() override {}
37 41
38 protected: 42 protected:
39 void SetUp() override { 43 void SetUp() override {
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 // handling a headers block. 115 // handling a headers block.
112 EXPECT_EQ(spdy_version_, parser_->spdy_version()); 116 EXPECT_EQ(spdy_version_, parser_->spdy_version());
113 117
114 EXPECT_CALL(handler_, OnHeaderBlockStart()).Times(1); 118 EXPECT_CALL(handler_, OnHeaderBlockStart()).Times(1);
115 string expect_key = kBaseKey + IntToString(0); 119 string expect_key = kBaseKey + IntToString(0);
116 string expect_value = kBaseValue + IntToString(0); 120 string expect_value = kBaseValue + IntToString(0);
117 EXPECT_CALL(handler_, OnHeader(StringPiece(expect_key), 121 EXPECT_CALL(handler_, OnHeader(StringPiece(expect_key),
118 StringPiece(expect_value))).Times(1); 122 StringPiece(expect_value))).Times(1);
119 123
120 string headers(CreateHeaders(1, false)); 124 string headers(CreateHeaders(1, false));
121 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1); 125 if (FLAGS_chromium_http2_flag_log_compressed_size) {
122 126 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length(), _)).Times(1);
127 } else {
128 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1);
129 }
123 EXPECT_TRUE(parser_-> 130 EXPECT_TRUE(parser_->
124 HandleControlFrameHeadersData(1, headers.c_str(), headers.length())); 131 HandleControlFrameHeadersData(1, headers.c_str(), headers.length()));
125 EXPECT_EQ(SpdyHeadersBlockParser::NO_PARSER_ERROR, parser_->get_error()); 132 EXPECT_EQ(SpdyHeadersBlockParser::NO_PARSER_ERROR, parser_->get_error());
126 } 133 }
127 134
128 TEST_P(SpdyHeadersBlockParserTest, NullsSupportedTest) { 135 TEST_P(SpdyHeadersBlockParserTest, NullsSupportedTest) {
129 // Sanity test, verify that we parse out correctly a block with 136 // Sanity test, verify that we parse out correctly a block with
130 // a single key-value pair when the key and value contain null charecters. 137 // a single key-value pair when the key and value contain null charecters.
131 EXPECT_CALL(handler_, OnHeaderBlockStart()).Times(1); 138 EXPECT_CALL(handler_, OnHeaderBlockStart()).Times(1);
132 139
133 string expect_key = kBaseKey + string("\0", 1) + IntToString(0); 140 string expect_key = kBaseKey + string("\0", 1) + IntToString(0);
134 string expect_value = kBaseValue + string("\0", 1) + IntToString(0); 141 string expect_value = kBaseValue + string("\0", 1) + IntToString(0);
135 EXPECT_CALL(handler_, OnHeader(StringPiece(expect_key), 142 EXPECT_CALL(handler_, OnHeader(StringPiece(expect_key),
136 StringPiece(expect_value))).Times(1); 143 StringPiece(expect_value))).Times(1);
137 144
138 string headers(CreateHeaders(1, true)); 145 string headers(CreateHeaders(1, true));
139 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1); 146 if (FLAGS_chromium_http2_flag_log_compressed_size) {
147 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length(), _)).Times(1);
148 } else {
149 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1);
150 }
140 151
141 EXPECT_TRUE(parser_-> 152 EXPECT_TRUE(parser_->
142 HandleControlFrameHeadersData(1, headers.c_str(), headers.length())); 153 HandleControlFrameHeadersData(1, headers.c_str(), headers.length()));
143 EXPECT_EQ(SpdyHeadersBlockParser::NO_PARSER_ERROR, parser_->get_error()); 154 EXPECT_EQ(SpdyHeadersBlockParser::NO_PARSER_ERROR, parser_->get_error());
144 } 155 }
145 156
146 TEST_P(SpdyHeadersBlockParserTest, MultipleBlocksAndHeadersWithPartialData) { 157 TEST_P(SpdyHeadersBlockParserTest, MultipleBlocksAndHeadersWithPartialData) {
147 testing::InSequence s; 158 testing::InSequence s;
148 159
149 // CreateHeaders is deterministic; we can call it once for the whole test. 160 // CreateHeaders is deterministic; we can call it once for the whole test.
150 string headers(CreateHeaders(kNumHeadersInBlock, false)); 161 string headers(CreateHeaders(kNumHeadersInBlock, false));
151 162
152 // The mock doesn't retain storage of arguments, so keep them in scope. 163 // The mock doesn't retain storage of arguments, so keep them in scope.
153 std::vector<string> retained_arguments; 164 std::vector<string> retained_arguments;
154 for (int i = 0; i < kNumHeadersInBlock; i++) { 165 for (int i = 0; i < kNumHeadersInBlock; i++) {
155 retained_arguments.push_back(kBaseKey + IntToString(i)); 166 retained_arguments.push_back(kBaseKey + IntToString(i));
156 retained_arguments.push_back(kBaseValue + IntToString(i)); 167 retained_arguments.push_back(kBaseValue + IntToString(i));
157 } 168 }
158 // For each block we expect to parse out the headers in order. 169 // For each block we expect to parse out the headers in order.
159 for (int i = 0; i < kNumHeaderBlocks; i++) { 170 for (int i = 0; i < kNumHeaderBlocks; i++) {
160 EXPECT_CALL(handler_, OnHeaderBlockStart()).Times(1); 171 EXPECT_CALL(handler_, OnHeaderBlockStart()).Times(1);
161 for (int j = 0; j < kNumHeadersInBlock; j++) { 172 for (int j = 0; j < kNumHeadersInBlock; j++) {
162 EXPECT_CALL(handler_, OnHeader( 173 EXPECT_CALL(handler_, OnHeader(
163 StringPiece(retained_arguments[2 * j]), 174 StringPiece(retained_arguments[2 * j]),
164 StringPiece(retained_arguments[2 * j + 1]))).Times(1); 175 StringPiece(retained_arguments[2 * j + 1]))).Times(1);
165 } 176 }
166 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1); 177 if (FLAGS_chromium_http2_flag_log_compressed_size) {
178 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length(), _)).Times(1);
179 } else {
180 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1);
181 }
167 } 182 }
168 // Parse the header blocks, feeding the parser one byte at a time. 183 // Parse the header blocks, feeding the parser one byte at a time.
169 for (int i = 1; i <= kNumHeaderBlocks; i++) { 184 for (int i = 1; i <= kNumHeaderBlocks; i++) {
170 for (string::iterator it = headers.begin(); it != headers.end(); ++it) { 185 for (string::iterator it = headers.begin(); it != headers.end(); ++it) {
171 if ((it + 1) == headers.end()) { 186 if ((it + 1) == headers.end()) {
172 // Last byte completes the block. 187 // Last byte completes the block.
173 EXPECT_TRUE(parser_->HandleControlFrameHeadersData(i, &(*it), 1)); 188 EXPECT_TRUE(parser_->HandleControlFrameHeadersData(i, &(*it), 1));
174 EXPECT_EQ(SpdyHeadersBlockParser::NO_PARSER_ERROR, 189 EXPECT_EQ(SpdyHeadersBlockParser::NO_PARSER_ERROR,
175 parser_->get_error()); 190 parser_->get_error());
176 } else { 191 } else {
177 EXPECT_FALSE(parser_->HandleControlFrameHeadersData(i, &(*it), 1)); 192 EXPECT_FALSE(parser_->HandleControlFrameHeadersData(i, &(*it), 1));
178 EXPECT_EQ(SpdyHeadersBlockParser::NEED_MORE_DATA, parser_->get_error()); 193 EXPECT_EQ(SpdyHeadersBlockParser::NEED_MORE_DATA, parser_->get_error());
179 } 194 }
180 } 195 }
181 } 196 }
182 } 197 }
183 198
184 TEST_P(SpdyHeadersBlockParserTest, HandlesEmptyCallsTest) { 199 TEST_P(SpdyHeadersBlockParserTest, HandlesEmptyCallsTest) {
185 EXPECT_CALL(handler_, OnHeaderBlockStart()).Times(1); 200 EXPECT_CALL(handler_, OnHeaderBlockStart()).Times(1);
186 201
187 string expect_key = kBaseKey + IntToString(0); 202 string expect_key = kBaseKey + IntToString(0);
188 string expect_value = kBaseValue + IntToString(0); 203 string expect_value = kBaseValue + IntToString(0);
189 EXPECT_CALL(handler_, OnHeader(StringPiece(expect_key), 204 EXPECT_CALL(handler_, OnHeader(StringPiece(expect_key),
190 StringPiece(expect_value))).Times(1); 205 StringPiece(expect_value))).Times(1);
191 206
192 string headers(CreateHeaders(1, false)); 207 string headers(CreateHeaders(1, false));
193 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1); 208 if (FLAGS_chromium_http2_flag_log_compressed_size) {
209 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length(), _)).Times(1);
210 } else {
211 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1);
212 }
194 213
195 // Send a header in pieces with intermediate empty calls. 214 // Send a header in pieces with intermediate empty calls.
196 for (string::iterator it = headers.begin(); it != headers.end(); ++it) { 215 for (string::iterator it = headers.begin(); it != headers.end(); ++it) {
197 if ((it + 1) == headers.end()) { 216 if ((it + 1) == headers.end()) {
198 // Last byte completes the block. 217 // Last byte completes the block.
199 EXPECT_TRUE(parser_->HandleControlFrameHeadersData(1, &(*it), 1)); 218 EXPECT_TRUE(parser_->HandleControlFrameHeadersData(1, &(*it), 1));
200 EXPECT_EQ(SpdyHeadersBlockParser::NO_PARSER_ERROR, parser_->get_error()); 219 EXPECT_EQ(SpdyHeadersBlockParser::NO_PARSER_ERROR, parser_->get_error());
201 } else { 220 } else {
202 EXPECT_FALSE(parser_->HandleControlFrameHeadersData(1, &(*it), 1)); 221 EXPECT_FALSE(parser_->HandleControlFrameHeadersData(1, &(*it), 1));
203 EXPECT_EQ(SpdyHeadersBlockParser::NEED_MORE_DATA, parser_->get_error()); 222 EXPECT_EQ(SpdyHeadersBlockParser::NEED_MORE_DATA, parser_->get_error());
(...skipping 25 matching lines...) Expand all
229 248
230 TEST_P(SpdyHeadersBlockParserTest, ExtraDataTest) { 249 TEST_P(SpdyHeadersBlockParserTest, ExtraDataTest) {
231 EXPECT_CALL(handler_, OnHeaderBlockStart()).Times(1); 250 EXPECT_CALL(handler_, OnHeaderBlockStart()).Times(1);
232 251
233 string expect_key = kBaseKey + IntToString(0); 252 string expect_key = kBaseKey + IntToString(0);
234 string expect_value = kBaseValue + IntToString(0); 253 string expect_value = kBaseValue + IntToString(0);
235 EXPECT_CALL(handler_, OnHeader(StringPiece(expect_key), 254 EXPECT_CALL(handler_, OnHeader(StringPiece(expect_key),
236 StringPiece(expect_value))).Times(1); 255 StringPiece(expect_value))).Times(1);
237 256
238 string headers = CreateHeaders(1, false) + "foobar"; 257 string headers = CreateHeaders(1, false) + "foobar";
239 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1); 258 if (FLAGS_chromium_http2_flag_log_compressed_size) {
259 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length(), _)).Times(1);
260 } else {
261 EXPECT_CALL(handler_, OnHeaderBlockEnd(headers.length())).Times(1);
262 }
240 263
241 EXPECT_FALSE(parser_->HandleControlFrameHeadersData(1, headers.c_str(), 264 EXPECT_FALSE(parser_->HandleControlFrameHeadersData(1, headers.c_str(),
242 headers.length())); 265 headers.length()));
243 EXPECT_EQ(SpdyHeadersBlockParser::TOO_MUCH_DATA, parser_->get_error()); 266 EXPECT_EQ(SpdyHeadersBlockParser::TOO_MUCH_DATA, parser_->get_error());
244 } 267 }
245 268
246 TEST_P(SpdyHeadersBlockParserTest, WrongStreamIdTest) { 269 TEST_P(SpdyHeadersBlockParserTest, WrongStreamIdTest) {
247 string headers(CreateHeaders(kNumHeadersInBlock, false)); 270 string headers(CreateHeaders(kNumHeadersInBlock, false));
248 EXPECT_FALSE(parser_->HandleControlFrameHeadersData(1, headers.data(), 1)); 271 EXPECT_FALSE(parser_->HandleControlFrameHeadersData(1, headers.data(), 1));
249 EXPECT_EQ(SpdyHeadersBlockParser::NEED_MORE_DATA, parser_->get_error()); 272 EXPECT_EQ(SpdyHeadersBlockParser::NEED_MORE_DATA, parser_->get_error());
250 bool result; 273 bool result;
251 EXPECT_SPDY_BUG( 274 EXPECT_SPDY_BUG(
252 result = parser_->HandleControlFrameHeadersData(2, headers.data() + 1, 1), 275 result = parser_->HandleControlFrameHeadersData(2, headers.data() + 1, 1),
253 "Unexpected stream id: 2 \\(expected 1\\)"); 276 "Unexpected stream id: 2 \\(expected 1\\)");
254 EXPECT_FALSE(result); 277 EXPECT_FALSE(result);
255 EXPECT_EQ(SpdyHeadersBlockParser::UNEXPECTED_STREAM_ID, parser_->get_error()); 278 EXPECT_EQ(SpdyHeadersBlockParser::UNEXPECTED_STREAM_ID, parser_->get_error());
256 } 279 }
257 280
258 TEST_P(SpdyHeadersBlockParserTest, InvalidStreamIdTest) { 281 TEST_P(SpdyHeadersBlockParserTest, InvalidStreamIdTest) {
259 string headers(CreateHeaders(kNumHeadersInBlock, false)); 282 string headers(CreateHeaders(kNumHeadersInBlock, false));
260 bool result; 283 bool result;
261 EXPECT_SPDY_BUG( 284 EXPECT_SPDY_BUG(
262 result = parser_->HandleControlFrameHeadersData(0, headers.data(), 1), 285 result = parser_->HandleControlFrameHeadersData(0, headers.data(), 1),
263 "Expected nonzero stream id, saw: 0"); 286 "Expected nonzero stream id, saw: 0");
264 EXPECT_FALSE(result); 287 EXPECT_FALSE(result);
265 EXPECT_EQ(SpdyHeadersBlockParser::UNEXPECTED_STREAM_ID, parser_->get_error()); 288 EXPECT_EQ(SpdyHeadersBlockParser::UNEXPECTED_STREAM_ID, parser_->get_error());
266 } 289 }
267 290
268 } // namespace net 291 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_headers_block_parser.cc ('k') | net/spdy/spdy_headers_handler_interface.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698