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