blob: febbb2ed11a059d64236ff107a5afc7b4ff44681 [file] [log] [blame]
Shane Farmer74cdea32017-05-12 16:22:36 -07001/*
2 * Copyright (C) 2017 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 "configuration/ConfigurationParser.h"
18
19#include <string>
20
Shane Farmer67e8a302017-12-06 14:39:10 -080021#include "android-base/stringprintf.h"
Shane Farmer74cdea32017-05-12 16:22:36 -070022#include "androidfw/ResourceTypes.h"
23
Shane Farmer67e8a302017-12-06 14:39:10 -080024#include "SdkConstants.h"
Shane Farmercb6c3f92017-11-27 13:19:36 -080025#include "configuration/ConfigurationParser.internal.h"
Shane Farmer74cdea32017-05-12 16:22:36 -070026#include "test/Test.h"
27#include "xml/XmlDom.h"
28
29namespace aapt {
Shane Farmer3edd4722017-09-01 14:34:22 -070030
31namespace configuration {
32void PrintTo(const AndroidSdk& sdk, std::ostream* os) {
Shane Farmer78c43d72017-12-04 09:08:38 -080033 *os << "SDK: min=" << sdk.min_sdk_version
Shane Farmer3edd4722017-09-01 14:34:22 -070034 << ", target=" << sdk.target_sdk_version.value_or_default(-1)
35 << ", max=" << sdk.max_sdk_version.value_or_default(-1);
36}
Shane Farmercb6c3f92017-11-27 13:19:36 -080037
Shane Farmer78c43d72017-12-04 09:08:38 -080038bool operator==(const ConfiguredArtifact& lhs, const ConfiguredArtifact& rhs) {
39 return lhs.name == rhs.name && lhs.abi_group == rhs.abi_group &&
40 lhs.screen_density_group == rhs.screen_density_group &&
41 lhs.locale_group == rhs.locale_group && lhs.android_sdk == rhs.android_sdk &&
42 lhs.device_feature_group == rhs.device_feature_group &&
43 lhs.gl_texture_group == rhs.gl_texture_group;
44}
45
46std::ostream& operator<<(std::ostream& out, const Maybe<std::string>& value) {
47 PrintTo(value, &out);
48 return out;
49}
50
51void PrintTo(const ConfiguredArtifact& artifact, std::ostream* os) {
52 *os << "\n{"
53 << "\n name: " << artifact.name << "\n sdk: " << artifact.android_sdk
54 << "\n abi: " << artifact.abi_group << "\n density: " << artifact.screen_density_group
55 << "\n locale: " << artifact.locale_group
56 << "\n features: " << artifact.device_feature_group
57 << "\n textures: " << artifact.gl_texture_group << "\n}\n";
58}
59
Shane Farmercb6c3f92017-11-27 13:19:36 -080060namespace handler {
Shane Farmer3edd4722017-09-01 14:34:22 -070061
Shane Farmer74cdea32017-05-12 16:22:36 -070062namespace {
63
Shane Farmer67e8a302017-12-06 14:39:10 -080064using ::aapt::configuration::Abi;
65using ::aapt::configuration::AndroidManifest;
66using ::aapt::configuration::AndroidSdk;
Shane Farmercb6c3f92017-11-27 13:19:36 -080067using ::aapt::configuration::ConfiguredArtifact;
Shane Farmer67e8a302017-12-06 14:39:10 -080068using ::aapt::configuration::DeviceFeature;
Shane Farmer78c43d72017-12-04 09:08:38 -080069using ::aapt::configuration::ExtractConfiguration;
Shane Farmer67e8a302017-12-06 14:39:10 -080070using ::aapt::configuration::GlTexture;
71using ::aapt::configuration::Locale;
72using ::aapt::configuration::PostProcessingConfiguration;
73using ::aapt::xml::Element;
74using ::aapt::xml::NodeCast;
Adam Lesinski6b372992017-08-09 10:54:23 -070075using ::android::ResTable_config;
Shane Farmer67e8a302017-12-06 14:39:10 -080076using ::android::base::StringPrintf;
Adam Lesinski6b372992017-08-09 10:54:23 -070077using ::testing::ElementsAre;
Shane Farmer78c43d72017-12-04 09:08:38 -080078using ::testing::Eq;
Shane Farmercb6c3f92017-11-27 13:19:36 -080079using ::testing::SizeIs;
Shane Farmer78c43d72017-12-04 09:08:38 -080080using ::testing::StrEq;
Shane Farmer74cdea32017-05-12 16:22:36 -070081
82constexpr const char* kValidConfig = R"(<?xml version="1.0" encoding="utf-8" ?>
83<post-process xmlns="http://schemas.android.com/tools/aapt">
Shane Farmer78c43d72017-12-04 09:08:38 -080084 <abi-groups>
Shane Farmer11cdc1c2018-01-31 16:43:24 -080085 <abi-group label="other" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -070086 <abi>x86</abi>
87 <abi>mips</abi>
88 </abi-group>
Shane Farmer11cdc1c2018-01-31 16:43:24 -080089 <abi-group label="arm" version-code-order="1">
90 <abi>armeabi-v7a</abi>
91 <abi>arm64-v8a</abi>
92 </abi-group>
Shane Farmer78c43d72017-12-04 09:08:38 -080093 </abi-groups>
94 <screen-density-groups>
Shane Farmer11cdc1c2018-01-31 16:43:24 -080095 <screen-density-group label="large" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -070096 <screen-density>xhdpi</screen-density>
97 <screen-density>xxhdpi</screen-density>
98 <screen-density>xxxhdpi</screen-density>
99 </screen-density-group>
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800100 <screen-density-group label="alldpi" version-code-order="1">
Shane Farmer74cdea32017-05-12 16:22:36 -0700101 <screen-density>ldpi</screen-density>
102 <screen-density>mdpi</screen-density>
103 <screen-density>hdpi</screen-density>
104 <screen-density>xhdpi</screen-density>
105 <screen-density>xxhdpi</screen-density>
106 <screen-density>xxxhdpi</screen-density>
107 </screen-density-group>
Shane Farmer78c43d72017-12-04 09:08:38 -0800108 </screen-density-groups>
109 <locale-groups>
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800110 <locale-group label="europe" version-code-order="1">
Shane Farmer0a5b2012017-06-22 12:24:12 -0700111 <locale>en</locale>
112 <locale>es</locale>
113 <locale>fr</locale>
114 <locale>de</locale>
Shane Farmer74cdea32017-05-12 16:22:36 -0700115 </locale-group>
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800116 <locale-group label="north-america" version-code-order="2">
Shane Farmer0a5b2012017-06-22 12:24:12 -0700117 <locale>en</locale>
118 <locale>es-rMX</locale>
119 <locale>fr-rCA</locale>
Shane Farmer74cdea32017-05-12 16:22:36 -0700120 </locale-group>
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800121 <locale-group label="all" version-code-order="-1">
122 <locale />
123 </locale-group>
Shane Farmer78c43d72017-12-04 09:08:38 -0800124 </locale-groups>
125 <android-sdks>
126 <android-sdk
127 label="v19"
128 minSdkVersion="19"
129 targetSdkVersion="24"
130 maxSdkVersion="25">
131 <manifest>
132 <!--- manifest additions here XSLT? TODO -->
133 </manifest>
134 </android-sdk>
135 </android-sdks>
136 <gl-texture-groups>
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800137 <gl-texture-group label="dxt1" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -0700138 <gl-texture name="GL_EXT_texture_compression_dxt1">
139 <texture-path>assets/dxt1/*</texture-path>
140 </gl-texture>
141 </gl-texture-group>
Shane Farmer78c43d72017-12-04 09:08:38 -0800142 </gl-texture-groups>
143 <device-feature-groups>
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800144 <device-feature-group label="low-latency" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -0700145 <supports-feature>android.hardware.audio.low_latency</supports-feature>
146 </device-feature-group>
Shane Farmer78c43d72017-12-04 09:08:38 -0800147 </device-feature-groups>
Shane Farmer74cdea32017-05-12 16:22:36 -0700148 <artifacts>
149 <artifact-format>
150 ${base}.${abi}.${screen-density}.${locale}.${sdk}.${gl}.${feature}.release
151 </artifact-format>
152 <artifact
153 name="art1"
154 abi-group="arm"
155 screen-density-group="large"
156 locale-group="europe"
Shane Farmer78c43d72017-12-04 09:08:38 -0800157 android-sdk="v19"
Shane Farmer74cdea32017-05-12 16:22:36 -0700158 gl-texture-group="dxt1"
159 device-feature-group="low-latency"/>
160 <artifact
161 name="art2"
162 abi-group="other"
163 screen-density-group="alldpi"
164 locale-group="north-america"
Shane Farmer78c43d72017-12-04 09:08:38 -0800165 android-sdk="v19"
Shane Farmer74cdea32017-05-12 16:22:36 -0700166 gl-texture-group="dxt1"
167 device-feature-group="low-latency"/>
168 </artifacts>
169</post-process>
170)";
171
172class ConfigurationParserTest : public ConfigurationParser, public ::testing::Test {
173 public:
Shane Farmer78c43d72017-12-04 09:08:38 -0800174 ConfigurationParserTest() : ConfigurationParser("", "config.xml") {
175 }
Shane Farmer74cdea32017-05-12 16:22:36 -0700176
177 protected:
178 StdErrDiagnostics diag_;
179};
180
Shane Farmerb1027272017-06-14 09:10:28 -0700181TEST_F(ConfigurationParserTest, ForPath_NoFile) {
182 auto result = ConfigurationParser::ForPath("./does_not_exist.xml");
183 EXPECT_FALSE(result);
184}
185
Shane Farmer78c43d72017-12-04 09:08:38 -0800186TEST_F(ConfigurationParserTest, ExtractConfiguration) {
187 Maybe<PostProcessingConfiguration> maybe_config =
188 ExtractConfiguration(kValidConfig, "dummy.xml", &diag_);
189
190 PostProcessingConfiguration config = maybe_config.value();
191
192 auto& arm = config.abi_groups["arm"];
193 auto& other = config.abi_groups["other"];
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800194 EXPECT_EQ(arm.order, 1);
195 EXPECT_EQ(other.order, 2);
Shane Farmer78c43d72017-12-04 09:08:38 -0800196
197 auto& large = config.screen_density_groups["large"];
198 auto& alldpi = config.screen_density_groups["alldpi"];
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800199 EXPECT_EQ(large.order, 2);
200 EXPECT_EQ(alldpi.order, 1);
Shane Farmer78c43d72017-12-04 09:08:38 -0800201
202 auto& north_america = config.locale_groups["north-america"];
203 auto& europe = config.locale_groups["europe"];
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800204 auto& all = config.locale_groups["all"];
Shane Farmer78c43d72017-12-04 09:08:38 -0800205 // Checked in reverse to make sure access order does not matter.
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800206 EXPECT_EQ(north_america.order, 2);
207 EXPECT_EQ(europe.order, 1);
208 EXPECT_EQ(all.order, -1);
209 EXPECT_EQ(3ul, config.locale_groups.size());
Shane Farmer78c43d72017-12-04 09:08:38 -0800210}
211
Shane Farmer74cdea32017-05-12 16:22:36 -0700212TEST_F(ConfigurationParserTest, ValidateFile) {
Shane Farmer78c43d72017-12-04 09:08:38 -0800213 auto parser = ConfigurationParser::ForContents(kValidConfig, "conf.xml").WithDiagnostics(&diag_);
Shane Farmercb6c3f92017-11-27 13:19:36 -0800214 auto result = parser.Parse("test.apk");
Shane Farmer74cdea32017-05-12 16:22:36 -0700215 ASSERT_TRUE(result);
Shane Farmercb6c3f92017-11-27 13:19:36 -0800216 const std::vector<OutputArtifact>& value = result.value();
217 EXPECT_THAT(value, SizeIs(2ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700218
Shane Farmercb6c3f92017-11-27 13:19:36 -0800219 const OutputArtifact& a1 = value[0];
220 EXPECT_EQ(a1.name, "art1.apk");
Shane Farmer78c43d72017-12-04 09:08:38 -0800221 EXPECT_EQ(a1.version, 1);
Shane Farmercb6c3f92017-11-27 13:19:36 -0800222 EXPECT_THAT(a1.abis, ElementsAre(Abi::kArmV7a, Abi::kArm64V8a));
223 EXPECT_THAT(a1.screen_densities,
224 ElementsAre(test::ParseConfigOrDie("xhdpi").CopyWithoutSdkVersion(),
225 test::ParseConfigOrDie("xxhdpi").CopyWithoutSdkVersion(),
226 test::ParseConfigOrDie("xxxhdpi").CopyWithoutSdkVersion()));
227 EXPECT_THAT(a1.locales, ElementsAre(test::ParseConfigOrDie("en"), test::ParseConfigOrDie("es"),
228 test::ParseConfigOrDie("fr"), test::ParseConfigOrDie("de")));
Shane Farmer78c43d72017-12-04 09:08:38 -0800229 ASSERT_TRUE(a1.android_sdk);
230 ASSERT_TRUE(a1.android_sdk.value().min_sdk_version);
231 EXPECT_EQ(a1.android_sdk.value().min_sdk_version, 19l);
Shane Farmercb6c3f92017-11-27 13:19:36 -0800232 EXPECT_THAT(a1.textures, SizeIs(1ul));
233 EXPECT_THAT(a1.features, SizeIs(1ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700234
Shane Farmercb6c3f92017-11-27 13:19:36 -0800235 const OutputArtifact& a2 = value[1];
236 EXPECT_EQ(a2.name, "art2.apk");
Shane Farmer78c43d72017-12-04 09:08:38 -0800237 EXPECT_EQ(a2.version, 2);
Shane Farmercb6c3f92017-11-27 13:19:36 -0800238 EXPECT_THAT(a2.abis, ElementsAre(Abi::kX86, Abi::kMips));
239 EXPECT_THAT(a2.screen_densities,
240 ElementsAre(test::ParseConfigOrDie("ldpi").CopyWithoutSdkVersion(),
241 test::ParseConfigOrDie("mdpi").CopyWithoutSdkVersion(),
242 test::ParseConfigOrDie("hdpi").CopyWithoutSdkVersion(),
243 test::ParseConfigOrDie("xhdpi").CopyWithoutSdkVersion(),
244 test::ParseConfigOrDie("xxhdpi").CopyWithoutSdkVersion(),
245 test::ParseConfigOrDie("xxxhdpi").CopyWithoutSdkVersion()));
246 EXPECT_THAT(a2.locales,
247 ElementsAre(test::ParseConfigOrDie("en"), test::ParseConfigOrDie("es-rMX"),
248 test::ParseConfigOrDie("fr-rCA")));
Shane Farmer78c43d72017-12-04 09:08:38 -0800249 ASSERT_TRUE(a2.android_sdk);
250 ASSERT_TRUE(a2.android_sdk.value().min_sdk_version);
251 EXPECT_EQ(a2.android_sdk.value().min_sdk_version, 19l);
Shane Farmercb6c3f92017-11-27 13:19:36 -0800252 EXPECT_THAT(a2.textures, SizeIs(1ul));
253 EXPECT_THAT(a2.features, SizeIs(1ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700254}
255
Shane Farmer78c43d72017-12-04 09:08:38 -0800256TEST_F(ConfigurationParserTest, ConfiguredArtifactOrdering) {
257 // Create a base builder with the configuration groups but no artifacts to allow it to be copied.
258 test::PostProcessingConfigurationBuilder base_builder = test::PostProcessingConfigurationBuilder()
259 .AddAbiGroup("arm")
260 .AddAbiGroup("arm64")
261 .AddAndroidSdk("v23", 23)
262 .AddAndroidSdk("v19", 19);
263
264 {
265 // Test version ordering.
266 ConfiguredArtifact v23;
267 v23.android_sdk = {"v23"};
268 ConfiguredArtifact v19;
269 v19.android_sdk = {"v19"};
270
271 test::PostProcessingConfigurationBuilder builder = base_builder;
272 PostProcessingConfiguration config = builder.AddArtifact(v23).AddArtifact(v19).Build();
273
274 config.SortArtifacts();
275 ASSERT_THAT(config.artifacts, SizeIs(2));
276 EXPECT_THAT(config.artifacts[0], Eq(v19));
277 EXPECT_THAT(config.artifacts[1], Eq(v23));
278 }
279
280 {
281 // Test ABI ordering.
282 ConfiguredArtifact arm;
283 arm.android_sdk = {"v19"};
284 arm.abi_group = {"arm"};
285 ConfiguredArtifact arm64;
286 arm64.android_sdk = {"v19"};
287 arm64.abi_group = {"arm64"};
288
289 test::PostProcessingConfigurationBuilder builder = base_builder;
290 PostProcessingConfiguration config = builder.AddArtifact(arm64).AddArtifact(arm).Build();
291
292 config.SortArtifacts();
293 ASSERT_THAT(config.artifacts, SizeIs(2));
294 EXPECT_THAT(config.artifacts[0], Eq(arm));
295 EXPECT_THAT(config.artifacts[1], Eq(arm64));
296 }
297
298 {
299 // Test Android SDK has precedence over ABI.
300 ConfiguredArtifact arm;
301 arm.android_sdk = {"v23"};
302 arm.abi_group = {"arm"};
303 ConfiguredArtifact arm64;
304 arm64.android_sdk = {"v19"};
305 arm64.abi_group = {"arm64"};
306
307 test::PostProcessingConfigurationBuilder builder = base_builder;
308 PostProcessingConfiguration config = builder.AddArtifact(arm64).AddArtifact(arm).Build();
309
310 config.SortArtifacts();
311 ASSERT_THAT(config.artifacts, SizeIs(2));
312 EXPECT_THAT(config.artifacts[0], Eq(arm64));
313 EXPECT_THAT(config.artifacts[1], Eq(arm));
314 }
315
316 {
317 // Test version is better than ABI.
318 ConfiguredArtifact arm;
319 arm.abi_group = {"arm"};
320 ConfiguredArtifact v19;
321 v19.android_sdk = {"v19"};
322
323 test::PostProcessingConfigurationBuilder builder = base_builder;
324 PostProcessingConfiguration config = builder.AddArtifact(v19).AddArtifact(arm).Build();
325
326 config.SortArtifacts();
327 ASSERT_THAT(config.artifacts, SizeIs(2));
328 EXPECT_THAT(config.artifacts[0], Eq(arm));
329 EXPECT_THAT(config.artifacts[1], Eq(v19));
330 }
331
332 {
333 // Test version is sorted higher than no version.
334 ConfiguredArtifact arm;
335 arm.abi_group = {"arm"};
336 ConfiguredArtifact v19;
337 v19.abi_group = {"arm"};
338 v19.android_sdk = {"v19"};
339
340 test::PostProcessingConfigurationBuilder builder = base_builder;
341 PostProcessingConfiguration config = builder.AddArtifact(v19).AddArtifact(arm).Build();
342
343 config.SortArtifacts();
344 ASSERT_THAT(config.artifacts, SizeIs(2));
345 EXPECT_THAT(config.artifacts[0], Eq(arm));
346 EXPECT_THAT(config.artifacts[1], Eq(v19));
347 }
348}
349
Shane Farmer74cdea32017-05-12 16:22:36 -0700350TEST_F(ConfigurationParserTest, InvalidNamespace) {
351 constexpr const char* invalid_ns = R"(<?xml version="1.0" encoding="utf-8" ?>
Shane Farmer78c43d72017-12-04 09:08:38 -0800352 <post-process xmlns="http://schemas.android.com/tools/another-unknown-tool" />)";
Shane Farmer74cdea32017-05-12 16:22:36 -0700353
Shane Farmer78c43d72017-12-04 09:08:38 -0800354 auto result = ConfigurationParser::ForContents(invalid_ns, "config.xml").Parse("test.apk");
Shane Farmer74cdea32017-05-12 16:22:36 -0700355 ASSERT_FALSE(result);
356}
357
358TEST_F(ConfigurationParserTest, ArtifactAction) {
Shane Farmer810fd182017-09-21 14:37:44 -0700359 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800360 const auto doc = test::BuildXmlDom(R"xml(
Shane Farmer810fd182017-09-21 14:37:44 -0700361 <artifact
362 abi-group="arm"
363 screen-density-group="large"
364 locale-group="europe"
Shane Farmer78c43d72017-12-04 09:08:38 -0800365 android-sdk="v19"
Shane Farmer810fd182017-09-21 14:37:44 -0700366 gl-texture-group="dxt1"
367 device-feature-group="low-latency"/>)xml");
368
Shane Farmer78c43d72017-12-04 09:08:38 -0800369 ASSERT_TRUE(ArtifactTagHandler(&config, NodeCast<Element>(doc->root.get()), &diag_));
Shane Farmer810fd182017-09-21 14:37:44 -0700370
Shane Farmer78c43d72017-12-04 09:08:38 -0800371 EXPECT_THAT(config.artifacts, SizeIs(1ul));
Shane Farmer810fd182017-09-21 14:37:44 -0700372
Shane Farmer78c43d72017-12-04 09:08:38 -0800373 auto& artifact = config.artifacts.back();
374 EXPECT_FALSE(artifact.name); // TODO: make this fail.
375 EXPECT_EQ("arm", artifact.abi_group.value());
376 EXPECT_EQ("large", artifact.screen_density_group.value());
377 EXPECT_EQ("europe", artifact.locale_group.value());
378 EXPECT_EQ("v19", artifact.android_sdk.value());
379 EXPECT_EQ("dxt1", artifact.gl_texture_group.value());
380 EXPECT_EQ("low-latency", artifact.device_feature_group.value());
Shane Farmer74cdea32017-05-12 16:22:36 -0700381}
382
383TEST_F(ConfigurationParserTest, ArtifactFormatAction) {
Shane Farmer810fd182017-09-21 14:37:44 -0700384 const auto doc = test::BuildXmlDom(R"xml(
Shane Farmer74cdea32017-05-12 16:22:36 -0700385 <artifact-format>
386 ${base}.${abi}.${screen-density}.${locale}.${sdk}.${gl}.${feature}.release
Shane Farmer810fd182017-09-21 14:37:44 -0700387 </artifact-format>)xml");
Shane Farmer74cdea32017-05-12 16:22:36 -0700388
Shane Farmer280be342017-06-21 15:20:15 -0700389 PostProcessingConfiguration config;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800390 bool ok = ArtifactFormatTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700391 ASSERT_TRUE(ok);
392 ASSERT_TRUE(config.artifact_format);
393 EXPECT_EQ(
394 "${base}.${abi}.${screen-density}.${locale}.${sdk}.${gl}.${feature}.release",
395 static_cast<std::string>(config.artifact_format.value())
396 );
397}
398
399TEST_F(ConfigurationParserTest, AbiGroupAction) {
400 static constexpr const char* xml = R"xml(
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800401 <abi-group label="arm" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -0700402 <!-- First comment. -->
403 <abi>
404 armeabi-v7a
405 </abi>
406 <!-- Another comment. -->
407 <abi>arm64-v8a</abi>
408 </abi-group>)xml";
409
410 auto doc = test::BuildXmlDom(xml);
411
Shane Farmer280be342017-06-21 15:20:15 -0700412 PostProcessingConfiguration config;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800413 bool ok = AbiGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700414 ASSERT_TRUE(ok);
415
Shane Farmercb6c3f92017-11-27 13:19:36 -0800416 EXPECT_THAT(config.abi_groups, SizeIs(1ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700417 ASSERT_EQ(1u, config.abi_groups.count("arm"));
418
Shane Farmer78c43d72017-12-04 09:08:38 -0800419 auto& out = config.abi_groups["arm"].entry;
Shane Farmer74cdea32017-05-12 16:22:36 -0700420 ASSERT_THAT(out, ElementsAre(Abi::kArmV7a, Abi::kArm64V8a));
421}
422
Shane Farmer39e474f2017-12-18 14:44:11 -0800423TEST_F(ConfigurationParserTest, AbiGroupAction_EmptyGroup) {
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800424 static constexpr const char* xml =
425 R"xml(<abi-group label="arm64-v8a" version-code-order="3"/>)xml";
Shane Farmer39e474f2017-12-18 14:44:11 -0800426
427 auto doc = test::BuildXmlDom(xml);
428
429 PostProcessingConfiguration config;
430 bool ok = AbiGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
431 ASSERT_TRUE(ok);
432
433 EXPECT_THAT(config.abi_groups, SizeIs(1ul));
434 ASSERT_EQ(1u, config.abi_groups.count("arm64-v8a"));
435
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800436 auto& out = config.abi_groups["arm64-v8a"];
437 ASSERT_THAT(out.entry, ElementsAre(Abi::kArm64V8a));
438 EXPECT_EQ(3, out.order);
439}
440
441TEST_F(ConfigurationParserTest, AbiGroupAction_EmptyGroup_NoOrder) {
442 static constexpr const char* xml = R"xml(<abi-group label="arm64-v8a"/>)xml";
443
444 auto doc = test::BuildXmlDom(xml);
445
446 PostProcessingConfiguration config;
447 bool ok = AbiGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
448 ASSERT_FALSE(ok);
Shane Farmer39e474f2017-12-18 14:44:11 -0800449}
450
451TEST_F(ConfigurationParserTest, AbiGroupAction_InvalidEmptyGroup) {
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800452 static constexpr const char* xml = R"xml(<abi-group label="arm" order="2"/>)xml";
Shane Farmer39e474f2017-12-18 14:44:11 -0800453
454 auto doc = test::BuildXmlDom(xml);
455
456 PostProcessingConfiguration config;
457 bool ok = AbiGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
458 ASSERT_FALSE(ok);
459}
460
Shane Farmer74cdea32017-05-12 16:22:36 -0700461TEST_F(ConfigurationParserTest, ScreenDensityGroupAction) {
462 static constexpr const char* xml = R"xml(
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800463 <screen-density-group label="large" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -0700464 <screen-density>xhdpi</screen-density>
465 <screen-density>
466 xxhdpi
467 </screen-density>
468 <screen-density>xxxhdpi</screen-density>
469 </screen-density-group>)xml";
470
471 auto doc = test::BuildXmlDom(xml);
472
Shane Farmer280be342017-06-21 15:20:15 -0700473 PostProcessingConfiguration config;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800474 bool ok = ScreenDensityGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700475 ASSERT_TRUE(ok);
476
Shane Farmercb6c3f92017-11-27 13:19:36 -0800477 EXPECT_THAT(config.screen_density_groups, SizeIs(1ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700478 ASSERT_EQ(1u, config.screen_density_groups.count("large"));
479
480 ConfigDescription xhdpi;
481 xhdpi.density = ResTable_config::DENSITY_XHIGH;
482 ConfigDescription xxhdpi;
483 xxhdpi.density = ResTable_config::DENSITY_XXHIGH;
484 ConfigDescription xxxhdpi;
485 xxxhdpi.density = ResTable_config::DENSITY_XXXHIGH;
486
Shane Farmer78c43d72017-12-04 09:08:38 -0800487 auto& out = config.screen_density_groups["large"].entry;
Shane Farmer74cdea32017-05-12 16:22:36 -0700488 ASSERT_THAT(out, ElementsAre(xhdpi, xxhdpi, xxxhdpi));
489}
490
Shane Farmer39e474f2017-12-18 14:44:11 -0800491TEST_F(ConfigurationParserTest, ScreenDensityGroupAction_EmtpyGroup) {
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800492 static constexpr const char* xml =
493 R"xml(<screen-density-group label="xhdpi" version-code-order="4"/>)xml";
Shane Farmer39e474f2017-12-18 14:44:11 -0800494
495 auto doc = test::BuildXmlDom(xml);
496
497 PostProcessingConfiguration config;
498 bool ok = ScreenDensityGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
499 ASSERT_TRUE(ok);
500
501 EXPECT_THAT(config.screen_density_groups, SizeIs(1ul));
502 ASSERT_EQ(1u, config.screen_density_groups.count("xhdpi"));
503
504 ConfigDescription xhdpi;
505 xhdpi.density = ResTable_config::DENSITY_XHIGH;
506
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800507 auto& out = config.screen_density_groups["xhdpi"];
508 EXPECT_THAT(out.entry, ElementsAre(xhdpi));
509 EXPECT_EQ(4, out.order);
510}
511
512TEST_F(ConfigurationParserTest, ScreenDensityGroupAction_EmtpyGroup_NoVersion) {
513 static constexpr const char* xml = R"xml(<screen-density-group label="xhdpi"/>)xml";
514
515 auto doc = test::BuildXmlDom(xml);
516
517 PostProcessingConfiguration config;
518 bool ok = ScreenDensityGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
519 ASSERT_FALSE(ok);
Shane Farmer39e474f2017-12-18 14:44:11 -0800520}
521
522TEST_F(ConfigurationParserTest, ScreenDensityGroupAction_InvalidEmtpyGroup) {
523 static constexpr const char* xml = R"xml(<screen-density-group label="really-big-screen"/>)xml";
524
525 auto doc = test::BuildXmlDom(xml);
526
527 PostProcessingConfiguration config;
528 bool ok = ScreenDensityGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
529 ASSERT_FALSE(ok);
530}
531
Shane Farmer74cdea32017-05-12 16:22:36 -0700532TEST_F(ConfigurationParserTest, LocaleGroupAction) {
533 static constexpr const char* xml = R"xml(
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800534 <locale-group label="europe" version-code-order="2">
Shane Farmer0a5b2012017-06-22 12:24:12 -0700535 <locale>en</locale>
536 <locale>es</locale>
537 <locale>fr</locale>
538 <locale>de</locale>
Shane Farmer74cdea32017-05-12 16:22:36 -0700539 </locale-group>)xml";
540
541 auto doc = test::BuildXmlDom(xml);
542
Shane Farmer280be342017-06-21 15:20:15 -0700543 PostProcessingConfiguration config;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800544 bool ok = LocaleGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700545 ASSERT_TRUE(ok);
546
547 ASSERT_EQ(1ul, config.locale_groups.size());
548 ASSERT_EQ(1u, config.locale_groups.count("europe"));
549
Shane Farmer78c43d72017-12-04 09:08:38 -0800550 const auto& out = config.locale_groups["europe"].entry;
Shane Farmer74cdea32017-05-12 16:22:36 -0700551
Shane Farmer0a5b2012017-06-22 12:24:12 -0700552 ConfigDescription en = test::ParseConfigOrDie("en");
553 ConfigDescription es = test::ParseConfigOrDie("es");
554 ConfigDescription fr = test::ParseConfigOrDie("fr");
555 ConfigDescription de = test::ParseConfigOrDie("de");
Shane Farmer74cdea32017-05-12 16:22:36 -0700556
557 ASSERT_THAT(out, ElementsAre(en, es, fr, de));
558}
559
Shane Farmer39e474f2017-12-18 14:44:11 -0800560TEST_F(ConfigurationParserTest, LocaleGroupAction_EmtpyGroup) {
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800561 static constexpr const char* xml = R"xml(<locale-group label="en" version-code-order="6"/>)xml";
Shane Farmer39e474f2017-12-18 14:44:11 -0800562
563 auto doc = test::BuildXmlDom(xml);
564
565 PostProcessingConfiguration config;
566 bool ok = LocaleGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
567 ASSERT_TRUE(ok);
568
569 ASSERT_EQ(1ul, config.locale_groups.size());
570 ASSERT_EQ(1u, config.locale_groups.count("en"));
571
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800572 const auto& out = config.locale_groups["en"];
Shane Farmer39e474f2017-12-18 14:44:11 -0800573
574 ConfigDescription en = test::ParseConfigOrDie("en");
575
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800576 EXPECT_THAT(out.entry, ElementsAre(en));
577 EXPECT_EQ(6, out.order);
578}
579
580TEST_F(ConfigurationParserTest, LocaleGroupAction_EmtpyGroup_NoOrder) {
581 static constexpr const char* xml = R"xml(<locale-group label="en"/>)xml";
582
583 auto doc = test::BuildXmlDom(xml);
584
585 PostProcessingConfiguration config;
586 bool ok = LocaleGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
587 ASSERT_FALSE(ok);
Shane Farmer39e474f2017-12-18 14:44:11 -0800588}
589
590TEST_F(ConfigurationParserTest, LocaleGroupAction_InvalidEmtpyGroup) {
591 static constexpr const char* xml = R"xml(<locale-group label="arm64"/>)xml";
592
593 auto doc = test::BuildXmlDom(xml);
594
595 PostProcessingConfiguration config;
596 bool ok = LocaleGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
597 ASSERT_FALSE(ok);
598}
599
Shane Farmer74cdea32017-05-12 16:22:36 -0700600TEST_F(ConfigurationParserTest, AndroidSdkGroupAction) {
601 static constexpr const char* xml = R"xml(
Shane Farmer78c43d72017-12-04 09:08:38 -0800602 <android-sdk label="v19"
Shane Farmer3edd4722017-09-01 14:34:22 -0700603 minSdkVersion="19"
604 targetSdkVersion="24"
605 maxSdkVersion="25">
Shane Farmer74cdea32017-05-12 16:22:36 -0700606 <manifest>
607 <!--- manifest additions here XSLT? TODO -->
608 </manifest>
Shane Farmer78c43d72017-12-04 09:08:38 -0800609 </android-sdk>)xml";
Shane Farmer74cdea32017-05-12 16:22:36 -0700610
611 auto doc = test::BuildXmlDom(xml);
612
Shane Farmer280be342017-06-21 15:20:15 -0700613 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800614 bool ok = AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700615 ASSERT_TRUE(ok);
616
Shane Farmer78c43d72017-12-04 09:08:38 -0800617 ASSERT_EQ(1ul, config.android_sdks.size());
618 ASSERT_EQ(1u, config.android_sdks.count("v19"));
Shane Farmer74cdea32017-05-12 16:22:36 -0700619
Shane Farmer78c43d72017-12-04 09:08:38 -0800620 auto& out = config.android_sdks["v19"];
Shane Farmer74cdea32017-05-12 16:22:36 -0700621
622 AndroidSdk sdk;
Shane Farmer3edd4722017-09-01 14:34:22 -0700623 sdk.min_sdk_version = 19;
624 sdk.target_sdk_version = 24;
625 sdk.max_sdk_version = 25;
Shane Farmer74cdea32017-05-12 16:22:36 -0700626 sdk.manifest = AndroidManifest();
627
Shane Farmerefe45392017-08-21 14:39:28 -0700628 ASSERT_EQ(sdk, out);
Shane Farmer74cdea32017-05-12 16:22:36 -0700629}
630
Shane Farmer67e8a302017-12-06 14:39:10 -0800631TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_SingleVersion) {
632 {
Shane Farmer78c43d72017-12-04 09:08:38 -0800633 const char* xml = "<android-sdk label='v19' minSdkVersion='19'></android-sdk>";
Shane Farmer67e8a302017-12-06 14:39:10 -0800634 auto doc = test::BuildXmlDom(xml);
635
636 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800637 bool ok = AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer67e8a302017-12-06 14:39:10 -0800638 ASSERT_TRUE(ok);
639
Shane Farmer78c43d72017-12-04 09:08:38 -0800640 ASSERT_EQ(1ul, config.android_sdks.size());
641 ASSERT_EQ(1u, config.android_sdks.count("v19"));
Shane Farmer67e8a302017-12-06 14:39:10 -0800642
Shane Farmer78c43d72017-12-04 09:08:38 -0800643 auto& out = config.android_sdks["v19"];
644 EXPECT_EQ(19, out.min_sdk_version);
Shane Farmer67e8a302017-12-06 14:39:10 -0800645 EXPECT_FALSE(out.max_sdk_version);
646 EXPECT_FALSE(out.target_sdk_version);
647 }
648
649 {
Shane Farmer78c43d72017-12-04 09:08:38 -0800650 const char* xml =
651 "<android-sdk label='v19' minSdkVersion='19' maxSdkVersion='19'></android-sdk>";
Shane Farmer67e8a302017-12-06 14:39:10 -0800652 auto doc = test::BuildXmlDom(xml);
653
654 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800655 bool ok = AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer67e8a302017-12-06 14:39:10 -0800656 ASSERT_TRUE(ok);
657
Shane Farmer78c43d72017-12-04 09:08:38 -0800658 ASSERT_EQ(1ul, config.android_sdks.size());
659 ASSERT_EQ(1u, config.android_sdks.count("v19"));
Shane Farmer67e8a302017-12-06 14:39:10 -0800660
Shane Farmer78c43d72017-12-04 09:08:38 -0800661 auto& out = config.android_sdks["v19"];
Shane Farmer67e8a302017-12-06 14:39:10 -0800662 EXPECT_EQ(19, out.max_sdk_version.value());
Shane Farmer78c43d72017-12-04 09:08:38 -0800663 EXPECT_EQ(19, out.min_sdk_version);
Shane Farmer67e8a302017-12-06 14:39:10 -0800664 EXPECT_FALSE(out.target_sdk_version);
665 }
666
667 {
Shane Farmer78c43d72017-12-04 09:08:38 -0800668 const char* xml =
669 "<android-sdk label='v19' minSdkVersion='19' targetSdkVersion='19'></android-sdk>";
Shane Farmer67e8a302017-12-06 14:39:10 -0800670 auto doc = test::BuildXmlDom(xml);
671
672 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800673 bool ok = AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer67e8a302017-12-06 14:39:10 -0800674 ASSERT_TRUE(ok);
675
Shane Farmer78c43d72017-12-04 09:08:38 -0800676 ASSERT_EQ(1ul, config.android_sdks.size());
677 ASSERT_EQ(1u, config.android_sdks.count("v19"));
Shane Farmer67e8a302017-12-06 14:39:10 -0800678
Shane Farmer78c43d72017-12-04 09:08:38 -0800679 auto& out = config.android_sdks["v19"];
Shane Farmer67e8a302017-12-06 14:39:10 -0800680 EXPECT_EQ(19, out.target_sdk_version.value());
Shane Farmer78c43d72017-12-04 09:08:38 -0800681 EXPECT_EQ(19, out.min_sdk_version);
Shane Farmer67e8a302017-12-06 14:39:10 -0800682 EXPECT_FALSE(out.max_sdk_version);
683 }
684}
685
686TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_InvalidVersion) {
Shane Farmer3edd4722017-09-01 14:34:22 -0700687 static constexpr const char* xml = R"xml(
Shane Farmer78c43d72017-12-04 09:08:38 -0800688 <android-sdk
689 label="v19"
690 minSdkVersion="v19"
691 targetSdkVersion="v24"
692 maxSdkVersion="v25">
693 <manifest>
694 <!--- manifest additions here XSLT? TODO -->
695 </manifest>
696 </android-sdk>)xml";
Shane Farmer3edd4722017-09-01 14:34:22 -0700697
698 auto doc = test::BuildXmlDom(xml);
699
700 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800701 bool ok = AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer67e8a302017-12-06 14:39:10 -0800702 ASSERT_FALSE(ok);
703}
704
705TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_NonNumeric) {
706 static constexpr const char* xml = R"xml(
Shane Farmer67e8a302017-12-06 14:39:10 -0800707 <android-sdk
Shane Farmer78c43d72017-12-04 09:08:38 -0800708 label="P"
Shane Farmer67e8a302017-12-06 14:39:10 -0800709 minSdkVersion="25"
710 targetSdkVersion="%s"
711 maxSdkVersion="%s">
Shane Farmer78c43d72017-12-04 09:08:38 -0800712 </android-sdk>)xml";
Shane Farmer67e8a302017-12-06 14:39:10 -0800713
714 const auto& dev_sdk = GetDevelopmentSdkCodeNameAndVersion();
715 const char* codename = dev_sdk.first.data();
716 const ApiVersion& version = dev_sdk.second;
717
718 auto doc = test::BuildXmlDom(StringPrintf(xml, codename, codename));
719
720 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800721 bool ok = AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer3edd4722017-09-01 14:34:22 -0700722 ASSERT_TRUE(ok);
723
Shane Farmer78c43d72017-12-04 09:08:38 -0800724 ASSERT_EQ(1ul, config.android_sdks.size());
725 ASSERT_EQ(1u, config.android_sdks.count("P"));
Shane Farmer3edd4722017-09-01 14:34:22 -0700726
Shane Farmer78c43d72017-12-04 09:08:38 -0800727 auto& out = config.android_sdks["P"];
Shane Farmer3edd4722017-09-01 14:34:22 -0700728
729 AndroidSdk sdk;
Shane Farmer67e8a302017-12-06 14:39:10 -0800730 sdk.min_sdk_version = 25;
731 sdk.target_sdk_version = version;
732 sdk.max_sdk_version = version;
Shane Farmer3edd4722017-09-01 14:34:22 -0700733
734 ASSERT_EQ(sdk, out);
735}
736
Shane Farmer74cdea32017-05-12 16:22:36 -0700737TEST_F(ConfigurationParserTest, GlTextureGroupAction) {
738 static constexpr const char* xml = R"xml(
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800739 <gl-texture-group label="dxt1" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -0700740 <gl-texture name="GL_EXT_texture_compression_dxt1">
741 <texture-path>assets/dxt1/main/*</texture-path>
742 <texture-path>
743 assets/dxt1/test/*
744 </texture-path>
745 </gl-texture>
746 </gl-texture-group>)xml";
747
748 auto doc = test::BuildXmlDom(xml);
749
Shane Farmer280be342017-06-21 15:20:15 -0700750 PostProcessingConfiguration config;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800751 bool ok = GlTextureGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700752 ASSERT_TRUE(ok);
753
Shane Farmercb6c3f92017-11-27 13:19:36 -0800754 EXPECT_THAT(config.gl_texture_groups, SizeIs(1ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700755 ASSERT_EQ(1u, config.gl_texture_groups.count("dxt1"));
756
Shane Farmer78c43d72017-12-04 09:08:38 -0800757 auto& out = config.gl_texture_groups["dxt1"].entry;
Shane Farmer74cdea32017-05-12 16:22:36 -0700758
759 GlTexture texture{
760 std::string("GL_EXT_texture_compression_dxt1"),
761 {"assets/dxt1/main/*", "assets/dxt1/test/*"}
762 };
763
764 ASSERT_EQ(1ul, out.size());
765 ASSERT_EQ(texture, out[0]);
766}
767
768TEST_F(ConfigurationParserTest, DeviceFeatureGroupAction) {
769 static constexpr const char* xml = R"xml(
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800770 <device-feature-group label="low-latency" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -0700771 <supports-feature>android.hardware.audio.low_latency</supports-feature>
772 <supports-feature>
773 android.hardware.audio.pro
774 </supports-feature>
775 </device-feature-group>)xml";
776
777 auto doc = test::BuildXmlDom(xml);
778
Shane Farmer280be342017-06-21 15:20:15 -0700779 PostProcessingConfiguration config;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800780 bool ok = DeviceFeatureGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700781 ASSERT_TRUE(ok);
782
Shane Farmercb6c3f92017-11-27 13:19:36 -0800783 EXPECT_THAT(config.device_feature_groups, SizeIs(1ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700784 ASSERT_EQ(1u, config.device_feature_groups.count("low-latency"));
785
Shane Farmer78c43d72017-12-04 09:08:38 -0800786 auto& out = config.device_feature_groups["low-latency"].entry;
Shane Farmer74cdea32017-05-12 16:22:36 -0700787
788 DeviceFeature low_latency = "android.hardware.audio.low_latency";
789 DeviceFeature pro = "android.hardware.audio.pro";
790 ASSERT_THAT(out, ElementsAre(low_latency, pro));
791}
792
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800793TEST_F(ConfigurationParserTest, Group_Valid) {
794 Group<int32_t> group;
795 group["item1"].order = 1;
796 group["item2"].order = 2;
797 group["item3"].order = 3;
798 group["item4"].order = 4;
799 group["item5"].order = 5;
800 group["item6"].order = 6;
801
802 EXPECT_TRUE(IsGroupValid(group, "test", &diag_));
803}
804
805TEST_F(ConfigurationParserTest, Group_OverlappingOrder) {
806 Group<int32_t> group;
807 group["item1"].order = 1;
808 group["item2"].order = 2;
809 group["item3"].order = 3;
810 group["item4"].order = 2;
811 group["item5"].order = 5;
812 group["item6"].order = 1;
813
814 EXPECT_FALSE(IsGroupValid(group, "test", &diag_));
815}
816
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700817// Artifact name parser test cases.
818
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700819TEST(ArtifactTest, Simple) {
820 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800821 ConfiguredArtifact x86;
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700822 x86.abi_group = {"x86"};
823
Shane Farmer9ecc0752017-08-24 15:55:36 -0700824 auto x86_result = x86.ToArtifactName("something.${abi}.apk", "", &diag);
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700825 ASSERT_TRUE(x86_result);
826 EXPECT_EQ(x86_result.value(), "something.x86.apk");
827
Shane Farmercb6c3f92017-11-27 13:19:36 -0800828 ConfiguredArtifact arm;
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700829 arm.abi_group = {"armeabi-v7a"};
830
Shane Farmer9ecc0752017-08-24 15:55:36 -0700831 {
832 auto arm_result = arm.ToArtifactName("app.${abi}.apk", "", &diag);
833 ASSERT_TRUE(arm_result);
834 EXPECT_EQ(arm_result.value(), "app.armeabi-v7a.apk");
835 }
836
837 {
838 auto arm_result = arm.ToArtifactName("app.${abi}.apk", "different_name.apk", &diag);
839 ASSERT_TRUE(arm_result);
840 EXPECT_EQ(arm_result.value(), "app.armeabi-v7a.apk");
841 }
842
843 {
844 auto arm_result = arm.ToArtifactName("${basename}.${abi}.apk", "app.apk", &diag);
845 ASSERT_TRUE(arm_result);
846 EXPECT_EQ(arm_result.value(), "app.armeabi-v7a.apk");
847 }
848
849 {
850 auto arm_result = arm.ToArtifactName("app.${abi}.${ext}", "app.apk", &diag);
851 ASSERT_TRUE(arm_result);
852 EXPECT_EQ(arm_result.value(), "app.armeabi-v7a.apk");
853 }
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700854}
855
856TEST(ArtifactTest, Complex) {
857 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800858 ConfiguredArtifact artifact;
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700859 artifact.abi_group = {"mips64"};
860 artifact.screen_density_group = {"ldpi"};
861 artifact.device_feature_group = {"df1"};
862 artifact.gl_texture_group = {"glx1"};
863 artifact.locale_group = {"en-AU"};
Shane Farmer78c43d72017-12-04 09:08:38 -0800864 artifact.android_sdk = {"v26"};
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700865
Shane Farmer9ecc0752017-08-24 15:55:36 -0700866 {
867 auto result = artifact.ToArtifactName(
Shane Farmerefe45392017-08-21 14:39:28 -0700868 "app.${density}_${locale}_${feature}_${gl}.${sdk}.${abi}.apk", "", &diag);
Shane Farmer9ecc0752017-08-24 15:55:36 -0700869 ASSERT_TRUE(result);
Shane Farmerefe45392017-08-21 14:39:28 -0700870 EXPECT_EQ(result.value(), "app.ldpi_en-AU_df1_glx1.v26.mips64.apk");
Shane Farmer9ecc0752017-08-24 15:55:36 -0700871 }
872
873 {
874 auto result = artifact.ToArtifactName(
Shane Farmerefe45392017-08-21 14:39:28 -0700875 "app.${density}_${locale}_${feature}_${gl}.${sdk}.${abi}.apk", "app.apk", &diag);
Shane Farmer9ecc0752017-08-24 15:55:36 -0700876 ASSERT_TRUE(result);
Shane Farmerefe45392017-08-21 14:39:28 -0700877 EXPECT_EQ(result.value(), "app.ldpi_en-AU_df1_glx1.v26.mips64.apk");
Shane Farmer9ecc0752017-08-24 15:55:36 -0700878 }
879
880 {
881 auto result = artifact.ToArtifactName(
Shane Farmerefe45392017-08-21 14:39:28 -0700882 "${basename}.${density}_${locale}_${feature}_${gl}.${sdk}.${abi}.apk", "app.apk", &diag);
Shane Farmer9ecc0752017-08-24 15:55:36 -0700883 ASSERT_TRUE(result);
Shane Farmerefe45392017-08-21 14:39:28 -0700884 EXPECT_EQ(result.value(), "app.ldpi_en-AU_df1_glx1.v26.mips64.apk");
Shane Farmer9ecc0752017-08-24 15:55:36 -0700885 }
886
887 {
888 auto result = artifact.ToArtifactName(
Shane Farmerefe45392017-08-21 14:39:28 -0700889 "app.${density}_${locale}_${feature}_${gl}.${sdk}.${abi}.${ext}", "app.apk", &diag);
Shane Farmer9ecc0752017-08-24 15:55:36 -0700890 ASSERT_TRUE(result);
Shane Farmerefe45392017-08-21 14:39:28 -0700891 EXPECT_EQ(result.value(), "app.ldpi_en-AU_df1_glx1.v26.mips64.apk");
Shane Farmer9ecc0752017-08-24 15:55:36 -0700892 }
893
894 {
895 auto result = artifact.ToArtifactName(
Shane Farmerefe45392017-08-21 14:39:28 -0700896 "${basename}.${density}_${locale}_${feature}_${gl}.${sdk}.${abi}", "app.apk", &diag);
Shane Farmer9ecc0752017-08-24 15:55:36 -0700897 ASSERT_TRUE(result);
Shane Farmerefe45392017-08-21 14:39:28 -0700898 EXPECT_EQ(result.value(), "app.ldpi_en-AU_df1_glx1.v26.mips64.apk");
Shane Farmer9ecc0752017-08-24 15:55:36 -0700899 }
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700900}
901
902TEST(ArtifactTest, Missing) {
903 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800904 ConfiguredArtifact x86;
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700905 x86.abi_group = {"x86"};
906
Shane Farmer9ecc0752017-08-24 15:55:36 -0700907 EXPECT_FALSE(x86.ToArtifactName("something.${density}.apk", "", &diag));
908 EXPECT_FALSE(x86.ToArtifactName("something.apk", "", &diag));
909 EXPECT_FALSE(x86.ToArtifactName("something.${density}.apk", "something.apk", &diag));
910 EXPECT_FALSE(x86.ToArtifactName("something.apk", "something.apk", &diag));
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700911}
912
913TEST(ArtifactTest, Empty) {
914 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800915 ConfiguredArtifact artifact;
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700916
Shane Farmer9ecc0752017-08-24 15:55:36 -0700917 EXPECT_FALSE(artifact.ToArtifactName("something.${density}.apk", "", &diag));
918 EXPECT_TRUE(artifact.ToArtifactName("something.apk", "", &diag));
919 EXPECT_FALSE(artifact.ToArtifactName("something.${density}.apk", "something.apk", &diag));
920 EXPECT_TRUE(artifact.ToArtifactName("something.apk", "something.apk", &diag));
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700921}
922
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700923TEST(ArtifactTest, Repeated) {
924 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800925 ConfiguredArtifact artifact;
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700926 artifact.screen_density_group = {"mdpi"};
927
Shane Farmer9ecc0752017-08-24 15:55:36 -0700928 ASSERT_TRUE(artifact.ToArtifactName("something.${density}.apk", "", &diag));
929 EXPECT_FALSE(artifact.ToArtifactName("something.${density}.${density}.apk", "", &diag));
930 ASSERT_TRUE(artifact.ToArtifactName("something.${density}.apk", "something.apk", &diag));
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700931}
932
933TEST(ArtifactTest, Nesting) {
934 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800935 ConfiguredArtifact x86;
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700936 x86.abi_group = {"x86"};
937
Shane Farmer9ecc0752017-08-24 15:55:36 -0700938 EXPECT_FALSE(x86.ToArtifactName("something.${abi${density}}.apk", "", &diag));
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700939
Shane Farmer9ecc0752017-08-24 15:55:36 -0700940 const Maybe<std::string>& name = x86.ToArtifactName("something.${abi${abi}}.apk", "", &diag);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700941 ASSERT_TRUE(name);
942 EXPECT_EQ(name.value(), "something.${abix86}.apk");
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700943}
944
945TEST(ArtifactTest, Recursive) {
946 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800947 ConfiguredArtifact artifact;
Shane Farmer0a5b2012017-06-22 12:24:12 -0700948 artifact.device_feature_group = {"${gl}"};
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700949 artifact.gl_texture_group = {"glx1"};
950
Shane Farmer9ecc0752017-08-24 15:55:36 -0700951 EXPECT_FALSE(artifact.ToArtifactName("app.${feature}.${gl}.apk", "", &diag));
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700952
953 artifact.device_feature_group = {"df1"};
Shane Farmer0a5b2012017-06-22 12:24:12 -0700954 artifact.gl_texture_group = {"${feature}"};
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700955 {
Shane Farmer9ecc0752017-08-24 15:55:36 -0700956 const auto& result = artifact.ToArtifactName("app.${feature}.${gl}.apk", "", &diag);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700957 ASSERT_TRUE(result);
958 EXPECT_EQ(result.value(), "app.df1.${feature}.apk");
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700959 }
960
961 // This is an invalid case, but should be the only possible case due to the ordering of
962 // replacement.
Shane Farmer0a5b2012017-06-22 12:24:12 -0700963 artifact.device_feature_group = {"${gl}"};
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700964 artifact.gl_texture_group = {"glx1"};
965 {
Shane Farmer9ecc0752017-08-24 15:55:36 -0700966 const auto& result = artifact.ToArtifactName("app.${feature}.apk", "", &diag);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700967 ASSERT_TRUE(result);
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700968 EXPECT_EQ(result.value(), "app.glx1.apk");
969 }
970}
971
Shane Farmer74cdea32017-05-12 16:22:36 -0700972} // namespace
Shane Farmercb6c3f92017-11-27 13:19:36 -0800973} // namespace handler
974} // namespace configuration
Shane Farmer74cdea32017-05-12 16:22:36 -0700975} // namespace aapt