xref: /llvm-project/lldb/unittests/Host/NativeProcessProtocolTest.cpp (revision 808142876c10b52e7ee57cdc6dcf0acc5c97c1b7)
1*80814287SRaphael Isemann //===-- NativeProcessProtocolTest.cpp -------------------------------------===//
227104981SPavel Labath //
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
627104981SPavel Labath //
727104981SPavel Labath //===----------------------------------------------------------------------===//
827104981SPavel Labath 
9f4335b8eSAntonio Afonso #include "TestingSupport/Host/NativeProcessTestUtils.h"
10f4335b8eSAntonio Afonso 
1127104981SPavel Labath #include "lldb/Host/common/NativeProcessProtocol.h"
1270795c1eSAntonio Afonso #include "llvm/Support/Process.h"
1327104981SPavel Labath #include "llvm/Testing/Support/Error.h"
1427104981SPavel Labath #include "gmock/gmock.h"
1527104981SPavel Labath 
1627104981SPavel Labath using namespace lldb_private;
1727104981SPavel Labath using namespace lldb;
1827104981SPavel Labath using namespace testing;
1927104981SPavel Labath 
TEST(NativeProcessProtocolTest,SetBreakpoint)2027104981SPavel Labath TEST(NativeProcessProtocolTest, SetBreakpoint) {
2127104981SPavel Labath   NiceMock<MockDelegate> DummyDelegate;
22f4335b8eSAntonio Afonso   MockProcess<NativeProcessProtocol> Process(DummyDelegate,
23f4335b8eSAntonio Afonso                                              ArchSpec("x86_64-pc-linux"));
2427104981SPavel Labath   auto Trap = cantFail(Process.GetSoftwareBreakpointTrapOpcode(1));
2527104981SPavel Labath   InSequence S;
2627104981SPavel Labath   EXPECT_CALL(Process, ReadMemory(0x47, 1))
2727104981SPavel Labath       .WillOnce(Return(ByMove(std::vector<uint8_t>{0xbb})));
2827104981SPavel Labath   EXPECT_CALL(Process, WriteMemory(0x47, Trap)).WillOnce(Return(ByMove(1)));
2927104981SPavel Labath   EXPECT_CALL(Process, ReadMemory(0x47, 1)).WillOnce(Return(ByMove(Trap)));
3027104981SPavel Labath   EXPECT_THAT_ERROR(Process.SetBreakpoint(0x47, 0, false).ToError(),
3127104981SPavel Labath                     llvm::Succeeded());
3227104981SPavel Labath }
3327104981SPavel Labath 
TEST(NativeProcessProtocolTest,SetBreakpointFailRead)3427104981SPavel Labath TEST(NativeProcessProtocolTest, SetBreakpointFailRead) {
3527104981SPavel Labath   NiceMock<MockDelegate> DummyDelegate;
36f4335b8eSAntonio Afonso   MockProcess<NativeProcessProtocol> Process(DummyDelegate,
37f4335b8eSAntonio Afonso                                              ArchSpec("x86_64-pc-linux"));
3827104981SPavel Labath   EXPECT_CALL(Process, ReadMemory(0x47, 1))
3927104981SPavel Labath       .WillOnce(Return(ByMove(
4027104981SPavel Labath           llvm::createStringError(llvm::inconvertibleErrorCode(), "Foo"))));
4127104981SPavel Labath   EXPECT_THAT_ERROR(Process.SetBreakpoint(0x47, 0, false).ToError(),
4227104981SPavel Labath                     llvm::Failed());
4327104981SPavel Labath }
4427104981SPavel Labath 
TEST(NativeProcessProtocolTest,SetBreakpointFailWrite)4527104981SPavel Labath TEST(NativeProcessProtocolTest, SetBreakpointFailWrite) {
4627104981SPavel Labath   NiceMock<MockDelegate> DummyDelegate;
47f4335b8eSAntonio Afonso   MockProcess<NativeProcessProtocol> Process(DummyDelegate,
48f4335b8eSAntonio Afonso                                              ArchSpec("x86_64-pc-linux"));
4927104981SPavel Labath   auto Trap = cantFail(Process.GetSoftwareBreakpointTrapOpcode(1));
5027104981SPavel Labath   InSequence S;
5127104981SPavel Labath   EXPECT_CALL(Process, ReadMemory(0x47, 1))
5227104981SPavel Labath       .WillOnce(Return(ByMove(std::vector<uint8_t>{0xbb})));
5327104981SPavel Labath   EXPECT_CALL(Process, WriteMemory(0x47, Trap))
5427104981SPavel Labath       .WillOnce(Return(ByMove(
5527104981SPavel Labath           llvm::createStringError(llvm::inconvertibleErrorCode(), "Foo"))));
5627104981SPavel Labath   EXPECT_THAT_ERROR(Process.SetBreakpoint(0x47, 0, false).ToError(),
5727104981SPavel Labath                     llvm::Failed());
5827104981SPavel Labath }
5927104981SPavel Labath 
TEST(NativeProcessProtocolTest,SetBreakpointFailVerify)6027104981SPavel Labath TEST(NativeProcessProtocolTest, SetBreakpointFailVerify) {
6127104981SPavel Labath   NiceMock<MockDelegate> DummyDelegate;
62f4335b8eSAntonio Afonso   MockProcess<NativeProcessProtocol> Process(DummyDelegate,
63f4335b8eSAntonio Afonso                                              ArchSpec("x86_64-pc-linux"));
6427104981SPavel Labath   auto Trap = cantFail(Process.GetSoftwareBreakpointTrapOpcode(1));
6527104981SPavel Labath   InSequence S;
6627104981SPavel Labath   EXPECT_CALL(Process, ReadMemory(0x47, 1))
6727104981SPavel Labath       .WillOnce(Return(ByMove(std::vector<uint8_t>{0xbb})));
6827104981SPavel Labath   EXPECT_CALL(Process, WriteMemory(0x47, Trap)).WillOnce(Return(ByMove(1)));
6927104981SPavel Labath   EXPECT_CALL(Process, ReadMemory(0x47, 1))
7027104981SPavel Labath       .WillOnce(Return(ByMove(
7127104981SPavel Labath           llvm::createStringError(llvm::inconvertibleErrorCode(), "Foo"))));
7227104981SPavel Labath   EXPECT_THAT_ERROR(Process.SetBreakpoint(0x47, 0, false).ToError(),
7327104981SPavel Labath                     llvm::Failed());
7427104981SPavel Labath }
750ae4022aSPavel Labath 
TEST(NativeProcessProtocolTest,ReadMemoryWithoutTrap)760ae4022aSPavel Labath TEST(NativeProcessProtocolTest, ReadMemoryWithoutTrap) {
770ae4022aSPavel Labath   NiceMock<MockDelegate> DummyDelegate;
78f4335b8eSAntonio Afonso   MockProcess<NativeProcessProtocol> Process(DummyDelegate,
79f4335b8eSAntonio Afonso                                              ArchSpec("aarch64-pc-linux"));
800ae4022aSPavel Labath   FakeMemory M{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};
810ae4022aSPavel Labath   EXPECT_CALL(Process, ReadMemory(_, _))
820ae4022aSPavel Labath       .WillRepeatedly(Invoke(&M, &FakeMemory::Read));
830ae4022aSPavel Labath   EXPECT_CALL(Process, WriteMemory(_, _))
840ae4022aSPavel Labath       .WillRepeatedly(Invoke(&M, &FakeMemory::Write));
850ae4022aSPavel Labath 
860ae4022aSPavel Labath   EXPECT_THAT_ERROR(Process.SetBreakpoint(0x4, 0, false).ToError(),
870ae4022aSPavel Labath                     llvm::Succeeded());
880ae4022aSPavel Labath   EXPECT_THAT_EXPECTED(
890ae4022aSPavel Labath       Process.ReadMemoryWithoutTrap(0, 10),
900ae4022aSPavel Labath       llvm::HasValue(std::vector<uint8_t>{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}));
910ae4022aSPavel Labath   EXPECT_THAT_EXPECTED(Process.ReadMemoryWithoutTrap(0, 6),
920ae4022aSPavel Labath                        llvm::HasValue(std::vector<uint8_t>{0, 1, 2, 3, 4, 5}));
930ae4022aSPavel Labath   EXPECT_THAT_EXPECTED(Process.ReadMemoryWithoutTrap(6, 4),
940ae4022aSPavel Labath                        llvm::HasValue(std::vector<uint8_t>{6, 7, 8, 9}));
950ae4022aSPavel Labath   EXPECT_THAT_EXPECTED(Process.ReadMemoryWithoutTrap(6, 2),
960ae4022aSPavel Labath                        llvm::HasValue(std::vector<uint8_t>{6, 7}));
970ae4022aSPavel Labath   EXPECT_THAT_EXPECTED(Process.ReadMemoryWithoutTrap(4, 2),
980ae4022aSPavel Labath                        llvm::HasValue(std::vector<uint8_t>{4, 5}));
990ae4022aSPavel Labath }
10070795c1eSAntonio Afonso 
TEST(NativeProcessProtocolTest,ReadCStringFromMemory)10170795c1eSAntonio Afonso TEST(NativeProcessProtocolTest, ReadCStringFromMemory) {
10270795c1eSAntonio Afonso   NiceMock<MockDelegate> DummyDelegate;
10370795c1eSAntonio Afonso   MockProcess<NativeProcessProtocol> Process(DummyDelegate,
10470795c1eSAntonio Afonso                                              ArchSpec("aarch64-pc-linux"));
10570795c1eSAntonio Afonso   FakeMemory M({'h', 'e', 'l', 'l', 'o', 0, 'w', 'o'});
10670795c1eSAntonio Afonso   EXPECT_CALL(Process, ReadMemory(_, _))
10770795c1eSAntonio Afonso       .WillRepeatedly(Invoke(&M, &FakeMemory::Read));
10870795c1eSAntonio Afonso 
10970795c1eSAntonio Afonso   char string[1024];
11070795c1eSAntonio Afonso   size_t bytes_read;
11170795c1eSAntonio Afonso   EXPECT_THAT_EXPECTED(Process.ReadCStringFromMemory(
11270795c1eSAntonio Afonso                            0x0, &string[0], sizeof(string), bytes_read),
11370795c1eSAntonio Afonso                        llvm::HasValue(llvm::StringRef("hello")));
11470795c1eSAntonio Afonso   EXPECT_EQ(bytes_read, 6UL);
11570795c1eSAntonio Afonso }
11670795c1eSAntonio Afonso 
TEST(NativeProcessProtocolTest,ReadCStringFromMemory_MaxSize)11770795c1eSAntonio Afonso TEST(NativeProcessProtocolTest, ReadCStringFromMemory_MaxSize) {
11870795c1eSAntonio Afonso   NiceMock<MockDelegate> DummyDelegate;
11970795c1eSAntonio Afonso   MockProcess<NativeProcessProtocol> Process(DummyDelegate,
12070795c1eSAntonio Afonso                                              ArchSpec("aarch64-pc-linux"));
12170795c1eSAntonio Afonso   FakeMemory M({'h', 'e', 'l', 'l', 'o', 0, 'w', 'o'});
12270795c1eSAntonio Afonso   EXPECT_CALL(Process, ReadMemory(_, _))
12370795c1eSAntonio Afonso       .WillRepeatedly(Invoke(&M, &FakeMemory::Read));
12470795c1eSAntonio Afonso 
12570795c1eSAntonio Afonso   char string[4];
12670795c1eSAntonio Afonso   size_t bytes_read;
12770795c1eSAntonio Afonso   EXPECT_THAT_EXPECTED(Process.ReadCStringFromMemory(
12870795c1eSAntonio Afonso                            0x0, &string[0], sizeof(string), bytes_read),
12970795c1eSAntonio Afonso                        llvm::HasValue(llvm::StringRef("hel")));
13070795c1eSAntonio Afonso   EXPECT_EQ(bytes_read, 3UL);
13170795c1eSAntonio Afonso }
13270795c1eSAntonio Afonso 
TEST(NativeProcessProtocolTest,ReadCStringFromMemory_CrossPageBoundary)13370795c1eSAntonio Afonso TEST(NativeProcessProtocolTest, ReadCStringFromMemory_CrossPageBoundary) {
13470795c1eSAntonio Afonso   NiceMock<MockDelegate> DummyDelegate;
13570795c1eSAntonio Afonso   MockProcess<NativeProcessProtocol> Process(DummyDelegate,
13670795c1eSAntonio Afonso                                              ArchSpec("aarch64-pc-linux"));
13770795c1eSAntonio Afonso   unsigned string_start = llvm::sys::Process::getPageSizeEstimate() - 3;
13870795c1eSAntonio Afonso   FakeMemory M({'h', 'e', 'l', 'l', 'o', 0, 'w', 'o'}, string_start);
13970795c1eSAntonio Afonso   EXPECT_CALL(Process, ReadMemory(_, _))
14070795c1eSAntonio Afonso       .WillRepeatedly(Invoke(&M, &FakeMemory::Read));
14170795c1eSAntonio Afonso 
14270795c1eSAntonio Afonso   char string[1024];
14370795c1eSAntonio Afonso   size_t bytes_read;
14470795c1eSAntonio Afonso   EXPECT_THAT_EXPECTED(Process.ReadCStringFromMemory(string_start, &string[0],
14570795c1eSAntonio Afonso                                                      sizeof(string),
14670795c1eSAntonio Afonso                                                      bytes_read),
14770795c1eSAntonio Afonso                        llvm::HasValue(llvm::StringRef("hello")));
14870795c1eSAntonio Afonso   EXPECT_EQ(bytes_read, 6UL);
14970795c1eSAntonio Afonso }