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