1 | //===-- RemoteAwarePlatformTest.cpp ---------------------------------------===// |
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 "lldb/Target/RemoteAwarePlatform.h" |
10 | #include "lldb/Core/Debugger.h" |
11 | #include "lldb/Core/Module.h" |
12 | #include "lldb/Core/ModuleSpec.h" |
13 | #include "lldb/Host/FileSystem.h" |
14 | #include "lldb/Target/Platform.h" |
15 | #include "lldb/Target/Process.h" |
16 | #include "gmock/gmock.h" |
17 | #include "gtest/gtest.h" |
18 | |
19 | using namespace lldb_private; |
20 | using namespace lldb; |
21 | using namespace testing; |
22 | |
23 | class RemoteAwarePlatformTester : public RemoteAwarePlatform { |
24 | public: |
25 | using RemoteAwarePlatform::RemoteAwarePlatform; |
26 | |
27 | MOCK_METHOD0(GetDescription, llvm::StringRef()); |
28 | MOCK_METHOD0(GetPluginName, llvm::StringRef()); |
29 | MOCK_METHOD1(GetSupportedArchitectures, |
30 | std::vector<ArchSpec>(const ArchSpec &process_host_arch)); |
31 | MOCK_METHOD4(Attach, |
32 | ProcessSP(ProcessAttachInfo &, Debugger &, Target *, Status &)); |
33 | MOCK_METHOD0(CalculateTrapHandlerSymbolNames, void()); |
34 | |
35 | MOCK_METHOD2(ResolveRemoteExecutable, |
36 | std::pair<Status, ModuleSP>(const ModuleSpec &, |
37 | const FileSpecList *)); |
38 | Status ResolveRemoteExecutable( |
39 | const ModuleSpec &module_spec, lldb::ModuleSP &exe_module_sp, |
40 | const FileSpecList *module_search_paths_ptr) /*override*/ |
41 | { // NOLINT(modernize-use-override) |
42 | auto pair = ResolveRemoteExecutable(gmock_a0: module_spec, gmock_a1: module_search_paths_ptr); |
43 | exe_module_sp = pair.second; |
44 | return pair.first; |
45 | } |
46 | |
47 | void SetRemotePlatform(lldb::PlatformSP platform) { |
48 | m_remote_platform_sp = platform; |
49 | } |
50 | }; |
51 | |
52 | class TargetPlatformTester : public Platform { |
53 | public: |
54 | using Platform::Platform; |
55 | |
56 | MOCK_METHOD0(GetDescription, llvm::StringRef()); |
57 | MOCK_METHOD0(GetPluginName, llvm::StringRef()); |
58 | MOCK_METHOD1(GetSupportedArchitectures, |
59 | std::vector<ArchSpec>(const ArchSpec &process_host_arch)); |
60 | MOCK_METHOD4(Attach, |
61 | ProcessSP(ProcessAttachInfo &, Debugger &, Target *, Status &)); |
62 | MOCK_METHOD0(CalculateTrapHandlerSymbolNames, void()); |
63 | MOCK_METHOD0(GetUserIDResolver, UserIDResolver &()); |
64 | }; |
65 | |
66 | namespace { |
67 | class RemoteAwarePlatformTest : public testing::Test { |
68 | public: |
69 | static void SetUpTestCase() { FileSystem::Initialize(); } |
70 | static void TearDownTestCase() { FileSystem::Terminate(); } |
71 | }; |
72 | } // namespace |
73 | |
74 | TEST_F(RemoteAwarePlatformTest, TestResolveExecutabelOnClientByPlatform) { |
75 | ModuleSpec executable_spec; |
76 | ModuleSP expected_executable(new Module(executable_spec)); |
77 | |
78 | RemoteAwarePlatformTester platform(false); |
79 | static const ArchSpec process_host_arch; |
80 | EXPECT_CALL(platform, GetSupportedArchitectures(process_host_arch)) |
81 | .WillRepeatedly(action: Return(value: std::vector<ArchSpec>())); |
82 | EXPECT_CALL(platform, ResolveRemoteExecutable(_, _)) |
83 | .WillRepeatedly(action: Return(value: std::make_pair(x: Status(), y&: expected_executable))); |
84 | |
85 | platform.SetRemotePlatform(std::make_shared<TargetPlatformTester>(args: false)); |
86 | |
87 | ModuleSP resolved_sp; |
88 | lldb_private::Status status = |
89 | platform.ResolveExecutable(module_spec: executable_spec, module_sp&: resolved_sp, module_search_paths_ptr: nullptr); |
90 | |
91 | ASSERT_TRUE(status.Success()); |
92 | EXPECT_EQ(expected_executable.get(), resolved_sp.get()); |
93 | } |
94 | |