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