1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #ifndef IDMAP2_TESTS_TESTHELPERS_H_ 18*d57664e9SAndroid Build Coastguard Worker #define IDMAP2_TESTS_TESTHELPERS_H_ 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include <stdio.h> 21*d57664e9SAndroid Build Coastguard Worker #include <string> 22*d57664e9SAndroid Build Coastguard Worker #include <string_view> 23*d57664e9SAndroid Build Coastguard Worker 24*d57664e9SAndroid Build Coastguard Worker #include "gmock/gmock.h" 25*d57664e9SAndroid Build Coastguard Worker #include "gtest/gtest.h" 26*d57664e9SAndroid Build Coastguard Worker 27*d57664e9SAndroid Build Coastguard Worker #include "android-base/file.h" 28*d57664e9SAndroid Build Coastguard Worker 29*d57664e9SAndroid Build Coastguard Worker namespace android::idmap2 { 30*d57664e9SAndroid Build Coastguard Worker 31*d57664e9SAndroid Build Coastguard Worker const unsigned char kIdmapRawData[] = { 32*d57664e9SAndroid Build Coastguard Worker // IDMAP HEADER 33*d57664e9SAndroid Build Coastguard Worker // 0x0: magic 34*d57664e9SAndroid Build Coastguard Worker 0x49, 0x44, 0x4d, 0x50, 35*d57664e9SAndroid Build Coastguard Worker 36*d57664e9SAndroid Build Coastguard Worker // 0x4: version 37*d57664e9SAndroid Build Coastguard Worker 0x0a, 0x00, 0x00, 0x00, 38*d57664e9SAndroid Build Coastguard Worker 39*d57664e9SAndroid Build Coastguard Worker // 0x8: target crc 40*d57664e9SAndroid Build Coastguard Worker 0x34, 0x12, 0x00, 0x00, 41*d57664e9SAndroid Build Coastguard Worker 42*d57664e9SAndroid Build Coastguard Worker // 0xc: overlay crc 43*d57664e9SAndroid Build Coastguard Worker 0x78, 0x56, 0x00, 0x00, 44*d57664e9SAndroid Build Coastguard Worker 45*d57664e9SAndroid Build Coastguard Worker // 0x10: fulfilled policies 46*d57664e9SAndroid Build Coastguard Worker 0x11, 0x00, 0x00, 0x00, 47*d57664e9SAndroid Build Coastguard Worker 48*d57664e9SAndroid Build Coastguard Worker // 0x14: enforce overlayable 49*d57664e9SAndroid Build Coastguard Worker 0x01, 0x00, 0x00, 0x00, 50*d57664e9SAndroid Build Coastguard Worker 51*d57664e9SAndroid Build Coastguard Worker // 0x18: target path length 52*d57664e9SAndroid Build Coastguard Worker 0x0b, 0x00, 0x00, 0x00, 53*d57664e9SAndroid Build Coastguard Worker 54*d57664e9SAndroid Build Coastguard Worker // 0x1c: target path "targetX.apk" 55*d57664e9SAndroid Build Coastguard Worker 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x58, 0x2e, 0x61, 0x70, 0x6b, 0x00, 56*d57664e9SAndroid Build Coastguard Worker 57*d57664e9SAndroid Build Coastguard Worker // 0x28: overlay path length 58*d57664e9SAndroid Build Coastguard Worker 0x0c, 0x00, 0x00, 0x00, 59*d57664e9SAndroid Build Coastguard Worker 60*d57664e9SAndroid Build Coastguard Worker // 0x2c: overlay path "overlayX.apk" 61*d57664e9SAndroid Build Coastguard Worker 0x6f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x58, 0x2e, 0x61, 0x70, 0x6b, 62*d57664e9SAndroid Build Coastguard Worker 63*d57664e9SAndroid Build Coastguard Worker // 0x38: overlay name length 64*d57664e9SAndroid Build Coastguard Worker 0x0b, 0x00, 0x00, 0x00, 65*d57664e9SAndroid Build Coastguard Worker 66*d57664e9SAndroid Build Coastguard Worker // 0x3c: overlay name "OverlayName" 67*d57664e9SAndroid Build Coastguard Worker 0x4f, 0x76, 0x65, 0x72, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6D, 0x65, 0x00, 68*d57664e9SAndroid Build Coastguard Worker 69*d57664e9SAndroid Build Coastguard Worker // 0x48 -> 4c: debug string 70*d57664e9SAndroid Build Coastguard Worker // string length, 71*d57664e9SAndroid Build Coastguard Worker 0x05, 0x00, 0x00, 0x00, 72*d57664e9SAndroid Build Coastguard Worker 73*d57664e9SAndroid Build Coastguard Worker // 0x4c string contents "debug\0\0\0" (padded to word alignment) 74*d57664e9SAndroid Build Coastguard Worker 0x64, 0x65, 0x62, 0x75, 0x67, 0x00, 0x00, 0x00, 75*d57664e9SAndroid Build Coastguard Worker 76*d57664e9SAndroid Build Coastguard Worker // DATA HEADER 77*d57664e9SAndroid Build Coastguard Worker // 0x54: target_entry_count 78*d57664e9SAndroid Build Coastguard Worker 0x03, 0x00, 0x00, 0x00, 79*d57664e9SAndroid Build Coastguard Worker 80*d57664e9SAndroid Build Coastguard Worker // 0x58: target_inline_entry_count 81*d57664e9SAndroid Build Coastguard Worker 0x01, 0x00, 0x00, 0x00, 82*d57664e9SAndroid Build Coastguard Worker 83*d57664e9SAndroid Build Coastguard Worker // 0x5c: target_inline_entry_value_count 84*d57664e9SAndroid Build Coastguard Worker 0x01, 0x00, 0x00, 0x00, 85*d57664e9SAndroid Build Coastguard Worker 86*d57664e9SAndroid Build Coastguard Worker // 0x60: config_count 87*d57664e9SAndroid Build Coastguard Worker 0x01, 0x00, 0x00, 0x00, 88*d57664e9SAndroid Build Coastguard Worker 89*d57664e9SAndroid Build Coastguard Worker // 0x64: overlay_entry_count 90*d57664e9SAndroid Build Coastguard Worker 0x03, 0x00, 0x00, 0x00, 91*d57664e9SAndroid Build Coastguard Worker 92*d57664e9SAndroid Build Coastguard Worker // 0x68: string_pool_offset 93*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 94*d57664e9SAndroid Build Coastguard Worker 95*d57664e9SAndroid Build Coastguard Worker // TARGET ENTRIES 96*d57664e9SAndroid Build Coastguard Worker // 0x6c: target id (0x7f020000) 97*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x02, 0x7f, 98*d57664e9SAndroid Build Coastguard Worker // 0x70: target id (0x7f030000) 99*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x03, 0x7f, 100*d57664e9SAndroid Build Coastguard Worker // 0x74: target id (0x7f030002) 101*d57664e9SAndroid Build Coastguard Worker 0x02, 0x00, 0x03, 0x7f, 102*d57664e9SAndroid Build Coastguard Worker 103*d57664e9SAndroid Build Coastguard Worker // 0x78: overlay_id (0x7f020000) 104*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x02, 0x7f, 105*d57664e9SAndroid Build Coastguard Worker // 0x7c: overlay_id (0x7f030000) 106*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x03, 0x7f, 107*d57664e9SAndroid Build Coastguard Worker // 0x80: overlay_id (0x7f030001) 108*d57664e9SAndroid Build Coastguard Worker 0x01, 0x00, 0x03, 0x7f, 109*d57664e9SAndroid Build Coastguard Worker 110*d57664e9SAndroid Build Coastguard Worker // INLINE TARGET ENTRIES 111*d57664e9SAndroid Build Coastguard Worker 112*d57664e9SAndroid Build Coastguard Worker // 0x84: target_id 113*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x04, 0x7f, 114*d57664e9SAndroid Build Coastguard Worker 115*d57664e9SAndroid Build Coastguard Worker // 0x88: start value index 116*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 117*d57664e9SAndroid Build Coastguard Worker 118*d57664e9SAndroid Build Coastguard Worker // 0x8c: value count 119*d57664e9SAndroid Build Coastguard Worker 0x01, 0x00, 0x00, 0x00, 120*d57664e9SAndroid Build Coastguard Worker 121*d57664e9SAndroid Build Coastguard Worker // INLINE TARGET ENTRY VALUES 122*d57664e9SAndroid Build Coastguard Worker 123*d57664e9SAndroid Build Coastguard Worker // 0x90: config index 124*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 125*d57664e9SAndroid Build Coastguard Worker 126*d57664e9SAndroid Build Coastguard Worker // 0x94: Res_value::size (value ignored by idmap) 127*d57664e9SAndroid Build Coastguard Worker 0x08, 0x00, 128*d57664e9SAndroid Build Coastguard Worker 129*d57664e9SAndroid Build Coastguard Worker // 0x98: Res_value::res0 (value ignored by idmap) 130*d57664e9SAndroid Build Coastguard Worker 0x00, 131*d57664e9SAndroid Build Coastguard Worker 132*d57664e9SAndroid Build Coastguard Worker // 0x9c: Res_value::dataType (TYPE_INT_HEX) 133*d57664e9SAndroid Build Coastguard Worker 0x11, 134*d57664e9SAndroid Build Coastguard Worker 135*d57664e9SAndroid Build Coastguard Worker // 0xa0: Res_value::data 136*d57664e9SAndroid Build Coastguard Worker 0x78, 0x56, 0x34, 0x12, 137*d57664e9SAndroid Build Coastguard Worker 138*d57664e9SAndroid Build Coastguard Worker // CONFIGURATIONS 139*d57664e9SAndroid Build Coastguard Worker 140*d57664e9SAndroid Build Coastguard Worker // 0xa4: ConfigDescription 141*d57664e9SAndroid Build Coastguard Worker // size 142*d57664e9SAndroid Build Coastguard Worker 0x40, 0x00, 0x00, 0x00, 143*d57664e9SAndroid Build Coastguard Worker // 0xa8: imsi 144*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 145*d57664e9SAndroid Build Coastguard Worker // 0xac: locale 146*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 147*d57664e9SAndroid Build Coastguard Worker // 0xb0: screenType 148*d57664e9SAndroid Build Coastguard Worker 0x02, 0x00, 0xe0, 0x01, 149*d57664e9SAndroid Build Coastguard Worker // 0xb4: input 150*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 151*d57664e9SAndroid Build Coastguard Worker // 0xb8: screenSize 152*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 153*d57664e9SAndroid Build Coastguard Worker // 0xbc: version 154*d57664e9SAndroid Build Coastguard Worker 0x07, 0x00, 0x00, 0x00, 155*d57664e9SAndroid Build Coastguard Worker // 0xc0: screenConfig 156*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 157*d57664e9SAndroid Build Coastguard Worker // 0xc4: screenSizeDp 158*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 159*d57664e9SAndroid Build Coastguard Worker // 0xc8: localeScript 160*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 161*d57664e9SAndroid Build Coastguard Worker // 0xcc: localVariant(1) 162*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 163*d57664e9SAndroid Build Coastguard Worker // 0xd0: localVariant(2) 164*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 165*d57664e9SAndroid Build Coastguard Worker // 0xd4: screenConfig2 166*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 167*d57664e9SAndroid Build Coastguard Worker // 0xd8: localeScriptWasComputed 168*d57664e9SAndroid Build Coastguard Worker 0x00, 169*d57664e9SAndroid Build Coastguard Worker // 0xd9: localeNumberingSystem(1) 170*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 171*d57664e9SAndroid Build Coastguard Worker // 0xdd: localeNumberingSystem(2) 172*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 173*d57664e9SAndroid Build Coastguard Worker 174*d57664e9SAndroid Build Coastguard Worker // 0xe1: padding 175*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 176*d57664e9SAndroid Build Coastguard Worker 177*d57664e9SAndroid Build Coastguard Worker // OVERLAY ENTRIES 178*d57664e9SAndroid Build Coastguard Worker // 0xe4: 0x7f020000 -> ... 179*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x02, 0x7f, 180*d57664e9SAndroid Build Coastguard Worker // 0xe8: 0x7f030000 -> ... 181*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x03, 0x7f, 182*d57664e9SAndroid Build Coastguard Worker // 0xec: 0x7f030001 -> ... 183*d57664e9SAndroid Build Coastguard Worker 0x01, 0x00, 0x03, 0x7f, 184*d57664e9SAndroid Build Coastguard Worker 185*d57664e9SAndroid Build Coastguard Worker // 0xf0: ... -> 0x7f020000 186*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x02, 0x7f, 187*d57664e9SAndroid Build Coastguard Worker // 0xf4: ... -> 0x7f030000 188*d57664e9SAndroid Build Coastguard Worker 0x00, 0x00, 0x03, 0x7f, 189*d57664e9SAndroid Build Coastguard Worker // 0xf8: ... -> 0x7f030002 190*d57664e9SAndroid Build Coastguard Worker 0x02, 0x00, 0x03, 0x7f, 191*d57664e9SAndroid Build Coastguard Worker 192*d57664e9SAndroid Build Coastguard Worker // 0xfc: string pool 193*d57664e9SAndroid Build Coastguard Worker // string length, 194*d57664e9SAndroid Build Coastguard Worker 0x04, 0x00, 0x00, 0x00, 195*d57664e9SAndroid Build Coastguard Worker 196*d57664e9SAndroid Build Coastguard Worker // 0x100 string contents "test" 197*d57664e9SAndroid Build Coastguard Worker 0x74, 0x65, 0x73, 0x74}; 198*d57664e9SAndroid Build Coastguard Worker 199*d57664e9SAndroid Build Coastguard Worker constexpr unsigned int kIdmapRawDataLen = std::size(kIdmapRawData); 200*d57664e9SAndroid Build Coastguard Worker const unsigned int kIdmapRawDataOffset = 0x54; 201*d57664e9SAndroid Build Coastguard Worker const unsigned int kIdmapRawDataTargetCrc = 0x1234; 202*d57664e9SAndroid Build Coastguard Worker const unsigned int kIdmapRawOverlayCrc = 0x5678; 203*d57664e9SAndroid Build Coastguard Worker const unsigned int kIdmapRawDataPolicies = 0x11; 204*d57664e9SAndroid Build Coastguard Worker inline const std::string_view kIdmapRawTargetPath = "targetX.apk"; 205*d57664e9SAndroid Build Coastguard Worker inline const std::string_view kIdmapRawOverlayPath = "overlayX.apk"; 206*d57664e9SAndroid Build Coastguard Worker inline const std::string_view kIdmapRawOverlayName = "OverlayName"; 207*d57664e9SAndroid Build Coastguard Worker 208*d57664e9SAndroid Build Coastguard Worker std::string GetTestDataPath(); 209*d57664e9SAndroid Build Coastguard Worker 210*d57664e9SAndroid Build Coastguard Worker class TempFrroFile : public TemporaryFile { 211*d57664e9SAndroid Build Coastguard Worker public: TempFrroFile()212*d57664e9SAndroid Build Coastguard Worker TempFrroFile() { 213*d57664e9SAndroid Build Coastguard Worker std::string new_path = path; 214*d57664e9SAndroid Build Coastguard Worker new_path += ".frro"; 215*d57664e9SAndroid Build Coastguard Worker ::rename(path, new_path.c_str()); 216*d57664e9SAndroid Build Coastguard Worker const auto new_len = new_path.copy(path, sizeof(path) - 1); 217*d57664e9SAndroid Build Coastguard Worker path[new_len] = '\0'; 218*d57664e9SAndroid Build Coastguard Worker } 219*d57664e9SAndroid Build Coastguard Worker }; 220*d57664e9SAndroid Build Coastguard Worker 221*d57664e9SAndroid Build Coastguard Worker class Idmap2Tests : public testing::Test { 222*d57664e9SAndroid Build Coastguard Worker protected: SetUp()223*d57664e9SAndroid Build Coastguard Worker void SetUp() override { 224*d57664e9SAndroid Build Coastguard Worker #ifdef __ANDROID__ 225*d57664e9SAndroid Build Coastguard Worker tmp_dir_path_ = "/data/local/tmp/idmap2-tests-XXXXXX"; 226*d57664e9SAndroid Build Coastguard Worker #else 227*d57664e9SAndroid Build Coastguard Worker tmp_dir_path_ = "/tmp/idmap2-tests-XXXXXX"; 228*d57664e9SAndroid Build Coastguard Worker #endif 229*d57664e9SAndroid Build Coastguard Worker EXPECT_NE(mkdtemp(const_cast<char*>(tmp_dir_path_.c_str())), nullptr) 230*d57664e9SAndroid Build Coastguard Worker << "Failed to create temporary directory: " << strerror(errno); 231*d57664e9SAndroid Build Coastguard Worker target_apk_path_ = GetTestDataPath() + "/target/target.apk"; 232*d57664e9SAndroid Build Coastguard Worker overlay_apk_path_ = GetTestDataPath() + "/overlay/overlay.apk"; 233*d57664e9SAndroid Build Coastguard Worker idmap_path_ = tmp_dir_path_ + "/a.idmap"; 234*d57664e9SAndroid Build Coastguard Worker } 235*d57664e9SAndroid Build Coastguard Worker TearDown()236*d57664e9SAndroid Build Coastguard Worker void TearDown() override { 237*d57664e9SAndroid Build Coastguard Worker EXPECT_EQ(rmdir(tmp_dir_path_.c_str()), 0) 238*d57664e9SAndroid Build Coastguard Worker << "Failed to remove temporary directory " << tmp_dir_path_ << ": " << strerror(errno); 239*d57664e9SAndroid Build Coastguard Worker } 240*d57664e9SAndroid Build Coastguard Worker GetTempDirPath()241*d57664e9SAndroid Build Coastguard Worker const std::string& GetTempDirPath() { 242*d57664e9SAndroid Build Coastguard Worker return tmp_dir_path_; 243*d57664e9SAndroid Build Coastguard Worker } 244*d57664e9SAndroid Build Coastguard Worker GetTargetApkPath()245*d57664e9SAndroid Build Coastguard Worker const std::string& GetTargetApkPath() { 246*d57664e9SAndroid Build Coastguard Worker return target_apk_path_; 247*d57664e9SAndroid Build Coastguard Worker } 248*d57664e9SAndroid Build Coastguard Worker GetOverlayApkPath()249*d57664e9SAndroid Build Coastguard Worker const std::string& GetOverlayApkPath() { 250*d57664e9SAndroid Build Coastguard Worker return overlay_apk_path_; 251*d57664e9SAndroid Build Coastguard Worker } 252*d57664e9SAndroid Build Coastguard Worker GetIdmapPath()253*d57664e9SAndroid Build Coastguard Worker const std::string& GetIdmapPath() { 254*d57664e9SAndroid Build Coastguard Worker return idmap_path_; 255*d57664e9SAndroid Build Coastguard Worker } 256*d57664e9SAndroid Build Coastguard Worker 257*d57664e9SAndroid Build Coastguard Worker private: 258*d57664e9SAndroid Build Coastguard Worker std::string tmp_dir_path_; 259*d57664e9SAndroid Build Coastguard Worker std::string target_apk_path_; 260*d57664e9SAndroid Build Coastguard Worker std::string overlay_apk_path_; 261*d57664e9SAndroid Build Coastguard Worker std::string idmap_path_; 262*d57664e9SAndroid Build Coastguard Worker }; 263*d57664e9SAndroid Build Coastguard Worker 264*d57664e9SAndroid Build Coastguard Worker } // namespace android::idmap2 265*d57664e9SAndroid Build Coastguard Worker 266*d57664e9SAndroid Build Coastguard Worker #endif // IDMAP2_TESTS_TESTHELPERS_H_ 267