| //===-- VMRangeTest.cpp ---------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "gtest/gtest.h" |
| |
| #include <limits> |
| |
| #include "lldb/Utility/VMRange.h" |
| |
| using namespace lldb_private; |
| |
| namespace lldb_private { |
| void PrintTo(const VMRange &v, std::ostream *os) { |
| (*os) << "VMRange(" << v.GetBaseAddress() << ", " << v.GetEndAddress() << ")"; |
| } |
| } // namespace lldb_private |
| |
| TEST(VMRange, IsValid) { |
| VMRange range; |
| EXPECT_FALSE(range.IsValid()); |
| |
| range.Reset(0x1, 0x100); |
| EXPECT_TRUE(range.IsValid()); |
| |
| range.Reset(0x1, 0x1); |
| EXPECT_FALSE(range.IsValid()); |
| } |
| |
| TEST(VMRange, Clear) { |
| VMRange range(0x100, 0x200); |
| EXPECT_NE(VMRange(), range); |
| range.Clear(); |
| EXPECT_EQ(VMRange(), range); |
| } |
| |
| TEST(VMRange, Comparison) { |
| VMRange range1(0x100, 0x200); |
| VMRange range2(0x100, 0x200); |
| EXPECT_EQ(range1, range2); |
| |
| EXPECT_NE(VMRange(0x100, 0x1ff), range1); |
| EXPECT_NE(VMRange(0x100, 0x201), range1); |
| EXPECT_NE(VMRange(0x0ff, 0x200), range1); |
| EXPECT_NE(VMRange(0x101, 0x200), range1); |
| |
| range2.Clear(); |
| EXPECT_NE(range1, range2); |
| } |
| |
| TEST(VMRange, Reset) { |
| VMRange range(0x100, 0x200); |
| EXPECT_FALSE(VMRange(0x200, 0x200) == range); |
| range.Reset(0x200, 0x200); |
| EXPECT_TRUE(VMRange(0x200, 0x200) == range); |
| } |
| |
| TEST(VMRange, SetEndAddress) { |
| VMRange range(0x100, 0x200); |
| |
| range.SetEndAddress(0xFF); |
| EXPECT_EQ(0U, range.GetByteSize()); |
| EXPECT_FALSE(range.IsValid()); |
| |
| range.SetEndAddress(0x101); |
| EXPECT_EQ(1U, range.GetByteSize()); |
| EXPECT_TRUE(range.IsValid()); |
| } |
| |
| TEST(VMRange, ContainsAddr) { |
| VMRange range(0x100, 0x200); |
| |
| EXPECT_FALSE(range.Contains(0x00)); |
| EXPECT_FALSE(range.Contains(0xFF)); |
| EXPECT_TRUE(range.Contains(0x100)); |
| EXPECT_TRUE(range.Contains(0x101)); |
| EXPECT_TRUE(range.Contains(0x1FF)); |
| EXPECT_FALSE(range.Contains(0x200)); |
| EXPECT_FALSE(range.Contains(0x201)); |
| EXPECT_FALSE(range.Contains(0xFFF)); |
| EXPECT_FALSE(range.Contains(std::numeric_limits<lldb::addr_t>::max())); |
| } |
| |
| TEST(VMRange, ContainsRange) { |
| VMRange range(0x100, 0x200); |
| |
| EXPECT_FALSE(range.Contains(VMRange(0x0, 0x0))); |
| |
| EXPECT_FALSE(range.Contains(VMRange(0x0, 0x100))); |
| EXPECT_FALSE(range.Contains(VMRange(0x0, 0x101))); |
| EXPECT_TRUE(range.Contains(VMRange(0x100, 0x105))); |
| EXPECT_TRUE(range.Contains(VMRange(0x101, 0x105))); |
| EXPECT_TRUE(range.Contains(VMRange(0x100, 0x1FF))); |
| EXPECT_TRUE(range.Contains(VMRange(0x105, 0x200))); |
| EXPECT_FALSE(range.Contains(VMRange(0x105, 0x201))); |
| EXPECT_FALSE(range.Contains(VMRange(0x200, 0x201))); |
| EXPECT_TRUE(range.Contains(VMRange(0x100, 0x200))); |
| EXPECT_FALSE( |
| range.Contains(VMRange(0x105, std::numeric_limits<lldb::addr_t>::max()))); |
| |
| // Empty range. |
| EXPECT_TRUE(range.Contains(VMRange(0x100, 0x100))); |
| |
| range.Clear(); |
| EXPECT_FALSE(range.Contains(VMRange(0x0, 0x0))); |
| } |
| |
| TEST(VMRange, Ordering) { |
| VMRange range1(0x44, 0x200); |
| VMRange range2(0x100, 0x1FF); |
| VMRange range3(0x100, 0x200); |
| |
| EXPECT_LE(range1, range1); |
| EXPECT_GE(range1, range1); |
| |
| EXPECT_LT(range1, range2); |
| EXPECT_LT(range2, range3); |
| |
| EXPECT_GT(range2, range1); |
| EXPECT_GT(range3, range2); |
| |
| // Ensure that < and > are always false when comparing ranges with themselves. |
| EXPECT_FALSE(range1 < range1); |
| EXPECT_FALSE(range2 < range2); |
| EXPECT_FALSE(range3 < range3); |
| |
| EXPECT_FALSE(range1 > range1); |
| EXPECT_FALSE(range2 > range2); |
| EXPECT_FALSE(range3 > range3); |
| } |
| |
| TEST(VMRange, CollectionContains) { |
| VMRange::collection collection = {VMRange(0x100, 0x105), |
| VMRange(0x108, 0x110)}; |
| |
| EXPECT_FALSE(VMRange::ContainsValue(collection, 0xFF)); |
| EXPECT_TRUE(VMRange::ContainsValue(collection, 0x100)); |
| EXPECT_FALSE(VMRange::ContainsValue(collection, 0x105)); |
| EXPECT_TRUE(VMRange::ContainsValue(collection, 0x109)); |
| |
| EXPECT_TRUE(VMRange::ContainsRange(collection, VMRange(0x100, 0x104))); |
| EXPECT_TRUE(VMRange::ContainsRange(collection, VMRange(0x108, 0x100))); |
| EXPECT_FALSE(VMRange::ContainsRange(collection, VMRange(0xFF, 0x100))); |
| |
| // TODO: Implement and test ContainsRange with values that span multiple |
| // ranges in the collection. |
| } |