1 // Copyright 2016 The Crashpad Authors. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "client/simple_address_range_bag.h"
16
17 #include "base/logging.h"
18 #include "gtest/gtest.h"
19 #include "test/gtest_death.h"
20
21 namespace crashpad {
22 namespace test {
23 namespace {
24
TEST(SimpleAddressRangeBag,Entry)25 TEST(SimpleAddressRangeBag, Entry) {
26 using TestBag = TSimpleAddressRangeBag<15>;
27 TestBag bag;
28
29 const TestBag::Entry* entry = TestBag::Iterator(bag).Next();
30 EXPECT_FALSE(entry);
31
32 bag.Insert(reinterpret_cast<void*>(0x1000), 200);
33 entry = TestBag::Iterator(bag).Next();
34 ASSERT_TRUE(entry);
35 EXPECT_EQ(0x1000u, entry->base);
36 EXPECT_EQ(200u, entry->size);
37
38 bag.Remove(reinterpret_cast<void*>(0x1000), 200);
39 EXPECT_FALSE(entry->is_active());
40 EXPECT_EQ(0u, entry->base);
41 EXPECT_EQ(0u, entry->size);
42 }
43
TEST(SimpleAddressRangeBag,SimpleAddressRangeBag)44 TEST(SimpleAddressRangeBag, SimpleAddressRangeBag) {
45 SimpleAddressRangeBag bag;
46
47 EXPECT_TRUE(bag.Insert(reinterpret_cast<void*>(0x1000), 10));
48 EXPECT_TRUE(bag.Insert(reinterpret_cast<void*>(0x2000), 20));
49 EXPECT_TRUE(bag.Insert(CheckedRange<uint64_t>(0x3000, 30)));
50
51 EXPECT_EQ(3u, bag.GetCount());
52
53 // Duplicates added too.
54 EXPECT_TRUE(bag.Insert(CheckedRange<uint64_t>(0x3000, 30)));
55 EXPECT_TRUE(bag.Insert(CheckedRange<uint64_t>(0x3000, 30)));
56 EXPECT_EQ(5u, bag.GetCount());
57
58 // Can be removed 3 times, but not the 4th time.
59 EXPECT_TRUE(bag.Remove(CheckedRange<uint64_t>(0x3000, 30)));
60 EXPECT_TRUE(bag.Remove(CheckedRange<uint64_t>(0x3000, 30)));
61 EXPECT_TRUE(bag.Remove(CheckedRange<uint64_t>(0x3000, 30)));
62 EXPECT_EQ(2u, bag.GetCount());
63 EXPECT_FALSE(bag.Remove(CheckedRange<uint64_t>(0x3000, 30)));
64 EXPECT_EQ(2u, bag.GetCount());
65
66 EXPECT_TRUE(bag.Remove(reinterpret_cast<void*>(0x1000), 10));
67 EXPECT_TRUE(bag.Remove(reinterpret_cast<void*>(0x2000), 20));
68 EXPECT_EQ(0u, bag.GetCount());
69 }
70
TEST(SimpleAddressRangeBag,CopyAndAssign)71 TEST(SimpleAddressRangeBag, CopyAndAssign) {
72 TSimpleAddressRangeBag<10> bag;
73 EXPECT_TRUE(bag.Insert(CheckedRange<uint64_t>(1, 2)));
74 EXPECT_TRUE(bag.Insert(CheckedRange<uint64_t>(3, 4)));
75 EXPECT_TRUE(bag.Insert(CheckedRange<uint64_t>(5, 6)));
76 EXPECT_TRUE(bag.Remove(CheckedRange<uint64_t>(3, 4)));
77 EXPECT_EQ(bag.GetCount(), 2u);
78
79 // Test copy.
80 TSimpleAddressRangeBag<10> bag_copy(bag);
81 EXPECT_EQ(bag_copy.GetCount(), 2u);
82 EXPECT_TRUE(bag_copy.Remove(CheckedRange<uint64_t>(1, 2)));
83 EXPECT_TRUE(bag_copy.Remove(CheckedRange<uint64_t>(5, 6)));
84 EXPECT_EQ(bag_copy.GetCount(), 0u);
85 EXPECT_EQ(bag.GetCount(), 2u);
86
87 // Test assign.
88 TSimpleAddressRangeBag<10> bag_assign;
89 bag_assign = bag;
90 EXPECT_EQ(bag_assign.GetCount(), 2u);
91 EXPECT_TRUE(bag_assign.Remove(CheckedRange<uint64_t>(1, 2)));
92 EXPECT_TRUE(bag_assign.Remove(CheckedRange<uint64_t>(5, 6)));
93 EXPECT_EQ(bag_assign.GetCount(), 0u);
94 EXPECT_EQ(bag.GetCount(), 2u);
95 }
96
97 // Running out of space shouldn't crash.
TEST(SimpleAddressRangeBag,OutOfSpace)98 TEST(SimpleAddressRangeBag, OutOfSpace) {
99 TSimpleAddressRangeBag<2> bag;
100 EXPECT_TRUE(bag.Insert(CheckedRange<uint64_t>(1, 2)));
101 EXPECT_TRUE(bag.Insert(CheckedRange<uint64_t>(3, 4)));
102 EXPECT_FALSE(bag.Insert(CheckedRange<uint64_t>(5, 6)));
103 EXPECT_EQ(bag.GetCount(), 2u);
104 EXPECT_FALSE(bag.Remove(CheckedRange<uint64_t>(5, 6)));
105 }
106
107 } // namespace
108 } // namespace test
109 } // namespace crashpad
110