1 //===-- NativeProcessProtocolTest.cpp ---------------------------*- C++ -*-===// 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 "TestingSupport/Host/NativeProcessTestUtils.h" 10 11 #include "lldb/Host/common/NativeProcessProtocol.h" 12 #include "llvm/Testing/Support/Error.h" 13 #include "gmock/gmock.h" 14 15 using namespace lldb_private; 16 using namespace lldb; 17 using namespace testing; 18 19 TEST(NativeProcessProtocolTest, SetBreakpoint) { 20 NiceMock<MockDelegate> DummyDelegate; 21 MockProcess<NativeProcessProtocol> Process(DummyDelegate, 22 ArchSpec("x86_64-pc-linux")); 23 auto Trap = cantFail(Process.GetSoftwareBreakpointTrapOpcode(1)); 24 InSequence S; 25 EXPECT_CALL(Process, ReadMemory(0x47, 1)) 26 .WillOnce(Return(ByMove(std::vector<uint8_t>{0xbb}))); 27 EXPECT_CALL(Process, WriteMemory(0x47, Trap)).WillOnce(Return(ByMove(1))); 28 EXPECT_CALL(Process, ReadMemory(0x47, 1)).WillOnce(Return(ByMove(Trap))); 29 EXPECT_THAT_ERROR(Process.SetBreakpoint(0x47, 0, false).ToError(), 30 llvm::Succeeded()); 31 } 32 33 TEST(NativeProcessProtocolTest, SetBreakpointFailRead) { 34 NiceMock<MockDelegate> DummyDelegate; 35 MockProcess<NativeProcessProtocol> Process(DummyDelegate, 36 ArchSpec("x86_64-pc-linux")); 37 EXPECT_CALL(Process, ReadMemory(0x47, 1)) 38 .WillOnce(Return(ByMove( 39 llvm::createStringError(llvm::inconvertibleErrorCode(), "Foo")))); 40 EXPECT_THAT_ERROR(Process.SetBreakpoint(0x47, 0, false).ToError(), 41 llvm::Failed()); 42 } 43 44 TEST(NativeProcessProtocolTest, SetBreakpointFailWrite) { 45 NiceMock<MockDelegate> DummyDelegate; 46 MockProcess<NativeProcessProtocol> Process(DummyDelegate, 47 ArchSpec("x86_64-pc-linux")); 48 auto Trap = cantFail(Process.GetSoftwareBreakpointTrapOpcode(1)); 49 InSequence S; 50 EXPECT_CALL(Process, ReadMemory(0x47, 1)) 51 .WillOnce(Return(ByMove(std::vector<uint8_t>{0xbb}))); 52 EXPECT_CALL(Process, WriteMemory(0x47, Trap)) 53 .WillOnce(Return(ByMove( 54 llvm::createStringError(llvm::inconvertibleErrorCode(), "Foo")))); 55 EXPECT_THAT_ERROR(Process.SetBreakpoint(0x47, 0, false).ToError(), 56 llvm::Failed()); 57 } 58 59 TEST(NativeProcessProtocolTest, SetBreakpointFailVerify) { 60 NiceMock<MockDelegate> DummyDelegate; 61 MockProcess<NativeProcessProtocol> Process(DummyDelegate, 62 ArchSpec("x86_64-pc-linux")); 63 auto Trap = cantFail(Process.GetSoftwareBreakpointTrapOpcode(1)); 64 InSequence S; 65 EXPECT_CALL(Process, ReadMemory(0x47, 1)) 66 .WillOnce(Return(ByMove(std::vector<uint8_t>{0xbb}))); 67 EXPECT_CALL(Process, WriteMemory(0x47, Trap)).WillOnce(Return(ByMove(1))); 68 EXPECT_CALL(Process, ReadMemory(0x47, 1)) 69 .WillOnce(Return(ByMove( 70 llvm::createStringError(llvm::inconvertibleErrorCode(), "Foo")))); 71 EXPECT_THAT_ERROR(Process.SetBreakpoint(0x47, 0, false).ToError(), 72 llvm::Failed()); 73 } 74 75 TEST(NativeProcessProtocolTest, ReadMemoryWithoutTrap) { 76 NiceMock<MockDelegate> DummyDelegate; 77 MockProcess<NativeProcessProtocol> Process(DummyDelegate, 78 ArchSpec("aarch64-pc-linux")); 79 FakeMemory M{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}; 80 EXPECT_CALL(Process, ReadMemory(_, _)) 81 .WillRepeatedly(Invoke(&M, &FakeMemory::Read)); 82 EXPECT_CALL(Process, WriteMemory(_, _)) 83 .WillRepeatedly(Invoke(&M, &FakeMemory::Write)); 84 85 EXPECT_THAT_ERROR(Process.SetBreakpoint(0x4, 0, false).ToError(), 86 llvm::Succeeded()); 87 EXPECT_THAT_EXPECTED( 88 Process.ReadMemoryWithoutTrap(0, 10), 89 llvm::HasValue(std::vector<uint8_t>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9})); 90 EXPECT_THAT_EXPECTED(Process.ReadMemoryWithoutTrap(0, 6), 91 llvm::HasValue(std::vector<uint8_t>{0, 1, 2, 3, 4, 5})); 92 EXPECT_THAT_EXPECTED(Process.ReadMemoryWithoutTrap(6, 4), 93 llvm::HasValue(std::vector<uint8_t>{6, 7, 8, 9})); 94 EXPECT_THAT_EXPECTED(Process.ReadMemoryWithoutTrap(6, 2), 95 llvm::HasValue(std::vector<uint8_t>{6, 7})); 96 EXPECT_THAT_EXPECTED(Process.ReadMemoryWithoutTrap(4, 2), 97 llvm::HasValue(std::vector<uint8_t>{4, 5})); 98 } 99