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 19 #include "gtest/gtest.h" 20 21 #include "wifilogd/byte_buffer.h" 22 #include "wifilogd/local_utils.h" 23 #include "wifilogd/memory_reader.h" 24 25 namespace android { 26 namespace wifilogd { 27 28 using local_utils::GetMaxVal; 29 30 TEST(MemoryReaderTest, BoolConversionNonEmptyBufferYieldsTrue) { 31 constexpr std::array<uint8_t, 1> buffer{}; 32 MemoryReader memory_reader(buffer.data(), buffer.size()); 33 EXPECT_TRUE(memory_reader); 34 } 35 36 TEST(MemoryReaderTest, BoolConversionEmptyBufferYieldsFalse) { 37 constexpr std::array<uint8_t, 0> buffer{}; 38 MemoryReader memory_reader(buffer.data(), buffer.size()); 39 EXPECT_FALSE(memory_reader); 40 } 41 42 TEST(MemoryReaderTest, BoolConversionNullBufferYieldsFalse) { 43 MemoryReader memory_reader(nullptr, 10); 44 EXPECT_FALSE(memory_reader); 45 } 46 47 TEST(MemoryReaderTest, CopyAssignmentWorks) { 48 constexpr std::array<uint8_t, 3> buffer{{1, 2, 3}}; 49 50 MemoryReader reader1{buffer.data(), buffer.size()}; 51 EXPECT_EQ(buffer[0], *reader1.GetBytesOrDie(sizeof(uint8_t))); 52 53 // A copy of reader1 should reflect the byte already read. 54 MemoryReader reader2 = reader1; 55 EXPECT_EQ(buffer[1], *reader2.GetBytesOrDie(sizeof(uint8_t))); 56 57 // reader1 should _not_ reflect the additional read on reader2. 58 EXPECT_GT(reader1.size(), reader2.size()); 59 } 60 61 TEST(MemoryReaderTest, CopyConstructionWorks) { 62 constexpr std::array<uint8_t, 3> buffer{{1, 2, 3}}; 63 64 MemoryReader reader1{buffer.data(), buffer.size()}; 65 EXPECT_EQ(buffer[0], *reader1.GetBytesOrDie(sizeof(uint8_t))); 66 67 // A copy of reader1 should reflect the byte already read. 68 MemoryReader reader2(reader1); 69 EXPECT_EQ(buffer[1], *reader2.GetBytesOrDie(sizeof(uint8_t))); 70 71 // reader1 should _not_ reflect the additional read on reader2. 72 EXPECT_GT(reader1.size(), reader2.size()); 73 } 74 75 TEST(MemoryReaderTest, CopyOutOrDieCopiesData) { 76 constexpr struct Message { 77 int a; 78 char b; 79 } original_message{5, 'c'}; 80 const auto& duplicate_message = 81 MemoryReader(&original_message, sizeof(original_message)) 82 .CopyOutOrDie<Message>(); 83 EXPECT_EQ(original_message.a, duplicate_message.a); 84 EXPECT_EQ(original_message.b, duplicate_message.b); 85 } 86 87 TEST(MemoryReaderTest, CopyOutOrDieWorksForMultipleObjects) { 88 constexpr struct M1 { 89 int a; 90 char b; 91 } first_message{1, 'a'}; 92 constexpr struct M2 { 93 uint64_t a; 94 uint64_t b; 95 } second_message{0, GetMaxVal(second_message.b)}; 96 const auto& buf = ByteBuffer<sizeof(first_message) + sizeof(second_message)>() 97 .AppendOrDie(&first_message, sizeof(first_message)) 98 .AppendOrDie(&second_message, sizeof(second_message)); 99 100 MemoryReader memory_reader(buf.data(), buf.size()); 101 const auto& copy_of_first_message = memory_reader.CopyOutOrDie<M1>(); 102 const auto& copy_of_second_message = memory_reader.CopyOutOrDie<M2>(); 103 EXPECT_EQ(first_message.a, copy_of_first_message.a); 104 EXPECT_EQ(first_message.b, copy_of_first_message.b); 105 EXPECT_EQ(second_message.a, copy_of_second_message.a); 106 EXPECT_EQ(second_message.b, copy_of_second_message.b); 107 } 108 109 TEST(MemoryReaderTest, GetBytesOrDieSucceedsOnSmallRead) { 110 constexpr std::array<uint8_t, 1024> buffer{}; 111 MemoryReader memory_reader(buffer.data(), buffer.size()); 112 EXPECT_EQ(buffer.data(), memory_reader.GetBytesOrDie(1)); 113 } 114 115 TEST(MemoryReaderTest, GetBytesOrDieSucceedsOnFullRead) { 116 constexpr std::array<uint8_t, 1024> buffer{}; 117 MemoryReader memory_reader(buffer.data(), buffer.size()); 118 EXPECT_EQ(buffer.data(), memory_reader.GetBytesOrDie(buffer.size())); 119 } 120 121 TEST(MemoryReaderTest, GetBytesOrDieCanConsumeFullBufferInParts) { 122 constexpr std::array<uint8_t, 1024> buffer{}; 123 static_assert(buffer.size() % 2 == 0, "Test will not consume whole buffer"); 124 MemoryReader memory_reader(buffer.data(), buffer.size()); 125 EXPECT_EQ(buffer.data(), memory_reader.GetBytesOrDie(buffer.size() / 2)); 126 EXPECT_EQ(buffer.data() + buffer.size() / 2, 127 memory_reader.GetBytesOrDie(buffer.size() / 2)); 128 } 129 130 TEST(MemoryReaderTest, SizeIsCorrectForNonEmptyBuffer) { 131 constexpr std::array<uint8_t, 1> buffer{}; 132 MemoryReader memory_reader(buffer.data(), buffer.size()); 133 EXPECT_EQ(buffer.size(), memory_reader.size()); 134 } 135 136 TEST(MemoryReaderTest, SizeIsCorrectForEmptyBuffer) { 137 constexpr std::array<uint8_t, 0> buffer{}; 138 MemoryReader memory_reader(buffer.data(), buffer.size()); 139 EXPECT_EQ(buffer.size(), memory_reader.size()); 140 } 141 142 TEST(MemoryReaderTest, SizeIsCorrectAfterSmallRead) { 143 constexpr std::array<uint8_t, 1024> buffer{}; 144 MemoryReader memory_reader(buffer.data(), buffer.size()); 145 memory_reader.GetBytesOrDie(1); 146 EXPECT_EQ(buffer.size() - 1, memory_reader.size()); 147 } 148 149 TEST(MemoryReaderTest, SizeIsCorrectAfterFullRead) { 150 constexpr std::array<uint8_t, 1024> buffer{}; 151 MemoryReader memory_reader(buffer.data(), buffer.size()); 152 memory_reader.GetBytesOrDie(buffer.size()); 153 EXPECT_EQ(0U, memory_reader.size()); 154 } 155 156 TEST(MemoryReaderTest, SizeIsZeroForNullBuffer) { 157 MemoryReader memory_reader(nullptr, 0); 158 EXPECT_EQ(0U, memory_reader.size()); 159 } 160 161 // Per 162 // github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#death-tests, 163 // death tests should be specially named. 164 165 TEST(MemoryReaderDeathTest, CopyOutOrDieWithNullBufferCausesDeath) { 166 constexpr struct Message { 167 int a; 168 char b; 169 } original{5, 'c'}; 170 EXPECT_DEATH(MemoryReader(nullptr, sizeof(original)).CopyOutOrDie<Message>(), 171 "Check failed"); 172 } 173 174 TEST(MemoryReaderDeathTest, CopyOutOrDieWithShortBufferCausesDeath) { 175 constexpr struct Message { 176 int a; 177 char b; 178 } original{5, 'c'}; 179 EXPECT_DEATH( 180 MemoryReader(&original, sizeof(original) - 1).CopyOutOrDie<Message>(), 181 "Check failed"); 182 } 183 184 TEST(MemoryReaderDeathTest, CopyOutOrDieOverrunWithMultipleReadsCausesDeath) { 185 constexpr struct Message { 186 int a; 187 char b; 188 } message{5, 'c'}; 189 MemoryReader memory_reader(&message, sizeof(message)); 190 memory_reader.CopyOutOrDie<Message>(); 191 EXPECT_DEATH(memory_reader.CopyOutOrDie<Message>(), "Check failed"); 192 } 193 194 TEST(MemoryReaderTest, GetBytesOrDieWithNullBufferCausesDeath) { 195 constexpr std::array<uint8_t, 1024> buffer{}; 196 MemoryReader memory_reader(nullptr, buffer.size()); 197 EXPECT_DEATH(memory_reader.GetBytesOrDie(buffer.size()), "Check failed"); 198 } 199 200 TEST(MemoryReaderTest, GetBytesOrDieWithShortBufferCausesDeath) { 201 constexpr std::array<uint8_t, 1024> buffer{}; 202 MemoryReader memory_reader(buffer.data(), buffer.size()); 203 EXPECT_DEATH(memory_reader.GetBytesOrDie(buffer.size() + 1), "Check failed"); 204 } 205 206 TEST(MemoryReaderTest, GetBytesOrDieOverrunWithMultipleReadsCausesDeath) { 207 constexpr std::array<uint8_t, 1024> buffer{}; 208 MemoryReader memory_reader(buffer.data(), buffer.size()); 209 EXPECT_EQ(buffer.data(), memory_reader.GetBytesOrDie(buffer.size())); 210 EXPECT_DEATH(memory_reader.GetBytesOrDie(1), "Check failed"); 211 } 212 213 } // namespace wifilogd 214 } // namespace android 215