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