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