/* * Copyright (C) 2016, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <array> #include <cstring> #include <string> #include "gtest/gtest.h" #include "wifilogd/byte_buffer.h" namespace android { namespace wifilogd { namespace { constexpr size_t kBufferSizeBytes = 1024; constexpr std::array<uint8_t, 1> kSmallestMessage{}; constexpr std::array<uint8_t, kBufferSizeBytes> kLargestMessage{}; class ByteBufferTest : public ::testing::Test { public: ByteBufferTest() {} protected: ByteBuffer<kBufferSizeBytes> buffer_; }; } // namespace TEST_F(ByteBufferTest, AppendMinimalOnEmptyBufferSucceeds) { buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size()); } TEST_F(ByteBufferTest, AppendMaximalOnEmptyBufferSucceeds) { buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size()); } TEST_F(ByteBufferTest, AppendStoresOurData) { const std::string message1{"hello"}; const std::string message2{"world"}; buffer_.AppendOrDie(message1.data(), message1.size()); buffer_.AppendOrDie(message2.data(), message2.size()); const std::string expected{"helloworld"}; EXPECT_EQ(0, std::memcmp(buffer_.data(), expected.data(), expected.size())); } TEST_F(ByteBufferTest, AssigningWorks) { const std::string message1{"hello"}; buffer_.AppendOrDie(message1.data(), message1.size()); ByteBuffer<kBufferSizeBytes> copy; ASSERT_NE(buffer_.size(), copy.size()); copy = buffer_; ASSERT_EQ(buffer_.size(), copy.size()); EXPECT_EQ(0, std::memcmp(copy.data(), buffer_.data(), buffer_.size())); } TEST_F(ByteBufferTest, ChainingWorks) { const std::string message1{"hello"}; const std::string message2{"world"}; buffer_.AppendOrDie(message1.data(), message1.size()) .AppendOrDie(message2.data(), message2.size()); const std::string expected{"helloworld"}; EXPECT_EQ(0, std::memcmp(buffer_.data(), expected.data(), expected.size())); } TEST_F(ByteBufferTest, CopyingWorks) { const std::string message1{"hello"}; buffer_.AppendOrDie(message1.data(), message1.size()); const ByteBuffer<kBufferSizeBytes> copy{buffer_}; ASSERT_EQ(buffer_.size(), copy.size()); EXPECT_EQ(0, std::memcmp(copy.data(), buffer_.data(), buffer_.size())); } TEST_F(ByteBufferTest, DataDoesNotReturnNullOnFreshBuffer) { EXPECT_NE(nullptr, buffer_.data()); } TEST_F(ByteBufferTest, DataDoesNotReturnNullAfterLargeWrite) { buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size()); EXPECT_NE(nullptr, buffer_.data()); } TEST_F(ByteBufferTest, SizeReturnsZeroOnFreshBuffer) { EXPECT_EQ(0U, buffer_.size()); } TEST_F(ByteBufferTest, SizeIsCorrectAfterSmallWrite) { buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size()); EXPECT_EQ(kSmallestMessage.size(), buffer_.size()); } TEST_F(ByteBufferTest, SizeIsCorrectAfterLargeWrite) { buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size()); EXPECT_EQ(kLargestMessage.size(), buffer_.size()); } TEST_F(ByteBufferTest, SizeIsCorrectAfterMultipleWrites) { buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size()) .AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size()) .AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size()); EXPECT_EQ(3 * kSmallestMessage.size(), buffer_.size()); } // Per // github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#death-tests, // death tests should be specially named. using ByteBufferDeathTest = ByteBufferTest; TEST_F(ByteBufferDeathTest, AppendLargerThanBufferCausesDeath) { constexpr std::array<uint8_t, kBufferSizeBytes + 1> oversized_message{}; EXPECT_DEATH( buffer_.AppendOrDie(oversized_message.data(), oversized_message.size()), "Check failed"); } TEST_F(ByteBufferDeathTest, AppendLargerThanFreeSpaceCausesDeath) { buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size()); EXPECT_DEATH( buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size()), "Check failed"); } } // namespace wifilogd } // namespace android