|  | // Copyright 2016 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef QUICHE_HTTP2_HTTP2_STRUCTURES_TEST_UTIL_H_ | 
|  | #define QUICHE_HTTP2_HTTP2_STRUCTURES_TEST_UTIL_H_ | 
|  |  | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  | #include "net/third_party/quiche/src/http2/http2_structures.h" | 
|  | #include "net/third_party/quiche/src/http2/platform/api/http2_string.h" | 
|  | #include "net/third_party/quiche/src/http2/test_tools/http2_random.h" | 
|  | #include "net/third_party/quiche/src/http2/tools/http2_frame_builder.h" | 
|  |  | 
|  | namespace http2 { | 
|  | namespace test { | 
|  |  | 
|  | template <class S> | 
|  | Http2String SerializeStructure(const S& s) { | 
|  | Http2FrameBuilder fb; | 
|  | fb.Append(s); | 
|  | EXPECT_EQ(S::EncodedSize(), fb.size()); | 
|  | return fb.buffer(); | 
|  | } | 
|  |  | 
|  | // Randomize the members of out, in a manner that yields encodeable contents | 
|  | // (e.g. a "uint24" field has only the low 24 bits set). | 
|  | void Randomize(Http2FrameHeader* out, Http2Random* rng); | 
|  | void Randomize(Http2PriorityFields* out, Http2Random* rng); | 
|  | void Randomize(Http2RstStreamFields* out, Http2Random* rng); | 
|  | void Randomize(Http2SettingFields* out, Http2Random* rng); | 
|  | void Randomize(Http2PushPromiseFields* out, Http2Random* rng); | 
|  | void Randomize(Http2PingFields* out, Http2Random* rng); | 
|  | void Randomize(Http2GoAwayFields* out, Http2Random* rng); | 
|  | void Randomize(Http2WindowUpdateFields* out, Http2Random* rng); | 
|  | void Randomize(Http2AltSvcFields* out, Http2Random* rng); | 
|  |  | 
|  | // Clear bits of header->flags that are known to be invalid for the | 
|  | // type. For unknown frame types, no change is made. | 
|  | void ScrubFlagsOfHeader(Http2FrameHeader* header); | 
|  |  | 
|  | // Is the frame with this header padded? Only true for known/supported frame | 
|  | // types. | 
|  | bool FrameIsPadded(const Http2FrameHeader& header); | 
|  |  | 
|  | // Does the frame with this header have Http2PriorityFields? | 
|  | bool FrameHasPriority(const Http2FrameHeader& header); | 
|  |  | 
|  | // Does the frame with this header have a variable length payload (including | 
|  | // empty) payload (e.g. DATA or HEADERS)? Really a test of the frame type. | 
|  | bool FrameCanHavePayload(const Http2FrameHeader& header); | 
|  |  | 
|  | // Does the frame with this header have a variable length HPACK payload | 
|  | // (including empty) payload (e.g. HEADERS)? Really a test of the frame type. | 
|  | bool FrameCanHaveHpackPayload(const Http2FrameHeader& header); | 
|  |  | 
|  | }  // namespace test | 
|  | }  // namespace http2 | 
|  |  | 
|  | #endif  // QUICHE_HTTP2_HTTP2_STRUCTURES_TEST_UTIL_H_ |