blob: 83b5a9579828c3932dfc0dc24a253fe0e05e61dc [file] [log] [blame]
QUICHE teamfd50a402018-12-07 22:54:05 -05001// 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
QUICHE team5be974e2020-12-29 18:35:24 -05005#include "http2/http2_structures_test_util.h"
QUICHE teamfd50a402018-12-07 22:54:05 -05006
7#include <cstdint>
8
QUICHE team5be974e2020-12-29 18:35:24 -05009#include "http2/http2_constants.h"
10#include "http2/http2_constants_test_util.h"
11#include "http2/http2_structures.h"
12#include "http2/test_tools/http2_random.h"
QUICHE teamfd50a402018-12-07 22:54:05 -050013
14namespace http2 {
15namespace test {
16
bnc05281d72020-12-16 15:37:33 -080017void 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();
QUICHE teamfd50a402018-12-07 22:54:05 -050022}
bnc05281d72020-12-16 15:37:33 -080023void 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);
QUICHE teamfd50a402018-12-07 22:54:05 -050027}
bnc05281d72020-12-16 15:37:33 -080028void Randomize(Http2RstStreamFields* out, Http2Random* rng) {
29 out->error_code = static_cast<Http2ErrorCode>(rng->Rand32());
QUICHE teamfd50a402018-12-07 22:54:05 -050030}
bnc05281d72020-12-16 15:37:33 -080031void Randomize(Http2SettingFields* out, Http2Random* rng) {
32 out->parameter = static_cast<Http2SettingsParameter>(rng->Rand16());
33 out->value = rng->Rand32();
QUICHE teamfd50a402018-12-07 22:54:05 -050034}
bnc05281d72020-12-16 15:37:33 -080035void Randomize(Http2PushPromiseFields* out, Http2Random* rng) {
36 out->promised_stream_id = rng->Rand32() & StreamIdMask();
QUICHE teamfd50a402018-12-07 22:54:05 -050037}
bnc05281d72020-12-16 15:37:33 -080038void Randomize(Http2PingFields* out, Http2Random* rng) {
QUICHE teamfd50a402018-12-07 22:54:05 -050039 for (int ndx = 0; ndx < 8; ++ndx) {
bnc05281d72020-12-16 15:37:33 -080040 out->opaque_bytes[ndx] = rng->Rand8();
QUICHE teamfd50a402018-12-07 22:54:05 -050041 }
42}
bnc05281d72020-12-16 15:37:33 -080043void Randomize(Http2GoAwayFields* out, Http2Random* rng) {
44 out->last_stream_id = rng->Rand32() & StreamIdMask();
45 out->error_code = static_cast<Http2ErrorCode>(rng->Rand32());
QUICHE teamfd50a402018-12-07 22:54:05 -050046}
bnc05281d72020-12-16 15:37:33 -080047void Randomize(Http2WindowUpdateFields* out, Http2Random* rng) {
48 out->window_size_increment = rng->Rand32() & 0x7fffffff;
QUICHE teamfd50a402018-12-07 22:54:05 -050049}
bnc05281d72020-12-16 15:37:33 -080050void Randomize(Http2AltSvcFields* out, Http2Random* rng) {
51 out->origin_length = rng->Rand16();
QUICHE teamfd50a402018-12-07 22:54:05 -050052}
bncbea13b82021-01-08 08:46:09 -080053void Randomize(Http2PriorityUpdateFields* out, Http2Random* rng) {
54 out->prioritized_stream_id = rng->Rand32() & StreamIdMask();
55}
QUICHE teamfd50a402018-12-07 22:54:05 -050056
57void 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
63bool 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
74bool 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
85bool 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
100bool 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