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

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

Issue 12213062: Invalid flags now result in a GOAWAY (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix test expectations Created 7 years, 10 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_session.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 (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"
11 #include "net/spdy/spdy_framer.h" 11 #include "net/spdy/spdy_framer.h"
12 #include "net/spdy/spdy_protocol.h" 12 #include "net/spdy/spdy_protocol.h"
13 #include "net/spdy/spdy_frame_builder.h" 13 #include "net/spdy/spdy_frame_builder.h"
14 #include "testing/gmock/include/gmock/gmock.h" 14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/platform_test.h" 15 #include "testing/platform_test.h"
16 16
17 using std::string; 17 using std::string;
18 using std::max; 18 using std::max;
19 using std::min; 19 using std::min;
20 using std::numeric_limits; 20 using std::numeric_limits;
21 using testing::_; 21 using testing::_;
22 22
23 namespace net { 23 namespace net {
24 24
25 namespace test { 25 namespace test {
26 26
27 static const size_t kMaxDecompressedSize = 1024; 27 static const size_t kMaxDecompressedSize = 1024;
28 28
29 // TODO(akalin): Make sure expectations on mocks are set before mock
30 // functions are called, as interleaving expectations and calls is
31 // undefined.
29 class MockVisitor : public SpdyFramerVisitorInterface { 32 class MockVisitor : public SpdyFramerVisitorInterface {
30 public: 33 public:
31 MOCK_METHOD1(OnError, void(SpdyFramer* framer)); 34 MOCK_METHOD1(OnError, void(SpdyFramer* framer));
32 MOCK_METHOD6(OnSynStream, void(SpdyStreamId stream_id, 35 MOCK_METHOD6(OnSynStream, void(SpdyStreamId stream_id,
33 SpdyStreamId associated_stream_id, 36 SpdyStreamId associated_stream_id,
34 SpdyPriority priority, 37 SpdyPriority priority,
35 uint8 slot, 38 uint8 slot,
36 bool fin, 39 bool fin,
37 bool unidirectional)); 40 bool unidirectional));
38 MOCK_METHOD2(OnSynReply, void(SpdyStreamId stream_id, bool fin)); 41 MOCK_METHOD2(OnSynReply, void(SpdyStreamId stream_id, bool fin));
(...skipping 3033 matching lines...) Expand 10 before | Expand all | Expand 10 after
3072 SpdyFramer::SPDY_UNSUPPORTED_VERSION)); 3075 SpdyFramer::SPDY_UNSUPPORTED_VERSION));
3073 EXPECT_STREQ("DECOMPRESS_FAILURE", 3076 EXPECT_STREQ("DECOMPRESS_FAILURE",
3074 SpdyFramer::ErrorCodeToString( 3077 SpdyFramer::ErrorCodeToString(
3075 SpdyFramer::SPDY_DECOMPRESS_FAILURE)); 3078 SpdyFramer::SPDY_DECOMPRESS_FAILURE));
3076 EXPECT_STREQ("COMPRESS_FAILURE", 3079 EXPECT_STREQ("COMPRESS_FAILURE",
3077 SpdyFramer::ErrorCodeToString( 3080 SpdyFramer::ErrorCodeToString(
3078 SpdyFramer::SPDY_COMPRESS_FAILURE)); 3081 SpdyFramer::SPDY_COMPRESS_FAILURE));
3079 EXPECT_STREQ("SPDY_INVALID_DATA_FRAME_FLAGS", 3082 EXPECT_STREQ("SPDY_INVALID_DATA_FRAME_FLAGS",
3080 SpdyFramer::ErrorCodeToString( 3083 SpdyFramer::ErrorCodeToString(
3081 SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS)); 3084 SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS));
3085 EXPECT_STREQ("SPDY_INVALID_CONTROL_FRAME_FLAGS",
3086 SpdyFramer::ErrorCodeToString(
3087 SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS));
3082 EXPECT_STREQ("UNKNOWN_ERROR", 3088 EXPECT_STREQ("UNKNOWN_ERROR",
3083 SpdyFramer::ErrorCodeToString(SpdyFramer::LAST_ERROR)); 3089 SpdyFramer::ErrorCodeToString(SpdyFramer::LAST_ERROR));
3084 } 3090 }
3085 3091
3086 TEST_P(SpdyFramerTest, StatusCodeToStringTest) { 3092 TEST_P(SpdyFramerTest, StatusCodeToStringTest) {
3087 EXPECT_STREQ("INVALID", 3093 EXPECT_STREQ("INVALID",
3088 SpdyFramer::StatusCodeToString(RST_STREAM_INVALID)); 3094 SpdyFramer::StatusCodeToString(RST_STREAM_INVALID));
3089 EXPECT_STREQ("PROTOCOL_ERROR", 3095 EXPECT_STREQ("PROTOCOL_ERROR",
3090 SpdyFramer::StatusCodeToString(RST_STREAM_PROTOCOL_ERROR)); 3096 SpdyFramer::StatusCodeToString(RST_STREAM_PROTOCOL_ERROR));
3091 EXPECT_STREQ("INVALID_STREAM", 3097 EXPECT_STREQ("INVALID_STREAM",
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
3169 SpdyFramer::GetMinimumControlFrameSize(spdy_version_, 3175 SpdyFramer::GetMinimumControlFrameSize(spdy_version_,
3170 NUM_CONTROL_FRAME_TYPES)); 3176 NUM_CONTROL_FRAME_TYPES));
3171 } 3177 }
3172 3178
3173 TEST_P(SpdyFramerTest, CatchProbableHttpResponse) { 3179 TEST_P(SpdyFramerTest, CatchProbableHttpResponse) {
3174 { 3180 {
3175 testing::StrictMock<test::MockVisitor> visitor; 3181 testing::StrictMock<test::MockVisitor> visitor;
3176 SpdyFramer framer(spdy_version_); 3182 SpdyFramer framer(spdy_version_);
3177 framer.set_visitor(&visitor); 3183 framer.set_visitor(&visitor);
3178 3184
3179 // This won't cause an error at the framer level. It will cause 3185 EXPECT_CALL(visitor, OnError(_));
3180 // flag validation errors at the Visitor::OnDataFrameHeader level.
3181 EXPECT_CALL(visitor, OnDataFrameHeader(_));
3182 framer.ProcessInput("HTTP/1.1", 8); 3186 framer.ProcessInput("HTTP/1.1", 8);
3183 EXPECT_TRUE(framer.probable_http_response()); 3187 EXPECT_TRUE(framer.probable_http_response());
3184 EXPECT_EQ(SpdyFramer::SPDY_FORWARD_STREAM_FRAME, framer.state()); 3188 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3189 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code());
3185 } 3190 }
3186 { 3191 {
3187 testing::StrictMock<test::MockVisitor> visitor; 3192 testing::StrictMock<test::MockVisitor> visitor;
3188 SpdyFramer framer(spdy_version_); 3193 SpdyFramer framer(spdy_version_);
3189 framer.set_visitor(&visitor); 3194 framer.set_visitor(&visitor);
3190 3195
3191 // This won't cause an error at the framer level. It will cause 3196 EXPECT_CALL(visitor, OnError(_));
3192 // flag validation errors at the Visitor::OnDataFrameHeader level.
3193 EXPECT_CALL(visitor, OnDataFrameHeader(_));
3194 framer.ProcessInput("HTTP/1.0", 8); 3197 framer.ProcessInput("HTTP/1.0", 8);
3195 EXPECT_TRUE(framer.probable_http_response()); 3198 EXPECT_TRUE(framer.probable_http_response());
3196 EXPECT_EQ(SpdyFramer::SPDY_FORWARD_STREAM_FRAME, framer.state()); 3199 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3200 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS, framer.error_code());
3197 } 3201 }
3198 } 3202 }
3199 3203
3200 TEST_P(SpdyFramerTest, DataFrameFlags) { 3204 TEST_P(SpdyFramerTest, DataFrameFlags) {
3201 for (int flags = 0; flags < 256; ++flags) { 3205 for (int flags = 0; flags < 256; ++flags) {
3202 SCOPED_TRACE(testing::Message() << "Flags " << flags); 3206 SCOPED_TRACE(testing::Message() << "Flags " << flags);
3203 3207
3204 testing::StrictMock<test::MockVisitor> visitor; 3208 testing::StrictMock<test::MockVisitor> visitor;
3205 SpdyFramer framer(spdy_version_); 3209 SpdyFramer framer(spdy_version_);
3206 framer.set_visitor(&visitor); 3210 framer.set_visitor(&visitor);
3207 3211
3208 scoped_ptr<SpdyFrame> frame( 3212 scoped_ptr<SpdyFrame> frame(
3209 framer.CreateDataFrame(1, "hello", 5, DATA_FLAG_NONE)); 3213 framer.CreateDataFrame(1, "hello", 5, DATA_FLAG_NONE));
3210 frame->set_flags(flags); 3214 frame->set_flags(flags);
3211 3215
3212 // Flags are just passed along since they need to be validated at 3216 if (flags & ~DATA_FLAG_FIN) {
3213 // a higher protocol layer. 3217 EXPECT_CALL(visitor, OnError(_));
3214 EXPECT_CALL(visitor, OnDataFrameHeader(_)); 3218 } else {
3215 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, SpdyDataFlags())); 3219 EXPECT_CALL(visitor, OnDataFrameHeader(_));
3216 if (flags & DATA_FLAG_FIN) { 3220 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 5, SpdyDataFlags()));
3217 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, DATA_FLAG_FIN)); 3221 if (flags & DATA_FLAG_FIN) {
3218 } 3222 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, DATA_FLAG_FIN));
3219 3223 }
3220 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize; 3224 }
3221 framer.ProcessInput(frame->data(), frame_size); 3225
3222 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state()); 3226 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize;
3223 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code()); 3227 framer.ProcessInput(frame->data(), frame_size);
3224 } 3228 if (flags & ~DATA_FLAG_FIN) {
3225 } 3229 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3226 3230 EXPECT_EQ(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS,
3231 framer.error_code());
3232 } else {
3233 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
3234 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code());
3235 }
3236 }
3237 }
3238
3239 TEST_P(SpdyFramerTest, SynStreamFrameFlags) {
3240 for (int flags = 0; flags < 256; ++flags) {
3241 SCOPED_TRACE(testing::Message() << "Flags " << flags);
3242
3243 testing::StrictMock<net::test::MockVisitor> visitor;
3244 SpdyFramer framer(spdy_version_);
3245 framer.set_visitor(&visitor);
3246
3247 EXPECT_CALL(visitor, OnControlFrameCompressed(_, _));
3248
3249 SpdyHeaderBlock headers;
3250 headers["foo"] = "bar";
3251 scoped_ptr<SpdyFrame> frame(
3252 framer.CreateSynStream(8, 3, 1, 0, CONTROL_FLAG_NONE, true, &headers));
3253 frame->set_flags(flags);
3254
3255 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) {
3256 EXPECT_CALL(visitor, OnError(_));
3257 } else {
3258 EXPECT_CALL(visitor, OnSynStream(8, 3, 1, 0, flags & CONTROL_FLAG_FIN,
3259 flags & CONTROL_FLAG_UNIDIRECTIONAL));
3260 EXPECT_CALL(visitor, OnControlFrameHeaderData(8, _, _))
3261 .WillRepeatedly(testing::Return(true));
3262 if (flags & DATA_FLAG_FIN) {
3263 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, DATA_FLAG_FIN));
3264 }
3265 }
3266
3267 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize;
3268 framer.ProcessInput(frame->data(), frame_size);
3269 if (flags & ~(CONTROL_FLAG_FIN | CONTROL_FLAG_UNIDIRECTIONAL)) {
3270 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3271 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
3272 framer.error_code());
3273 } else {
3274 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
3275 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code());
3276 }
3277 }
3278 }
3279
3280 TEST_P(SpdyFramerTest, SynReplyFrameFlags) {
3281 for (int flags = 0; flags < 256; ++flags) {
3282 SCOPED_TRACE(testing::Message() << "Flags " << flags);
3283
3284 testing::StrictMock<net::test::MockVisitor> visitor;
3285 SpdyFramer framer(spdy_version_);
3286 framer.set_visitor(&visitor);
3287
3288 EXPECT_CALL(visitor, OnControlFrameCompressed(_, _));
3289
3290 SpdyHeaderBlock headers;
3291 headers["foo"] = "bar";
3292 scoped_ptr<SpdyFrame> frame(
3293 framer.CreateSynReply(37, CONTROL_FLAG_NONE, true, &headers));
3294 frame->set_flags(flags);
3295
3296 if (flags & ~CONTROL_FLAG_FIN) {
3297 EXPECT_CALL(visitor, OnError(_));
3298 } else {
3299 EXPECT_CALL(visitor, OnSynReply(37, flags & CONTROL_FLAG_FIN));
3300 EXPECT_CALL(visitor, OnControlFrameHeaderData(37, _, _))
3301 .WillRepeatedly(testing::Return(true));
3302 if (flags & DATA_FLAG_FIN) {
3303 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, DATA_FLAG_FIN));
3304 }
3305 }
3306
3307 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize;
3308 framer.ProcessInput(frame->data(), frame_size);
3309 if (flags & ~CONTROL_FLAG_FIN) {
3310 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3311 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
3312 framer.error_code());
3313 } else {
3314 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
3315 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code());
3316 }
3317 }
3318 }
3319
3320 TEST_P(SpdyFramerTest, RstStreamFrameFlags) {
3321 for (int flags = 0; flags < 256; ++flags) {
3322 SCOPED_TRACE(testing::Message() << "Flags " << flags);
3323
3324 testing::StrictMock<net::test::MockVisitor> visitor;
3325 SpdyFramer framer(spdy_version_);
3326 framer.set_visitor(&visitor);
3327
3328 scoped_ptr<SpdyFrame> frame(framer.CreateRstStream(13, RST_STREAM_CANCEL));
3329 frame->set_flags(flags);
3330
3331 if (flags != 0) {
3332 EXPECT_CALL(visitor, OnError(_));
3333 } else {
3334 EXPECT_CALL(visitor, OnRstStream(13, RST_STREAM_CANCEL));
3335 }
3336
3337 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize;
3338 framer.ProcessInput(frame->data(), frame_size);
3339 if (flags != 0) {
3340 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3341 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
3342 framer.error_code());
3343 } else {
3344 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
3345 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code());
3346 }
3347 }
3348 }
3349
3350 TEST_P(SpdyFramerTest, SettingsFrameFlags) {
3351 for (int flags = 0; flags < 256; ++flags) {
3352 SCOPED_TRACE(testing::Message() << "Flags " << flags);
3353
3354 testing::StrictMock<net::test::MockVisitor> visitor;
3355 SpdyFramer framer(spdy_version_);
3356 framer.set_visitor(&visitor);
3357
3358 SettingsMap settings;
3359 settings[SETTINGS_UPLOAD_BANDWIDTH] =
3360 std::make_pair(SETTINGS_FLAG_NONE, 54321);
3361 scoped_ptr<SpdyFrame> frame(framer.CreateSettings(settings));
3362 frame->set_flags(flags);
3363
3364 if (flags & ~SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS) {
3365 EXPECT_CALL(visitor, OnError(_));
3366 } else {
3367 EXPECT_CALL(visitor, OnSetting(SETTINGS_UPLOAD_BANDWIDTH,
3368 SETTINGS_FLAG_NONE, 54321));
3369 }
3370
3371 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize;
3372 framer.ProcessInput(frame->data(), frame_size);
3373 if (flags & ~SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS) {
3374 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3375 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
3376 framer.error_code());
3377 } else {
3378 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
3379 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code());
3380 }
3381 }
3382 }
3383
3384 TEST_P(SpdyFramerTest, GoawayFrameFlags) {
3385 for (int flags = 0; flags < 256; ++flags) {
3386 SCOPED_TRACE(testing::Message() << "Flags " << flags);
3387
3388 testing::StrictMock<net::test::MockVisitor> visitor;
3389 SpdyFramer framer(spdy_version_);
3390 framer.set_visitor(&visitor);
3391
3392 scoped_ptr<SpdyFrame> frame(framer.CreateGoAway(97, GOAWAY_OK));
3393 frame->set_flags(flags);
3394
3395 if (flags != 0) {
3396 EXPECT_CALL(visitor, OnError(_));
3397 } else {
3398 EXPECT_CALL(visitor, OnGoAway(97, GOAWAY_OK));
3399 }
3400
3401 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize;
3402 framer.ProcessInput(frame->data(), frame_size);
3403 if (flags != 0) {
3404 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3405 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
3406 framer.error_code());
3407 } else {
3408 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
3409 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code());
3410 }
3411 }
3412 }
3413
3414 TEST_P(SpdyFramerTest, HeadersFrameFlags) {
3415 for (int flags = 0; flags < 256; ++flags) {
3416 SCOPED_TRACE(testing::Message() << "Flags " << flags);
3417
3418 testing::StrictMock<net::test::MockVisitor> visitor;
3419 SpdyFramer framer(spdy_version_);
3420 framer.set_visitor(&visitor);
3421
3422 EXPECT_CALL(visitor, OnControlFrameCompressed(_, _));
3423
3424 SpdyHeaderBlock headers;
3425 headers["foo"] = "bar";
3426 scoped_ptr<SpdyFrame> frame(
3427 framer.CreateHeaders(57, CONTROL_FLAG_NONE, true, &headers));
3428 frame->set_flags(flags);
3429
3430 if (flags & ~CONTROL_FLAG_FIN) {
3431 EXPECT_CALL(visitor, OnError(_));
3432 } else {
3433 EXPECT_CALL(visitor, OnHeaders(57, flags & CONTROL_FLAG_FIN));
3434 EXPECT_CALL(visitor, OnControlFrameHeaderData(57, _, _))
3435 .WillRepeatedly(testing::Return(true));
3436 if (flags & DATA_FLAG_FIN) {
3437 EXPECT_CALL(visitor, OnStreamFrameData(_, _, 0, DATA_FLAG_FIN));
3438 }
3439 }
3440
3441 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize;
3442 framer.ProcessInput(frame->data(), frame_size);
3443 if (flags & ~CONTROL_FLAG_FIN) {
3444 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3445 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
3446 framer.error_code());
3447 } else {
3448 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
3449 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code());
3450 }
3451 }
3452 }
3453
3454 TEST_P(SpdyFramerTest, PingFrameFlags) {
3455 for (int flags = 0; flags < 256; ++flags) {
3456 SCOPED_TRACE(testing::Message() << "Flags " << flags);
3457
3458 testing::StrictMock<net::test::MockVisitor> visitor;
3459 SpdyFramer framer(spdy_version_);
3460 framer.set_visitor(&visitor);
3461
3462 scoped_ptr<SpdyFrame> frame(framer.CreatePingFrame(42));
3463 frame->set_flags(flags);
3464
3465 if (flags != 0) {
3466 EXPECT_CALL(visitor, OnError(_));
3467 } else {
3468 EXPECT_CALL(visitor, OnPing(42));
3469 }
3470
3471 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize;
3472 framer.ProcessInput(frame->data(), frame_size);
3473 if (flags != 0) {
3474 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3475 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
3476 framer.error_code());
3477 } else {
3478 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
3479 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code());
3480 }
3481 }
3482 }
3483
3484 TEST_P(SpdyFramerTest, WindowUpdateFrameFlags) {
3485 for (int flags = 0; flags < 256; ++flags) {
3486 SCOPED_TRACE(testing::Message() << "Flags " << flags);
3487
3488 testing::StrictMock<net::test::MockVisitor> visitor;
3489 SpdyFramer framer(spdy_version_);
3490 framer.set_visitor(&visitor);
3491
3492 scoped_ptr<SpdyFrame> frame(framer.CreateWindowUpdate(4, 1024));
3493 frame->set_flags(flags);
3494
3495 if (flags != 0) {
3496 EXPECT_CALL(visitor, OnError(_));
3497 } else {
3498 EXPECT_CALL(visitor, OnWindowUpdate(4, 1024));
3499 }
3500
3501 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize;
3502 framer.ProcessInput(frame->data(), frame_size);
3503 if (flags != 0) {
3504 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3505 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
3506 framer.error_code());
3507 } else {
3508 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
3509 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code());
3510 }
3511 }
3512 }
3513
3514 TEST_P(SpdyFramerTest, CredentialFrameFlags) {
3515 for (int flags = 0; flags < 256; ++flags) {
3516 SCOPED_TRACE(testing::Message() << "Flags " << flags);
3517
3518 testing::StrictMock<net::test::MockVisitor> visitor;
3519 SpdyFramer framer(spdy_version_);
3520 framer.set_visitor(&visitor);
3521
3522 SpdyCredential credential;
3523 scoped_ptr<SpdyFrame> frame(framer.CreateCredentialFrame(credential));
3524 frame->set_flags(flags);
3525
3526 if (flags != 0) {
3527 EXPECT_CALL(visitor, OnError(_));
3528 } else {
3529 EXPECT_CALL(visitor, OnCredentialFrameData(_, _))
3530 .WillRepeatedly(testing::Return(true));
3531 }
3532
3533 size_t frame_size = frame->length() + SpdyFrame::kHeaderSize;
3534 framer.ProcessInput(frame->data(), frame_size);
3535 if (flags != 0) {
3536 EXPECT_EQ(SpdyFramer::SPDY_ERROR, framer.state());
3537 EXPECT_EQ(SpdyFramer::SPDY_INVALID_CONTROL_FRAME_FLAGS,
3538 framer.error_code());
3539 } else {
3540 EXPECT_EQ(SpdyFramer::SPDY_RESET, framer.state());
3541 EXPECT_EQ(SpdyFramer::SPDY_NO_ERROR, framer.error_code());
3542 }
3543 }
3544 }
3545
3227 TEST_P(SpdyFramerTest, EmptySynStream) { 3546 TEST_P(SpdyFramerTest, EmptySynStream) {
3228 SpdyHeaderBlock headers; 3547 SpdyHeaderBlock headers;
3229 3548
3230 testing::StrictMock<test::MockVisitor> visitor; 3549 testing::StrictMock<test::MockVisitor> visitor;
3231 SpdyFramer framer(spdy_version_); 3550 SpdyFramer framer(spdy_version_);
3232 framer.set_visitor(&visitor); 3551 framer.set_visitor(&visitor);
3233 3552
3234 EXPECT_CALL(visitor, OnControlFrameCompressed(_, _)); 3553 EXPECT_CALL(visitor, OnControlFrameCompressed(_, _));
3235 scoped_ptr<SpdySynStreamControlFrame> 3554 scoped_ptr<SpdySynStreamControlFrame>
3236 frame(framer.CreateSynStream(1, 0, 1, 0, CONTROL_FLAG_NONE, true, 3555 frame(framer.CreateSynStream(1, 0, 1, 0, CONTROL_FLAG_NONE, true,
(...skipping 17 matching lines...) Expand all
3254 const uint32 kWireFormat = htonl(IsSpdy2() ? 0x04030201 : 0x01020304); 3573 const uint32 kWireFormat = htonl(IsSpdy2() ? 0x04030201 : 0x01020304);
3255 3574
3256 SettingsFlagsAndId id_and_flags = 3575 SettingsFlagsAndId id_and_flags =
3257 SettingsFlagsAndId::FromWireFormat(spdy_version_, kWireFormat); 3576 SettingsFlagsAndId::FromWireFormat(spdy_version_, kWireFormat);
3258 EXPECT_EQ(kId, id_and_flags.id()); 3577 EXPECT_EQ(kId, id_and_flags.id());
3259 EXPECT_EQ(kFlags, id_and_flags.flags()); 3578 EXPECT_EQ(kFlags, id_and_flags.flags());
3260 EXPECT_EQ(kWireFormat, id_and_flags.GetWireFormat(spdy_version_)); 3579 EXPECT_EQ(kWireFormat, id_and_flags.GetWireFormat(spdy_version_));
3261 } 3580 }
3262 3581
3263 } // namespace net 3582 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_framer.cc ('k') | net/spdy/spdy_session.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698