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