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