• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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