79 lines
2.5 KiB
C++
79 lines
2.5 KiB
C++
// Copyright 2019 The Chromium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "base/android/reached_addresses_bitset.h"
|
|
|
|
#include <utility>
|
|
|
|
#include "testing/gmock/include/gmock/gmock.h"
|
|
#include "testing/gtest/include/gtest/gtest.h"
|
|
|
|
namespace base {
|
|
namespace android {
|
|
|
|
using testing::ElementsAre;
|
|
using testing::ElementsAreArray;
|
|
|
|
constexpr uintptr_t kStartAddress = 0x1000;
|
|
constexpr uintptr_t kEndAddress = 0x2000;
|
|
constexpr size_t kStorageSize = 512;
|
|
|
|
class ReachedAddressesBitsetTest : public testing::Test {
|
|
public:
|
|
ReachedAddressesBitsetTest()
|
|
: bitset_(kStartAddress, kEndAddress, storage_, kStorageSize) {
|
|
memset(storage_, 0, kStorageSize * sizeof(uint32_t));
|
|
EXPECT_TRUE(bitset()->GetReachedOffsets().empty());
|
|
}
|
|
|
|
ReachedAddressesBitset* bitset() { return &bitset_; }
|
|
|
|
private:
|
|
std::atomic<uint32_t> storage_[kStorageSize];
|
|
ReachedAddressesBitset bitset_;
|
|
};
|
|
|
|
TEST_F(ReachedAddressesBitsetTest, RecordStartAddress) {
|
|
bitset()->RecordAddress(kStartAddress);
|
|
EXPECT_THAT(bitset()->GetReachedOffsets(), ElementsAre(0));
|
|
}
|
|
|
|
TEST_F(ReachedAddressesBitsetTest, RecordLastAddress) {
|
|
bitset()->RecordAddress(kEndAddress - 4);
|
|
EXPECT_THAT(bitset()->GetReachedOffsets(),
|
|
ElementsAre(kEndAddress - 4 - kStartAddress));
|
|
}
|
|
|
|
TEST_F(ReachedAddressesBitsetTest, RecordAddressOutsideOfRange_Small) {
|
|
bitset()->RecordAddress(kStartAddress - 4);
|
|
EXPECT_THAT(bitset()->GetReachedOffsets(), ElementsAre());
|
|
}
|
|
|
|
TEST_F(ReachedAddressesBitsetTest, RecordAddressOutsideOfRange_Large) {
|
|
bitset()->RecordAddress(kEndAddress);
|
|
EXPECT_THAT(bitset()->GetReachedOffsets(), ElementsAre());
|
|
}
|
|
|
|
TEST_F(ReachedAddressesBitsetTest, RecordUnalignedAddresses) {
|
|
constexpr uint32_t aligned_offset = 0x100;
|
|
bitset()->RecordAddress(kStartAddress + aligned_offset + 1);
|
|
bitset()->RecordAddress(kStartAddress + aligned_offset + 2);
|
|
bitset()->RecordAddress(kStartAddress + aligned_offset + 3);
|
|
EXPECT_THAT(bitset()->GetReachedOffsets(), ElementsAre(aligned_offset));
|
|
}
|
|
|
|
TEST_F(ReachedAddressesBitsetTest, FillBitsetOneByOne) {
|
|
std::vector<uint32_t> expected_offsets;
|
|
for (uintptr_t address = kStartAddress; address < kEndAddress; address += 4) {
|
|
bitset()->RecordAddress(address);
|
|
expected_offsets.push_back(address - kStartAddress);
|
|
ASSERT_THAT(bitset()->GetReachedOffsets(),
|
|
ElementsAreArray(expected_offsets))
|
|
<< "Last added: " << address;
|
|
}
|
|
}
|
|
|
|
} // namespace android
|
|
} // namespace base
|