Home | History | Annotate | Download | only in tests
      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 
     25 namespace android {
     26 namespace wifilogd {
     27 namespace {
     28 
     29 constexpr size_t kBufferSizeBytes = 1024;
     30 constexpr std::array<uint8_t, 1> kSmallestMessage{};
     31 constexpr std::array<uint8_t, kBufferSizeBytes> kLargestMessage{};
     32 
     33 class ByteBufferTest : public ::testing::Test {
     34  public:
     35   ByteBufferTest() {}
     36 
     37  protected:
     38   ByteBuffer<kBufferSizeBytes> buffer_;
     39 };
     40 
     41 }  // namespace
     42 
     43 TEST_F(ByteBufferTest, AppendMinimalOnEmptyBufferSucceeds) {
     44   buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size());
     45 }
     46 
     47 TEST_F(ByteBufferTest, AppendMaximalOnEmptyBufferSucceeds) {
     48   buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
     49 }
     50 
     51 TEST_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 
     61 TEST_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 
     73 TEST_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 
     83 TEST_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 
     92 TEST_F(ByteBufferTest, DataDoesNotReturnNullOnFreshBuffer) {
     93   EXPECT_NE(nullptr, buffer_.data());
     94 }
     95 
     96 TEST_F(ByteBufferTest, DataDoesNotReturnNullAfterLargeWrite) {
     97   buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
     98   EXPECT_NE(nullptr, buffer_.data());
     99 }
    100 
    101 TEST_F(ByteBufferTest, SizeReturnsZeroOnFreshBuffer) {
    102   EXPECT_EQ(0U, buffer_.size());
    103 }
    104 
    105 TEST_F(ByteBufferTest, SizeIsCorrectAfterSmallWrite) {
    106   buffer_.AppendOrDie(kSmallestMessage.data(), kSmallestMessage.size());
    107   EXPECT_EQ(kSmallestMessage.size(), buffer_.size());
    108 }
    109 
    110 TEST_F(ByteBufferTest, SizeIsCorrectAfterLargeWrite) {
    111   buffer_.AppendOrDie(kLargestMessage.data(), kLargestMessage.size());
    112   EXPECT_EQ(kLargestMessage.size(), buffer_.size());
    113 }
    114 
    115 TEST_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.
    125 using ByteBufferDeathTest = ByteBufferTest;
    126 
    127 TEST_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 
    134 TEST_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