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 #include "quiche/quic/test_tools/qpack/qpack_decoder_test_utils.h"
6 
7 #include <algorithm>
8 #include <cstddef>
9 #include <utility>
10 
11 #include "absl/strings/string_view.h"
12 #include "quiche/quic/platform/api/quic_test.h"
13 
14 namespace quic {
15 namespace test {
16 
TestHeadersHandler()17 TestHeadersHandler::TestHeadersHandler()
18     : decoding_completed_(false), decoding_error_detected_(false) {}
19 
OnHeaderDecoded(absl::string_view name,absl::string_view value)20 void TestHeadersHandler::OnHeaderDecoded(absl::string_view name,
21                                          absl::string_view value) {
22   ASSERT_FALSE(decoding_completed_);
23   ASSERT_FALSE(decoding_error_detected_);
24 
25   header_list_.AppendValueOrAddHeader(name, value);
26 }
27 
OnDecodingCompleted()28 void TestHeadersHandler::OnDecodingCompleted() {
29   ASSERT_FALSE(decoding_completed_);
30   ASSERT_FALSE(decoding_error_detected_);
31 
32   decoding_completed_ = true;
33 }
34 
OnDecodingErrorDetected(QuicErrorCode,absl::string_view error_message)35 void TestHeadersHandler::OnDecodingErrorDetected(
36     QuicErrorCode /*error_code*/, absl::string_view error_message) {
37   ASSERT_FALSE(decoding_completed_);
38   ASSERT_FALSE(decoding_error_detected_);
39 
40   decoding_error_detected_ = true;
41   error_message_.assign(error_message.data(), error_message.size());
42 }
43 
ReleaseHeaderList()44 spdy::Http2HeaderBlock TestHeadersHandler::ReleaseHeaderList() {
45   QUICHE_DCHECK(decoding_completed_);
46   QUICHE_DCHECK(!decoding_error_detected_);
47 
48   return std::move(header_list_);
49 }
50 
decoding_completed() const51 bool TestHeadersHandler::decoding_completed() const {
52   return decoding_completed_;
53 }
54 
decoding_error_detected() const55 bool TestHeadersHandler::decoding_error_detected() const {
56   return decoding_error_detected_;
57 }
58 
error_message() const59 const std::string& TestHeadersHandler::error_message() const {
60   QUICHE_DCHECK(decoding_error_detected_);
61   return error_message_;
62 }
63 
QpackDecode(uint64_t maximum_dynamic_table_capacity,uint64_t maximum_blocked_streams,QpackDecoder::EncoderStreamErrorDelegate * encoder_stream_error_delegate,QpackStreamSenderDelegate * decoder_stream_sender_delegate,QpackProgressiveDecoder::HeadersHandlerInterface * handler,const FragmentSizeGenerator & fragment_size_generator,absl::string_view data)64 void QpackDecode(
65     uint64_t maximum_dynamic_table_capacity, uint64_t maximum_blocked_streams,
66     QpackDecoder::EncoderStreamErrorDelegate* encoder_stream_error_delegate,
67     QpackStreamSenderDelegate* decoder_stream_sender_delegate,
68     QpackProgressiveDecoder::HeadersHandlerInterface* handler,
69     const FragmentSizeGenerator& fragment_size_generator,
70     absl::string_view data) {
71   QpackDecoder decoder(maximum_dynamic_table_capacity, maximum_blocked_streams,
72                        encoder_stream_error_delegate);
73   decoder.set_qpack_stream_sender_delegate(decoder_stream_sender_delegate);
74   auto progressive_decoder =
75       decoder.CreateProgressiveDecoder(/* stream_id = */ 1, handler);
76   while (!data.empty()) {
77     size_t fragment_size = std::min(fragment_size_generator(), data.size());
78     progressive_decoder->Decode(data.substr(0, fragment_size));
79     data = data.substr(fragment_size);
80   }
81   progressive_decoder->EndHeaderBlock();
82 }
83 
84 }  // namespace test
85 }  // namespace quic
86