1 // Copyright 2016 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/http2/test_tools/http2_structures_test_util.h"
6
7 #include <cstdint>
8
9 #include "quiche/http2/http2_constants.h"
10 #include "quiche/http2/http2_structures.h"
11 #include "quiche/http2/test_tools/http2_constants_test_util.h"
12 #include "quiche/http2/test_tools/http2_random.h"
13
14 namespace http2 {
15 namespace test {
16
Randomize(Http2FrameHeader * out,Http2Random * rng)17 void Randomize(Http2FrameHeader* out, Http2Random* rng) {
18 out->payload_length = rng->Rand32() & 0xffffff;
19 out->type = static_cast<Http2FrameType>(rng->Rand8());
20 out->flags = static_cast<Http2FrameFlag>(rng->Rand8());
21 out->stream_id = rng->Rand32() & StreamIdMask();
22 }
Randomize(Http2PriorityFields * out,Http2Random * rng)23 void Randomize(Http2PriorityFields* out, Http2Random* rng) {
24 out->stream_dependency = rng->Rand32() & StreamIdMask();
25 out->weight = rng->Rand8() + 1;
26 out->is_exclusive = rng->OneIn(2);
27 }
Randomize(Http2RstStreamFields * out,Http2Random * rng)28 void Randomize(Http2RstStreamFields* out, Http2Random* rng) {
29 out->error_code = static_cast<Http2ErrorCode>(rng->Rand32());
30 }
Randomize(Http2SettingFields * out,Http2Random * rng)31 void Randomize(Http2SettingFields* out, Http2Random* rng) {
32 out->parameter = static_cast<Http2SettingsParameter>(rng->Rand16());
33 out->value = rng->Rand32();
34 }
Randomize(Http2PushPromiseFields * out,Http2Random * rng)35 void Randomize(Http2PushPromiseFields* out, Http2Random* rng) {
36 out->promised_stream_id = rng->Rand32() & StreamIdMask();
37 }
Randomize(Http2PingFields * out,Http2Random * rng)38 void Randomize(Http2PingFields* out, Http2Random* rng) {
39 for (int ndx = 0; ndx < 8; ++ndx) {
40 out->opaque_bytes[ndx] = rng->Rand8();
41 }
42 }
Randomize(Http2GoAwayFields * out,Http2Random * rng)43 void Randomize(Http2GoAwayFields* out, Http2Random* rng) {
44 out->last_stream_id = rng->Rand32() & StreamIdMask();
45 out->error_code = static_cast<Http2ErrorCode>(rng->Rand32());
46 }
Randomize(Http2WindowUpdateFields * out,Http2Random * rng)47 void Randomize(Http2WindowUpdateFields* out, Http2Random* rng) {
48 out->window_size_increment = rng->Rand32() & 0x7fffffff;
49 }
Randomize(Http2AltSvcFields * out,Http2Random * rng)50 void Randomize(Http2AltSvcFields* out, Http2Random* rng) {
51 out->origin_length = rng->Rand16();
52 }
Randomize(Http2PriorityUpdateFields * out,Http2Random * rng)53 void Randomize(Http2PriorityUpdateFields* out, Http2Random* rng) {
54 out->prioritized_stream_id = rng->Rand32() & StreamIdMask();
55 }
56
ScrubFlagsOfHeader(Http2FrameHeader * header)57 void ScrubFlagsOfHeader(Http2FrameHeader* header) {
58 uint8_t invalid_mask = InvalidFlagMaskForFrameType(header->type);
59 uint8_t keep_mask = ~invalid_mask;
60 header->RetainFlags(keep_mask);
61 }
62
FrameIsPadded(const Http2FrameHeader & header)63 bool FrameIsPadded(const Http2FrameHeader& header) {
64 switch (header.type) {
65 case Http2FrameType::DATA:
66 case Http2FrameType::HEADERS:
67 case Http2FrameType::PUSH_PROMISE:
68 return header.IsPadded();
69 default:
70 return false;
71 }
72 }
73
FrameHasPriority(const Http2FrameHeader & header)74 bool FrameHasPriority(const Http2FrameHeader& header) {
75 switch (header.type) {
76 case Http2FrameType::HEADERS:
77 return header.HasPriority();
78 case Http2FrameType::PRIORITY:
79 return true;
80 default:
81 return false;
82 }
83 }
84
FrameCanHavePayload(const Http2FrameHeader & header)85 bool FrameCanHavePayload(const Http2FrameHeader& header) {
86 switch (header.type) {
87 case Http2FrameType::DATA:
88 case Http2FrameType::HEADERS:
89 case Http2FrameType::PUSH_PROMISE:
90 case Http2FrameType::CONTINUATION:
91 case Http2FrameType::PING:
92 case Http2FrameType::GOAWAY:
93 case Http2FrameType::ALTSVC:
94 return true;
95 default:
96 return false;
97 }
98 }
99
FrameCanHaveHpackPayload(const Http2FrameHeader & header)100 bool FrameCanHaveHpackPayload(const Http2FrameHeader& header) {
101 switch (header.type) {
102 case Http2FrameType::HEADERS:
103 case Http2FrameType::PUSH_PROMISE:
104 case Http2FrameType::CONTINUATION:
105 return true;
106 default:
107 return false;
108 }
109 }
110
111 } // namespace test
112 } // namespace http2
113