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
17 namespace spdy {
18
19 namespace test {
20
21 class QUICHE_EXPORT SpdyFrameBuilderPeer {
22 public:
GetWritableBuffer(SpdyFrameBuilder * builder,size_t length)23 static char* GetWritableBuffer(SpdyFrameBuilder* builder, size_t length) {
24 return builder->GetWritableBuffer(length);
25 }
26
GetWritableOutput(SpdyFrameBuilder * builder,size_t desired_length,size_t * actual_length)27 static char* GetWritableOutput(SpdyFrameBuilder* builder,
28 size_t desired_length, size_t* actual_length) {
29 return builder->GetWritableOutput(desired_length, actual_length);
30 }
31 };
32
33 namespace {
34
35 const int64_t kSize = 64 * 1024;
36 char output_buffer[kSize] = "";
37
38 } // namespace
39
40 // Verifies that SpdyFrameBuilder::GetWritableBuffer() can be used to build a
41 // SpdySerializedFrame.
TEST(SpdyFrameBuilderTest,GetWritableBuffer)42 TEST(SpdyFrameBuilderTest, GetWritableBuffer) {
43 const size_t kBuilderSize = 10;
44 SpdyFrameBuilder builder(kBuilderSize);
45 char* writable_buffer =
46 SpdyFrameBuilderPeer::GetWritableBuffer(&builder, kBuilderSize);
47 memset(writable_buffer, ~1, kBuilderSize);
48 EXPECT_TRUE(builder.Seek(kBuilderSize));
49 SpdySerializedFrame frame(builder.take());
50 char expected[kBuilderSize];
51 memset(expected, ~1, kBuilderSize);
52 EXPECT_EQ(absl::string_view(expected, kBuilderSize),
53 absl::string_view(frame.data(), kBuilderSize));
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(output.Begin(), kBuilderSize, false);
68 char expected[kBuilderSize];
69 memset(expected, ~1, kBuilderSize);
70 EXPECT_EQ(absl::string_view(expected, kBuilderSize),
71 absl::string_view(frame.data(), kBuilderSize));
72 }
73
74 // Verifies the case that the buffer's capacity is too small.
TEST(SpdyFrameBuilderTest,GetWritableOutputNegative)75 TEST(SpdyFrameBuilderTest, GetWritableOutputNegative) {
76 size_t small_cap = 1;
77 ArrayOutputBuffer output(output_buffer, small_cap);
78 const size_t kBuilderSize = 10;
79 SpdyFrameBuilder builder(kBuilderSize, &output);
80 size_t actual_size = 0;
81 char* writable_buffer = SpdyFrameBuilderPeer::GetWritableOutput(
82 &builder, kBuilderSize, &actual_size);
83 EXPECT_EQ(0u, actual_size);
84 EXPECT_EQ(nullptr, writable_buffer);
85 }
86
87 } // namespace test
88 } // namespace spdy
89