1 // Copyright 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 <fuzzer/FuzzedDataProvider.h>
6 
7 #include <cstddef>
8 #include <cstdint>
9 
10 #include "quiche/quic/core/qpack/qpack_decoder_stream_sender.h"
11 #include "quiche/quic/core/quic_types.h"
12 #include "quiche/quic/test_tools/qpack/qpack_test_utils.h"
13 
14 namespace quic {
15 namespace test {
16 
17 // This fuzzer exercises QpackDecoderStreamSender.
LLVMFuzzerTestOneInput(const uint8_t * data,size_t size)18 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
19   NoopQpackStreamSenderDelegate delegate;
20   QpackDecoderStreamSender sender;
21   sender.set_qpack_stream_sender_delegate(&delegate);
22 
23   FuzzedDataProvider provider(data, size);
24 
25   while (provider.remaining_bytes() != 0) {
26     switch (provider.ConsumeIntegral<uint8_t>() % 4) {
27       case 0: {
28         uint64_t increment = provider.ConsumeIntegral<uint64_t>();
29         sender.SendInsertCountIncrement(increment);
30         break;
31       }
32       case 1: {
33         QuicStreamId stream_id = provider.ConsumeIntegral<QuicStreamId>();
34         sender.SendHeaderAcknowledgement(stream_id);
35         break;
36       }
37       case 2: {
38         QuicStreamId stream_id = provider.ConsumeIntegral<QuicStreamId>();
39         sender.SendStreamCancellation(stream_id);
40         break;
41       }
42       case 3: {
43         sender.Flush();
44         break;
45       }
46     }
47   }
48 
49   sender.Flush();
50   return 0;
51 }
52 
53 }  // namespace test
54 }  // namespace quic
55