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