xref: /llvm-project/lldb/unittests/Platform/Android/PlatformAndroidTest.cpp (revision 0642cd768b80665585c8500bed2933a3b99123dc)
149f55b02SKazuki Sakamoto //===-- PlatformAndroidTest.cpp -------------------------------------------===//
249f55b02SKazuki Sakamoto //
349f55b02SKazuki Sakamoto // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
449f55b02SKazuki Sakamoto // See https://llvm.org/LICENSE.txt for license information.
549f55b02SKazuki Sakamoto // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
649f55b02SKazuki Sakamoto //
749f55b02SKazuki Sakamoto //===----------------------------------------------------------------------===//
849f55b02SKazuki Sakamoto 
949f55b02SKazuki Sakamoto #include "Plugins/Platform/Android/PlatformAndroid.h"
1049f55b02SKazuki Sakamoto #include "Plugins/Platform/Android/PlatformAndroidRemoteGDBServer.h"
1149f55b02SKazuki Sakamoto #include "TestingSupport/SubsystemRAII.h"
1249f55b02SKazuki Sakamoto #include "TestingSupport/TestUtilities.h"
1349f55b02SKazuki Sakamoto #include "lldb/Utility/Connection.h"
1449f55b02SKazuki Sakamoto #include "gmock/gmock.h"
1549f55b02SKazuki Sakamoto 
1649f55b02SKazuki Sakamoto using namespace lldb;
1749f55b02SKazuki Sakamoto using namespace lldb_private;
1849f55b02SKazuki Sakamoto using namespace lldb_private::platform_android;
1949f55b02SKazuki Sakamoto using namespace testing;
2049f55b02SKazuki Sakamoto 
2149f55b02SKazuki Sakamoto namespace {
2249f55b02SKazuki Sakamoto 
2349f55b02SKazuki Sakamoto class MockSyncService : public AdbClient::SyncService {
2449f55b02SKazuki Sakamoto public:
2549f55b02SKazuki Sakamoto   MockSyncService() : SyncService(std::unique_ptr<Connection>()) {}
2649f55b02SKazuki Sakamoto 
2749f55b02SKazuki Sakamoto   MOCK_METHOD2(PullFile,
2849f55b02SKazuki Sakamoto                Status(const FileSpec &remote_file, const FileSpec &local_file));
2949f55b02SKazuki Sakamoto   MOCK_METHOD4(Stat, Status(const FileSpec &remote_file, uint32_t &mode,
3049f55b02SKazuki Sakamoto                             uint32_t &size, uint32_t &mtime));
3149f55b02SKazuki Sakamoto };
3249f55b02SKazuki Sakamoto 
3349f55b02SKazuki Sakamoto typedef std::unique_ptr<AdbClient::SyncService> SyncServiceUP;
3449f55b02SKazuki Sakamoto 
3549f55b02SKazuki Sakamoto class MockAdbClient : public AdbClient {
3649f55b02SKazuki Sakamoto public:
3749f55b02SKazuki Sakamoto   explicit MockAdbClient() : AdbClient("mock") {}
3849f55b02SKazuki Sakamoto 
3949f55b02SKazuki Sakamoto   MOCK_METHOD3(ShellToFile,
4049f55b02SKazuki Sakamoto                Status(const char *command, std::chrono::milliseconds timeout,
4149f55b02SKazuki Sakamoto                       const FileSpec &output_file_spec));
4249f55b02SKazuki Sakamoto   MOCK_METHOD1(GetSyncService, SyncServiceUP(Status &error));
4349f55b02SKazuki Sakamoto };
4449f55b02SKazuki Sakamoto 
4549f55b02SKazuki Sakamoto class PlatformAndroidTest : public PlatformAndroid, public ::testing::Test {
4649f55b02SKazuki Sakamoto public:
4749f55b02SKazuki Sakamoto   PlatformAndroidTest() : PlatformAndroid(false) {
4849f55b02SKazuki Sakamoto     m_remote_platform_sp = PlatformSP(new PlatformAndroidRemoteGDBServer());
4949f55b02SKazuki Sakamoto   }
5049f55b02SKazuki Sakamoto 
5149f55b02SKazuki Sakamoto   MOCK_METHOD1(GetAdbClient, AdbClientUP(Status &error));
52fabd16c7SKazuki Sakamoto   MOCK_METHOD0(GetPropertyPackageName, llvm::StringRef());
5349f55b02SKazuki Sakamoto };
5449f55b02SKazuki Sakamoto 
5549f55b02SKazuki Sakamoto } // namespace
5649f55b02SKazuki Sakamoto 
5749f55b02SKazuki Sakamoto TEST_F(PlatformAndroidTest, DownloadModuleSliceWithAdbClientError) {
5849f55b02SKazuki Sakamoto   EXPECT_CALL(*this, GetAdbClient(_))
5949f55b02SKazuki Sakamoto       .Times(1)
6049f55b02SKazuki Sakamoto       .WillOnce(DoAll(WithArg<0>([](auto &arg) {
61*0642cd76SAdrian Prantl                         arg = Status::FromErrorString(
62*0642cd76SAdrian Prantl                             "Failed to create AdbClient");
6349f55b02SKazuki Sakamoto                       }),
6449f55b02SKazuki Sakamoto                       Return(ByMove(AdbClientUP()))));
6549f55b02SKazuki Sakamoto 
6649f55b02SKazuki Sakamoto   EXPECT_TRUE(
6749f55b02SKazuki Sakamoto       DownloadModuleSlice(
6849f55b02SKazuki Sakamoto           FileSpec("/system/app/Test/Test.apk!/lib/arm64-v8a/libtest.so"), 4096,
6949f55b02SKazuki Sakamoto           3600, FileSpec())
7049f55b02SKazuki Sakamoto           .Fail());
7149f55b02SKazuki Sakamoto }
7249f55b02SKazuki Sakamoto 
7349f55b02SKazuki Sakamoto TEST_F(PlatformAndroidTest, DownloadModuleSliceWithNormalFile) {
7449f55b02SKazuki Sakamoto   auto sync_service = new MockSyncService();
7549f55b02SKazuki Sakamoto   EXPECT_CALL(*sync_service, Stat(FileSpec("/system/lib64/libc.so"), _, _, _))
7649f55b02SKazuki Sakamoto       .Times(1)
7749f55b02SKazuki Sakamoto       .WillOnce(DoAll(SetArgReferee<1>(1), Return(Status())));
7849f55b02SKazuki Sakamoto   EXPECT_CALL(*sync_service, PullFile(FileSpec("/system/lib64/libc.so"), _))
7949f55b02SKazuki Sakamoto       .Times(1)
8049f55b02SKazuki Sakamoto       .WillOnce(Return(Status()));
8149f55b02SKazuki Sakamoto 
8249f55b02SKazuki Sakamoto   auto adb_client = new MockAdbClient();
8349f55b02SKazuki Sakamoto   EXPECT_CALL(*adb_client, GetSyncService(_))
8449f55b02SKazuki Sakamoto       .Times(1)
8549f55b02SKazuki Sakamoto       .WillOnce(Return(ByMove(SyncServiceUP(sync_service))));
8649f55b02SKazuki Sakamoto 
8749f55b02SKazuki Sakamoto   EXPECT_CALL(*this, GetAdbClient(_))
8849f55b02SKazuki Sakamoto       .Times(1)
8949f55b02SKazuki Sakamoto       .WillOnce(Return(ByMove(AdbClientUP(adb_client))));
9049f55b02SKazuki Sakamoto 
9149f55b02SKazuki Sakamoto   EXPECT_TRUE(
9249f55b02SKazuki Sakamoto       DownloadModuleSlice(FileSpec("/system/lib64/libc.so"), 0, 0, FileSpec())
9349f55b02SKazuki Sakamoto           .Success());
9449f55b02SKazuki Sakamoto }
9549f55b02SKazuki Sakamoto 
9649f55b02SKazuki Sakamoto TEST_F(PlatformAndroidTest, DownloadModuleSliceWithZipFile) {
9749f55b02SKazuki Sakamoto   auto adb_client = new MockAdbClient();
9849f55b02SKazuki Sakamoto   EXPECT_CALL(*adb_client,
9949f55b02SKazuki Sakamoto               ShellToFile(StrEq("dd if='/system/app/Test/Test.apk' "
10049f55b02SKazuki Sakamoto                                 "iflag=skip_bytes,count_bytes "
10149f55b02SKazuki Sakamoto                                 "skip=4096 count=3600 status=none"),
10249f55b02SKazuki Sakamoto                           _, _))
10349f55b02SKazuki Sakamoto       .Times(1)
10449f55b02SKazuki Sakamoto       .WillOnce(Return(Status()));
10549f55b02SKazuki Sakamoto 
10649f55b02SKazuki Sakamoto   EXPECT_CALL(*this, GetAdbClient(_))
10749f55b02SKazuki Sakamoto       .Times(1)
10849f55b02SKazuki Sakamoto       .WillOnce(Return(ByMove(AdbClientUP(adb_client))));
10949f55b02SKazuki Sakamoto 
11049f55b02SKazuki Sakamoto   EXPECT_TRUE(
11149f55b02SKazuki Sakamoto       DownloadModuleSlice(
11249f55b02SKazuki Sakamoto           FileSpec("/system/app/Test/Test.apk!/lib/arm64-v8a/libtest.so"), 4096,
11349f55b02SKazuki Sakamoto           3600, FileSpec())
11449f55b02SKazuki Sakamoto           .Success());
11549f55b02SKazuki Sakamoto }
11649f55b02SKazuki Sakamoto 
117fabd16c7SKazuki Sakamoto TEST_F(PlatformAndroidTest, DownloadModuleSliceWithZipFileAndRunAs) {
118fabd16c7SKazuki Sakamoto   auto adb_client = new MockAdbClient();
119fabd16c7SKazuki Sakamoto   EXPECT_CALL(*adb_client,
120fabd16c7SKazuki Sakamoto               ShellToFile(StrEq("run-as 'com.example.test' "
121fabd16c7SKazuki Sakamoto                                 "dd if='/system/app/Test/Test.apk' "
122fabd16c7SKazuki Sakamoto                                 "iflag=skip_bytes,count_bytes "
123fabd16c7SKazuki Sakamoto                                 "skip=4096 count=3600 status=none"),
124fabd16c7SKazuki Sakamoto                           _, _))
125fabd16c7SKazuki Sakamoto       .Times(1)
126fabd16c7SKazuki Sakamoto       .WillOnce(Return(Status()));
127fabd16c7SKazuki Sakamoto 
128fabd16c7SKazuki Sakamoto   EXPECT_CALL(*this, GetPropertyPackageName())
129fabd16c7SKazuki Sakamoto       .Times(1)
130fabd16c7SKazuki Sakamoto       .WillOnce(Return(llvm::StringRef("com.example.test")));
131fabd16c7SKazuki Sakamoto 
132fabd16c7SKazuki Sakamoto   EXPECT_CALL(*this, GetAdbClient(_))
133fabd16c7SKazuki Sakamoto       .Times(1)
134fabd16c7SKazuki Sakamoto       .WillOnce(Return(ByMove(AdbClientUP(adb_client))));
135fabd16c7SKazuki Sakamoto 
136fabd16c7SKazuki Sakamoto   EXPECT_TRUE(
137fabd16c7SKazuki Sakamoto       DownloadModuleSlice(
138fabd16c7SKazuki Sakamoto           FileSpec("/system/app/Test/Test.apk!/lib/arm64-v8a/libtest.so"), 4096,
139fabd16c7SKazuki Sakamoto           3600, FileSpec())
140fabd16c7SKazuki Sakamoto           .Success());
141fabd16c7SKazuki Sakamoto }
142fabd16c7SKazuki Sakamoto 
14349f55b02SKazuki Sakamoto TEST_F(PlatformAndroidTest, GetFileWithNormalFile) {
14449f55b02SKazuki Sakamoto   auto sync_service = new MockSyncService();
14549f55b02SKazuki Sakamoto   EXPECT_CALL(*sync_service, Stat(FileSpec("/data/local/tmp/test"), _, _, _))
14649f55b02SKazuki Sakamoto       .Times(1)
14749f55b02SKazuki Sakamoto       .WillOnce(DoAll(SetArgReferee<1>(1), Return(Status())));
14849f55b02SKazuki Sakamoto   EXPECT_CALL(*sync_service, PullFile(FileSpec("/data/local/tmp/test"), _))
14949f55b02SKazuki Sakamoto       .Times(1)
15049f55b02SKazuki Sakamoto       .WillOnce(Return(Status()));
15149f55b02SKazuki Sakamoto 
15249f55b02SKazuki Sakamoto   auto adb_client = new MockAdbClient();
15349f55b02SKazuki Sakamoto   EXPECT_CALL(*adb_client, GetSyncService(_))
15449f55b02SKazuki Sakamoto       .Times(1)
15549f55b02SKazuki Sakamoto       .WillOnce(Return(ByMove(SyncServiceUP(sync_service))));
15649f55b02SKazuki Sakamoto 
15749f55b02SKazuki Sakamoto   EXPECT_CALL(*this, GetAdbClient(_))
15849f55b02SKazuki Sakamoto       .Times(1)
15949f55b02SKazuki Sakamoto       .WillOnce(Return(ByMove(AdbClientUP(adb_client))));
16049f55b02SKazuki Sakamoto 
16149f55b02SKazuki Sakamoto   EXPECT_TRUE(GetFile(FileSpec("/data/local/tmp/test"), FileSpec()).Success());
16249f55b02SKazuki Sakamoto }
16349f55b02SKazuki Sakamoto 
16449f55b02SKazuki Sakamoto TEST_F(PlatformAndroidTest, GetFileWithCatFallback) {
16549f55b02SKazuki Sakamoto   auto sync_service = new MockSyncService();
16649f55b02SKazuki Sakamoto   EXPECT_CALL(
16749f55b02SKazuki Sakamoto       *sync_service,
16849f55b02SKazuki Sakamoto       Stat(FileSpec("/data/data/com.example.app/lib-main/libtest.so"), _, _, _))
16949f55b02SKazuki Sakamoto       .Times(1)
17049f55b02SKazuki Sakamoto       .WillOnce(DoAll(SetArgReferee<1>(0), Return(Status())));
17149f55b02SKazuki Sakamoto 
17249f55b02SKazuki Sakamoto   auto adb_client0 = new MockAdbClient();
17349f55b02SKazuki Sakamoto   EXPECT_CALL(*adb_client0, GetSyncService(_))
17449f55b02SKazuki Sakamoto       .Times(1)
17549f55b02SKazuki Sakamoto       .WillOnce(Return(ByMove(SyncServiceUP(sync_service))));
17649f55b02SKazuki Sakamoto 
17749f55b02SKazuki Sakamoto   auto adb_client1 = new MockAdbClient();
17849f55b02SKazuki Sakamoto   EXPECT_CALL(
17949f55b02SKazuki Sakamoto       *adb_client1,
18049f55b02SKazuki Sakamoto       ShellToFile(StrEq("cat '/data/data/com.example.app/lib-main/libtest.so'"),
18149f55b02SKazuki Sakamoto                   _, _))
18249f55b02SKazuki Sakamoto       .Times(1)
18349f55b02SKazuki Sakamoto       .WillOnce(Return(Status()));
18449f55b02SKazuki Sakamoto 
18549f55b02SKazuki Sakamoto   EXPECT_CALL(*this, GetAdbClient(_))
18649f55b02SKazuki Sakamoto       .Times(2)
18749f55b02SKazuki Sakamoto       .WillOnce(Return(ByMove(AdbClientUP(adb_client0))))
18849f55b02SKazuki Sakamoto       .WillOnce(Return(ByMove(AdbClientUP(adb_client1))));
18949f55b02SKazuki Sakamoto 
19049f55b02SKazuki Sakamoto   EXPECT_TRUE(
19149f55b02SKazuki Sakamoto       GetFile(FileSpec("/data/data/com.example.app/lib-main/libtest.so"),
19249f55b02SKazuki Sakamoto               FileSpec())
19349f55b02SKazuki Sakamoto           .Success());
19449f55b02SKazuki Sakamoto }
195fabd16c7SKazuki Sakamoto 
196fabd16c7SKazuki Sakamoto TEST_F(PlatformAndroidTest, GetFileWithCatFallbackAndRunAs) {
197fabd16c7SKazuki Sakamoto   auto sync_service = new MockSyncService();
198fabd16c7SKazuki Sakamoto   EXPECT_CALL(
199fabd16c7SKazuki Sakamoto       *sync_service,
200fabd16c7SKazuki Sakamoto       Stat(FileSpec("/data/data/com.example.app/lib-main/libtest.so"), _, _, _))
201fabd16c7SKazuki Sakamoto       .Times(1)
202fabd16c7SKazuki Sakamoto       .WillOnce(DoAll(SetArgReferee<1>(0), Return(Status())));
203fabd16c7SKazuki Sakamoto 
204fabd16c7SKazuki Sakamoto   auto adb_client0 = new MockAdbClient();
205fabd16c7SKazuki Sakamoto   EXPECT_CALL(*adb_client0, GetSyncService(_))
206fabd16c7SKazuki Sakamoto       .Times(1)
207fabd16c7SKazuki Sakamoto       .WillOnce(Return(ByMove(SyncServiceUP(sync_service))));
208fabd16c7SKazuki Sakamoto 
209fabd16c7SKazuki Sakamoto   auto adb_client1 = new MockAdbClient();
210fabd16c7SKazuki Sakamoto   EXPECT_CALL(
211fabd16c7SKazuki Sakamoto       *adb_client1,
212fabd16c7SKazuki Sakamoto       ShellToFile(StrEq("run-as 'com.example.app' "
213fabd16c7SKazuki Sakamoto                         "cat '/data/data/com.example.app/lib-main/libtest.so'"),
214fabd16c7SKazuki Sakamoto                   _, _))
215fabd16c7SKazuki Sakamoto       .Times(1)
216fabd16c7SKazuki Sakamoto       .WillOnce(Return(Status()));
217fabd16c7SKazuki Sakamoto 
218fabd16c7SKazuki Sakamoto   EXPECT_CALL(*this, GetPropertyPackageName())
219fabd16c7SKazuki Sakamoto       .Times(1)
220fabd16c7SKazuki Sakamoto       .WillOnce(Return(llvm::StringRef("com.example.app")));
221fabd16c7SKazuki Sakamoto 
222fabd16c7SKazuki Sakamoto   EXPECT_CALL(*this, GetAdbClient(_))
223fabd16c7SKazuki Sakamoto       .Times(2)
224fabd16c7SKazuki Sakamoto       .WillOnce(Return(ByMove(AdbClientUP(adb_client0))))
225fabd16c7SKazuki Sakamoto       .WillOnce(Return(ByMove(AdbClientUP(adb_client1))));
226fabd16c7SKazuki Sakamoto 
227fabd16c7SKazuki Sakamoto   EXPECT_TRUE(
228fabd16c7SKazuki Sakamoto       GetFile(FileSpec("/data/data/com.example.app/lib-main/libtest.so"),
229fabd16c7SKazuki Sakamoto               FileSpec())
230fabd16c7SKazuki Sakamoto           .Success());
231fabd16c7SKazuki Sakamoto }
232