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

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

Issue 202383002: Add settings IDs to SpdyConstants. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Test fix. Created 6 years, 9 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 550 matching lines...) Expand 10 before | Expand all | Expand 10 after
561 LOG(ERROR) << "Expected header named '" << it->first 561 LOG(ERROR) << "Expected header named '" << it->first
562 << "' to have a value of '" << it->second 562 << "' to have a value of '" << it->second
563 << "'. The actual value received was '" << it2->second 563 << "'. The actual value received was '" << it2->second
564 << "'."; 564 << "'.";
565 return false; 565 return false;
566 } 566 }
567 } 567 }
568 return true; 568 return true;
569 } 569 }
570 570
571 void AddSpdySettingFromWireFormat(SettingsMap* settings,
572 uint32 key,
573 uint32 value) {
574 SettingsFlagsAndId flags_and_id =
575 SettingsFlagsAndId::FromWireFormat(spdy_version_, key);
576 SpdySettingsIds id = static_cast<SpdySettingsIds>(flags_and_id.id());
577 SpdySettingsFlags flags =
578 static_cast<SpdySettingsFlags>(flags_and_id.flags());
579 CHECK(settings->find(id) == settings->end());
580 settings->insert(std::make_pair(id, SettingsFlagsAndValue(flags, value)));
581 }
582
583 bool IsSpdy2() { return spdy_version_ == SPDY2; } 571 bool IsSpdy2() { return spdy_version_ == SPDY2; }
584 bool IsSpdy3() { return spdy_version_ == SPDY3; } 572 bool IsSpdy3() { return spdy_version_ == SPDY3; }
585 bool IsSpdy4() { return spdy_version_ == SPDY4; } 573 bool IsSpdy4() { return spdy_version_ == SPDY4; }
586 574
587 // Version of SPDY protocol to be used. 575 // Version of SPDY protocol to be used.
588 SpdyMajorVersion spdy_version_; 576 SpdyMajorVersion spdy_version_;
589 unsigned char spdy_version_ch_; 577 unsigned char spdy_version_ch_;
590 }; 578 };
591 579
592 // 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 1616 matching lines...) Expand 10 before | Expand all | Expand 10 after
2209 TEST_P(SpdyFramerTest, CreateSettings) { 2197 TEST_P(SpdyFramerTest, CreateSettings) {
2210 SpdyFramer framer(spdy_version_); 2198 SpdyFramer framer(spdy_version_);
2211 2199
2212 { 2200 {
2213 const char kDescription[] = "Network byte order SETTINGS frame"; 2201 const char kDescription[] = "Network byte order SETTINGS frame";
2214 2202
2215 const unsigned char kV2FrameData[] = { 2203 const unsigned char kV2FrameData[] = {
2216 0x80, spdy_version_ch_, 0x00, 0x04, 2204 0x80, spdy_version_ch_, 0x00, 0x04,
2217 0x00, 0x00, 0x00, 0x0c, 2205 0x00, 0x00, 0x00, 0x0c,
2218 0x00, 0x00, 0x00, 0x01, 2206 0x00, 0x00, 0x00, 0x01,
2219 0x04, 0x03, 0x02, 0x01, 2207 0x07, 0x00, 0x00, 0x01,
2220 0x0a, 0x0b, 0x0c, 0x0d, 2208 0x0a, 0x0b, 0x0c, 0x0d,
2221 }; 2209 };
2222 const unsigned char kV3FrameData[] = { 2210 const unsigned char kV3FrameData[] = {
2223 0x80, spdy_version_ch_, 0x00, 0x04, 2211 0x80, spdy_version_ch_, 0x00, 0x04,
2224 0x00, 0x00, 0x00, 0x0c, 2212 0x00, 0x00, 0x00, 0x0c,
2225 0x00, 0x00, 0x00, 0x01, 2213 0x00, 0x00, 0x00, 0x01,
2226 0x01, 0x02, 0x03, 0x04, 2214 0x01, 0x00, 0x00, 0x07,
2227 0x0a, 0x0b, 0x0c, 0x0d, 2215 0x0a, 0x0b, 0x0c, 0x0d,
2228 }; 2216 };
2229 const unsigned char kV4FrameData[] = { 2217 const unsigned char kV4FrameData[] = {
2230 0x00, 0x05, 0x04, 0x00, 2218 0x00, 0x05, 0x04, 0x00,
2231 0x00, 0x00, 0x00, 0x00, 2219 0x00, 0x00, 0x00, 0x00,
2232 0x01, 0x0a, 0x0b, 0x0c, 2220 0x04, 0x0a, 0x0b, 0x0c,
2233 0x0d, 2221 0x0d,
2234 }; 2222 };
2235 2223
2236 uint32 kValue = 0x0a0b0c0d; 2224 uint32 kValue = 0x0a0b0c0d;
2237 SpdySettingsIR settings_ir; 2225 SpdySettingsIR settings_ir;
2238 2226
2239 SpdySettingsFlags kFlags = static_cast<SpdySettingsFlags>(0x01); 2227 SpdySettingsFlags kFlags = static_cast<SpdySettingsFlags>(0x01);
2240 SpdySettingsIds kId = static_cast<SpdySettingsIds>(0x020304); 2228 SpdySettingsIds kId = SETTINGS_INITIAL_WINDOW_SIZE;
2241 if (IsSpdy4()) {
2242 kId = static_cast<SpdySettingsIds>(0x01);
2243 }
2244 SettingsMap settings; 2229 SettingsMap settings;
2245 settings[kId] = SettingsFlagsAndValue(kFlags, kValue); 2230 settings[kId] = SettingsFlagsAndValue(kFlags, kValue);
2246 EXPECT_EQ(kFlags, settings[kId].first); 2231 EXPECT_EQ(kFlags, settings[kId].first);
2247 EXPECT_EQ(kValue, settings[kId].second); 2232 EXPECT_EQ(kValue, settings[kId].second);
2248 settings_ir.AddSetting(kId, 2233 settings_ir.AddSetting(kId,
2249 kFlags & SETTINGS_FLAG_PLEASE_PERSIST, 2234 kFlags & SETTINGS_FLAG_PLEASE_PERSIST,
2250 kFlags & SETTINGS_FLAG_PERSISTED, 2235 kFlags & SETTINGS_FLAG_PERSISTED,
2251 kValue); 2236 kValue);
2252 2237
2253 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir)); 2238 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir));
2254 if (IsSpdy2()) { 2239 if (IsSpdy2()) {
2255 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData)); 2240 CompareFrame(kDescription, *frame, kV2FrameData, arraysize(kV2FrameData));
2256 } else if (IsSpdy3()) { 2241 } else if (IsSpdy3()) {
2257 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData)); 2242 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
2258 } else { 2243 } else {
2259 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 2244 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
2260 } 2245 }
2261 } 2246 }
2262 2247
2263 { 2248 {
2264 const char kDescription[] = "Basic SETTINGS frame"; 2249 const char kDescription[] = "Basic SETTINGS frame";
2265 2250
2266 SettingsMap settings; 2251 const unsigned char kV2FrameData[] = {
2267 AddSpdySettingFromWireFormat(
2268 &settings, 0x00000000, 0x00000001); // 1st Setting
2269 AddSpdySettingFromWireFormat(
2270 &settings, 0x01000001, 0x00000002); // 2nd Setting
2271 AddSpdySettingFromWireFormat(
2272 &settings, 0x02000002, 0x00000003); // 3rd Setting
2273 AddSpdySettingFromWireFormat(
2274 &settings, 0x03000003, 0xff000004); // 4th Setting
2275
2276 const unsigned char kV3FrameData[] = { // Also applies for V2.
2277 0x80, spdy_version_ch_, 0x00, 0x04, 2252 0x80, spdy_version_ch_, 0x00, 0x04,
2278 0x00, 0x00, 0x00, 0x24, 2253 0x00, 0x00, 0x00, 0x24,
2279 0x00, 0x00, 0x00, 0x04, 2254 0x00, 0x00, 0x00, 0x04,
2280 0x00, 0x00, 0x00, 0x00, // 1st Setting 2255 0x01, 0x00, 0x00, 0x00, // 1st Setting
2281 0x00, 0x00, 0x00, 0x01, 2256 0x00, 0x00, 0x00, 0x05,
2282 0x01, 0x00, 0x00, 0x01, // 2nd Setting 2257 0x02, 0x00, 0x00, 0x00, // 2nd Setting
2283 0x00, 0x00, 0x00, 0x02, 2258 0x00, 0x00, 0x00, 0x06,
2284 0x02, 0x00, 0x00, 0x02, // 3rd Setting 2259 0x03, 0x00, 0x00, 0x00, // 3rd Setting
2285 0x00, 0x00, 0x00, 0x03, 2260 0x00, 0x00, 0x00, 0x07,
2286 0x03, 0x00, 0x00, 0x03, // 4th Setting 2261 0x04, 0x00, 0x00, 0x00, // 4th Setting
2287 0xff, 0x00, 0x00, 0x04, 2262 0x00, 0x00, 0x00, 0x08,
2288 }; 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.
2289 const unsigned char kV4FrameData[] = { 2280 const unsigned char kV4FrameData[] = {
2290 0x00, 0x14, 0x04, 0x00, 2281 0x00, 0x14, 0x04, 0x00,
2291 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,
2292 0x01, // 1st Setting 2287 0x01, // 1st Setting
2293 0x00, 0x00, 0x00, 0x01, 2288 0x00, 0x00, 0x00, 0x05,
2294 0x02, // 2nd Setting 2289 0x02, // 2nd Setting
2295 0x00, 0x00, 0x00, 0x02, 2290 0x00, 0x00, 0x00, 0x06,
2296 0x03, // 3rd Setting
2297 0x00, 0x00, 0x00, 0x03,
2298 0x04, // 4th Setting
2299 0xff, 0x00, 0x00, 0x04,
2300 }; 2291 };
2292
2301 SpdySettingsIR settings_ir; 2293 SpdySettingsIR settings_ir;
2302 if (!IsSpdy4()) { 2294 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 1),
2303 for (SettingsMap::const_iterator it = settings.begin(); 2295 false, // persist
2304 it != settings.end(); 2296 false, // persisted
2305 ++it) { 2297 5);
2306 settings_ir.AddSetting(it->first, 2298 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 2),
2307 it->second.first & SETTINGS_FLAG_PLEASE_PERSIST, 2299 false, // persist
2308 it->second.first & SETTINGS_FLAG_PERSISTED, 2300 false, // persisted
2309 it->second.second); 2301 6);
2310 } 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));
2311 } else { 2316 } else {
2312 SpdySettingsIds kId = static_cast<SpdySettingsIds>(0x01);
2313 settings_ir.AddSetting(kId, 0, 0, 0x00000001);
2314 kId = static_cast<SpdySettingsIds>(0x02);
2315 settings_ir.AddSetting(kId, 0, 0, 0x00000002);
2316 kId = static_cast<SpdySettingsIds>(0x03);
2317 settings_ir.AddSetting(kId, 0, 0, 0x00000003);
2318 kId = static_cast<SpdySettingsIds>(0x04);
2319 settings_ir.AddSetting(kId, 0, 0, 0xff000004);
2320 }
2321 scoped_ptr<SpdyFrame> frame(framer.SerializeSettings(settings_ir));
2322 if (IsSpdy4()) {
2323 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData)); 2317 CompareFrame(kDescription, *frame, kV4FrameData, arraysize(kV4FrameData));
2324 } else {
2325 CompareFrame(kDescription, *frame, kV3FrameData, arraysize(kV3FrameData));
2326 } 2318 }
2327 } 2319 }
2328 2320
2329 { 2321 {
2330 const char kDescription[] = "Empty SETTINGS frame"; 2322 const char kDescription[] = "Empty SETTINGS frame";
2331 2323
2332 const unsigned char kV3FrameData[] = { // Also applies for V2. 2324 const unsigned char kV3FrameData[] = { // Also applies for V2.
2333 0x80, spdy_version_ch_, 0x00, 0x04, 2325 0x80, spdy_version_ch_, 0x00, 0x04,
2334 0x00, 0x00, 0x00, 0x04, 2326 0x00, 0x00, 0x00, 0x04,
2335 0x00, 0x00, 0x00, 0x00, 2327 0x00, 0x00, 0x00, 0x00,
(...skipping 767 matching lines...) Expand 10 before | Expand all | Expand 10 after
3103 } 3095 }
3104 } 3096 }
3105 3097
3106 // Tests handling of SETTINGS frames with invalid length. 3098 // Tests handling of SETTINGS frames with invalid length.
3107 TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) { 3099 TEST_P(SpdyFramerTest, ReadBogusLenSettingsFrame) {
3108 SpdyFramer framer(spdy_version_); 3100 SpdyFramer framer(spdy_version_);
3109 SpdySettingsIR settings_ir; 3101 SpdySettingsIR settings_ir;
3110 3102
3111 // 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
3112 // calling SimulateInFramer() below. 3104 // calling SimulateInFramer() below.
3113 SettingsMap settings; 3105 settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE,
3114 settings[SETTINGS_UPLOAD_BANDWIDTH] = 3106 false,
3115 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, 0x00000002);
3116 settings_ir.AddSetting(SETTINGS_UPLOAD_BANDWIDTH,
3117 true, // please persist
3118 false, 3107 false,
3119 0x00000002); 3108 0x00000002);
3120 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir)); 3109 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir));
3121 const size_t kNewLength = 14; 3110 const size_t kNewLength = 14;
3122 SetFrameLength(control_frame.get(), kNewLength, spdy_version_); 3111 SetFrameLength(control_frame.get(), kNewLength, spdy_version_);
3123 TestSpdyVisitor visitor(spdy_version_); 3112 TestSpdyVisitor visitor(spdy_version_);
3124 visitor.use_compression_ = false; 3113 visitor.use_compression_ = false;
3125 visitor.SimulateInFramer( 3114 visitor.SimulateInFramer(
3126 reinterpret_cast<unsigned char*>(control_frame->data()), 3115 reinterpret_cast<unsigned char*>(control_frame->data()),
3127 framer.GetControlFrameHeaderSize() + kNewLength); 3116 framer.GetControlFrameHeaderSize() + kNewLength);
3128 // Should generate an error, since its not possible to have a 3117 // Should generate an error, since its not possible to have a
3129 // settings frame of length kNewLength. 3118 // settings frame of length kNewLength.
3130 EXPECT_EQ(1, visitor.error_count_); 3119 EXPECT_EQ(1, visitor.error_count_);
3131 } 3120 }
3132 3121
3133 // Tests handling of SETTINGS frames larger than the frame buffer size. 3122 // Tests handling of SETTINGS frames larger than the frame buffer size.
3134 TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) { 3123 TEST_P(SpdyFramerTest, ReadLargeSettingsFrame) {
3135 SpdyFramer framer(spdy_version_); 3124 SpdyFramer framer(spdy_version_);
3136 SpdySettingsIR settings_ir; 3125 SpdySettingsIR settings_ir;
3137 SettingsMap settings; 3126 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 1),
3138 3127 false, // persist
3139 SpdySettingsFlags flags = SETTINGS_FLAG_PLEASE_PERSIST; 3128 false, // persisted
3140 settings[SETTINGS_UPLOAD_BANDWIDTH] = 3129 5);
3141 SettingsFlagsAndValue(flags, 0x00000002); 3130 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 2),
3142 settings[SETTINGS_DOWNLOAD_BANDWIDTH] = 3131 false, // persist
3143 SettingsFlagsAndValue(flags, 0x00000003); 3132 false, // persisted
3144 settings[SETTINGS_ROUND_TRIP_TIME] = SettingsFlagsAndValue(flags, 0x00000004); 3133 6);
3145 for (SettingsMap::const_iterator it = settings.begin(); 3134 settings_ir.AddSetting(SpdyConstants::ParseSettingId(spdy_version_, 3),
3146 it != settings.end(); 3135 false, // persist
3147 ++it) { 3136 false, // persisted
3148 settings_ir.AddSetting(it->first, 3137 7);
3149 it->second.first & SETTINGS_FLAG_PLEASE_PERSIST,
3150 it->second.first & SETTINGS_FLAG_PERSISTED,
3151 it->second.second);
3152 }
3153 3138
3154 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir)); 3139 scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir));
3155 EXPECT_LT(SpdyFramer::kControlFrameBufferSize, 3140 EXPECT_LT(SpdyFramer::kControlFrameBufferSize,
3156 control_frame->size()); 3141 control_frame->size());
3157 TestSpdyVisitor visitor(spdy_version_); 3142 TestSpdyVisitor visitor(spdy_version_);
3158 visitor.use_compression_ = false; 3143 visitor.use_compression_ = false;
3159 3144
3160 // Read all at once. 3145 // Read all at once.
3161 visitor.SimulateInFramer( 3146 visitor.SimulateInFramer(
3162 reinterpret_cast<unsigned char*>(control_frame->data()), 3147 reinterpret_cast<unsigned char*>(control_frame->data()),
(...skipping 1588 matching lines...) Expand 10 before | Expand all | Expand 10 after
4751 SpdyBlockedIR blocked_ir(0); 4736 SpdyBlockedIR blocked_ir(0);
4752 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir)); 4737 scoped_ptr<SpdySerializedFrame> frame(framer.SerializeFrame(blocked_ir));
4753 framer.ProcessInput(frame->data(), framer.GetBlockedSize()); 4738 framer.ProcessInput(frame->data(), framer.GetBlockedSize());
4754 4739
4755 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); 4740 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
4756 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()) 4741 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code())
4757 << SpdyFramer::ErrorCodeToString(framer.error_code()); 4742 << SpdyFramer::ErrorCodeToString(framer.error_code());
4758 } 4743 }
4759 4744
4760 } // 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