Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1224)

Unified Diff: net/spdy/spdy_deframer_visitor.h

Issue 2832973003: Split net/spdy into core and chromium subdirectories. (Closed)
Patch Set: Fix some more build rules. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/spdy/spdy_bug_tracker.h ('k') | net/spdy/spdy_deframer_visitor.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/spdy/spdy_deframer_visitor.h
diff --git a/net/spdy/spdy_deframer_visitor.h b/net/spdy/spdy_deframer_visitor.h
deleted file mode 100644
index 9727d37ddd8dbf6729be2f504d10059f5260288b..0000000000000000000000000000000000000000
--- a/net/spdy/spdy_deframer_visitor.h
+++ /dev/null
@@ -1,250 +0,0 @@
-// 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.
-
-#ifndef NET_SPDY_SPDY_DEFRAMER_VISITOR_H_
-#define NET_SPDY_SPDY_DEFRAMER_VISITOR_H_
-
-// Supports testing by converting callbacks to SpdyFramerVisitorInterface into
-// callbacks to SpdyDeframerVisitorInterface, whose arguments are generally
-// SpdyFrameIR instances. This enables a test client or test backend to operate
-// at a level between the low-level callbacks of SpdyFramerVisitorInterface and
-// the much higher level of entire messages (i.e. headers, body, trailers).
-// Where possible the converter (SpdyTestDeframer) tries to preserve information
-// that might be useful to tests (e.g. the order of headers or the amount of
-// padding); the design also aims to allow tests to be concise, ideally
-// supporting gMock style EXPECT_CALL(visitor, OnHeaders(...matchers...))
-// without too much boilerplate.
-//
-// Only supports HTTP/2 for the moment.
-//
-// Example of usage:
-//
-// SpdyFramer framer(HTTP2);
-//
-// // Need to call SpdyTestDeframer::AtFrameEnd() after processing each
-// // frame, so tell SpdyFramer to stop after each.
-// framer.set_process_single_input_frame(true);
-//
-// // Need the new OnHeader callbacks.
-// framer.set_use_new_methods_for_test(true);
-//
-// // Create your visitor, a subclass of SpdyDeframerVisitorInterface.
-// // For example, using DeframerCallbackCollector to collect frames:
-// std::vector<CollectedFrame> collected_frames;
-// auto your_visitor = gtl::MakeUnique<DeframerCallbackCollector>(
-// &collected_frames);
-//
-// // Transfer ownership of your visitor to the converter, which ensures that
-// // your visitor stays alive while the converter needs to call it.
-// auto the_deframer = SpdyTestDeframer::CreateConverter(
-// std::move(your_visitor));
-//
-// // Tell the framer to notify SpdyTestDeframer of the decoded frame
-// // details.
-// framer.set_visitor(the_deframer.get());
-//
-// // Process frames.
-// SpdyStringPiece input = ...
-// while (!input.empty() && !framer.HasError()) {
-// size_t consumed = framer.ProcessInput(input.data(), input.size());
-// input.remove_prefix(consumed);
-// if (framer.state() == SpdyFramer::SPDY_READY_FOR_FRAME) {
-// the_deframer->AtFrameEnd();
-// }
-// }
-//
-// // Make sure that the correct frames were received. For example:
-// ASSERT_EQ(collected_frames.size(), 3);
-//
-// SpdyDataIR expected1(7 /*stream_id*/, "Data Payload");
-// expected1.set_padding_len(17);
-// EXPECT_TRUE(collected_frames[0].VerifyEquals(expected1));
-//
-// // Repeat for the other frames.
-//
-// Note that you could also seed the subclass of SpdyDeframerVisitorInterface
-// with the expected frames, which it would pop-off the list as its expectations
-// are met.
-
-#include <stdint.h>
-
-#include <memory>
-#include <type_traits>
-#include <utility>
-#include <vector>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "net/spdy/platform/api/spdy_string.h"
-#include "net/spdy/spdy_framer.h"
-#include "net/spdy/spdy_protocol.h"
-#include "net/spdy/spdy_protocol_test_utils.h"
-#include "net/spdy/spdy_test_utils.h"
-
-namespace net {
-namespace test {
-
-// Non-lossy representation of a SETTINGS frame payload.
-typedef std::vector<std::pair<SpdySettingsIds, uint32_t>> SettingVector;
-
-// StringPairVector is used to record information lost by SpdyHeaderBlock, in
-// particular the order of each header entry, though it doesn't expose the
-// inner details of the HPACK block, such as the type of encoding selected
-// for each header entry, nor dynamic table size changes.
-typedef std::pair<SpdyString, SpdyString> StringPair;
-typedef std::vector<StringPair> StringPairVector;
-
-// Forward decl.
-class SpdyTestDeframer;
-
-// Note that this only roughly captures the frames, as padding bytes are lost,
-// continuation frames are combined with their leading HEADERS or PUSH_PROMISE,
-// the details of the HPACK encoding are lost, leaving
-// only the list of header entries (name and value strings). If really helpful,
-// we could add a SpdyRawDeframerVisitorInterface that gets the HPACK bytes,
-// and receives continuation frames. For more info we'd need to improve
-// SpdyFramerVisitorInterface.
-class SpdyDeframerVisitorInterface {
- public:
- virtual ~SpdyDeframerVisitorInterface() {}
-
- // Wrap a visitor in another SpdyDeframerVisitorInterface that will
- // DVLOG each call, and will then forward the calls to the wrapped visitor
- // (if provided; nullptr is OK). Takes ownership of the wrapped visitor.
- static std::unique_ptr<SpdyDeframerVisitorInterface> LogBeforeVisiting(
- std::unique_ptr<SpdyDeframerVisitorInterface> wrapped_visitor);
-
- virtual void OnAltSvc(std::unique_ptr<SpdyAltSvcIR> frame) {}
- virtual void OnData(std::unique_ptr<SpdyDataIR> frame) {}
- virtual void OnGoAway(std::unique_ptr<SpdyGoAwayIR> frame) {}
-
- // SpdyHeadersIR and SpdyPushPromiseIR each has a SpdyHeaderBlock which
- // significantly modifies the headers, so the actual header entries (name
- // and value strings) are provided in a vector.
- virtual void OnHeaders(std::unique_ptr<SpdyHeadersIR> frame,
- std::unique_ptr<StringPairVector> headers) {}
-
- virtual void OnPing(std::unique_ptr<SpdyPingIR> frame) {}
- virtual void OnPingAck(std::unique_ptr<SpdyPingIR> frame);
- virtual void OnPriority(std::unique_ptr<SpdyPriorityIR> frame) {}
-
- // SpdyHeadersIR and SpdyPushPromiseIR each has a SpdyHeaderBlock which
- // significantly modifies the headers, so the actual header entries (name
- // and value strings) are provided in a vector.
- virtual void OnPushPromise(std::unique_ptr<SpdyPushPromiseIR> frame,
- std::unique_ptr<StringPairVector> headers) {}
-
- virtual void OnRstStream(std::unique_ptr<SpdyRstStreamIR> frame) {}
-
- // SpdySettingsIR has a map for settings, so loses info about the order of
- // settings, and whether the same setting appeared more than once, so the
- // the actual settings (parameter and value) are provided in a vector.
- virtual void OnSettings(std::unique_ptr<SpdySettingsIR> frame,
- std::unique_ptr<SettingVector> settings) {}
-
- // A settings frame with an ACK has no content, but for uniformity passing
- // a frame with the ACK flag set.
- virtual void OnSettingsAck(std::unique_ptr<SpdySettingsIR> frame);
-
- virtual void OnWindowUpdate(std::unique_ptr<SpdyWindowUpdateIR> frame) {}
-
- // The SpdyFramer will not process any more data at this point.
- virtual void OnError(SpdyFramer* framer, SpdyTestDeframer* deframer) {}
-};
-
-class SpdyTestDeframer : public SpdyFramerVisitorInterface {
- public:
- ~SpdyTestDeframer() override {}
-
- // Creates a SpdyFramerVisitorInterface that builds SpdyFrameIR concrete
- // instances based on the callbacks it receives; when an entire frame is
- // decoded/reconstructed it calls the passed in SpdyDeframerVisitorInterface.
- // Transfers ownership of visitor to the new SpdyTestDeframer, which ensures
- // that it continues to exist while the SpdyTestDeframer exists.
- static std::unique_ptr<SpdyTestDeframer> CreateConverter(
- std::unique_ptr<SpdyDeframerVisitorInterface> visitor);
-
- // Call to notify the deframer that the SpdyFramer has returned after reaching
- // the end of decoding a frame. This is used to flush info about some frame
- // types where we don't get a clear end signal; others are flushed (i.e. the
- // appropriate call to the SpdyDeframerVisitorInterface method is invoked)
- // as they're decoded by SpdyFramer and it calls the deframer. See the
- // example in the comments at the top of this file.
- virtual bool AtFrameEnd() = 0;
-
- protected:
- SpdyTestDeframer() {}
-
- private:
- DISALLOW_COPY_AND_ASSIGN(SpdyTestDeframer);
-};
-
-// CollectedFrame holds the result of one call to SpdyDeframerVisitorInterface,
-// as recorded by DeframerCallbackCollector.
-struct CollectedFrame {
- CollectedFrame();
- CollectedFrame(CollectedFrame&& other);
- ~CollectedFrame();
- CollectedFrame& operator=(CollectedFrame&& other);
-
- // Compare a SpdyFrameIR sub-class instance, expected_ir, against the
- // collected SpdyFrameIR.
- template <class T,
- typename X =
- typename std::enable_if<std::is_base_of<SpdyFrameIR, T>::value>>
- ::testing::AssertionResult VerifyHasFrame(const T& expected_ir) const {
- return VerifySpdyFrameIREquals(expected_ir, frame_ir.get())
- ? ::testing::AssertionSuccess()
- : ::testing::AssertionFailure();
- }
-
- // Compare the collected headers against a StringPairVector. Ignores
- // this->frame_ir.
- ::testing::AssertionResult VerifyHasHeaders(
- const StringPairVector& expected_headers) const;
-
- // Compare the collected settings (parameter and value pairs) against
- // expected_settings. Ignores this->frame_ir.
- ::testing::AssertionResult VerifyHasSettings(
- const SettingVector& expected_settings) const;
-
- std::unique_ptr<SpdyFrameIR> frame_ir;
- std::unique_ptr<StringPairVector> headers;
- std::unique_ptr<SettingVector> settings;
- bool error_reported = false;
-};
-
-// Creates a CollectedFrame instance for each callback, storing it in the
-// vector provided to the constructor.
-class DeframerCallbackCollector : public SpdyDeframerVisitorInterface {
- public:
- explicit DeframerCallbackCollector(
- std::vector<CollectedFrame>* collected_frames);
- ~DeframerCallbackCollector() override {}
-
- void OnAltSvc(std::unique_ptr<SpdyAltSvcIR> frame_ir) override;
- void OnData(std::unique_ptr<SpdyDataIR> frame_ir) override;
- void OnGoAway(std::unique_ptr<SpdyGoAwayIR> frame_ir) override;
- void OnHeaders(std::unique_ptr<SpdyHeadersIR> frame_ir,
- std::unique_ptr<StringPairVector> headers) override;
- void OnPing(std::unique_ptr<SpdyPingIR> frame_ir) override;
- void OnPingAck(std::unique_ptr<SpdyPingIR> frame_ir) override;
- void OnPriority(std::unique_ptr<SpdyPriorityIR> frame_ir) override;
- void OnPushPromise(std::unique_ptr<SpdyPushPromiseIR> frame_ir,
- std::unique_ptr<StringPairVector> headers) override;
- void OnRstStream(std::unique_ptr<SpdyRstStreamIR> frame_ir) override;
- void OnSettings(std::unique_ptr<SpdySettingsIR> frame_ir,
- std::unique_ptr<SettingVector> settings) override;
- void OnSettingsAck(std::unique_ptr<SpdySettingsIR> frame_ir) override;
- void OnWindowUpdate(std::unique_ptr<SpdyWindowUpdateIR> frame_ir) override;
- void OnError(SpdyFramer* framer, SpdyTestDeframer* deframer) override;
-
- private:
- std::vector<CollectedFrame>* collected_frames_;
-};
-
-} // namespace test
-} // namespace net
-
-#endif // NET_SPDY_SPDY_DEFRAMER_VISITOR_H_
« no previous file with comments | « net/spdy/spdy_bug_tracker.h ('k') | net/spdy/spdy_deframer_visitor.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698