OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |