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