buffered_spdy_framer_unittest.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/spdy/buffered_spdy_framer.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/spdy/spdy_test_util_common.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestBufferedSpdyVisitor : public BufferedSpdyFramerVisitorInterface { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch explicit TestBufferedSpdyVisitor(SpdyMajorVersion spdy_version) 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : buffered_spdy_framer_(spdy_version, true), 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) error_count_(0), 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) setting_count_(0), 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syn_frame_count_(0), 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) syn_reply_frame_count_(0), 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) headers_frame_count_(0), 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) header_stream_id_(-1) { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnError(SpdyFramer::SpdyError error_code) OVERRIDE { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << "SpdyFramer Error: " << error_code; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_count_++; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStreamError( 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyStreamId stream_id, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& description) OVERRIDE { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << "SpdyFramer Error on stream: " << stream_id << " " 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << description; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_count_++; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnSynStream(SpdyStreamId stream_id, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyStreamId associated_stream_id, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyPriority priority, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 credential_slot, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin, 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool unidirectional, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SpdyHeaderBlock& headers) OVERRIDE { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_stream_id_ = stream_id; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syn_frame_count_++; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers_ = headers; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnSynReply(SpdyStreamId stream_id, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SpdyHeaderBlock& headers) OVERRIDE { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_stream_id_ = stream_id; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syn_reply_frame_count_++; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers_ = headers; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnHeaders(SpdyStreamId stream_id, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SpdyHeaderBlock& headers) OVERRIDE { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_stream_id_ = stream_id; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers_frame_count_++; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers_ = headers; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnDataFrameHeader(SpdyStreamId stream_id, 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) size_t length, 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool fin) OVERRIDE { 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ADD_FAILURE() << "Unexpected OnDataFrameHeader call."; 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStreamFrameData(SpdyStreamId stream_id, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* data, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t len, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin) OVERRIDE { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(FATAL) << "Unexpected OnStreamFrameData call."; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnSettings(bool clear_persisted) OVERRIDE {} 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnSetting(SpdySettingsIds id, 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 flags, 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 value) OVERRIDE { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setting_count_++; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPing(uint32 unique_id) OVERRIDE {} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnRstStream(SpdyStreamId stream_id, 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyRstStreamStatus status) OVERRIDE { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGoAway(SpdyStreamId last_accepted_stream_id, 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyGoAwayStatus status) OVERRIDE { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool OnCredentialFrameData(const char*, size_t) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(FATAL) << "Unexpected OnCredentialFrameData call."; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnDataFrameHeader(const SpdyFrame* frame) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(FATAL) << "Unexpected OnDataFrameHeader call."; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnRstStream(const SpdyFrame& frame) {} 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnGoAway(const SpdyFrame& frame) {} 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnPing(const SpdyFrame& frame) {} 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowUpdate(SpdyStreamId stream_id, 1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uint32 delta_window_size) OVERRIDE {} 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnPushPromise(SpdyStreamId stream_id, 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SpdyStreamId promised_stream_id) OVERRIDE {} 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnCredential(const SpdyFrame& frame) {} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience function which runs a framer simulation with particular input. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateInFramer(const unsigned char* input, size_t size) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffered_spdy_framer_.set_visitor(this); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t input_remaining = size; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* input_ptr = reinterpret_cast<const char*>(input); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (input_remaining > 0 && 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffered_spdy_framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To make the tests more interesting, we feed random (amd small) chunks 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // into the framer. This simulates getting strange-sized reads from 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the socket. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kMaxReadSize = 32; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t bytes_read = 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (rand() % std::min(input_remaining, kMaxReadSize)) + 1; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t bytes_processed = 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffered_spdy_framer_.ProcessInput(input_ptr, bytes_read); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_remaining -= bytes_processed; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_ptr += bytes_processed; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BufferedSpdyFramer buffered_spdy_framer_; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Counters from the visitor callbacks. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_count_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int setting_count_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int syn_frame_count_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int syn_reply_frame_count_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int headers_frame_count_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Header block streaming state: 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId header_stream_id_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Headers from OnSyn, OnSynReply and OnHeaders for verification. 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyHeaderBlock headers_; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass BufferedSpdyFramerTest 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : public PlatformTest, 159eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public ::testing::WithParamInterface<NextProto> { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the two header blocks have equivalent content. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CompareHeaderBlocks(const SpdyHeaderBlock* expected, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SpdyHeaderBlock* actual) { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected->size() != actual->size()) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Expected " << expected->size() << " headers; actually got " 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << actual->size() << "."; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (SpdyHeaderBlock::const_iterator it = expected->begin(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != expected->end(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyHeaderBlock::const_iterator it2 = actual->find(it->first); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it2 == actual->end()) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Expected header name '" << it->first << "'."; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->second.compare(it2->second) != 0) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Expected header named '" << it->first 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "' to have a value of '" << it->second 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "'. The actual value received was '" << it2->second 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "'."; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpdyMajorVersion spdy_version() { 189558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return NextProtoToSpdyMajorVersion(GetParam()); 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochINSTANTIATE_TEST_CASE_P( 194eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NextProto, 195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BufferedSpdyFramerTest, 1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) testing::Values(kProtoDeprecatedSPDY2, 1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) kProtoSPDY3, kProtoSPDY31, kProtoSPDY4a2, 198558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch kProtoHTTP2Draft04)); 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_P(BufferedSpdyFramerTest, OnSetting) { 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpdyFramer framer(spdy_version()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SettingsMap settings; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings[SETTINGS_UPLOAD_BANDWIDTH] = 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 0x00000002); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) settings[SETTINGS_DOWNLOAD_BANDWIDTH] = 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 0x00000003); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SpdyFrame> control_frame(framer.CreateSettings(settings)); 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestBufferedSpdyVisitor visitor(spdy_version()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor.SimulateInFramer( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<unsigned char*>(control_frame->data()), 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) control_frame->size()); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.error_count_); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, visitor.setting_count_); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_P(BufferedSpdyFramerTest, ReadSynStreamHeaderBlock) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyHeaderBlock headers; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers["aa"] = "vv"; 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers["bb"] = "ww"; 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BufferedSpdyFramer framer(spdy_version(), true); 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SpdyFrame> control_frame( 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) framer.CreateSynStream(1, // stream_id 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, // associated_stream_id 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, // priority 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, // credential_slot 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTROL_FLAG_NONE, 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &headers)); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(control_frame.get() != NULL); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestBufferedSpdyVisitor visitor(spdy_version()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor.SimulateInFramer( 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<unsigned char*>(control_frame.get()->data()), 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) control_frame.get()->size()); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.error_count_); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, visitor.syn_frame_count_); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.syn_reply_frame_count_); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.headers_frame_count_); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 243eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_P(BufferedSpdyFramerTest, ReadSynReplyHeaderBlock) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyHeaderBlock headers; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers["alpha"] = "beta"; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers["gamma"] = "delta"; 247eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BufferedSpdyFramer framer(spdy_version(), true); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SpdyFrame> control_frame( 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) framer.CreateSynReply(1, // stream_id 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTROL_FLAG_NONE, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &headers)); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(control_frame.get() != NULL); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestBufferedSpdyVisitor visitor(spdy_version()); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor.SimulateInFramer( 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<unsigned char*>(control_frame.get()->data()), 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) control_frame.get()->size()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.error_count_); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.syn_frame_count_); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, visitor.syn_reply_frame_count_); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.headers_frame_count_); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_P(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyHeaderBlock headers; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers["alpha"] = "beta"; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers["gamma"] = "delta"; 269eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BufferedSpdyFramer framer(spdy_version(), true); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SpdyFrame> control_frame( 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) framer.CreateHeaders(1, // stream_id 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTROL_FLAG_NONE, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &headers)); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(control_frame.get() != NULL); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestBufferedSpdyVisitor visitor(spdy_version()); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor.SimulateInFramer( 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<unsigned char*>(control_frame.get()->data()), 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) control_frame.get()->size()); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.error_count_); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.syn_frame_count_); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.syn_reply_frame_count_); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, visitor.headers_frame_count_); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 288