blob: df3fa02ce44c626dc94f9a2d8c0c478137ce8e9a [file] [log] [blame]
Adam Lesinski7ad11102016-10-28 16:39:15 -07001/*
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/AssetManager2.h"
18#include "androidfw/AssetManager.h"
19
Adam Lesinski7ad11102016-10-28 16:39:15 -070020#include "TestHelpers.h"
Ryan Mitchell824cc492020-02-12 10:48:14 -080021#include "android-base/file.h"
22#include "android-base/logging.h"
Adam Lesinski929d6512017-01-16 19:11:19 -080023#include "androidfw/ResourceUtils.h"
Adam Lesinskida431a22016-12-29 16:08:16 -050024#include "data/appaslib/R.h"
Adam Lesinski7ad11102016-10-28 16:39:15 -070025#include "data/basic/R.h"
Adam Lesinskida431a22016-12-29 16:08:16 -050026#include "data/lib_one/R.h"
27#include "data/lib_two/R.h"
28#include "data/libclient/R.h"
Adam Lesinski7ad11102016-10-28 16:39:15 -070029#include "data/styles/R.h"
Adam Lesinski0c405242017-01-13 20:47:26 -080030#include "data/system/R.h"
Adam Lesinski7ad11102016-10-28 16:39:15 -070031
Adam Lesinski7ad11102016-10-28 16:39:15 -070032namespace app = com::android::app;
Adam Lesinskida431a22016-12-29 16:08:16 -050033namespace appaslib = com::android::appaslib::app;
34namespace basic = com::android::basic;
35namespace lib_one = com::android::lib_one;
36namespace lib_two = com::android::lib_two;
37namespace libclient = com::android::libclient;
Adam Lesinski7ad11102016-10-28 16:39:15 -070038
Adam Lesinskibebfcc42018-02-12 14:27:46 -080039using ::testing::Eq;
40using ::testing::NotNull;
41using ::testing::StrEq;
42
Adam Lesinski7ad11102016-10-28 16:39:15 -070043namespace android {
44
45class AssetManager2Test : public ::testing::Test {
46 public:
47 void SetUp() override {
Ryan Mitchell824cc492020-02-12 10:48:14 -080048 // Move to the test data directory so the idmap can locate the overlay APK.
49 std::string original_path = base::GetExecutableDirectory();
50 chdir(GetTestDataPath().c_str());
51
52 basic_assets_ = ApkAssets::Load("basic/basic.apk");
Adam Lesinski7ad11102016-10-28 16:39:15 -070053 ASSERT_NE(nullptr, basic_assets_);
54
Ryan Mitchell824cc492020-02-12 10:48:14 -080055 basic_de_fr_assets_ = ApkAssets::Load("basic/basic_de_fr.apk");
Adam Lesinski7ad11102016-10-28 16:39:15 -070056 ASSERT_NE(nullptr, basic_de_fr_assets_);
57
Ryan Mitchell14e8ade2021-01-11 16:01:35 -080058 basic_xhdpi_assets_ = ApkAssets::Load("basic/basic_xhdpi-v4.apk");
59 ASSERT_NE(nullptr, basic_de_fr_assets_);
60
61 basic_xxhdpi_assets_ = ApkAssets::Load("basic/basic_xxhdpi-v4.apk");
62 ASSERT_NE(nullptr, basic_de_fr_assets_);
63
Ryan Mitchell824cc492020-02-12 10:48:14 -080064 style_assets_ = ApkAssets::Load("styles/styles.apk");
Adam Lesinski7ad11102016-10-28 16:39:15 -070065 ASSERT_NE(nullptr, style_assets_);
Adam Lesinskida431a22016-12-29 16:08:16 -050066
Ryan Mitchell824cc492020-02-12 10:48:14 -080067 lib_one_assets_ = ApkAssets::Load("lib_one/lib_one.apk");
Adam Lesinskida431a22016-12-29 16:08:16 -050068 ASSERT_NE(nullptr, lib_one_assets_);
69
Ryan Mitchell824cc492020-02-12 10:48:14 -080070 lib_two_assets_ = ApkAssets::Load("lib_two/lib_two.apk");
Adam Lesinskida431a22016-12-29 16:08:16 -050071 ASSERT_NE(nullptr, lib_two_assets_);
72
Ryan Mitchell824cc492020-02-12 10:48:14 -080073 libclient_assets_ = ApkAssets::Load("libclient/libclient.apk");
Adam Lesinskida431a22016-12-29 16:08:16 -050074 ASSERT_NE(nullptr, libclient_assets_);
75
Ryan Mitchell824cc492020-02-12 10:48:14 -080076 appaslib_assets_ = ApkAssets::Load("appaslib/appaslib.apk", PROPERTY_DYNAMIC);
Adam Lesinskida431a22016-12-29 16:08:16 -050077 ASSERT_NE(nullptr, appaslib_assets_);
Adam Lesinski0c405242017-01-13 20:47:26 -080078
Ryan Mitchell824cc492020-02-12 10:48:14 -080079 system_assets_ = ApkAssets::Load("system/system.apk", PROPERTY_SYSTEM);
Adam Lesinski0c405242017-01-13 20:47:26 -080080 ASSERT_NE(nullptr, system_assets_);
Adam Lesinskibebfcc42018-02-12 14:27:46 -080081
Ryan Mitchell824cc492020-02-12 10:48:14 -080082 app_assets_ = ApkAssets::Load("app/app.apk");
Adam Lesinskibebfcc42018-02-12 14:27:46 -080083 ASSERT_THAT(app_assets_, NotNull());
Mårten Kongstadc92c4dd2019-02-05 01:29:59 +010084
Ryan Mitchell824cc492020-02-12 10:48:14 -080085 overlay_assets_ = ApkAssets::LoadOverlay("overlay/overlay.idmap");
86 ASSERT_NE(nullptr, overlay_assets_);
87
88 overlayable_assets_ = ApkAssets::Load("overlayable/overlayable.apk");
Mårten Kongstadc92c4dd2019-02-05 01:29:59 +010089 ASSERT_THAT(overlayable_assets_, NotNull());
Ryan Mitchell824cc492020-02-12 10:48:14 -080090 chdir(original_path.c_str());
Adam Lesinski7ad11102016-10-28 16:39:15 -070091 }
92
93 protected:
Yurii Zubrytskyib3455192023-05-01 14:35:48 -070094 AssetManager2::ApkAssetsPtr basic_assets_;
95 AssetManager2::ApkAssetsPtr basic_de_fr_assets_;
96 AssetManager2::ApkAssetsPtr basic_xhdpi_assets_;
97 AssetManager2::ApkAssetsPtr basic_xxhdpi_assets_;
98 AssetManager2::ApkAssetsPtr style_assets_;
99 AssetManager2::ApkAssetsPtr lib_one_assets_;
100 AssetManager2::ApkAssetsPtr lib_two_assets_;
101 AssetManager2::ApkAssetsPtr libclient_assets_;
102 AssetManager2::ApkAssetsPtr appaslib_assets_;
103 AssetManager2::ApkAssetsPtr system_assets_;
104 AssetManager2::ApkAssetsPtr app_assets_;
105 AssetManager2::ApkAssetsPtr overlay_assets_;
106 AssetManager2::ApkAssetsPtr overlayable_assets_;
Adam Lesinski7ad11102016-10-28 16:39:15 -0700107};
108
Adam Lesinskida431a22016-12-29 16:08:16 -0500109TEST_F(AssetManager2Test, FindsResourceFromSingleApkAssets) {
Adam Lesinski7ad11102016-10-28 16:39:15 -0700110 ResTable_config desired_config;
111 memset(&desired_config, 0, sizeof(desired_config));
112 desired_config.language[0] = 'd';
113 desired_config.language[1] = 'e';
114
115 AssetManager2 assetmanager;
Jeremy Meyerc5704112023-08-09 16:42:46 +0000116 assetmanager.SetConfiguration(desired_config);
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700117 assetmanager.SetApkAssets({basic_assets_});
Adam Lesinski7ad11102016-10-28 16:39:15 -0700118
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000119 auto value = assetmanager.GetResource(basic::R::string::test1);
120 ASSERT_TRUE(value.has_value());
Adam Lesinski7ad11102016-10-28 16:39:15 -0700121
122 // Came from our ApkAssets.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000123 EXPECT_EQ(0, value->cookie);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700124
125 // It is the default config.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000126 EXPECT_EQ(0, value->config.language[0]);
127 EXPECT_EQ(0, value->config.language[1]);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700128
129 // It is a string.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000130 EXPECT_EQ(Res_value::TYPE_STRING, value->type);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700131}
132
Adam Lesinskida431a22016-12-29 16:08:16 -0500133TEST_F(AssetManager2Test, FindsResourceFromMultipleApkAssets) {
Adam Lesinski7ad11102016-10-28 16:39:15 -0700134 ResTable_config desired_config;
135 memset(&desired_config, 0, sizeof(desired_config));
136 desired_config.language[0] = 'd';
137 desired_config.language[1] = 'e';
138
139 AssetManager2 assetmanager;
Jeremy Meyerc5704112023-08-09 16:42:46 +0000140 assetmanager.SetConfiguration(desired_config);
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700141 assetmanager.SetApkAssets({basic_assets_, basic_de_fr_assets_});
Adam Lesinski7ad11102016-10-28 16:39:15 -0700142
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000143 auto value = assetmanager.GetResource(basic::R::string::test1);
144 ASSERT_TRUE(value.has_value());
Adam Lesinski7ad11102016-10-28 16:39:15 -0700145
146 // Came from our de_fr ApkAssets.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000147 EXPECT_EQ(1, value->cookie);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700148
Adam Lesinskida431a22016-12-29 16:08:16 -0500149 // The configuration is German.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000150 EXPECT_EQ('d', value->config.language[0]);
151 EXPECT_EQ('e', value->config.language[1]);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700152
153 // It is a string.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000154 EXPECT_EQ(Res_value::TYPE_STRING, value->type);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700155}
156
Adam Lesinskida431a22016-12-29 16:08:16 -0500157TEST_F(AssetManager2Test, FindsResourceFromSharedLibrary) {
158 AssetManager2 assetmanager;
159
160 // libclient is built with lib_one and then lib_two in order.
161 // Reverse the order to test that proper package ID re-assignment is happening.
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700162 assetmanager.SetApkAssets({lib_two_assets_, lib_one_assets_, libclient_assets_});
Adam Lesinskida431a22016-12-29 16:08:16 -0500163
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000164 auto value = assetmanager.GetResource(libclient::R::string::foo_one);
165 ASSERT_TRUE(value.has_value());
Adam Lesinskida431a22016-12-29 16:08:16 -0500166
167 // Reference comes from libclient.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000168 EXPECT_EQ(2, value->cookie);
169 EXPECT_EQ(Res_value::TYPE_REFERENCE, value->type);
Adam Lesinskida431a22016-12-29 16:08:16 -0500170
171 // Lookup the reference.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000172 value = assetmanager.GetResource(value->data);
173 ASSERT_TRUE(value.has_value());
174 EXPECT_EQ(1, value->cookie);
175 EXPECT_EQ(Res_value::TYPE_STRING, value->type);
Adam Lesinskida431a22016-12-29 16:08:16 -0500176 EXPECT_EQ(std::string("Foo from lib_one"),
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000177 GetStringFromPool(assetmanager.GetStringPoolForCookie(value->cookie), value->data));
Adam Lesinskida431a22016-12-29 16:08:16 -0500178
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000179 value = assetmanager.GetResource(libclient::R::string::foo_two);
180 ASSERT_TRUE(value.has_value());
Adam Lesinskida431a22016-12-29 16:08:16 -0500181
182 // Reference comes from libclient.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000183 EXPECT_EQ(2, value->cookie);
184 EXPECT_EQ(Res_value::TYPE_REFERENCE, value->type);
Adam Lesinskida431a22016-12-29 16:08:16 -0500185
186 // Lookup the reference.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000187 value = assetmanager.GetResource(value->data);
188 ASSERT_TRUE(value.has_value());
189 EXPECT_EQ(0, value->cookie);
190 EXPECT_EQ(Res_value::TYPE_STRING, value->type);
Adam Lesinskida431a22016-12-29 16:08:16 -0500191 EXPECT_EQ(std::string("Foo from lib_two"),
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000192 GetStringFromPool(assetmanager.GetStringPoolForCookie(value->cookie), value->data));
Adam Lesinskida431a22016-12-29 16:08:16 -0500193}
194
195TEST_F(AssetManager2Test, FindsResourceFromAppLoadedAsSharedLibrary) {
196 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700197 assetmanager.SetApkAssets({appaslib_assets_});
Adam Lesinskida431a22016-12-29 16:08:16 -0500198
199 // The appaslib package will have been assigned the package ID 0x02.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000200 auto value = assetmanager.GetResource(fix_package_id(appaslib::R::integer::number1, 0x02));
201 ASSERT_TRUE(value.has_value());
202 EXPECT_EQ(Res_value::TYPE_REFERENCE, value->type);
203 EXPECT_EQ(fix_package_id(appaslib::R::array::integerArray1, 0x02), value->data);
Adam Lesinskida431a22016-12-29 16:08:16 -0500204}
205
Ryan Mitchell824cc492020-02-12 10:48:14 -0800206TEST_F(AssetManager2Test, AssignsOverlayPackageIdLast) {
207 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700208 assetmanager.SetApkAssets({overlayable_assets_, overlay_assets_, lib_one_assets_});
Ryan Mitchell824cc492020-02-12 10:48:14 -0800209
Yurii Zubrytskyibdcbf552023-05-10 13:16:23 -0700210 ASSERT_EQ(3, assetmanager.GetApkAssetsCount());
211 auto op = assetmanager.StartOperation();
212 ASSERT_EQ(overlayable_assets_, assetmanager.GetApkAssets(0));
213 ASSERT_EQ(overlay_assets_, assetmanager.GetApkAssets(1));
214 ASSERT_EQ(lib_one_assets_, assetmanager.GetApkAssets(2));
Ryan Mitchell824cc492020-02-12 10:48:14 -0800215
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700216 auto get_first_package_id = [&assetmanager](auto apkAssets) -> uint8_t {
Ryan Mitchell824cc492020-02-12 10:48:14 -0800217 return assetmanager.GetAssignedPackageId(apkAssets->GetLoadedArsc()->GetPackages()[0].get());
218 };
219
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700220 ASSERT_EQ(0x7f, get_first_package_id(overlayable_assets_));
221 ASSERT_EQ(0x03, get_first_package_id(overlay_assets_));
222 ASSERT_EQ(0x02, get_first_package_id(lib_one_assets_));
Ryan Mitchell824cc492020-02-12 10:48:14 -0800223}
224
Ryan Mitchell741e96f2019-01-23 16:56:51 -0800225TEST_F(AssetManager2Test, GetSharedLibraryResourceName) {
226 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700227 assetmanager.SetApkAssets({lib_one_assets_});
Ryan Mitchell741e96f2019-01-23 16:56:51 -0800228
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000229 auto name = assetmanager.GetResourceName(lib_one::R::string::foo);
230 ASSERT_TRUE(name.has_value());
231 ASSERT_EQ("com.android.lib_one:string/foo", ToFormattedResourceString(*name));
Ryan Mitchell741e96f2019-01-23 16:56:51 -0800232}
233
Ryan Mitchell14e8ade2021-01-11 16:01:35 -0800234TEST_F(AssetManager2Test, GetResourceNameNonMatchingConfig) {
235 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700236 assetmanager.SetApkAssets({basic_de_fr_assets_});
Ryan Mitchell14e8ade2021-01-11 16:01:35 -0800237
238 auto value = assetmanager.GetResourceName(basic::R::string::test1);
239 ASSERT_TRUE(value.has_value());
240 EXPECT_EQ("com.android.basic:string/test1", ToFormattedResourceString(*value));
241}
242
243TEST_F(AssetManager2Test, GetResourceTypeSpecFlags) {
244 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700245 assetmanager.SetApkAssets({basic_de_fr_assets_});
Ryan Mitchell14e8ade2021-01-11 16:01:35 -0800246
247 auto value = assetmanager.GetResourceTypeSpecFlags(basic::R::string::test1);
248 ASSERT_TRUE(value.has_value());
249 EXPECT_EQ(ResTable_typeSpec::SPEC_PUBLIC | ResTable_config::CONFIG_LOCALE, *value);
250}
251
Adam Lesinskida431a22016-12-29 16:08:16 -0500252TEST_F(AssetManager2Test, FindsBagResourceFromSingleApkAssets) {
Adam Lesinski7ad11102016-10-28 16:39:15 -0700253 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700254 assetmanager.SetApkAssets({basic_assets_});
Adam Lesinski7ad11102016-10-28 16:39:15 -0700255
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000256 auto bag = assetmanager.GetBag(basic::R::array::integerArray1);
257 ASSERT_TRUE(bag.has_value());
Adam Lesinski7ad11102016-10-28 16:39:15 -0700258
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000259 ASSERT_EQ(3u, (*bag)->entry_count);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700260
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000261 EXPECT_EQ(static_cast<uint8_t>(Res_value::TYPE_INT_DEC), (*bag)->entries[0].value.dataType);
262 EXPECT_EQ(1u, (*bag)->entries[0].value.data);
263 EXPECT_EQ(0, (*bag)->entries[0].cookie);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700264
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000265 EXPECT_EQ(static_cast<uint8_t>(Res_value::TYPE_INT_DEC), (*bag)->entries[1].value.dataType);
266 EXPECT_EQ(2u, (*bag)->entries[1].value.data);
267 EXPECT_EQ(0, (*bag)->entries[1].cookie);
268
269 EXPECT_EQ(static_cast<uint8_t>(Res_value::TYPE_INT_DEC), (*bag)->entries[2].value.dataType);
270 EXPECT_EQ(3u, (*bag)->entries[2].value.data);
271 EXPECT_EQ(0, (*bag)->entries[2].cookie);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700272}
273
Adam Lesinskida431a22016-12-29 16:08:16 -0500274TEST_F(AssetManager2Test, FindsBagResourceFromMultipleApkAssets) {}
275
276TEST_F(AssetManager2Test, FindsBagResourceFromSharedLibrary) {
277 AssetManager2 assetmanager;
278
279 // libclient is built with lib_one and then lib_two in order.
280 // Reverse the order to test that proper package ID re-assignment is happening.
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700281 assetmanager.SetApkAssets({lib_two_assets_, lib_one_assets_, libclient_assets_});
Adam Lesinskida431a22016-12-29 16:08:16 -0500282
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000283 auto bag = assetmanager.GetBag(fix_package_id(lib_one::R::style::Theme, 0x03));
284 ASSERT_TRUE(bag.has_value());
285
286 ASSERT_GE((*bag)->entry_count, 2u);
Adam Lesinskibebfcc42018-02-12 14:27:46 -0800287
288 // First two attributes come from lib_one.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000289 EXPECT_EQ(1, (*bag)->entries[0].cookie);
290 EXPECT_EQ(0x03, get_package_id((*bag)->entries[0].key));
291 EXPECT_EQ(1, (*bag)->entries[1].cookie);
292 EXPECT_EQ(0x03, get_package_id((*bag)->entries[1].key));
Adam Lesinskibebfcc42018-02-12 14:27:46 -0800293}
294
Ryan Mitchell155d5392020-02-10 13:35:24 -0800295TEST_F(AssetManager2Test, FindsBagResourceFromMultipleSharedLibraries) {
296 AssetManager2 assetmanager;
297
298 // libclient is built with lib_one and then lib_two in order.
299 // Reverse the order to test that proper package ID re-assignment is happening.
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700300 assetmanager.SetApkAssets({lib_two_assets_, lib_one_assets_, libclient_assets_});
Ryan Mitchell155d5392020-02-10 13:35:24 -0800301
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000302 auto bag = assetmanager.GetBag(libclient::R::style::ThemeMultiLib);
303 ASSERT_TRUE(bag.has_value());
304 ASSERT_EQ((*bag)->entry_count, 2u);
Ryan Mitchell155d5392020-02-10 13:35:24 -0800305
306 // First attribute comes from lib_two.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000307 EXPECT_EQ(2, (*bag)->entries[0].cookie);
308 EXPECT_EQ(0x02, get_package_id((*bag)->entries[0].key));
Ryan Mitchell155d5392020-02-10 13:35:24 -0800309
310 // The next two attributes come from lib_one.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000311 EXPECT_EQ(2, (*bag)->entries[1].cookie);
312 EXPECT_EQ(0x03, get_package_id((*bag)->entries[1].key));
Ryan Mitchell155d5392020-02-10 13:35:24 -0800313}
314
Adam Lesinskibebfcc42018-02-12 14:27:46 -0800315TEST_F(AssetManager2Test, FindsStyleResourceWithParentFromSharedLibrary) {
316 AssetManager2 assetmanager;
317
318 // libclient is built with lib_one and then lib_two in order.
319 // Reverse the order to test that proper package ID re-assignment is happening.
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700320 assetmanager.SetApkAssets({lib_two_assets_, lib_one_assets_, libclient_assets_});
Adam Lesinskibebfcc42018-02-12 14:27:46 -0800321
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000322 auto bag = assetmanager.GetBag(libclient::R::style::Theme);
323 ASSERT_TRUE(bag.has_value());
324 ASSERT_GE((*bag)->entry_count, 2u);
Adam Lesinskida431a22016-12-29 16:08:16 -0500325
326 // First two attributes come from lib_one.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000327 EXPECT_EQ(1, (*bag)->entries[0].cookie);
328 EXPECT_EQ(0x03, get_package_id((*bag)->entries[0].key));
329 EXPECT_EQ(1, (*bag)->entries[1].cookie);
330 EXPECT_EQ(0x03, get_package_id((*bag)->entries[1].key));
Adam Lesinskida431a22016-12-29 16:08:16 -0500331}
332
Adam Lesinski7ad11102016-10-28 16:39:15 -0700333TEST_F(AssetManager2Test, MergesStylesWithParentFromSingleApkAssets) {
334 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700335 assetmanager.SetApkAssets({style_assets_});
Adam Lesinski7ad11102016-10-28 16:39:15 -0700336
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000337 auto bag_one = assetmanager.GetBag(app::R::style::StyleOne);
338 ASSERT_TRUE(bag_one.has_value());
339 ASSERT_EQ(2u, (*bag_one)->entry_count);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700340
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000341 EXPECT_EQ(app::R::attr::attr_one, (*bag_one)->entries[0].key);
342 EXPECT_EQ(Res_value::TYPE_INT_DEC, (*bag_one)->entries[0].value.dataType);
343 EXPECT_EQ(1u, (*bag_one)->entries[0].value.data);
344 EXPECT_EQ(0, (*bag_one)->entries[0].cookie);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700345
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000346 EXPECT_EQ(app::R::attr::attr_two, (*bag_one)->entries[1].key);
347 EXPECT_EQ(Res_value::TYPE_INT_DEC, (*bag_one)->entries[1].value.dataType);
348 EXPECT_EQ(2u, (*bag_one)->entries[1].value.data);
349 EXPECT_EQ(0, (*bag_one)->entries[1].cookie);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700350
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000351 auto bag_two = assetmanager.GetBag(app::R::style::StyleTwo);
352 ASSERT_TRUE(bag_two.has_value());
353 ASSERT_EQ(6u, (*bag_two)->entry_count);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700354
355 // attr_one is inherited from StyleOne.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000356 EXPECT_EQ(app::R::attr::attr_one, (*bag_two)->entries[0].key);
357 EXPECT_EQ(Res_value::TYPE_INT_DEC, (*bag_two)->entries[0].value.dataType);
358 EXPECT_EQ(1u, (*bag_two)->entries[0].value.data);
359 EXPECT_EQ(0, (*bag_two)->entries[0].cookie);
360 EXPECT_EQ(app::R::style::StyleOne, (*bag_two)->entries[0].style);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700361
362 // attr_two should be overridden from StyleOne by StyleTwo.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000363 EXPECT_EQ(app::R::attr::attr_two, (*bag_two)->entries[1].key);
364 EXPECT_EQ(Res_value::TYPE_STRING, (*bag_two)->entries[1].value.dataType);
365 EXPECT_EQ(0, (*bag_two)->entries[1].cookie);
366 EXPECT_EQ(app::R::style::StyleTwo, (*bag_two)->entries[1].style);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700367 EXPECT_EQ(std::string("string"), GetStringFromPool(assetmanager.GetStringPoolForCookie(0),
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000368 (*bag_two)->entries[1].value.data));
Adam Lesinski7ad11102016-10-28 16:39:15 -0700369
370 // The rest are new attributes.
371
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000372 EXPECT_EQ(app::R::attr::attr_three, (*bag_two)->entries[2].key);
373 EXPECT_EQ(Res_value::TYPE_ATTRIBUTE, (*bag_two)->entries[2].value.dataType);
374 EXPECT_EQ(app::R::attr::attr_indirect, (*bag_two)->entries[2].value.data);
375 EXPECT_EQ(0, (*bag_two)->entries[2].cookie);
376 EXPECT_EQ(app::R::style::StyleTwo, (*bag_two)->entries[2].style);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700377
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000378 EXPECT_EQ(app::R::attr::attr_five, (*bag_two)->entries[3].key);
379 EXPECT_EQ(Res_value::TYPE_REFERENCE, (*bag_two)->entries[3].value.dataType);
380 EXPECT_EQ(app::R::string::string_one, (*bag_two)->entries[3].value.data);
381 EXPECT_EQ(0, (*bag_two)->entries[3].cookie);
382 EXPECT_EQ(app::R::style::StyleTwo, (*bag_two)->entries[3].style);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700383
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000384 EXPECT_EQ(app::R::attr::attr_indirect, (*bag_two)->entries[4].key);
385 EXPECT_EQ(Res_value::TYPE_INT_DEC, (*bag_two)->entries[4].value.dataType);
386 EXPECT_EQ(3u, (*bag_two)->entries[4].value.data);
387 EXPECT_EQ(0, (*bag_two)->entries[4].cookie);
388 EXPECT_EQ(app::R::style::StyleTwo, (*bag_two)->entries[4].style);
Adam Lesinski32e75012017-05-09 15:25:37 -0700389
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000390 EXPECT_EQ(app::R::attr::attr_empty, (*bag_two)->entries[5].key);
391 EXPECT_EQ(Res_value::TYPE_NULL, (*bag_two)->entries[5].value.dataType);
392 EXPECT_EQ(Res_value::DATA_NULL_EMPTY, (*bag_two)->entries[5].value.data);
393 EXPECT_EQ(0, (*bag_two)->entries[5].cookie);
394 EXPECT_EQ(app::R::style::StyleTwo, (*bag_two)->entries[5].style);
Adam Lesinski7ad11102016-10-28 16:39:15 -0700395}
396
y57cd1952018-04-12 14:26:23 -0700397TEST_F(AssetManager2Test, MergeStylesCircularDependency) {
398 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700399 assetmanager.SetApkAssets({style_assets_});
y57cd1952018-04-12 14:26:23 -0700400
401 // GetBag should stop traversing the parents of styles when a circular
402 // dependency is detected
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000403 auto bag = assetmanager.GetBag(app::R::style::StyleFour);
404 ASSERT_TRUE(bag.has_value());
405 ASSERT_EQ(3u, (*bag)->entry_count);
y57cd1952018-04-12 14:26:23 -0700406}
407
Adam Lesinski0c405242017-01-13 20:47:26 -0800408TEST_F(AssetManager2Test, ResolveReferenceToResource) {
409 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700410 assetmanager.SetApkAssets({basic_assets_});
Adam Lesinski0c405242017-01-13 20:47:26 -0800411
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000412 auto value = assetmanager.GetResource(basic::R::integer::ref1);
413 ASSERT_TRUE(value.has_value());
414 EXPECT_EQ(Res_value::TYPE_REFERENCE, value->type);
415 EXPECT_EQ(basic::R::integer::ref2, value->data);
Adam Lesinski0c405242017-01-13 20:47:26 -0800416
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000417 auto result = assetmanager.ResolveReference(*value);
418 ASSERT_TRUE(result.has_value());
419 EXPECT_EQ(Res_value::TYPE_INT_DEC, value->type);
420 EXPECT_EQ(12000u, value->data);
421 EXPECT_EQ(basic::R::integer::ref2, value->resid);
Adam Lesinski0c405242017-01-13 20:47:26 -0800422}
423
424TEST_F(AssetManager2Test, ResolveReferenceToBag) {
425 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700426 assetmanager.SetApkAssets({basic_assets_});
Adam Lesinski0c405242017-01-13 20:47:26 -0800427
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000428 auto value = assetmanager.GetResource(basic::R::integer::number2, true /*may_be_bag*/);
429 ASSERT_TRUE(value.has_value());
430 EXPECT_EQ(Res_value::TYPE_REFERENCE, value->type);
431 EXPECT_EQ(basic::R::array::integerArray1, value->data);
Adam Lesinski0c405242017-01-13 20:47:26 -0800432
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000433 auto result = assetmanager.ResolveReference(*value);
434 ASSERT_TRUE(result.has_value());
435 EXPECT_EQ(Res_value::TYPE_REFERENCE, value->type);
436 EXPECT_EQ(basic::R::array::integerArray1, value->data);
437 EXPECT_EQ(basic::R::array::integerArray1, value->resid);
Adam Lesinski0c405242017-01-13 20:47:26 -0800438}
439
y9efbbef2018-04-18 11:29:09 -0700440TEST_F(AssetManager2Test, ResolveDeepIdReference) {
441 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700442 assetmanager.SetApkAssets({basic_assets_});
y9efbbef2018-04-18 11:29:09 -0700443
444 // Set up the resource ids
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000445 auto high_ref = assetmanager.GetResourceId("@id/high_ref", "values", "com.android.basic");
446 ASSERT_TRUE(high_ref.has_value());
447
448 auto middle_ref = assetmanager.GetResourceId("@id/middle_ref", "values", "com.android.basic");
449 ASSERT_TRUE(middle_ref.has_value());
450
451 auto low_ref = assetmanager.GetResourceId("@id/low_ref", "values", "com.android.basic");
452 ASSERT_TRUE(low_ref.has_value());
y9efbbef2018-04-18 11:29:09 -0700453
454 // Retrieve the most shallow resource
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000455 auto value = assetmanager.GetResource(*high_ref);
456 ASSERT_TRUE(value.has_value());
457 EXPECT_EQ(Res_value::TYPE_REFERENCE, value->type);
458 EXPECT_EQ(*middle_ref, value->data);;
y9efbbef2018-04-18 11:29:09 -0700459
460 // Check that resolving the reference resolves to the deepest id
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000461 auto result = assetmanager.ResolveReference(*value);
462 ASSERT_TRUE(result.has_value());
463 EXPECT_EQ(*low_ref, value->resid);
y9efbbef2018-04-18 11:29:09 -0700464}
465
Ryan Mitchell14e8ade2021-01-11 16:01:35 -0800466TEST_F(AssetManager2Test, DensityOverride) {
467 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700468 assetmanager.SetApkAssets({basic_assets_, basic_xhdpi_assets_, basic_xxhdpi_assets_});
Jeremy Meyerc5704112023-08-09 16:42:46 +0000469 assetmanager.SetConfiguration({
Ryan Mitchell14e8ade2021-01-11 16:01:35 -0800470 .density = ResTable_config::DENSITY_XHIGH,
471 .sdkVersion = 21,
Jeremy Meyerc5704112023-08-09 16:42:46 +0000472 });
Ryan Mitchell14e8ade2021-01-11 16:01:35 -0800473
474 auto value = assetmanager.GetResource(basic::R::string::density, false /*may_be_bag*/);
475 ASSERT_TRUE(value.has_value());
476 EXPECT_EQ(Res_value::TYPE_STRING, value->type);
477 EXPECT_EQ("xhdpi", GetStringFromPool(assetmanager.GetStringPoolForCookie(value->cookie),
478 value->data));
479
480 value = assetmanager.GetResource(basic::R::string::density, false /*may_be_bag*/,
481 ResTable_config::DENSITY_XXHIGH);
482 ASSERT_TRUE(value.has_value());
483 EXPECT_EQ(Res_value::TYPE_STRING, value->type);
484 EXPECT_EQ("xxhdpi", GetStringFromPool(assetmanager.GetStringPoolForCookie(value->cookie),
485 value->data));
486}
487
Adam Lesinski1c855a02017-11-29 09:59:37 -0800488TEST_F(AssetManager2Test, KeepLastReferenceIdUnmodifiedIfNoReferenceIsResolved) {
489 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700490 assetmanager.SetApkAssets({basic_assets_});
Adam Lesinski1c855a02017-11-29 09:59:37 -0800491
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000492 // Create some kind of value that is NOT a reference.
493 AssetManager2::SelectedValue value{};
494 value.cookie = 1;
495 value.type = Res_value::TYPE_STRING;
496 value.resid = basic::R::string::test1;
Adam Lesinski1c855a02017-11-29 09:59:37 -0800497
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000498 auto result = assetmanager.ResolveReference(value);
499 ASSERT_TRUE(result.has_value());
500 EXPECT_EQ(1, value.cookie);
501 EXPECT_EQ(basic::R::string::test1, value.resid);
Adam Lesinski1c855a02017-11-29 09:59:37 -0800502}
503
Ryan Mitchell016f9e62020-11-16 23:08:18 +0000504TEST_F(AssetManager2Test, ResolveReferenceMissingResourceDoNotCacheFlags) {
505 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700506 assetmanager.SetApkAssets({basic_assets_});
Ryan Mitchell016f9e62020-11-16 23:08:18 +0000507 {
508 AssetManager2::SelectedValue value{};
509 value.data = basic::R::string::test1;
510 value.type = Res_value::TYPE_REFERENCE;
511 value.flags = ResTable_config::CONFIG_KEYBOARD;
512
513 auto result = assetmanager.ResolveReference(value);
514 ASSERT_TRUE(result.has_value());
515 EXPECT_EQ(Res_value::TYPE_STRING, value.type);
516 EXPECT_EQ(0, value.cookie);
517 EXPECT_EQ(basic::R::string::test1, value.resid);
518 EXPECT_EQ(ResTable_typeSpec::SPEC_PUBLIC | ResTable_config::CONFIG_KEYBOARD, value.flags);
519 }
520 {
521 AssetManager2::SelectedValue value{};
522 value.data = basic::R::string::test1;
523 value.type = Res_value::TYPE_REFERENCE;
524 value.flags = ResTable_config::CONFIG_COLOR_MODE;
525
526 auto result = assetmanager.ResolveReference(value);
527 ASSERT_TRUE(result.has_value());
528 EXPECT_EQ(Res_value::TYPE_STRING, value.type);
529 EXPECT_EQ(0, value.cookie);
530 EXPECT_EQ(basic::R::string::test1, value.resid);
531 EXPECT_EQ(ResTable_typeSpec::SPEC_PUBLIC | ResTable_config::CONFIG_COLOR_MODE, value.flags);
532 }
533}
534
Ryan Mitchell43d2f212020-11-13 18:06:15 -0800535TEST_F(AssetManager2Test, ResolveReferenceMissingResource) {
536 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700537 assetmanager.SetApkAssets({basic_assets_});
Ryan Mitchell43d2f212020-11-13 18:06:15 -0800538
539 const uint32_t kMissingResId = 0x8001ffff;
540 AssetManager2::SelectedValue value{};
541 value.type = Res_value::TYPE_REFERENCE;
542 value.data = kMissingResId;
543
544 auto result = assetmanager.ResolveReference(value);
545 ASSERT_FALSE(result.has_value());
546 EXPECT_EQ(Res_value::TYPE_REFERENCE, value.type);
547 EXPECT_EQ(kMissingResId, value.data);
548 EXPECT_EQ(kMissingResId, value.resid);
549 EXPECT_EQ(-1, value.cookie);
550 EXPECT_EQ(0, value.flags);
551}
552
553TEST_F(AssetManager2Test, ResolveReferenceMissingResourceLib) {
554 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700555 assetmanager.SetApkAssets({libclient_assets_});
Ryan Mitchell43d2f212020-11-13 18:06:15 -0800556
557 AssetManager2::SelectedValue value{};
558 value.type = Res_value::TYPE_REFERENCE;
559 value.data = libclient::R::string::foo_one;
560
561 auto result = assetmanager.ResolveReference(value);
562 ASSERT_TRUE(result.has_value());
563 EXPECT_EQ(Res_value::TYPE_DYNAMIC_REFERENCE, value.type);
564 EXPECT_EQ(lib_one::R::string::foo, value.data);
565 EXPECT_EQ(libclient::R::string::foo_one, value.resid);
566 EXPECT_EQ(0, value.cookie);
567 EXPECT_EQ(static_cast<uint32_t>(ResTable_typeSpec::SPEC_PUBLIC), value.flags);
568}
569
Adam Lesinski0c405242017-01-13 20:47:26 -0800570static bool IsConfigurationPresent(const std::set<ResTable_config>& configurations,
571 const ResTable_config& configuration) {
572 return configurations.count(configuration) > 0;
573}
574
575TEST_F(AssetManager2Test, GetResourceConfigurations) {
576 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700577 assetmanager.SetApkAssets({system_assets_, basic_de_fr_assets_});
Adam Lesinski0c405242017-01-13 20:47:26 -0800578
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000579 auto configurations = assetmanager.GetResourceConfigurations();
580 ASSERT_TRUE(configurations.has_value());
Adam Lesinski0c405242017-01-13 20:47:26 -0800581
582 // We expect the locale sv from the system assets, and de and fr from basic_de_fr assets.
583 // And one extra for the default configuration.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000584 EXPECT_EQ(4u, configurations->size());
Adam Lesinski0c405242017-01-13 20:47:26 -0800585
586 ResTable_config expected_config;
587 memset(&expected_config, 0, sizeof(expected_config));
588 expected_config.language[0] = 's';
589 expected_config.language[1] = 'v';
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000590 EXPECT_TRUE(IsConfigurationPresent(*configurations, expected_config));
Adam Lesinski0c405242017-01-13 20:47:26 -0800591
592 expected_config.language[0] = 'd';
593 expected_config.language[1] = 'e';
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000594 EXPECT_TRUE(IsConfigurationPresent(*configurations, expected_config));
Adam Lesinski0c405242017-01-13 20:47:26 -0800595
596 expected_config.language[0] = 'f';
597 expected_config.language[1] = 'r';
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000598 EXPECT_TRUE(IsConfigurationPresent(*configurations, expected_config));
Adam Lesinski0c405242017-01-13 20:47:26 -0800599
600 // Take out the system assets.
601 configurations = assetmanager.GetResourceConfigurations(true /* exclude_system */);
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000602 ASSERT_TRUE(configurations.has_value());
Adam Lesinski0c405242017-01-13 20:47:26 -0800603
604 // We expect de and fr from basic_de_fr assets.
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000605 EXPECT_EQ(2u, configurations->size());
Adam Lesinski0c405242017-01-13 20:47:26 -0800606
607 expected_config.language[0] = 's';
608 expected_config.language[1] = 'v';
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000609 EXPECT_FALSE(IsConfigurationPresent(*configurations, expected_config));
Adam Lesinski0c405242017-01-13 20:47:26 -0800610
611 expected_config.language[0] = 'd';
612 expected_config.language[1] = 'e';
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000613 EXPECT_TRUE(IsConfigurationPresent(*configurations, expected_config));
Adam Lesinski0c405242017-01-13 20:47:26 -0800614
615 expected_config.language[0] = 'f';
616 expected_config.language[1] = 'r';
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000617 EXPECT_TRUE(IsConfigurationPresent(*configurations, expected_config));
Adam Lesinski0c405242017-01-13 20:47:26 -0800618}
619
620TEST_F(AssetManager2Test, GetResourceLocales) {
621 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700622 assetmanager.SetApkAssets({system_assets_, basic_de_fr_assets_});
Adam Lesinski0c405242017-01-13 20:47:26 -0800623
624 std::set<std::string> locales = assetmanager.GetResourceLocales();
625
626 // We expect the locale sv from the system assets, and de and fr from basic_de_fr assets.
627 EXPECT_EQ(3u, locales.size());
628 EXPECT_GT(locales.count("sv"), 0u);
629 EXPECT_GT(locales.count("de"), 0u);
630 EXPECT_GT(locales.count("fr"), 0u);
631
632 locales = assetmanager.GetResourceLocales(true /*exclude_system*/);
633 // We expect the de and fr locales from basic_de_fr assets.
634 EXPECT_EQ(2u, locales.size());
635 EXPECT_GT(locales.count("de"), 0u);
636 EXPECT_GT(locales.count("fr"), 0u);
637}
638
639TEST_F(AssetManager2Test, GetResourceId) {
640 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700641 assetmanager.SetApkAssets({basic_assets_});
Adam Lesinski0c405242017-01-13 20:47:26 -0800642
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000643 auto resid = assetmanager.GetResourceId("com.android.basic:layout/main", "", "");
644 ASSERT_TRUE(resid.has_value());
645 EXPECT_EQ(basic::R::layout::main, *resid);
646
647 resid = assetmanager.GetResourceId("layout/main", "", "com.android.basic");
648 ASSERT_TRUE(resid.has_value());
649 EXPECT_EQ(basic::R::layout::main, *resid);
650
651 resid = assetmanager.GetResourceId("main", "layout", "com.android.basic");
652 ASSERT_TRUE(resid.has_value());
653 EXPECT_EQ(basic::R::layout::main, *resid);
Adam Lesinski0c405242017-01-13 20:47:26 -0800654}
655
Adam Lesinskibebfcc42018-02-12 14:27:46 -0800656TEST_F(AssetManager2Test, OpensFileFromSingleApkAssets) {
657 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700658 assetmanager.SetApkAssets({system_assets_});
Adam Lesinski7ad11102016-10-28 16:39:15 -0700659
Adam Lesinskibebfcc42018-02-12 14:27:46 -0800660 std::unique_ptr<Asset> asset = assetmanager.Open("file.txt", Asset::ACCESS_BUFFER);
661 ASSERT_THAT(asset, NotNull());
662
663 const char* data = reinterpret_cast<const char*>(asset->getBuffer(false /*wordAligned*/));
664 ASSERT_THAT(data, NotNull());
665 EXPECT_THAT(std::string(data, asset->getLength()), StrEq("file\n"));
666}
667
668TEST_F(AssetManager2Test, OpensFileFromMultipleApkAssets) {
669 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700670 assetmanager.SetApkAssets({system_assets_, app_assets_});
Adam Lesinskibebfcc42018-02-12 14:27:46 -0800671
672 std::unique_ptr<Asset> asset = assetmanager.Open("file.txt", Asset::ACCESS_BUFFER);
673 ASSERT_THAT(asset, NotNull());
674
675 const char* data = reinterpret_cast<const char*>(asset->getBuffer(false /*wordAligned*/));
676 ASSERT_THAT(data, NotNull());
677 EXPECT_THAT(std::string(data, asset->getLength()), StrEq("app override file\n"));
678}
679
680TEST_F(AssetManager2Test, OpenDir) {
681 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700682 assetmanager.SetApkAssets({system_assets_});
Adam Lesinskibebfcc42018-02-12 14:27:46 -0800683
684 std::unique_ptr<AssetDir> asset_dir = assetmanager.OpenDir("");
685 ASSERT_THAT(asset_dir, NotNull());
686 ASSERT_THAT(asset_dir->getFileCount(), Eq(2u));
687
688 EXPECT_THAT(asset_dir->getFileName(0), Eq(String8("file.txt")));
689 EXPECT_THAT(asset_dir->getFileType(0), Eq(FileType::kFileTypeRegular));
690
691 EXPECT_THAT(asset_dir->getFileName(1), Eq(String8("subdir")));
692 EXPECT_THAT(asset_dir->getFileType(1), Eq(FileType::kFileTypeDirectory));
693
694 asset_dir = assetmanager.OpenDir("subdir");
695 ASSERT_THAT(asset_dir, NotNull());
696 ASSERT_THAT(asset_dir->getFileCount(), Eq(1u));
697
698 EXPECT_THAT(asset_dir->getFileName(0), Eq(String8("subdir_file.txt")));
699 EXPECT_THAT(asset_dir->getFileType(0), Eq(FileType::kFileTypeRegular));
700}
701
702TEST_F(AssetManager2Test, OpenDirFromManyApks) {
703 AssetManager2 assetmanager;
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700704 assetmanager.SetApkAssets({system_assets_, app_assets_});
Adam Lesinskibebfcc42018-02-12 14:27:46 -0800705
706 std::unique_ptr<AssetDir> asset_dir = assetmanager.OpenDir("");
707 ASSERT_THAT(asset_dir, NotNull());
708 ASSERT_THAT(asset_dir->getFileCount(), Eq(3u));
709
710 EXPECT_THAT(asset_dir->getFileName(0), Eq(String8("app_file.txt")));
711 EXPECT_THAT(asset_dir->getFileType(0), Eq(FileType::kFileTypeRegular));
712
713 EXPECT_THAT(asset_dir->getFileName(1), Eq(String8("file.txt")));
714 EXPECT_THAT(asset_dir->getFileType(1), Eq(FileType::kFileTypeRegular));
715
716 EXPECT_THAT(asset_dir->getFileName(2), Eq(String8("subdir")));
717 EXPECT_THAT(asset_dir->getFileType(2), Eq(FileType::kFileTypeDirectory));
718}
Adam Lesinski7ad11102016-10-28 16:39:15 -0700719
Winson2f3669b2019-01-11 11:28:34 -0800720TEST_F(AssetManager2Test, GetLastPathWithoutEnablingReturnsEmpty) {
721 ResTable_config desired_config;
722
723 AssetManager2 assetmanager;
Jeremy Meyerc5704112023-08-09 16:42:46 +0000724 assetmanager.SetConfiguration(desired_config);
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700725 assetmanager.SetApkAssets({basic_assets_});
Winson2f3669b2019-01-11 11:28:34 -0800726 assetmanager.SetResourceResolutionLoggingEnabled(false);
727
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000728 auto value = assetmanager.GetResource(basic::R::string::test1);
729 ASSERT_TRUE(value.has_value());
Winson2f3669b2019-01-11 11:28:34 -0800730
731 auto result = assetmanager.GetLastResourceResolution();
732 EXPECT_EQ("", result);
733}
734
735TEST_F(AssetManager2Test, GetLastPathWithoutResolutionReturnsEmpty) {
736 ResTable_config desired_config;
737
738 AssetManager2 assetmanager;
Jeremy Meyerc5704112023-08-09 16:42:46 +0000739 assetmanager.SetConfiguration(desired_config);
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700740 assetmanager.SetApkAssets({basic_assets_});
Winson2f3669b2019-01-11 11:28:34 -0800741
742 auto result = assetmanager.GetLastResourceResolution();
743 EXPECT_EQ("", result);
744}
745
746TEST_F(AssetManager2Test, GetLastPathWithSingleApkAssets) {
747 ResTable_config desired_config;
748 memset(&desired_config, 0, sizeof(desired_config));
749 desired_config.language[0] = 'd';
750 desired_config.language[1] = 'e';
751
752 AssetManager2 assetmanager;
753 assetmanager.SetResourceResolutionLoggingEnabled(true);
Jeremy Meyerc5704112023-08-09 16:42:46 +0000754 assetmanager.SetConfiguration(desired_config);
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700755 assetmanager.SetApkAssets({basic_assets_});
Winson2f3669b2019-01-11 11:28:34 -0800756
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000757 auto value = assetmanager.GetResource(basic::R::string::test1);
758 ASSERT_TRUE(value.has_value());
Winson2f3669b2019-01-11 11:28:34 -0800759
760 auto result = assetmanager.GetLastResourceResolution();
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700761 EXPECT_EQ(
762 "Resolution for 0x7f030000 com.android.basic:string/test1\n"
763 "\tFor config - de\n"
764 "\tFound initial: basic/basic.apk #0\n"
765 "Best matching is from default configuration of com.android.basic",
766 result);
Winson2f3669b2019-01-11 11:28:34 -0800767}
768
769TEST_F(AssetManager2Test, GetLastPathWithMultipleApkAssets) {
770 ResTable_config desired_config;
771 memset(&desired_config, 0, sizeof(desired_config));
772 desired_config.language[0] = 'd';
773 desired_config.language[1] = 'e';
774
775 AssetManager2 assetmanager;
776 assetmanager.SetResourceResolutionLoggingEnabled(true);
Jeremy Meyerc5704112023-08-09 16:42:46 +0000777 assetmanager.SetConfiguration(desired_config);
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700778 assetmanager.SetApkAssets({basic_assets_, basic_de_fr_assets_});
Winson2f3669b2019-01-11 11:28:34 -0800779
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000780 auto value = assetmanager.GetResource(basic::R::string::test1);
781 ASSERT_TRUE(value.has_value());
Winson2f3669b2019-01-11 11:28:34 -0800782
783 auto result = assetmanager.GetLastResourceResolution();
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700784 EXPECT_EQ(
785 "Resolution for 0x7f030000 com.android.basic:string/test1\n"
786 "\tFor config - de\n"
787 "\tFound initial: basic/basic.apk #0\n"
788 "\tFound better: basic/basic_de_fr.apk #1 - de\n"
789 "Best matching is from de configuration of com.android.basic",
790 result);
Winson2f3669b2019-01-11 11:28:34 -0800791}
792
793TEST_F(AssetManager2Test, GetLastPathAfterDisablingReturnsEmpty) {
794 ResTable_config desired_config;
795 memset(&desired_config, 0, sizeof(desired_config));
796
797 AssetManager2 assetmanager;
798 assetmanager.SetResourceResolutionLoggingEnabled(true);
Jeremy Meyerc5704112023-08-09 16:42:46 +0000799 assetmanager.SetConfiguration(desired_config);
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700800 assetmanager.SetApkAssets({basic_assets_});
Winson2f3669b2019-01-11 11:28:34 -0800801
Ryan Mitchelldb21f09a2020-11-16 23:08:18 +0000802 auto value = assetmanager.GetResource(basic::R::string::test1);
803 ASSERT_TRUE(value.has_value());
Winson2f3669b2019-01-11 11:28:34 -0800804
805 auto resultEnabled = assetmanager.GetLastResourceResolution();
806 ASSERT_NE("", resultEnabled);
807
808 assetmanager.SetResourceResolutionLoggingEnabled(false);
809
810 auto resultDisabled = assetmanager.GetLastResourceResolution();
811 EXPECT_EQ("", resultDisabled);
812}
813
Ryan Mitchell2e394222019-08-28 12:10:51 -0700814TEST_F(AssetManager2Test, GetOverlayablesToString) {
Mårten Kongstadc92c4dd2019-02-05 01:29:59 +0100815 ResTable_config desired_config;
816 memset(&desired_config, 0, sizeof(desired_config));
817
818 AssetManager2 assetmanager;
819 assetmanager.SetResourceResolutionLoggingEnabled(true);
Jeremy Meyerc5704112023-08-09 16:42:46 +0000820 assetmanager.SetConfiguration(desired_config);
Yurii Zubrytskyib3455192023-05-01 14:35:48 -0700821 assetmanager.SetApkAssets({overlayable_assets_});
Mårten Kongstadc92c4dd2019-02-05 01:29:59 +0100822
823 const auto map = assetmanager.GetOverlayableMapForPackage(0x7f);
824 ASSERT_NE(nullptr, map);
Ryan Mitchell8a891d82019-07-01 09:48:23 -0700825 ASSERT_EQ(3, map->size());
Mårten Kongstadc92c4dd2019-02-05 01:29:59 +0100826 ASSERT_EQ(map->at("OverlayableResources1"), "overlay://theme");
827 ASSERT_EQ(map->at("OverlayableResources2"), "overlay://com.android.overlayable");
Ryan Mitchell8a891d82019-07-01 09:48:23 -0700828 ASSERT_EQ(map->at("OverlayableResources3"), "");
Ryan Mitchell2e394222019-08-28 12:10:51 -0700829
830 std::string api;
831 ASSERT_TRUE(assetmanager.GetOverlayablesToString("com.android.overlayable", &api));
832 ASSERT_EQ(api.find("not_overlayable"), std::string::npos);
833 ASSERT_NE(api.find("resource='com.android.overlayable:string/overlayable2' overlayable='OverlayableResources1' actor='overlay://theme' policy='0x0000000a'\n"),
834 std::string::npos);
Mårten Kongstadc92c4dd2019-02-05 01:29:59 +0100835}
836
Yurii Zubrytskyibdcbf552023-05-10 13:16:23 -0700837TEST_F(AssetManager2Test, GetApkAssets) {
838 AssetManager2 assetmanager;
839 assetmanager.SetApkAssets({overlayable_assets_, overlay_assets_, lib_one_assets_});
840
841 ASSERT_EQ(3, assetmanager.GetApkAssetsCount());
842 EXPECT_EQ(1, overlayable_assets_->getStrongCount());
843 EXPECT_EQ(1, overlay_assets_->getStrongCount());
844 EXPECT_EQ(1, lib_one_assets_->getStrongCount());
845
846 {
847 auto op = assetmanager.StartOperation();
848 ASSERT_EQ(overlayable_assets_, assetmanager.GetApkAssets(0));
849 ASSERT_EQ(overlay_assets_, assetmanager.GetApkAssets(1));
850 EXPECT_EQ(2, overlayable_assets_->getStrongCount());
851 EXPECT_EQ(2, overlay_assets_->getStrongCount());
852 EXPECT_EQ(1, lib_one_assets_->getStrongCount());
853 }
854 EXPECT_EQ(1, overlayable_assets_->getStrongCount());
855 EXPECT_EQ(1, overlay_assets_->getStrongCount());
856 EXPECT_EQ(1, lib_one_assets_->getStrongCount());
857}
858
Adam Lesinski7ad11102016-10-28 16:39:15 -0700859} // namespace android