//===-- 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 #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::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::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. }