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