1/*
2 * Copyright (C) 2016, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <array>
18#include <cstring>
19#include <string>
20
21#include "gtest/gtest.h"
22
23#include "wifilogd/byte_buffer.h"
24
25namespace android {
26namespace wifilogd {
27namespace {
28
29constexpr size_t kBufferSizeBytes = 1024;
30constexpr std::array<uint8_t, 1> kSmallestMessage{};
31constexpr std::array<uint8_t, kBufferSizeBytes> kLargestMessage{};
32
33class ByteBufferTest : public ::testing::Test {
34 public:
35  ByteBufferTest() {}
36
37 protected:
38  ByteBuffer<kBufferSizeBytes> buffer_;
39};
40
41}  // namespace
42
43TEST_F(ByteBufferTest, AppendMinimalOnEmptyBufferSucceeds) {
44  buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size());
45}
46
47TEST_F(ByteBufferTest, AppendMaximalOnEmptyBufferSucceeds) {
48  buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
49}
50
51TEST_F(ByteBufferTest, AppendStoresOurData) {
52  const std::string message1{"hello"};
53  const std::string message2{"world"};
54  buffer_.AppendOrDie(message1.data(), message1.size());
55  buffer_.AppendOrDie(message2.data(), message2.size());
56
57  const std::string expected{"helloworld"};
58  EXPECT_EQ(0, std::memcmp(buffer_.data(), expected.data(), expected.size()));
59}
60
61TEST_F(ByteBufferTest, AssigningWorks) {
62  const std::string message1{"hello"};
63  buffer_.AppendOrDie(message1.data(), message1.size());
64
65  ByteBuffer<kBufferSizeBytes> copy;
66  ASSERT_NE(buffer_.size(), copy.size());
67
68  copy = buffer_;
69  ASSERT_EQ(buffer_.size(), copy.size());
70  EXPECT_EQ(0, std::memcmp(copy.data(), buffer_.data(), buffer_.size()));
71}
72
73TEST_F(ByteBufferTest, ChainingWorks) {
74  const std::string message1{"hello"};
75  const std::string message2{"world"};
76  buffer_.AppendOrDie(message1.data(), message1.size())
77      .AppendOrDie(message2.data(), message2.size());
78
79  const std::string expected{"helloworld"};
80  EXPECT_EQ(0, std::memcmp(buffer_.data(), expected.data(), expected.size()));
81}
82
83TEST_F(ByteBufferTest, CopyingWorks) {
84  const std::string message1{"hello"};
85  buffer_.AppendOrDie(message1.data(), message1.size());
86
87  const ByteBuffer<kBufferSizeBytes> copy{buffer_};
88  ASSERT_EQ(buffer_.size(), copy.size());
89  EXPECT_EQ(0, std::memcmp(copy.data(), buffer_.data(), buffer_.size()));
90}
91
92TEST_F(ByteBufferTest, DataDoesNotReturnNullOnFreshBuffer) {
93  EXPECT_NE(nullptr, buffer_.data());
94}
95
96TEST_F(ByteBufferTest, DataDoesNotReturnNullAfterLargeWrite) {
97  buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
98  EXPECT_NE(nullptr, buffer_.data());
99}
100
101TEST_F(ByteBufferTest, SizeReturnsZeroOnFreshBuffer) {
102  EXPECT_EQ(0U, buffer_.size());
103}
104
105TEST_F(ByteBufferTest, SizeIsCorrectAfterSmallWrite) {
106  buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size());
107  EXPECT_EQ(kSmallestMessage.size(), buffer_.size());
108}
109
110TEST_F(ByteBufferTest, SizeIsCorrectAfterLargeWrite) {
111  buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
112  EXPECT_EQ(kLargestMessage.size(), buffer_.size());
113}
114
115TEST_F(ByteBufferTest, SizeIsCorrectAfterMultipleWrites) {
116  buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size())
117      .AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size())
118      .AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size());
119  EXPECT_EQ(3 * kSmallestMessage.size(), buffer_.size());
120}
121
122// Per
123// github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#death-tests,
124// death tests should be specially named.
125using ByteBufferDeathTest = ByteBufferTest;
126
127TEST_F(ByteBufferDeathTest, AppendLargerThanBufferCausesDeath) {
128  constexpr std::array<uint8_t, kBufferSizeBytes + 1> oversized_message{};
129  EXPECT_DEATH(
130      buffer_.AppendOrDie(oversized_message.data(), oversized_message.size()),
131      "Check failed");
132}
133
134TEST_F(ByteBufferDeathTest, AppendLargerThanFreeSpaceCausesDeath) {
135  buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
136  EXPECT_DEATH(
137      buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size()),
138      "Check failed");
139}
140
141}  // namespace wifilogd
142}  // namespace android
143