xref: /llvm-project/lldb/unittests/Platform/Android/PlatformAndroidTest.cpp (revision 49f55b025d81823fa7e2b287c8930a8304483e5a)
1 //===-- PlatformAndroidTest.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 "Plugins/Platform/Android/PlatformAndroid.h"
10 #include "Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.h"
11 #include "TestingSupport/SubsystemRAII.h"
12 #include "TestingSupport/TestUtilities.h"
13 #include "lldb/Utility/Connection.h"
14 #include "gmock/gmock.h"
15 
16 using namespace lldb;
17 using namespace lldb_private;
18 using namespace lldb_private::platform_android;
19 using namespace testing;
20 
21 namespace {
22 
23 class MockSyncService : public AdbClient::SyncService {
24 public:
25   MockSyncService() : SyncService(std::unique_ptr<Connection>()) {}
26 
27   MOCK_METHOD2(PullFile,
28                Status(const FileSpec &remote_file, const FileSpec &local_file));
29   MOCK_METHOD4(Stat, Status(const FileSpec &remote_file, uint32_t &mode,
30                             uint32_t &size, uint32_t &mtime));
31 };
32 
33 typedef std::unique_ptr<AdbClient::SyncService> SyncServiceUP;
34 
35 class MockAdbClient : public AdbClient {
36 public:
37   explicit MockAdbClient() : AdbClient("mock") {}
38 
39   MOCK_METHOD3(ShellToFile,
40                Status(const char *command, std::chrono::milliseconds timeout,
41                       const FileSpec &output_file_spec));
42   MOCK_METHOD1(GetSyncService, SyncServiceUP(Status &error));
43 };
44 
45 class PlatformAndroidTest : public PlatformAndroid, public ::testing::Test {
46 public:
47   PlatformAndroidTest() : PlatformAndroid(false) {
48     m_remote_platform_sp = PlatformSP(new PlatformAndroidRemoteGDBServer());
49   }
50 
51   MOCK_METHOD1(GetAdbClient, AdbClientUP(Status &error));
52 };
53 
54 } // namespace
55 
56 TEST_F(PlatformAndroidTest, DownloadModuleSliceWithAdbClientError) {
57   EXPECT_CALL(*this, GetAdbClient(_))
58       .Times(1)
59       .WillOnce(DoAll(WithArg<0>([](auto &arg) {
60                         arg = Status("Failed to create AdbClient");
61                       }),
62                       Return(ByMove(AdbClientUP()))));
63 
64   EXPECT_TRUE(
65       DownloadModuleSlice(
66           FileSpec("/system/app/Test/Test.apk!/lib/arm64-v8a/libtest.so"), 4096,
67           3600, FileSpec())
68           .Fail());
69 }
70 
71 TEST_F(PlatformAndroidTest, DownloadModuleSliceWithNormalFile) {
72   auto sync_service = new MockSyncService();
73   EXPECT_CALL(*sync_service, Stat(FileSpec("/system/lib64/libc.so"), _, _, _))
74       .Times(1)
75       .WillOnce(DoAll(SetArgReferee<1>(1), Return(Status())));
76   EXPECT_CALL(*sync_service, PullFile(FileSpec("/system/lib64/libc.so"), _))
77       .Times(1)
78       .WillOnce(Return(Status()));
79 
80   auto adb_client = new MockAdbClient();
81   EXPECT_CALL(*adb_client, GetSyncService(_))
82       .Times(1)
83       .WillOnce(Return(ByMove(SyncServiceUP(sync_service))));
84 
85   EXPECT_CALL(*this, GetAdbClient(_))
86       .Times(1)
87       .WillOnce(Return(ByMove(AdbClientUP(adb_client))));
88 
89   EXPECT_TRUE(
90       DownloadModuleSlice(FileSpec("/system/lib64/libc.so"), 0, 0, FileSpec())
91           .Success());
92 }
93 
94 TEST_F(PlatformAndroidTest, DownloadModuleSliceWithZipFile) {
95   auto adb_client = new MockAdbClient();
96   EXPECT_CALL(*adb_client,
97               ShellToFile(StrEq("dd if='/system/app/Test/Test.apk' "
98                                 "iflag=skip_bytes,count_bytes "
99                                 "skip=4096 count=3600 status=none"),
100                           _, _))
101       .Times(1)
102       .WillOnce(Return(Status()));
103 
104   EXPECT_CALL(*this, GetAdbClient(_))
105       .Times(1)
106       .WillOnce(Return(ByMove(AdbClientUP(adb_client))));
107 
108   EXPECT_TRUE(
109       DownloadModuleSlice(
110           FileSpec("/system/app/Test/Test.apk!/lib/arm64-v8a/libtest.so"), 4096,
111           3600, FileSpec())
112           .Success());
113 }
114 
115 TEST_F(PlatformAndroidTest, GetFileWithNormalFile) {
116   auto sync_service = new MockSyncService();
117   EXPECT_CALL(*sync_service, Stat(FileSpec("/data/local/tmp/test"), _, _, _))
118       .Times(1)
119       .WillOnce(DoAll(SetArgReferee<1>(1), Return(Status())));
120   EXPECT_CALL(*sync_service, PullFile(FileSpec("/data/local/tmp/test"), _))
121       .Times(1)
122       .WillOnce(Return(Status()));
123 
124   auto adb_client = new MockAdbClient();
125   EXPECT_CALL(*adb_client, GetSyncService(_))
126       .Times(1)
127       .WillOnce(Return(ByMove(SyncServiceUP(sync_service))));
128 
129   EXPECT_CALL(*this, GetAdbClient(_))
130       .Times(1)
131       .WillOnce(Return(ByMove(AdbClientUP(adb_client))));
132 
133   EXPECT_TRUE(GetFile(FileSpec("/data/local/tmp/test"), FileSpec()).Success());
134 }
135 
136 TEST_F(PlatformAndroidTest, GetFileWithCatFallback) {
137   auto sync_service = new MockSyncService();
138   EXPECT_CALL(
139       *sync_service,
140       Stat(FileSpec("/data/data/com.example.app/lib-main/libtest.so"), _, _, _))
141       .Times(1)
142       .WillOnce(DoAll(SetArgReferee<1>(0), Return(Status())));
143 
144   auto adb_client0 = new MockAdbClient();
145   EXPECT_CALL(*adb_client0, GetSyncService(_))
146       .Times(1)
147       .WillOnce(Return(ByMove(SyncServiceUP(sync_service))));
148 
149   auto adb_client1 = new MockAdbClient();
150   EXPECT_CALL(
151       *adb_client1,
152       ShellToFile(StrEq("cat '/data/data/com.example.app/lib-main/libtest.so'"),
153                   _, _))
154       .Times(1)
155       .WillOnce(Return(Status()));
156 
157   EXPECT_CALL(*this, GetAdbClient(_))
158       .Times(2)
159       .WillOnce(Return(ByMove(AdbClientUP(adb_client0))))
160       .WillOnce(Return(ByMove(AdbClientUP(adb_client1))));
161 
162   EXPECT_TRUE(
163       GetFile(FileSpec("/data/data/com.example.app/lib-main/libtest.so"),
164               FileSpec())
165           .Success());
166 }
167