| Index: net/http2/decoder/frame_parts_collector.cc
|
| diff --git a/net/http2/decoder/frame_parts_collector.cc b/net/http2/decoder/frame_parts_collector.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..05c54880105fa8356d4c570beec1b762c477dfa2
|
| --- /dev/null
|
| +++ b/net/http2/decoder/frame_parts_collector.cc
|
| @@ -0,0 +1,112 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "net/http2/decoder/frame_parts_collector.h"
|
| +
|
| +#include <utility>
|
| +
|
| +#include "base/logging.h"
|
| +#include "net/http2/http2_structures_test_util.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace net {
|
| +namespace test {
|
| +
|
| +FramePartsCollector::FramePartsCollector() {}
|
| +FramePartsCollector::~FramePartsCollector() {}
|
| +
|
| +void FramePartsCollector::Reset() {
|
| + current_frame_.reset();
|
| + collected_frames_.clear();
|
| + expected_header_set_ = false;
|
| +}
|
| +
|
| +const FrameParts* FramePartsCollector::frame(size_t n) const {
|
| + if (n < size()) {
|
| + return collected_frames_.at(n).get();
|
| + }
|
| + CHECK(n == size());
|
| + return current_frame();
|
| +}
|
| +
|
| +void FramePartsCollector::ExpectFrameHeader(const Http2FrameHeader& header) {
|
| + EXPECT_FALSE(IsInProgress());
|
| + EXPECT_FALSE(expected_header_set_) << "expected_header_: "
|
| + << expected_header_;
|
| + expected_header_ = header;
|
| + expected_header_set_ = true;
|
| + // OnFrameHeader is called before the flags are scrubbed, but the other
|
| + // methods are called after, so scrub the invalid flags from expected_header_.
|
| + ScrubFlagsOfHeader(&expected_header_);
|
| +}
|
| +
|
| +void FramePartsCollector::TestExpectedHeader(const Http2FrameHeader& header) {
|
| + if (expected_header_set_) {
|
| + EXPECT_EQ(header, expected_header_);
|
| + expected_header_set_ = false;
|
| + }
|
| +}
|
| +
|
| +Http2FrameDecoderListener* FramePartsCollector::StartFrame(
|
| + const Http2FrameHeader& header) {
|
| + TestExpectedHeader(header);
|
| + EXPECT_FALSE(IsInProgress());
|
| + if (current_frame_ == nullptr) {
|
| + current_frame_.reset(new FrameParts(header));
|
| + }
|
| + return current_frame();
|
| +}
|
| +
|
| +Http2FrameDecoderListener* FramePartsCollector::StartAndEndFrame(
|
| + const Http2FrameHeader& header) {
|
| + TestExpectedHeader(header);
|
| + EXPECT_FALSE(IsInProgress());
|
| + if (current_frame_ == nullptr) {
|
| + current_frame_.reset(new FrameParts(header));
|
| + }
|
| + Http2FrameDecoderListener* result = current_frame();
|
| + collected_frames_.push_back(std::move(current_frame_));
|
| + return result;
|
| +}
|
| +
|
| +Http2FrameDecoderListener* FramePartsCollector::CurrentFrame() {
|
| + EXPECT_TRUE(IsInProgress());
|
| + if (current_frame_ == nullptr) {
|
| + return &failing_listener_;
|
| + }
|
| + return current_frame();
|
| +}
|
| +
|
| +Http2FrameDecoderListener* FramePartsCollector::EndFrame() {
|
| + EXPECT_TRUE(IsInProgress());
|
| + if (current_frame_ == nullptr) {
|
| + return &failing_listener_;
|
| + }
|
| + Http2FrameDecoderListener* result = current_frame();
|
| + collected_frames_.push_back(std::move(current_frame_));
|
| + return result;
|
| +}
|
| +
|
| +Http2FrameDecoderListener* FramePartsCollector::FrameError(
|
| + const Http2FrameHeader& header) {
|
| + TestExpectedHeader(header);
|
| + if (current_frame_ == nullptr) {
|
| + // The decoder may detect an error before making any calls to the listener
|
| + // regarding the frame, in which case current_frame_==nullptr and we need
|
| + // to create a FrameParts instance.
|
| + current_frame_.reset(new FrameParts(header));
|
| + } else {
|
| + // Similarly, the decoder may have made calls to the listener regarding the
|
| + // frame before detecting the error; for example, the DATA payload decoder
|
| + // calls OnDataStart before it can detect padding errors, hence before it
|
| + // can call OnPaddingTooLong.
|
| + EXPECT_EQ(header, current_frame_->frame_header);
|
| + }
|
| + Http2FrameDecoderListener* result = current_frame();
|
| + collected_frames_.push_back(std::move(current_frame_));
|
| + return result;
|
| +}
|
| +
|
| +} // namespace test
|
| +} // namespace net
|
|
|