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