1 // Copyright (c) 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef QUICHE_QUIC_TEST_TOOLS_QPACK_QPACK_DECODER_TEST_UTILS_H_
6 #define QUICHE_QUIC_TEST_TOOLS_QPACK_QPACK_DECODER_TEST_UTILS_H_
7 
8 #include <string>
9 
10 #include "absl/strings/string_view.h"
11 #include "quiche/quic/core/qpack/qpack_decoder.h"
12 #include "quiche/quic/core/qpack/qpack_progressive_decoder.h"
13 #include "quiche/quic/core/quic_error_codes.h"
14 #include "quiche/quic/platform/api/quic_test.h"
15 #include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
16 #include "quiche/spdy/core/http2_header_block.h"
17 
18 namespace quic {
19 namespace test {
20 
21 // Mock QpackDecoder::EncoderStreamErrorDelegate implementation.
22 class MockEncoderStreamErrorDelegate
23     : public QpackDecoder::EncoderStreamErrorDelegate {
24  public:
25   ~MockEncoderStreamErrorDelegate() override = default;
26 
27   MOCK_METHOD(void, OnEncoderStreamError,
28               (QuicErrorCode error_code, absl::string_view error_message),
29               (override));
30 };
31 
32 // HeadersHandlerInterface implementation that collects decoded headers
33 // into a Http2HeaderBlock.
34 class TestHeadersHandler
35     : public QpackProgressiveDecoder::HeadersHandlerInterface {
36  public:
37   TestHeadersHandler();
38   ~TestHeadersHandler() override = default;
39 
40   // HeadersHandlerInterface implementation:
41   void OnHeaderDecoded(absl::string_view name,
42                        absl::string_view value) override;
43   void OnDecodingCompleted() override;
44   void OnDecodingErrorDetected(QuicErrorCode error_code,
45                                absl::string_view error_message) override;
46 
47   // Release decoded header list.  Must only be called if decoding is complete
48   // and no errors have been detected.
49   spdy::Http2HeaderBlock ReleaseHeaderList();
50 
51   bool decoding_completed() const;
52   bool decoding_error_detected() const;
53   const std::string& error_message() const;
54 
55  private:
56   spdy::Http2HeaderBlock header_list_;
57   bool decoding_completed_;
58   bool decoding_error_detected_;
59   std::string error_message_;
60 };
61 
62 class MockHeadersHandler
63     : public QpackProgressiveDecoder::HeadersHandlerInterface {
64  public:
65   MockHeadersHandler() = default;
66   MockHeadersHandler(const MockHeadersHandler&) = delete;
67   MockHeadersHandler& operator=(const MockHeadersHandler&) = delete;
68   ~MockHeadersHandler() override = default;
69 
70   MOCK_METHOD(void, OnHeaderDecoded,
71               (absl::string_view name, absl::string_view value), (override));
72   MOCK_METHOD(void, OnDecodingCompleted, (), (override));
73   MOCK_METHOD(void, OnDecodingErrorDetected,
74               (QuicErrorCode error_code, absl::string_view error_message),
75               (override));
76 };
77 
78 class NoOpHeadersHandler
79     : public QpackProgressiveDecoder::HeadersHandlerInterface {
80  public:
81   ~NoOpHeadersHandler() override = default;
82 
OnHeaderDecoded(absl::string_view,absl::string_view)83   void OnHeaderDecoded(absl::string_view /*name*/,
84                        absl::string_view /*value*/) override {}
OnDecodingCompleted()85   void OnDecodingCompleted() override {}
OnDecodingErrorDetected(QuicErrorCode,absl::string_view)86   void OnDecodingErrorDetected(QuicErrorCode /*error_code*/,
87                                absl::string_view /*error_message*/) override {}
88 };
89 
90 void QpackDecode(
91     uint64_t maximum_dynamic_table_capacity, uint64_t maximum_blocked_streams,
92     QpackDecoder::EncoderStreamErrorDelegate* encoder_stream_error_delegate,
93     QpackStreamSenderDelegate* decoder_stream_sender_delegate,
94     QpackProgressiveDecoder::HeadersHandlerInterface* handler,
95     const FragmentSizeGenerator& fragment_size_generator,
96     absl::string_view data);
97 
98 }  // namespace test
99 }  // namespace quic
100 
101 #endif  // QUICHE_QUIC_TEST_TOOLS_QPACK_QPACK_DECODER_TEST_UTILS_H_
102