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), 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) push_promise_frame_count_(0), 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch header_stream_id_(static_cast<SpdyStreamId>(-1)), 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch promised_stream_id_(static_cast<SpdyStreamId>(-1)) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnError(SpdyFramer::SpdyError error_code) OVERRIDE { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << "SpdyFramer Error: " << error_code; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_count_++; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStreamError( 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyStreamId stream_id, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& description) OVERRIDE { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(INFO) << "SpdyFramer Error on stream: " << stream_id << " " 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << description; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_count_++; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnSynStream(SpdyStreamId stream_id, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyStreamId associated_stream_id, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyPriority priority, 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool unidirectional, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SpdyHeaderBlock& headers) OVERRIDE { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_stream_id_ = stream_id; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syn_frame_count_++; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers_ = headers; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnSynReply(SpdyStreamId stream_id, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SpdyHeaderBlock& headers) OVERRIDE { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_stream_id_ = stream_id; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syn_reply_frame_count_++; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers_ = headers; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnHeaders(SpdyStreamId stream_id, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SpdyHeaderBlock& headers) OVERRIDE { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) header_stream_id_ = stream_id; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers_frame_count_++; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers_ = headers; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnDataFrameHeader(SpdyStreamId stream_id, 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) size_t length, 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool fin) OVERRIDE { 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ADD_FAILURE() << "Unexpected OnDataFrameHeader call."; 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStreamFrameData(SpdyStreamId stream_id, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* data, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t len, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin) OVERRIDE { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(FATAL) << "Unexpected OnStreamFrameData call."; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnSettings(bool clear_persisted) OVERRIDE {} 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnSetting(SpdySettingsIds id, 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint8 flags, 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32 value) OVERRIDE { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) setting_count_++; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnPing(SpdyPingId unique_id, bool is_ack) OVERRIDE {} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnRstStream(SpdyStreamId stream_id, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyRstStreamStatus status) OVERRIDE { 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGoAway(SpdyStreamId last_accepted_stream_id, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpdyGoAwayStatus status) OVERRIDE { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool OnCredentialFrameData(const char*, size_t) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(FATAL) << "Unexpected OnCredentialFrameData call."; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnDataFrameHeader(const SpdyFrame* frame) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(FATAL) << "Unexpected OnDataFrameHeader call."; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnRstStream(const SpdyFrame& frame) {} 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnGoAway(const SpdyFrame& frame) {} 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnPing(const SpdyFrame& frame) {} 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowUpdate(SpdyStreamId stream_id, 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch uint32 delta_window_size) OVERRIDE {} 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void OnPushPromise(SpdyStreamId stream_id, 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SpdyStreamId promised_stream_id, 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const SpdyHeaderBlock& headers) OVERRIDE { 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) header_stream_id_ = stream_id; 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_NE(header_stream_id_, SpdyFramer::kInvalidStream); 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) push_promise_frame_count_++; 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) promised_stream_id_ = promised_stream_id; 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_NE(promised_stream_id_, SpdyFramer::kInvalidStream); 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) headers_ = headers; 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual bool OnUnknownFrame(SpdyStreamId stream_id, int frame_type) OVERRIDE { 12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return true; 13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnCredential(const SpdyFrame& frame) {} 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience function which runs a framer simulation with particular input. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateInFramer(const unsigned char* input, size_t size) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffered_spdy_framer_.set_visitor(this); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t input_remaining = size; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* input_ptr = reinterpret_cast<const char*>(input); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (input_remaining > 0 && 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffered_spdy_framer_.error_code() == SpdyFramer::SPDY_NO_ERROR) { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To make the tests more interesting, we feed random (amd small) chunks 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // into the framer. This simulates getting strange-sized reads from 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the socket. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t kMaxReadSize = 32; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t bytes_read = 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (rand() % std::min(input_remaining, kMaxReadSize)) + 1; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t bytes_processed = 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffered_spdy_framer_.ProcessInput(input_ptr, bytes_read); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_remaining -= bytes_processed; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_ptr += bytes_processed; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BufferedSpdyFramer buffered_spdy_framer_; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Counters from the visitor callbacks. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_count_; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int setting_count_; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int syn_frame_count_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int syn_reply_frame_count_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int headers_frame_count_; 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int push_promise_frame_count_; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Header block streaming state: 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyStreamId header_stream_id_; 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SpdyStreamId promised_stream_id_; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Headers from OnSyn, OnSynReply, OnHeaders and OnPushPromise for 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // verification. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyHeaderBlock headers_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass BufferedSpdyFramerTest 176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : public PlatformTest, 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public ::testing::WithParamInterface<NextProto> { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the two header blocks have equivalent content. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CompareHeaderBlocks(const SpdyHeaderBlock* expected, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SpdyHeaderBlock* actual) { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (expected->size() != actual->size()) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Expected " << expected->size() << " headers; actually got " 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << actual->size() << "."; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (SpdyHeaderBlock::const_iterator it = expected->begin(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != expected->end(); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyHeaderBlock::const_iterator it2 = actual->find(it->first); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it2 == actual->end()) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Expected header name '" << it->first << "'."; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it->second.compare(it2->second) != 0) { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Expected header named '" << it->first 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "' to have a value of '" << it->second 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "'. The actual value received was '" << it2->second 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << "'."; 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpdyMajorVersion spdy_version() { 207558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return NextProtoToSpdyMajorVersion(GetParam()); 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochINSTANTIATE_TEST_CASE_P( 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NextProto, 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BufferedSpdyFramerTest, 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) testing::Values(kProtoDeprecatedSPDY2, 215a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch kProtoSPDY3, kProtoSPDY31, kProtoSPDY4)); 216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_P(BufferedSpdyFramerTest, OnSetting) { 218eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SpdyFramer framer(spdy_version()); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SpdySettingsIR settings_ir; 2204ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch settings_ir.AddSetting(SETTINGS_INITIAL_WINDOW_SIZE, false, false, 2); 2214ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch settings_ir.AddSetting(SETTINGS_MAX_CONCURRENT_STREAMS, false, false, 3); 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<SpdyFrame> control_frame(framer.SerializeSettings(settings_ir)); 223eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestBufferedSpdyVisitor visitor(spdy_version()); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor.SimulateInFramer( 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<unsigned char*>(control_frame->data()), 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) control_frame->size()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.error_count_); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, visitor.setting_count_); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_P(BufferedSpdyFramerTest, ReadSynStreamHeaderBlock) { 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (spdy_version() > SPDY3) { 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // SYN_STREAM not supported in SPDY>3. 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyHeaderBlock headers; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers["aa"] = "vv"; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers["bb"] = "ww"; 240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BufferedSpdyFramer framer(spdy_version(), true); 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SpdyFrame> control_frame( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) framer.CreateSynStream(1, // stream_id 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, // associated_stream_id 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, // priority 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTROL_FLAG_NONE, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &headers)); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(control_frame.get() != NULL); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 249eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestBufferedSpdyVisitor visitor(spdy_version()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor.SimulateInFramer( 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<unsigned char*>(control_frame.get()->data()), 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) control_frame.get()->size()); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.error_count_); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, visitor.syn_frame_count_); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.syn_reply_frame_count_); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.headers_frame_count_); 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, visitor.push_promise_frame_count_); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_P(BufferedSpdyFramerTest, ReadSynReplyHeaderBlock) { 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (spdy_version() > SPDY3) { 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // SYN_REPLY not supported in SPDY>3. 264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 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.CreateSynReply(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_); 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, visitor.push_promise_frame_count_); 28303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (spdy_version() < SPDY4) { 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, visitor.syn_reply_frame_count_); 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, visitor.headers_frame_count_); 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } else { 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(0, visitor.syn_reply_frame_count_); 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(1, visitor.headers_frame_count_); 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_P(BufferedSpdyFramerTest, ReadHeadersHeaderBlock) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpdyHeaderBlock headers; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers["alpha"] = "beta"; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) headers["gamma"] = "delta"; 297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch BufferedSpdyFramer framer(spdy_version(), true); 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<SpdyFrame> control_frame( 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) framer.CreateHeaders(1, // stream_id 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTROL_FLAG_NONE, 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &headers)); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(control_frame.get() != NULL); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch TestBufferedSpdyVisitor visitor(spdy_version()); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visitor.SimulateInFramer( 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reinterpret_cast<unsigned char*>(control_frame.get()->data()), 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) control_frame.get()->size()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.error_count_); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.syn_frame_count_); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, visitor.syn_reply_frame_count_); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, visitor.headers_frame_count_); 312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, visitor.push_promise_frame_count_); 313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); 314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(BufferedSpdyFramerTest, ReadPushPromiseHeaderBlock) { 317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (spdy_version() < SPDY4) 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SpdyHeaderBlock headers; 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) headers["alpha"] = "beta"; 321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) headers["gamma"] = "delta"; 322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BufferedSpdyFramer framer(spdy_version(), true); 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<SpdyFrame> control_frame( 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) framer.CreatePushPromise(1, 2, &headers)); 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(control_frame.get() != NULL); 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TestBufferedSpdyVisitor visitor(spdy_version()); 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) visitor.SimulateInFramer( 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<unsigned char*>(control_frame.get()->data()), 330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) control_frame.get()->size()); 331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, visitor.error_count_); 332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, visitor.syn_frame_count_); 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, visitor.syn_reply_frame_count_); 334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(0, visitor.headers_frame_count_); 335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1, visitor.push_promise_frame_count_); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(CompareHeaderBlocks(&headers, &visitor.headers_)); 337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(1u, visitor.header_stream_id_); 338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(2u, visitor.promised_stream_id_); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 340eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 342