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