blob: dd5d3d60a4085586fddaa454231d8ce88d8e45e8 [file] [log] [blame]
QUICHE team82dee2f2019-01-18 12:35:12 -05001// 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
QUICHE team5be974e2020-12-29 18:35:24 -05005#include "spdy/core/spdy_frame_builder.h"
QUICHE team82dee2f2019-01-18 12:35:12 -05006
7#include <memory>
8
QUICHE team5be974e2020-12-29 18:35:24 -05009#include "common/platform/api/quiche_export.h"
10#include "common/platform/api/quiche_test.h"
11#include "spdy/core/array_output_buffer.h"
12#include "spdy/core/spdy_framer.h"
13#include "spdy/core/spdy_protocol.h"
QUICHE team82dee2f2019-01-18 12:35:12 -050014
15namespace spdy {
16
danzhd34bb4b2019-04-10 15:27:49 -070017namespace test {
18
bnc45ccf4b2020-01-21 19:05:27 -080019class QUICHE_EXPORT_PRIVATE SpdyFrameBuilderPeer {
danzhd34bb4b2019-04-10 15:27:49 -070020 public:
21 static char* GetWritableBuffer(SpdyFrameBuilder* builder, size_t length) {
22 return builder->GetWritableBuffer(length);
23 }
24
25 static char* GetWritableOutput(SpdyFrameBuilder* builder,
26 size_t desired_length,
27 size_t* actual_length) {
28 return builder->GetWritableOutput(desired_length, actual_length);
29 }
30};
31
QUICHE team82dee2f2019-01-18 12:35:12 -050032namespace {
33
34const int64_t kSize = 64 * 1024;
35char output_buffer[kSize] = "";
36
37} // namespace
38
39// Verifies that SpdyFrameBuilder::GetWritableBuffer() can be used to build a
40// SpdySerializedFrame.
41TEST(SpdyFrameBuilderTest, GetWritableBuffer) {
42 const size_t kBuilderSize = 10;
43 SpdyFrameBuilder builder(kBuilderSize);
danzhd34bb4b2019-04-10 15:27:49 -070044 char* writable_buffer =
45 SpdyFrameBuilderPeer::GetWritableBuffer(&builder, kBuilderSize);
QUICHE team82dee2f2019-01-18 12:35:12 -050046 memset(writable_buffer, ~1, kBuilderSize);
47 EXPECT_TRUE(builder.Seek(kBuilderSize));
48 SpdySerializedFrame frame(builder.take());
49 char expected[kBuilderSize];
50 memset(expected, ~1, kBuilderSize);
vasilvvc8ccdb22020-10-12 16:42:34 -070051 EXPECT_EQ(absl::string_view(expected, kBuilderSize),
52 absl::string_view(frame.data(), kBuilderSize));
QUICHE team82dee2f2019-01-18 12:35:12 -050053}
54
55// Verifies that SpdyFrameBuilder::GetWritableBuffer() can be used to build a
56// SpdySerializedFrame to the output buffer.
57TEST(SpdyFrameBuilderTest, GetWritableOutput) {
58 ArrayOutputBuffer output(output_buffer, kSize);
59 const size_t kBuilderSize = 10;
60 SpdyFrameBuilder builder(kBuilderSize, &output);
61 size_t actual_size = 0;
danzhd34bb4b2019-04-10 15:27:49 -070062 char* writable_buffer = SpdyFrameBuilderPeer::GetWritableOutput(
63 &builder, kBuilderSize, &actual_size);
QUICHE team82dee2f2019-01-18 12:35:12 -050064 memset(writable_buffer, ~1, kBuilderSize);
65 EXPECT_TRUE(builder.Seek(kBuilderSize));
66 SpdySerializedFrame frame(output.Begin(), kBuilderSize, false);
67 char expected[kBuilderSize];
68 memset(expected, ~1, kBuilderSize);
vasilvvc8ccdb22020-10-12 16:42:34 -070069 EXPECT_EQ(absl::string_view(expected, kBuilderSize),
70 absl::string_view(frame.data(), kBuilderSize));
QUICHE team82dee2f2019-01-18 12:35:12 -050071}
72
73// Verifies the case that the buffer's capacity is too small.
74TEST(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;
danzhd34bb4b2019-04-10 15:27:49 -070080 char* writable_buffer = SpdyFrameBuilderPeer::GetWritableOutput(
81 &builder, kBuilderSize, &actual_size);
QUICHE team82dee2f2019-01-18 12:35:12 -050082 EXPECT_EQ(0u, actual_size);
83 EXPECT_EQ(nullptr, writable_buffer);
84}
85
danzhd34bb4b2019-04-10 15:27:49 -070086} // namespace test
QUICHE team82dee2f2019-01-18 12:35:12 -050087} // namespace spdy