reached_addresses_bitset_unittest.cc 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "base/android/reached_addresses_bitset.h"
  5. #include <utility>
  6. #include "testing/gmock/include/gmock/gmock.h"
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. namespace base {
  9. namespace android {
  10. using testing::ElementsAre;
  11. using testing::ElementsAreArray;
  12. constexpr uintptr_t kStartAddress = 0x1000;
  13. constexpr uintptr_t kEndAddress = 0x2000;
  14. constexpr size_t kStorageSize = 512;
  15. class ReachedAddressesBitsetTest : public testing::Test {
  16. public:
  17. ReachedAddressesBitsetTest()
  18. : bitset_(kStartAddress, kEndAddress, storage_, kStorageSize) {
  19. memset(storage_, 0, kStorageSize * sizeof(uint32_t));
  20. EXPECT_TRUE(bitset()->GetReachedOffsets().empty());
  21. }
  22. ReachedAddressesBitset* bitset() { return &bitset_; }
  23. private:
  24. std::atomic<uint32_t> storage_[kStorageSize];
  25. ReachedAddressesBitset bitset_;
  26. };
  27. TEST_F(ReachedAddressesBitsetTest, RecordStartAddress) {
  28. bitset()->RecordAddress(kStartAddress);
  29. EXPECT_THAT(bitset()->GetReachedOffsets(), ElementsAre(0));
  30. }
  31. TEST_F(ReachedAddressesBitsetTest, RecordLastAddress) {
  32. bitset()->RecordAddress(kEndAddress - 4);
  33. EXPECT_THAT(bitset()->GetReachedOffsets(),
  34. ElementsAre(kEndAddress - 4 - kStartAddress));
  35. }
  36. TEST_F(ReachedAddressesBitsetTest, RecordAddressOutsideOfRange_Small) {
  37. bitset()->RecordAddress(kStartAddress - 4);
  38. EXPECT_THAT(bitset()->GetReachedOffsets(), ElementsAre());
  39. }
  40. TEST_F(ReachedAddressesBitsetTest, RecordAddressOutsideOfRange_Large) {
  41. bitset()->RecordAddress(kEndAddress);
  42. EXPECT_THAT(bitset()->GetReachedOffsets(), ElementsAre());
  43. }
  44. TEST_F(ReachedAddressesBitsetTest, RecordUnalignedAddresses) {
  45. constexpr uint32_t aligned_offset = 0x100;
  46. bitset()->RecordAddress(kStartAddress + aligned_offset + 1);
  47. bitset()->RecordAddress(kStartAddress + aligned_offset + 2);
  48. bitset()->RecordAddress(kStartAddress + aligned_offset + 3);
  49. EXPECT_THAT(bitset()->GetReachedOffsets(), ElementsAre(aligned_offset));
  50. }
  51. TEST_F(ReachedAddressesBitsetTest, FillBitsetOneByOne) {
  52. std::vector<uint32_t> expected_offsets;
  53. for (uintptr_t address = kStartAddress; address < kEndAddress; address += 4) {
  54. bitset()->RecordAddress(address);
  55. expected_offsets.push_back(address - kStartAddress);
  56. ASSERT_THAT(bitset()->GetReachedOffsets(),
  57. ElementsAreArray(expected_offsets))
  58. << "Last added: " << address;
  59. }
  60. }
  61. } // namespace android
  62. } // namespace base