1 //===-- VMRangeTest.cpp ---------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "gtest/gtest.h"
10
11 #include <limits>
12
13 #include "lldb/Utility/VMRange.h"
14
15 using namespace lldb_private;
16
17 namespace lldb_private {
PrintTo(const VMRange & v,std::ostream * os)18 void PrintTo(const VMRange &v, std::ostream *os) {
19 (*os) << "VMRange(" << v.GetBaseAddress() << ", " << v.GetEndAddress() << ")";
20 }
21 } // namespace lldb_private
22
TEST(VMRange,IsValid)23 TEST(VMRange, IsValid) {
24 VMRange range;
25 EXPECT_FALSE(range.IsValid());
26
27 range.Reset(0x1, 0x100);
28 EXPECT_TRUE(range.IsValid());
29
30 range.Reset(0x1, 0x1);
31 EXPECT_FALSE(range.IsValid());
32 }
33
TEST(VMRange,Clear)34 TEST(VMRange, Clear) {
35 VMRange range(0x100, 0x200);
36 EXPECT_NE(VMRange(), range);
37 range.Clear();
38 EXPECT_EQ(VMRange(), range);
39 }
40
TEST(VMRange,Comparison)41 TEST(VMRange, Comparison) {
42 VMRange range1(0x100, 0x200);
43 VMRange range2(0x100, 0x200);
44 EXPECT_EQ(range1, range2);
45
46 EXPECT_NE(VMRange(0x100, 0x1ff), range1);
47 EXPECT_NE(VMRange(0x100, 0x201), range1);
48 EXPECT_NE(VMRange(0x0ff, 0x200), range1);
49 EXPECT_NE(VMRange(0x101, 0x200), range1);
50
51 range2.Clear();
52 EXPECT_NE(range1, range2);
53 }
54
TEST(VMRange,Reset)55 TEST(VMRange, Reset) {
56 VMRange range(0x100, 0x200);
57 EXPECT_FALSE(VMRange(0x200, 0x200) == range);
58 range.Reset(0x200, 0x200);
59 EXPECT_TRUE(VMRange(0x200, 0x200) == range);
60 }
61
TEST(VMRange,SetEndAddress)62 TEST(VMRange, SetEndAddress) {
63 VMRange range(0x100, 0x200);
64
65 range.SetEndAddress(0xFF);
66 EXPECT_EQ(0U, range.GetByteSize());
67 EXPECT_FALSE(range.IsValid());
68
69 range.SetEndAddress(0x101);
70 EXPECT_EQ(1U, range.GetByteSize());
71 EXPECT_TRUE(range.IsValid());
72 }
73
TEST(VMRange,ContainsAddr)74 TEST(VMRange, ContainsAddr) {
75 VMRange range(0x100, 0x200);
76
77 EXPECT_FALSE(range.Contains(0x00));
78 EXPECT_FALSE(range.Contains(0xFF));
79 EXPECT_TRUE(range.Contains(0x100));
80 EXPECT_TRUE(range.Contains(0x101));
81 EXPECT_TRUE(range.Contains(0x1FF));
82 EXPECT_FALSE(range.Contains(0x200));
83 EXPECT_FALSE(range.Contains(0x201));
84 EXPECT_FALSE(range.Contains(0xFFF));
85 EXPECT_FALSE(range.Contains(std::numeric_limits<lldb::addr_t>::max()));
86 }
87
TEST(VMRange,ContainsRange)88 TEST(VMRange, ContainsRange) {
89 VMRange range(0x100, 0x200);
90
91 EXPECT_FALSE(range.Contains(VMRange(0x0, 0x0)));
92
93 EXPECT_FALSE(range.Contains(VMRange(0x0, 0x100)));
94 EXPECT_FALSE(range.Contains(VMRange(0x0, 0x101)));
95 EXPECT_TRUE(range.Contains(VMRange(0x100, 0x105)));
96 EXPECT_TRUE(range.Contains(VMRange(0x101, 0x105)));
97 EXPECT_TRUE(range.Contains(VMRange(0x100, 0x1FF)));
98 EXPECT_TRUE(range.Contains(VMRange(0x105, 0x200)));
99 EXPECT_FALSE(range.Contains(VMRange(0x105, 0x201)));
100 EXPECT_FALSE(range.Contains(VMRange(0x200, 0x201)));
101 EXPECT_TRUE(range.Contains(VMRange(0x100, 0x200)));
102 EXPECT_FALSE(
103 range.Contains(VMRange(0x105, std::numeric_limits<lldb::addr_t>::max())));
104
105 // Empty range.
106 EXPECT_TRUE(range.Contains(VMRange(0x100, 0x100)));
107
108 range.Clear();
109 EXPECT_FALSE(range.Contains(VMRange(0x0, 0x0)));
110 }
111
TEST(VMRange,Ordering)112 TEST(VMRange, Ordering) {
113 VMRange range1(0x44, 0x200);
114 VMRange range2(0x100, 0x1FF);
115 VMRange range3(0x100, 0x200);
116
117 EXPECT_LE(range1, range1);
118 EXPECT_GE(range1, range1);
119
120 EXPECT_LT(range1, range2);
121 EXPECT_LT(range2, range3);
122
123 EXPECT_GT(range2, range1);
124 EXPECT_GT(range3, range2);
125
126 // Ensure that < and > are always false when comparing ranges with themselves.
127 EXPECT_FALSE(range1 < range1);
128 EXPECT_FALSE(range2 < range2);
129 EXPECT_FALSE(range3 < range3);
130
131 EXPECT_FALSE(range1 > range1);
132 EXPECT_FALSE(range2 > range2);
133 EXPECT_FALSE(range3 > range3);
134 }
135
TEST(VMRange,CollectionContains)136 TEST(VMRange, CollectionContains) {
137 VMRange::collection collection = {VMRange(0x100, 0x105),
138 VMRange(0x108, 0x110)};
139
140 EXPECT_FALSE(VMRange::ContainsValue(collection, 0xFF));
141 EXPECT_TRUE(VMRange::ContainsValue(collection, 0x100));
142 EXPECT_FALSE(VMRange::ContainsValue(collection, 0x105));
143 EXPECT_TRUE(VMRange::ContainsValue(collection, 0x109));
144
145 EXPECT_TRUE(VMRange::ContainsRange(collection, VMRange(0x100, 0x104)));
146 EXPECT_TRUE(VMRange::ContainsRange(collection, VMRange(0x108, 0x100)));
147 EXPECT_FALSE(VMRange::ContainsRange(collection, VMRange(0xFF, 0x100)));
148
149 // TODO: Implement and test ContainsRange with values that span multiple
150 // ranges in the collection.
151 }
152