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