xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/spdy/core/spdy_frame_builder_test.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright (c) 2013 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/spdy/core/spdy_frame_builder.h"
6 
7 #include <cstddef>
8 #include <cstdint>
9 #include <cstring>
10 
11 #include "absl/strings/string_view.h"
12 #include "quiche/common/platform/api/quiche_export.h"
13 #include "quiche/common/platform/api/quiche_test.h"
14 #include "quiche/spdy/core/array_output_buffer.h"
15 #include "quiche/spdy/core/spdy_protocol.h"
16 #include "quiche/spdy/test_tools/spdy_test_utils.h"
17 
18 namespace spdy {
19 
20 namespace test {
21 
22 class QUICHE_EXPORT SpdyFrameBuilderPeer {
23  public:
GetWritableBuffer(SpdyFrameBuilder * builder,size_t length)24   static char* GetWritableBuffer(SpdyFrameBuilder* builder, size_t length) {
25     return builder->GetWritableBuffer(length);
26   }
27 
GetWritableOutput(SpdyFrameBuilder * builder,size_t desired_length,size_t * actual_length)28   static char* GetWritableOutput(SpdyFrameBuilder* builder,
29                                  size_t desired_length, size_t* actual_length) {
30     return builder->GetWritableOutput(desired_length, actual_length);
31   }
32 };
33 
34 namespace {
35 
36 const int64_t kSize = 64 * 1024;
37 char output_buffer[kSize] = "";
38 
39 }  // namespace
40 
41 // Verifies that SpdyFrameBuilder::GetWritableBuffer() can be used to build a
42 // SpdySerializedFrame.
TEST(SpdyFrameBuilderTest,GetWritableBuffer)43 TEST(SpdyFrameBuilderTest, GetWritableBuffer) {
44   const size_t kBuilderSize = 10;
45   SpdyFrameBuilder builder(kBuilderSize);
46   char* writable_buffer =
47       SpdyFrameBuilderPeer::GetWritableBuffer(&builder, kBuilderSize);
48   memset(writable_buffer, ~1, kBuilderSize);
49   EXPECT_TRUE(builder.Seek(kBuilderSize));
50   SpdySerializedFrame frame(builder.take());
51   char expected[kBuilderSize];
52   memset(expected, ~1, kBuilderSize);
53   EXPECT_EQ(absl::string_view(expected, kBuilderSize), frame);
54 }
55 
56 // Verifies that SpdyFrameBuilder::GetWritableBuffer() can be used to build a
57 // SpdySerializedFrame to the output buffer.
TEST(SpdyFrameBuilderTest,GetWritableOutput)58 TEST(SpdyFrameBuilderTest, GetWritableOutput) {
59   ArrayOutputBuffer output(output_buffer, kSize);
60   const size_t kBuilderSize = 10;
61   SpdyFrameBuilder builder(kBuilderSize, &output);
62   size_t actual_size = 0;
63   char* writable_buffer = SpdyFrameBuilderPeer::GetWritableOutput(
64       &builder, kBuilderSize, &actual_size);
65   memset(writable_buffer, ~1, kBuilderSize);
66   EXPECT_TRUE(builder.Seek(kBuilderSize));
67   SpdySerializedFrame frame = MakeSerializedFrame(output.Begin(), kBuilderSize);
68   char expected[kBuilderSize];
69   memset(expected, ~1, kBuilderSize);
70   EXPECT_EQ(absl::string_view(expected, kBuilderSize), frame);
71 }
72 
73 // Verifies the case that the buffer's capacity is too small.
TEST(SpdyFrameBuilderTest,GetWritableOutputNegative)74 TEST(SpdyFrameBuilderTest, GetWritableOutputNegative) {
75   size_t small_cap = 1;
76   ArrayOutputBuffer output(output_buffer, small_cap);
77   const size_t kBuilderSize = 10;
78   SpdyFrameBuilder builder(kBuilderSize, &output);
79   size_t actual_size = 0;
80   char* writable_buffer = SpdyFrameBuilderPeer::GetWritableOutput(
81       &builder, kBuilderSize, &actual_size);
82   EXPECT_EQ(0u, actual_size);
83   EXPECT_EQ(nullptr, writable_buffer);
84 }
85 
86 }  // namespace test
87 }  // namespace spdy
88