LoadedArsc_test.cpp revision da431a22da38f9c4085b5d71ed9a9c6122c6a5a6
1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "androidfw/LoadedArsc.h" 18 19#include "TestHelpers.h" 20#include "data/basic/R.h" 21#include "data/libclient/R.h" 22#include "data/styles/R.h" 23 24namespace app = com::android::app; 25namespace basic = com::android::basic; 26namespace libclient = com::android::libclient; 27 28namespace android { 29 30TEST(LoadedArscTest, LoadSinglePackageArsc) { 31 std::string contents; 32 ASSERT_TRUE(ReadFileFromZipToString(GetTestDataPath() + "/styles/styles.apk", "resources.arsc", 33 &contents)); 34 35 std::unique_ptr<LoadedArsc> loaded_arsc = LoadedArsc::Load(contents.data(), contents.size()); 36 ASSERT_NE(nullptr, loaded_arsc); 37 38 const std::vector<std::unique_ptr<const LoadedPackage>>& packages = loaded_arsc->GetPackages(); 39 ASSERT_EQ(1u, packages.size()); 40 EXPECT_EQ(std::string("com.android.app"), packages[0]->GetPackageName()); 41 EXPECT_EQ(0x7f, packages[0]->GetPackageId()); 42 43 ResTable_config config; 44 memset(&config, 0, sizeof(config)); 45 config.sdkVersion = 24; 46 47 LoadedArscEntry entry; 48 ResTable_config selected_config; 49 uint32_t flags; 50 51 ASSERT_TRUE( 52 loaded_arsc->FindEntry(app::R::string::string_one, config, &entry, &selected_config, &flags)); 53 ASSERT_NE(nullptr, entry.entry); 54} 55 56TEST(LoadedArscTest, FindDefaultEntry) { 57 std::string contents; 58 ASSERT_TRUE( 59 ReadFileFromZipToString(GetTestDataPath() + "/basic/basic.apk", "resources.arsc", &contents)); 60 61 std::unique_ptr<LoadedArsc> loaded_arsc = LoadedArsc::Load(contents.data(), contents.size()); 62 ASSERT_NE(nullptr, loaded_arsc); 63 64 ResTable_config desired_config; 65 memset(&desired_config, 0, sizeof(desired_config)); 66 desired_config.language[0] = 'd'; 67 desired_config.language[1] = 'e'; 68 69 LoadedArscEntry entry; 70 ResTable_config selected_config; 71 uint32_t flags; 72 73 ASSERT_TRUE(loaded_arsc->FindEntry(basic::R::string::test1, desired_config, &entry, 74 &selected_config, &flags)); 75 ASSERT_NE(nullptr, entry.entry); 76} 77 78TEST(LoadedArscTest, LoadSharedLibrary) { 79 std::string contents; 80 ASSERT_TRUE(ReadFileFromZipToString(GetTestDataPath() + "/lib_one/lib_one.apk", "resources.arsc", 81 &contents)); 82 83 std::unique_ptr<LoadedArsc> loaded_arsc = LoadedArsc::Load(contents.data(), contents.size()); 84 ASSERT_NE(nullptr, loaded_arsc); 85 86 const auto& packages = loaded_arsc->GetPackages(); 87 ASSERT_EQ(1u, packages.size()); 88 89 EXPECT_TRUE(packages[0]->IsDynamic()); 90 EXPECT_EQ(std::string("com.android.lib_one"), packages[0]->GetPackageName()); 91 EXPECT_EQ(0, packages[0]->GetPackageId()); 92 93 const auto& dynamic_pkg_map = packages[0]->GetDynamicPackageMap(); 94 95 // The library has no dependencies. 96 ASSERT_TRUE(dynamic_pkg_map.empty()); 97} 98 99TEST(LoadedArscTest, LoadAppLinkedAgainstSharedLibrary) { 100 std::string contents; 101 ASSERT_TRUE(ReadFileFromZipToString(GetTestDataPath() + "/libclient/libclient.apk", 102 "resources.arsc", &contents)); 103 104 std::unique_ptr<LoadedArsc> loaded_arsc = LoadedArsc::Load(contents.data(), contents.size()); 105 ASSERT_NE(nullptr, loaded_arsc); 106 107 const auto& packages = loaded_arsc->GetPackages(); 108 ASSERT_EQ(1u, packages.size()); 109 110 EXPECT_FALSE(packages[0]->IsDynamic()); 111 EXPECT_EQ(std::string("com.android.libclient"), packages[0]->GetPackageName()); 112 EXPECT_EQ(0x7f, packages[0]->GetPackageId()); 113 114 const auto& dynamic_pkg_map = packages[0]->GetDynamicPackageMap(); 115 116 // The library has two dependencies. 117 ASSERT_EQ(2u, dynamic_pkg_map.size()); 118 119 EXPECT_EQ(std::string("com.android.lib_one"), dynamic_pkg_map[0].package_name); 120 EXPECT_EQ(0x02, dynamic_pkg_map[0].package_id); 121 122 EXPECT_EQ(std::string("com.android.lib_two"), dynamic_pkg_map[1].package_name); 123 EXPECT_EQ(0x03, dynamic_pkg_map[1].package_id); 124} 125 126TEST(LoadedArscTest, LoadAppAsSharedLibrary) { 127 std::string contents; 128 ASSERT_TRUE(ReadFileFromZipToString(GetTestDataPath() + "/appaslib/appaslib.apk", 129 "resources.arsc", &contents)); 130 131 std::unique_ptr<LoadedArsc> loaded_arsc = 132 LoadedArsc::Load(contents.data(), contents.size(), true /*load_as_shared_library*/); 133 ASSERT_NE(nullptr, loaded_arsc); 134 135 const auto& packages = loaded_arsc->GetPackages(); 136 ASSERT_EQ(1u, packages.size()); 137 138 EXPECT_TRUE(packages[0]->IsDynamic()); 139 EXPECT_EQ(0x7f, packages[0]->GetPackageId()); 140} 141 142// structs with size fields (like Res_value, ResTable_entry) should be 143// backwards and forwards compatible (aka checking the size field against 144// sizeof(Res_value) might not be backwards compatible. 145TEST(LoadedArscTest, LoadingShouldBeForwardsAndBackwardsCompatible) { ASSERT_TRUE(false); } 146 147} // namespace android 148