1 : // Copyright 2012 Google Inc. 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 "syzygy/core/address_range.h"
16 :
17 : #include <limits>
18 : #include "gmock/gmock.h"
19 : #include "gtest/gtest.h"
20 : #include "syzygy/core/unittest_util.h"
21 :
22 : namespace core {
23 :
24 : typedef AddressRange<const uint8*, size_t> PointerRange;
25 : typedef AddressRange<size_t, size_t> IntegerRange;
26 :
27 : namespace {
28 :
29 : // A pretty printer for AddressRange. This makes failed unittests readable.
30 : template<typename AddressType, typename SizeType>
31 : std::ostream& operator<<(
32 : std::ostream& os,
33 : const AddressRange<AddressType, SizeType>& addr_range) {
34 : os << "AddressRange(" << addr_range.start() << ", " << addr_range.size()
35 : << ")";
36 : return os;
37 : }
38 :
39 : } // namespace
40 :
41 E : TEST(AddressRangeTest, Create) {
42 E : PointerRange pointer_range1(nullptr, std::numeric_limits<size_t>::max());
43 E : IntegerRange integer_range1(0, std::numeric_limits<size_t>::max());
44 :
45 E : PointerRange pointer_range2(nullptr, 0);
46 E : IntegerRange integer_range2(0, 0);
47 E : }
48 :
49 E : TEST(AddressRangeTest, IsEmtpy) {
50 E : PointerRange pointer_range1(nullptr, 0);
51 E : EXPECT_TRUE(pointer_range1.IsEmpty());
52 :
53 E : PointerRange pointer_range2(nullptr, 1);
54 E : EXPECT_FALSE(pointer_range2.IsEmpty());
55 E : }
56 :
57 E : TEST(AddressRangeTest, Contains) {
58 : // Non-intersecting ranges first.
59 E : EXPECT_FALSE(IntegerRange(10, 10).Contains(IntegerRange(0, 10)));
60 E : EXPECT_FALSE(IntegerRange(0, 10).Contains(IntegerRange(10, 10)));
61 :
62 : // Overlapping, non-contained.
63 E : EXPECT_FALSE(IntegerRange(5, 10).Contains(IntegerRange(10, 10)));
64 E : EXPECT_FALSE(IntegerRange(0, 10).Contains(IntegerRange(5, 10)));
65 :
66 : // Contained, a couple of different cases.
67 E : EXPECT_TRUE(IntegerRange(10, 10).Contains(IntegerRange(10, 10)));
68 E : EXPECT_TRUE(IntegerRange(10, 10).Contains(IntegerRange(15, 5)));
69 E : EXPECT_TRUE(IntegerRange(10, 10).Contains(IntegerRange(10, 5)));
70 :
71 : // An empty range contains no full range.
72 E : EXPECT_FALSE(IntegerRange(10, 0).Contains(IntegerRange(10, 1)));
73 E : EXPECT_FALSE(IntegerRange(10, 0).Contains(IntegerRange(9, 2)));
74 :
75 : // An empty range contains itself.
76 E : EXPECT_TRUE(IntegerRange(10, 0).Contains(IntegerRange(10, 0)));
77 :
78 : // An non-empty range contains any empty range with a start address within it
79 : // or on its boundary.
80 E : EXPECT_TRUE(IntegerRange(10, 2).Contains(IntegerRange(11, 0)));
81 E : EXPECT_TRUE(IntegerRange(10, 2).Contains(IntegerRange(10, 0)));
82 E : EXPECT_TRUE(IntegerRange(10, 2).Contains(IntegerRange(12, 0)));
83 E : }
84 :
85 E : TEST(AddressRangeTest, Intersects) {
86 : // Non-intersecting ranges first.
87 E : EXPECT_FALSE(IntegerRange(10, 10).Intersects(IntegerRange(0, 10)));
88 E : EXPECT_FALSE(IntegerRange(0, 10).Intersects(IntegerRange(10, 10)));
89 :
90 : // Overlapping, non-contained.
91 E : EXPECT_TRUE(IntegerRange(5, 10).Intersects(IntegerRange(10, 10)));
92 E : EXPECT_TRUE(IntegerRange(0, 10).Intersects(IntegerRange(5, 10)));
93 :
94 : // Contained, a couple of different cases.
95 E : EXPECT_TRUE(IntegerRange(10, 10).Intersects(IntegerRange(10, 10)));
96 E : EXPECT_TRUE(IntegerRange(10, 10).Intersects(IntegerRange(15, 5)));
97 E : EXPECT_TRUE(IntegerRange(10, 10).Intersects(IntegerRange(10, 5)));
98 :
99 : // An empty range only intersects with a non-empty range if its address lies
100 : // strictly within the non-empty range.
101 E : EXPECT_TRUE(IntegerRange(10, 2).Intersects(IntegerRange(11, 0)));
102 E : EXPECT_TRUE(IntegerRange(11, 0).Intersects(IntegerRange(10, 2)));
103 E : EXPECT_FALSE(IntegerRange(10, 2).Intersects(IntegerRange(10, 0)));
104 E : EXPECT_FALSE(IntegerRange(10, 2).Intersects(IntegerRange(12, 0)));
105 E : EXPECT_FALSE(IntegerRange(10, 0).Intersects(IntegerRange(10, 2)));
106 E : EXPECT_FALSE(IntegerRange(12, 0).Intersects(IntegerRange(10, 2)));
107 E : }
108 :
109 E : TEST(AddressRangeTest, Operators) {
110 E : EXPECT_FALSE(IntegerRange(10, 10) < IntegerRange(10, 10));
111 E : EXPECT_TRUE(IntegerRange(9, 10) < IntegerRange(10, 10));
112 E : EXPECT_TRUE(IntegerRange(9, 11) < IntegerRange(10, 10));
113 E : EXPECT_TRUE(IntegerRange(10, 9) < IntegerRange(10, 10));
114 :
115 E : EXPECT_TRUE(IntegerRange(10, 0) < IntegerRange(10, 1));
116 E : EXPECT_FALSE(IntegerRange(10, 1) < IntegerRange(10, 0));
117 E : EXPECT_FALSE(IntegerRange(10, 0) < IntegerRange(10, 0));
118 E : EXPECT_TRUE(IntegerRange(10, 0) == IntegerRange(10, 0));
119 E : EXPECT_FALSE(IntegerRange(10, 0) != IntegerRange(10, 0));
120 E : }
121 :
122 E : TEST(AddressRangeTest, AddressRangeSerialization) {
123 E : const AddressRange<size_t, size_t> range(100, 20);
124 E : EXPECT_TRUE(testing::TestSerialization(range));
125 E : }
126 :
127 E : TEST(AddressRangeTest, Offset) {
128 E : EXPECT_EQ(IntegerRange(100, 20).Offset(40).start(), 140);
129 :
130 E : AddressRange<uint32_t*, size_t> pointer_range(nullptr, 20);
131 E : EXPECT_EQ(pointer_range.Offset(40).start(), pointer_range.start() + 40);
132 E : }
133 :
134 : } // namespace core
|