blob: 2ef8b999a192c5dc92476650233763fbc7d9f86d [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
MÃ¥rten Kongstad24c9aa62018-06-20 08:46:41 +020029using ::android::ConfigDescription;
30
Shane Farmer74cdea32017-05-12 16:22:36 -070031namespace aapt {
Shane Farmer3edd4722017-09-01 14:34:22 -070032
33namespace configuration {
34void PrintTo(const AndroidSdk& sdk, std::ostream* os) {
Shane Farmer78c43d72017-12-04 09:08:38 -080035 *os << "SDK: min=" << sdk.min_sdk_version
Shane Farmer3edd4722017-09-01 14:34:22 -070036 << ", target=" << sdk.target_sdk_version.value_or_default(-1)
37 << ", max=" << sdk.max_sdk_version.value_or_default(-1);
38}
Shane Farmercb6c3f92017-11-27 13:19:36 -080039
Shane Farmer78c43d72017-12-04 09:08:38 -080040bool operator==(const ConfiguredArtifact& lhs, const ConfiguredArtifact& rhs) {
41 return lhs.name == rhs.name && lhs.abi_group == rhs.abi_group &&
42 lhs.screen_density_group == rhs.screen_density_group &&
43 lhs.locale_group == rhs.locale_group && lhs.android_sdk == rhs.android_sdk &&
44 lhs.device_feature_group == rhs.device_feature_group &&
45 lhs.gl_texture_group == rhs.gl_texture_group;
46}
47
48std::ostream& operator<<(std::ostream& out, const Maybe<std::string>& value) {
49 PrintTo(value, &out);
50 return out;
51}
52
53void PrintTo(const ConfiguredArtifact& artifact, std::ostream* os) {
54 *os << "\n{"
55 << "\n name: " << artifact.name << "\n sdk: " << artifact.android_sdk
56 << "\n abi: " << artifact.abi_group << "\n density: " << artifact.screen_density_group
57 << "\n locale: " << artifact.locale_group
58 << "\n features: " << artifact.device_feature_group
59 << "\n textures: " << artifact.gl_texture_group << "\n}\n";
60}
61
Shane Farmercb6c3f92017-11-27 13:19:36 -080062namespace handler {
Shane Farmer3edd4722017-09-01 14:34:22 -070063
Shane Farmer74cdea32017-05-12 16:22:36 -070064namespace {
65
Shane Farmer67e8a302017-12-06 14:39:10 -080066using ::aapt::configuration::Abi;
67using ::aapt::configuration::AndroidManifest;
68using ::aapt::configuration::AndroidSdk;
Shane Farmercb6c3f92017-11-27 13:19:36 -080069using ::aapt::configuration::ConfiguredArtifact;
Shane Farmer67e8a302017-12-06 14:39:10 -080070using ::aapt::configuration::DeviceFeature;
Shane Farmer78c43d72017-12-04 09:08:38 -080071using ::aapt::configuration::ExtractConfiguration;
Shane Farmer67e8a302017-12-06 14:39:10 -080072using ::aapt::configuration::GlTexture;
73using ::aapt::configuration::Locale;
74using ::aapt::configuration::PostProcessingConfiguration;
75using ::aapt::xml::Element;
76using ::aapt::xml::NodeCast;
Adam Lesinski6b372992017-08-09 10:54:23 -070077using ::android::ResTable_config;
Shane Farmer67e8a302017-12-06 14:39:10 -080078using ::android::base::StringPrintf;
Adam Lesinski6b372992017-08-09 10:54:23 -070079using ::testing::ElementsAre;
Shane Farmer78c43d72017-12-04 09:08:38 -080080using ::testing::Eq;
Shane Farmercb6c3f92017-11-27 13:19:36 -080081using ::testing::SizeIs;
Shane Farmer78c43d72017-12-04 09:08:38 -080082using ::testing::StrEq;
Shane Farmer74cdea32017-05-12 16:22:36 -070083
84constexpr const char* kValidConfig = R"(<?xml version="1.0" encoding="utf-8" ?>
85<post-process xmlns="http://schemas.android.com/tools/aapt">
Shane Farmer78c43d72017-12-04 09:08:38 -080086 <abi-groups>
Shane Farmer11cdc1c2018-01-31 16:43:24 -080087 <abi-group label="other" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -070088 <abi>x86</abi>
89 <abi>mips</abi>
90 </abi-group>
Shane Farmer11cdc1c2018-01-31 16:43:24 -080091 <abi-group label="arm" version-code-order="1">
92 <abi>armeabi-v7a</abi>
93 <abi>arm64-v8a</abi>
94 </abi-group>
Shane Farmer78c43d72017-12-04 09:08:38 -080095 </abi-groups>
96 <screen-density-groups>
Shane Farmer11cdc1c2018-01-31 16:43:24 -080097 <screen-density-group label="large" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -070098 <screen-density>xhdpi</screen-density>
99 <screen-density>xxhdpi</screen-density>
100 <screen-density>xxxhdpi</screen-density>
101 </screen-density-group>
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800102 <screen-density-group label="alldpi" version-code-order="1">
Shane Farmer74cdea32017-05-12 16:22:36 -0700103 <screen-density>ldpi</screen-density>
104 <screen-density>mdpi</screen-density>
105 <screen-density>hdpi</screen-density>
106 <screen-density>xhdpi</screen-density>
107 <screen-density>xxhdpi</screen-density>
108 <screen-density>xxxhdpi</screen-density>
109 </screen-density-group>
Shane Farmer78c43d72017-12-04 09:08:38 -0800110 </screen-density-groups>
111 <locale-groups>
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800112 <locale-group label="europe" version-code-order="1">
Shane Farmer0a5b2012017-06-22 12:24:12 -0700113 <locale>en</locale>
114 <locale>es</locale>
115 <locale>fr</locale>
116 <locale>de</locale>
Shane Farmer74cdea32017-05-12 16:22:36 -0700117 </locale-group>
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800118 <locale-group label="north-america" version-code-order="2">
Shane Farmer0a5b2012017-06-22 12:24:12 -0700119 <locale>en</locale>
120 <locale>es-rMX</locale>
121 <locale>fr-rCA</locale>
Shane Farmer74cdea32017-05-12 16:22:36 -0700122 </locale-group>
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800123 <locale-group label="all" version-code-order="-1">
124 <locale />
125 </locale-group>
Shane Farmer78c43d72017-12-04 09:08:38 -0800126 </locale-groups>
127 <android-sdks>
128 <android-sdk
129 label="v19"
130 minSdkVersion="19"
131 targetSdkVersion="24"
132 maxSdkVersion="25">
133 <manifest>
134 <!--- manifest additions here XSLT? TODO -->
135 </manifest>
136 </android-sdk>
137 </android-sdks>
138 <gl-texture-groups>
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800139 <gl-texture-group label="dxt1" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -0700140 <gl-texture name="GL_EXT_texture_compression_dxt1">
141 <texture-path>assets/dxt1/*</texture-path>
142 </gl-texture>
143 </gl-texture-group>
Shane Farmer78c43d72017-12-04 09:08:38 -0800144 </gl-texture-groups>
145 <device-feature-groups>
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800146 <device-feature-group label="low-latency" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -0700147 <supports-feature>android.hardware.audio.low_latency</supports-feature>
148 </device-feature-group>
Shane Farmer78c43d72017-12-04 09:08:38 -0800149 </device-feature-groups>
Shane Farmer74cdea32017-05-12 16:22:36 -0700150 <artifacts>
151 <artifact-format>
152 ${base}.${abi}.${screen-density}.${locale}.${sdk}.${gl}.${feature}.release
153 </artifact-format>
154 <artifact
155 name="art1"
156 abi-group="arm"
157 screen-density-group="large"
158 locale-group="europe"
Shane Farmer78c43d72017-12-04 09:08:38 -0800159 android-sdk="v19"
Shane Farmer74cdea32017-05-12 16:22:36 -0700160 gl-texture-group="dxt1"
161 device-feature-group="low-latency"/>
162 <artifact
163 name="art2"
164 abi-group="other"
165 screen-density-group="alldpi"
166 locale-group="north-america"
Shane Farmer78c43d72017-12-04 09:08:38 -0800167 android-sdk="v19"
Shane Farmer74cdea32017-05-12 16:22:36 -0700168 gl-texture-group="dxt1"
169 device-feature-group="low-latency"/>
170 </artifacts>
171</post-process>
172)";
173
174class ConfigurationParserTest : public ConfigurationParser, public ::testing::Test {
175 public:
Shane Farmer78c43d72017-12-04 09:08:38 -0800176 ConfigurationParserTest() : ConfigurationParser("", "config.xml") {
177 }
Shane Farmer74cdea32017-05-12 16:22:36 -0700178
179 protected:
180 StdErrDiagnostics diag_;
181};
182
Shane Farmerb1027272017-06-14 09:10:28 -0700183TEST_F(ConfigurationParserTest, ForPath_NoFile) {
184 auto result = ConfigurationParser::ForPath("./does_not_exist.xml");
185 EXPECT_FALSE(result);
186}
187
Shane Farmer78c43d72017-12-04 09:08:38 -0800188TEST_F(ConfigurationParserTest, ExtractConfiguration) {
189 Maybe<PostProcessingConfiguration> maybe_config =
190 ExtractConfiguration(kValidConfig, "dummy.xml", &diag_);
191
192 PostProcessingConfiguration config = maybe_config.value();
193
194 auto& arm = config.abi_groups["arm"];
195 auto& other = config.abi_groups["other"];
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800196 EXPECT_EQ(arm.order, 1);
197 EXPECT_EQ(other.order, 2);
Shane Farmer78c43d72017-12-04 09:08:38 -0800198
199 auto& large = config.screen_density_groups["large"];
200 auto& alldpi = config.screen_density_groups["alldpi"];
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800201 EXPECT_EQ(large.order, 2);
202 EXPECT_EQ(alldpi.order, 1);
Shane Farmer78c43d72017-12-04 09:08:38 -0800203
204 auto& north_america = config.locale_groups["north-america"];
205 auto& europe = config.locale_groups["europe"];
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800206 auto& all = config.locale_groups["all"];
Shane Farmer78c43d72017-12-04 09:08:38 -0800207 // Checked in reverse to make sure access order does not matter.
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800208 EXPECT_EQ(north_america.order, 2);
209 EXPECT_EQ(europe.order, 1);
210 EXPECT_EQ(all.order, -1);
211 EXPECT_EQ(3ul, config.locale_groups.size());
Shane Farmer78c43d72017-12-04 09:08:38 -0800212}
213
Shane Farmer74cdea32017-05-12 16:22:36 -0700214TEST_F(ConfigurationParserTest, ValidateFile) {
Shane Farmer78c43d72017-12-04 09:08:38 -0800215 auto parser = ConfigurationParser::ForContents(kValidConfig, "conf.xml").WithDiagnostics(&diag_);
Shane Farmercb6c3f92017-11-27 13:19:36 -0800216 auto result = parser.Parse("test.apk");
Shane Farmer74cdea32017-05-12 16:22:36 -0700217 ASSERT_TRUE(result);
Shane Farmercb6c3f92017-11-27 13:19:36 -0800218 const std::vector<OutputArtifact>& value = result.value();
219 EXPECT_THAT(value, SizeIs(2ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700220
Shane Farmercb6c3f92017-11-27 13:19:36 -0800221 const OutputArtifact& a1 = value[0];
222 EXPECT_EQ(a1.name, "art1.apk");
Shane Farmer78c43d72017-12-04 09:08:38 -0800223 EXPECT_EQ(a1.version, 1);
Shane Farmercb6c3f92017-11-27 13:19:36 -0800224 EXPECT_THAT(a1.abis, ElementsAre(Abi::kArmV7a, Abi::kArm64V8a));
225 EXPECT_THAT(a1.screen_densities,
226 ElementsAre(test::ParseConfigOrDie("xhdpi").CopyWithoutSdkVersion(),
227 test::ParseConfigOrDie("xxhdpi").CopyWithoutSdkVersion(),
228 test::ParseConfigOrDie("xxxhdpi").CopyWithoutSdkVersion()));
229 EXPECT_THAT(a1.locales, ElementsAre(test::ParseConfigOrDie("en"), test::ParseConfigOrDie("es"),
230 test::ParseConfigOrDie("fr"), test::ParseConfigOrDie("de")));
Shane Farmer78c43d72017-12-04 09:08:38 -0800231 ASSERT_TRUE(a1.android_sdk);
232 ASSERT_TRUE(a1.android_sdk.value().min_sdk_version);
Chih-Hung Hsieh054dab12018-12-10 13:52:46 -0800233 EXPECT_EQ(a1.android_sdk.value().min_sdk_version, 19L);
Shane Farmercb6c3f92017-11-27 13:19:36 -0800234 EXPECT_THAT(a1.textures, SizeIs(1ul));
235 EXPECT_THAT(a1.features, SizeIs(1ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700236
Shane Farmercb6c3f92017-11-27 13:19:36 -0800237 const OutputArtifact& a2 = value[1];
238 EXPECT_EQ(a2.name, "art2.apk");
Shane Farmer78c43d72017-12-04 09:08:38 -0800239 EXPECT_EQ(a2.version, 2);
Shane Farmercb6c3f92017-11-27 13:19:36 -0800240 EXPECT_THAT(a2.abis, ElementsAre(Abi::kX86, Abi::kMips));
241 EXPECT_THAT(a2.screen_densities,
242 ElementsAre(test::ParseConfigOrDie("ldpi").CopyWithoutSdkVersion(),
243 test::ParseConfigOrDie("mdpi").CopyWithoutSdkVersion(),
244 test::ParseConfigOrDie("hdpi").CopyWithoutSdkVersion(),
245 test::ParseConfigOrDie("xhdpi").CopyWithoutSdkVersion(),
246 test::ParseConfigOrDie("xxhdpi").CopyWithoutSdkVersion(),
247 test::ParseConfigOrDie("xxxhdpi").CopyWithoutSdkVersion()));
248 EXPECT_THAT(a2.locales,
249 ElementsAre(test::ParseConfigOrDie("en"), test::ParseConfigOrDie("es-rMX"),
250 test::ParseConfigOrDie("fr-rCA")));
Shane Farmer78c43d72017-12-04 09:08:38 -0800251 ASSERT_TRUE(a2.android_sdk);
252 ASSERT_TRUE(a2.android_sdk.value().min_sdk_version);
Chih-Hung Hsieh054dab12018-12-10 13:52:46 -0800253 EXPECT_EQ(a2.android_sdk.value().min_sdk_version, 19L);
Shane Farmercb6c3f92017-11-27 13:19:36 -0800254 EXPECT_THAT(a2.textures, SizeIs(1ul));
255 EXPECT_THAT(a2.features, SizeIs(1ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700256}
257
Shane Farmer78c43d72017-12-04 09:08:38 -0800258TEST_F(ConfigurationParserTest, ConfiguredArtifactOrdering) {
259 // Create a base builder with the configuration groups but no artifacts to allow it to be copied.
260 test::PostProcessingConfigurationBuilder base_builder = test::PostProcessingConfigurationBuilder()
261 .AddAbiGroup("arm")
262 .AddAbiGroup("arm64")
263 .AddAndroidSdk("v23", 23)
264 .AddAndroidSdk("v19", 19);
265
266 {
267 // Test version ordering.
268 ConfiguredArtifact v23;
269 v23.android_sdk = {"v23"};
270 ConfiguredArtifact v19;
271 v19.android_sdk = {"v19"};
272
273 test::PostProcessingConfigurationBuilder builder = base_builder;
274 PostProcessingConfiguration config = builder.AddArtifact(v23).AddArtifact(v19).Build();
275
276 config.SortArtifacts();
277 ASSERT_THAT(config.artifacts, SizeIs(2));
278 EXPECT_THAT(config.artifacts[0], Eq(v19));
279 EXPECT_THAT(config.artifacts[1], Eq(v23));
280 }
281
282 {
283 // Test ABI ordering.
284 ConfiguredArtifact arm;
285 arm.android_sdk = {"v19"};
286 arm.abi_group = {"arm"};
287 ConfiguredArtifact arm64;
288 arm64.android_sdk = {"v19"};
289 arm64.abi_group = {"arm64"};
290
291 test::PostProcessingConfigurationBuilder builder = base_builder;
292 PostProcessingConfiguration config = builder.AddArtifact(arm64).AddArtifact(arm).Build();
293
294 config.SortArtifacts();
295 ASSERT_THAT(config.artifacts, SizeIs(2));
296 EXPECT_THAT(config.artifacts[0], Eq(arm));
297 EXPECT_THAT(config.artifacts[1], Eq(arm64));
298 }
299
300 {
301 // Test Android SDK has precedence over ABI.
302 ConfiguredArtifact arm;
303 arm.android_sdk = {"v23"};
304 arm.abi_group = {"arm"};
305 ConfiguredArtifact arm64;
306 arm64.android_sdk = {"v19"};
307 arm64.abi_group = {"arm64"};
308
309 test::PostProcessingConfigurationBuilder builder = base_builder;
310 PostProcessingConfiguration config = builder.AddArtifact(arm64).AddArtifact(arm).Build();
311
312 config.SortArtifacts();
313 ASSERT_THAT(config.artifacts, SizeIs(2));
314 EXPECT_THAT(config.artifacts[0], Eq(arm64));
315 EXPECT_THAT(config.artifacts[1], Eq(arm));
316 }
317
318 {
319 // Test version is better than ABI.
320 ConfiguredArtifact arm;
321 arm.abi_group = {"arm"};
322 ConfiguredArtifact v19;
323 v19.android_sdk = {"v19"};
324
325 test::PostProcessingConfigurationBuilder builder = base_builder;
326 PostProcessingConfiguration config = builder.AddArtifact(v19).AddArtifact(arm).Build();
327
328 config.SortArtifacts();
329 ASSERT_THAT(config.artifacts, SizeIs(2));
330 EXPECT_THAT(config.artifacts[0], Eq(arm));
331 EXPECT_THAT(config.artifacts[1], Eq(v19));
332 }
333
334 {
335 // Test version is sorted higher than no version.
336 ConfiguredArtifact arm;
337 arm.abi_group = {"arm"};
338 ConfiguredArtifact v19;
339 v19.abi_group = {"arm"};
340 v19.android_sdk = {"v19"};
341
342 test::PostProcessingConfigurationBuilder builder = base_builder;
343 PostProcessingConfiguration config = builder.AddArtifact(v19).AddArtifact(arm).Build();
344
345 config.SortArtifacts();
346 ASSERT_THAT(config.artifacts, SizeIs(2));
347 EXPECT_THAT(config.artifacts[0], Eq(arm));
348 EXPECT_THAT(config.artifacts[1], Eq(v19));
349 }
350}
351
Shane Farmer74cdea32017-05-12 16:22:36 -0700352TEST_F(ConfigurationParserTest, InvalidNamespace) {
353 constexpr const char* invalid_ns = R"(<?xml version="1.0" encoding="utf-8" ?>
Shane Farmer78c43d72017-12-04 09:08:38 -0800354 <post-process xmlns="http://schemas.android.com/tools/another-unknown-tool" />)";
Shane Farmer74cdea32017-05-12 16:22:36 -0700355
Shane Farmer78c43d72017-12-04 09:08:38 -0800356 auto result = ConfigurationParser::ForContents(invalid_ns, "config.xml").Parse("test.apk");
Shane Farmer74cdea32017-05-12 16:22:36 -0700357 ASSERT_FALSE(result);
358}
359
360TEST_F(ConfigurationParserTest, ArtifactAction) {
Shane Farmer810fd182017-09-21 14:37:44 -0700361 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800362 const auto doc = test::BuildXmlDom(R"xml(
Shane Farmer810fd182017-09-21 14:37:44 -0700363 <artifact
364 abi-group="arm"
365 screen-density-group="large"
366 locale-group="europe"
Shane Farmer78c43d72017-12-04 09:08:38 -0800367 android-sdk="v19"
Shane Farmer810fd182017-09-21 14:37:44 -0700368 gl-texture-group="dxt1"
369 device-feature-group="low-latency"/>)xml");
370
Shane Farmer78c43d72017-12-04 09:08:38 -0800371 ASSERT_TRUE(ArtifactTagHandler(&config, NodeCast<Element>(doc->root.get()), &diag_));
Shane Farmer810fd182017-09-21 14:37:44 -0700372
Shane Farmer78c43d72017-12-04 09:08:38 -0800373 EXPECT_THAT(config.artifacts, SizeIs(1ul));
Shane Farmer810fd182017-09-21 14:37:44 -0700374
Shane Farmer78c43d72017-12-04 09:08:38 -0800375 auto& artifact = config.artifacts.back();
376 EXPECT_FALSE(artifact.name); // TODO: make this fail.
377 EXPECT_EQ("arm", artifact.abi_group.value());
378 EXPECT_EQ("large", artifact.screen_density_group.value());
379 EXPECT_EQ("europe", artifact.locale_group.value());
380 EXPECT_EQ("v19", artifact.android_sdk.value());
381 EXPECT_EQ("dxt1", artifact.gl_texture_group.value());
382 EXPECT_EQ("low-latency", artifact.device_feature_group.value());
Shane Farmer74cdea32017-05-12 16:22:36 -0700383}
384
385TEST_F(ConfigurationParserTest, ArtifactFormatAction) {
Shane Farmer810fd182017-09-21 14:37:44 -0700386 const auto doc = test::BuildXmlDom(R"xml(
Shane Farmer74cdea32017-05-12 16:22:36 -0700387 <artifact-format>
388 ${base}.${abi}.${screen-density}.${locale}.${sdk}.${gl}.${feature}.release
Shane Farmer810fd182017-09-21 14:37:44 -0700389 </artifact-format>)xml");
Shane Farmer74cdea32017-05-12 16:22:36 -0700390
Shane Farmer280be342017-06-21 15:20:15 -0700391 PostProcessingConfiguration config;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800392 bool ok = ArtifactFormatTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700393 ASSERT_TRUE(ok);
394 ASSERT_TRUE(config.artifact_format);
395 EXPECT_EQ(
396 "${base}.${abi}.${screen-density}.${locale}.${sdk}.${gl}.${feature}.release",
397 static_cast<std::string>(config.artifact_format.value())
398 );
399}
400
401TEST_F(ConfigurationParserTest, AbiGroupAction) {
402 static constexpr const char* xml = R"xml(
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800403 <abi-group label="arm" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -0700404 <!-- First comment. -->
405 <abi>
406 armeabi-v7a
407 </abi>
408 <!-- Another comment. -->
409 <abi>arm64-v8a</abi>
410 </abi-group>)xml";
411
412 auto doc = test::BuildXmlDom(xml);
413
Shane Farmer280be342017-06-21 15:20:15 -0700414 PostProcessingConfiguration config;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800415 bool ok = AbiGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700416 ASSERT_TRUE(ok);
417
Shane Farmercb6c3f92017-11-27 13:19:36 -0800418 EXPECT_THAT(config.abi_groups, SizeIs(1ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700419 ASSERT_EQ(1u, config.abi_groups.count("arm"));
420
Shane Farmer78c43d72017-12-04 09:08:38 -0800421 auto& out = config.abi_groups["arm"].entry;
Shane Farmer74cdea32017-05-12 16:22:36 -0700422 ASSERT_THAT(out, ElementsAre(Abi::kArmV7a, Abi::kArm64V8a));
423}
424
Shane Farmer39e474f2017-12-18 14:44:11 -0800425TEST_F(ConfigurationParserTest, AbiGroupAction_EmptyGroup) {
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800426 static constexpr const char* xml =
427 R"xml(<abi-group label="arm64-v8a" version-code-order="3"/>)xml";
Shane Farmer39e474f2017-12-18 14:44:11 -0800428
429 auto doc = test::BuildXmlDom(xml);
430
431 PostProcessingConfiguration config;
432 bool ok = AbiGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
433 ASSERT_TRUE(ok);
434
435 EXPECT_THAT(config.abi_groups, SizeIs(1ul));
436 ASSERT_EQ(1u, config.abi_groups.count("arm64-v8a"));
437
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800438 auto& out = config.abi_groups["arm64-v8a"];
439 ASSERT_THAT(out.entry, ElementsAre(Abi::kArm64V8a));
440 EXPECT_EQ(3, out.order);
441}
442
443TEST_F(ConfigurationParserTest, AbiGroupAction_EmptyGroup_NoOrder) {
444 static constexpr const char* xml = R"xml(<abi-group label="arm64-v8a"/>)xml";
445
446 auto doc = test::BuildXmlDom(xml);
447
448 PostProcessingConfiguration config;
449 bool ok = AbiGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
450 ASSERT_FALSE(ok);
Shane Farmer39e474f2017-12-18 14:44:11 -0800451}
452
453TEST_F(ConfigurationParserTest, AbiGroupAction_InvalidEmptyGroup) {
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800454 static constexpr const char* xml = R"xml(<abi-group label="arm" order="2"/>)xml";
Shane Farmer39e474f2017-12-18 14:44:11 -0800455
456 auto doc = test::BuildXmlDom(xml);
457
458 PostProcessingConfiguration config;
459 bool ok = AbiGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
460 ASSERT_FALSE(ok);
461}
462
Shane Farmer74cdea32017-05-12 16:22:36 -0700463TEST_F(ConfigurationParserTest, ScreenDensityGroupAction) {
464 static constexpr const char* xml = R"xml(
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800465 <screen-density-group label="large" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -0700466 <screen-density>xhdpi</screen-density>
467 <screen-density>
468 xxhdpi
469 </screen-density>
470 <screen-density>xxxhdpi</screen-density>
471 </screen-density-group>)xml";
472
473 auto doc = test::BuildXmlDom(xml);
474
Shane Farmer280be342017-06-21 15:20:15 -0700475 PostProcessingConfiguration config;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800476 bool ok = ScreenDensityGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700477 ASSERT_TRUE(ok);
478
Shane Farmercb6c3f92017-11-27 13:19:36 -0800479 EXPECT_THAT(config.screen_density_groups, SizeIs(1ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700480 ASSERT_EQ(1u, config.screen_density_groups.count("large"));
481
482 ConfigDescription xhdpi;
483 xhdpi.density = ResTable_config::DENSITY_XHIGH;
484 ConfigDescription xxhdpi;
485 xxhdpi.density = ResTable_config::DENSITY_XXHIGH;
486 ConfigDescription xxxhdpi;
487 xxxhdpi.density = ResTable_config::DENSITY_XXXHIGH;
488
Shane Farmer78c43d72017-12-04 09:08:38 -0800489 auto& out = config.screen_density_groups["large"].entry;
Shane Farmer74cdea32017-05-12 16:22:36 -0700490 ASSERT_THAT(out, ElementsAre(xhdpi, xxhdpi, xxxhdpi));
491}
492
Shane Farmer39e474f2017-12-18 14:44:11 -0800493TEST_F(ConfigurationParserTest, ScreenDensityGroupAction_EmtpyGroup) {
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800494 static constexpr const char* xml =
495 R"xml(<screen-density-group label="xhdpi" version-code-order="4"/>)xml";
Shane Farmer39e474f2017-12-18 14:44:11 -0800496
497 auto doc = test::BuildXmlDom(xml);
498
499 PostProcessingConfiguration config;
500 bool ok = ScreenDensityGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
501 ASSERT_TRUE(ok);
502
503 EXPECT_THAT(config.screen_density_groups, SizeIs(1ul));
504 ASSERT_EQ(1u, config.screen_density_groups.count("xhdpi"));
505
506 ConfigDescription xhdpi;
507 xhdpi.density = ResTable_config::DENSITY_XHIGH;
508
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800509 auto& out = config.screen_density_groups["xhdpi"];
510 EXPECT_THAT(out.entry, ElementsAre(xhdpi));
511 EXPECT_EQ(4, out.order);
512}
513
514TEST_F(ConfigurationParserTest, ScreenDensityGroupAction_EmtpyGroup_NoVersion) {
515 static constexpr const char* xml = R"xml(<screen-density-group label="xhdpi"/>)xml";
516
517 auto doc = test::BuildXmlDom(xml);
518
519 PostProcessingConfiguration config;
520 bool ok = ScreenDensityGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
521 ASSERT_FALSE(ok);
Shane Farmer39e474f2017-12-18 14:44:11 -0800522}
523
524TEST_F(ConfigurationParserTest, ScreenDensityGroupAction_InvalidEmtpyGroup) {
525 static constexpr const char* xml = R"xml(<screen-density-group label="really-big-screen"/>)xml";
526
527 auto doc = test::BuildXmlDom(xml);
528
529 PostProcessingConfiguration config;
530 bool ok = ScreenDensityGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
531 ASSERT_FALSE(ok);
532}
533
Shane Farmer74cdea32017-05-12 16:22:36 -0700534TEST_F(ConfigurationParserTest, LocaleGroupAction) {
535 static constexpr const char* xml = R"xml(
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800536 <locale-group label="europe" version-code-order="2">
Shane Farmer0a5b2012017-06-22 12:24:12 -0700537 <locale>en</locale>
538 <locale>es</locale>
539 <locale>fr</locale>
540 <locale>de</locale>
Shane Farmer74cdea32017-05-12 16:22:36 -0700541 </locale-group>)xml";
542
543 auto doc = test::BuildXmlDom(xml);
544
Shane Farmer280be342017-06-21 15:20:15 -0700545 PostProcessingConfiguration config;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800546 bool ok = LocaleGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700547 ASSERT_TRUE(ok);
548
549 ASSERT_EQ(1ul, config.locale_groups.size());
550 ASSERT_EQ(1u, config.locale_groups.count("europe"));
551
Shane Farmer78c43d72017-12-04 09:08:38 -0800552 const auto& out = config.locale_groups["europe"].entry;
Shane Farmer74cdea32017-05-12 16:22:36 -0700553
Shane Farmer0a5b2012017-06-22 12:24:12 -0700554 ConfigDescription en = test::ParseConfigOrDie("en");
555 ConfigDescription es = test::ParseConfigOrDie("es");
556 ConfigDescription fr = test::ParseConfigOrDie("fr");
557 ConfigDescription de = test::ParseConfigOrDie("de");
Shane Farmer74cdea32017-05-12 16:22:36 -0700558
559 ASSERT_THAT(out, ElementsAre(en, es, fr, de));
560}
561
Shane Farmer39e474f2017-12-18 14:44:11 -0800562TEST_F(ConfigurationParserTest, LocaleGroupAction_EmtpyGroup) {
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800563 static constexpr const char* xml = R"xml(<locale-group label="en" version-code-order="6"/>)xml";
Shane Farmer39e474f2017-12-18 14:44:11 -0800564
565 auto doc = test::BuildXmlDom(xml);
566
567 PostProcessingConfiguration config;
568 bool ok = LocaleGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
569 ASSERT_TRUE(ok);
570
571 ASSERT_EQ(1ul, config.locale_groups.size());
572 ASSERT_EQ(1u, config.locale_groups.count("en"));
573
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800574 const auto& out = config.locale_groups["en"];
Shane Farmer39e474f2017-12-18 14:44:11 -0800575
576 ConfigDescription en = test::ParseConfigOrDie("en");
577
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800578 EXPECT_THAT(out.entry, ElementsAre(en));
579 EXPECT_EQ(6, out.order);
580}
581
582TEST_F(ConfigurationParserTest, LocaleGroupAction_EmtpyGroup_NoOrder) {
583 static constexpr const char* xml = R"xml(<locale-group label="en"/>)xml";
584
585 auto doc = test::BuildXmlDom(xml);
586
587 PostProcessingConfiguration config;
588 bool ok = LocaleGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
589 ASSERT_FALSE(ok);
Shane Farmer39e474f2017-12-18 14:44:11 -0800590}
591
592TEST_F(ConfigurationParserTest, LocaleGroupAction_InvalidEmtpyGroup) {
593 static constexpr const char* xml = R"xml(<locale-group label="arm64"/>)xml";
594
595 auto doc = test::BuildXmlDom(xml);
596
597 PostProcessingConfiguration config;
598 bool ok = LocaleGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
599 ASSERT_FALSE(ok);
600}
601
Shane Farmer74cdea32017-05-12 16:22:36 -0700602TEST_F(ConfigurationParserTest, AndroidSdkGroupAction) {
603 static constexpr const char* xml = R"xml(
Shane Farmer78c43d72017-12-04 09:08:38 -0800604 <android-sdk label="v19"
Shane Farmer3edd4722017-09-01 14:34:22 -0700605 minSdkVersion="19"
606 targetSdkVersion="24"
607 maxSdkVersion="25">
Shane Farmer74cdea32017-05-12 16:22:36 -0700608 <manifest>
609 <!--- manifest additions here XSLT? TODO -->
610 </manifest>
Shane Farmer78c43d72017-12-04 09:08:38 -0800611 </android-sdk>)xml";
Shane Farmer74cdea32017-05-12 16:22:36 -0700612
613 auto doc = test::BuildXmlDom(xml);
614
Shane Farmer280be342017-06-21 15:20:15 -0700615 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800616 bool ok = AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700617 ASSERT_TRUE(ok);
618
Shane Farmer78c43d72017-12-04 09:08:38 -0800619 ASSERT_EQ(1ul, config.android_sdks.size());
620 ASSERT_EQ(1u, config.android_sdks.count("v19"));
Shane Farmer74cdea32017-05-12 16:22:36 -0700621
Shane Farmer78c43d72017-12-04 09:08:38 -0800622 auto& out = config.android_sdks["v19"];
Shane Farmer74cdea32017-05-12 16:22:36 -0700623
624 AndroidSdk sdk;
Shane Farmer3edd4722017-09-01 14:34:22 -0700625 sdk.min_sdk_version = 19;
626 sdk.target_sdk_version = 24;
627 sdk.max_sdk_version = 25;
Shane Farmer74cdea32017-05-12 16:22:36 -0700628 sdk.manifest = AndroidManifest();
629
Shane Farmerefe45392017-08-21 14:39:28 -0700630 ASSERT_EQ(sdk, out);
Shane Farmer74cdea32017-05-12 16:22:36 -0700631}
632
Shane Farmer67e8a302017-12-06 14:39:10 -0800633TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_SingleVersion) {
634 {
Shane Farmer78c43d72017-12-04 09:08:38 -0800635 const char* xml = "<android-sdk label='v19' minSdkVersion='19'></android-sdk>";
Shane Farmer67e8a302017-12-06 14:39:10 -0800636 auto doc = test::BuildXmlDom(xml);
637
638 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800639 bool ok = AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer67e8a302017-12-06 14:39:10 -0800640 ASSERT_TRUE(ok);
641
Shane Farmer78c43d72017-12-04 09:08:38 -0800642 ASSERT_EQ(1ul, config.android_sdks.size());
643 ASSERT_EQ(1u, config.android_sdks.count("v19"));
Shane Farmer67e8a302017-12-06 14:39:10 -0800644
Shane Farmer78c43d72017-12-04 09:08:38 -0800645 auto& out = config.android_sdks["v19"];
646 EXPECT_EQ(19, out.min_sdk_version);
Shane Farmer67e8a302017-12-06 14:39:10 -0800647 EXPECT_FALSE(out.max_sdk_version);
648 EXPECT_FALSE(out.target_sdk_version);
649 }
650
651 {
Shane Farmer78c43d72017-12-04 09:08:38 -0800652 const char* xml =
653 "<android-sdk label='v19' minSdkVersion='19' maxSdkVersion='19'></android-sdk>";
Shane Farmer67e8a302017-12-06 14:39:10 -0800654 auto doc = test::BuildXmlDom(xml);
655
656 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800657 bool ok = AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer67e8a302017-12-06 14:39:10 -0800658 ASSERT_TRUE(ok);
659
Shane Farmer78c43d72017-12-04 09:08:38 -0800660 ASSERT_EQ(1ul, config.android_sdks.size());
661 ASSERT_EQ(1u, config.android_sdks.count("v19"));
Shane Farmer67e8a302017-12-06 14:39:10 -0800662
Shane Farmer78c43d72017-12-04 09:08:38 -0800663 auto& out = config.android_sdks["v19"];
Shane Farmer67e8a302017-12-06 14:39:10 -0800664 EXPECT_EQ(19, out.max_sdk_version.value());
Shane Farmer78c43d72017-12-04 09:08:38 -0800665 EXPECT_EQ(19, out.min_sdk_version);
Shane Farmer67e8a302017-12-06 14:39:10 -0800666 EXPECT_FALSE(out.target_sdk_version);
667 }
668
669 {
Shane Farmer78c43d72017-12-04 09:08:38 -0800670 const char* xml =
671 "<android-sdk label='v19' minSdkVersion='19' targetSdkVersion='19'></android-sdk>";
Shane Farmer67e8a302017-12-06 14:39:10 -0800672 auto doc = test::BuildXmlDom(xml);
673
674 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800675 bool ok = AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer67e8a302017-12-06 14:39:10 -0800676 ASSERT_TRUE(ok);
677
Shane Farmer78c43d72017-12-04 09:08:38 -0800678 ASSERT_EQ(1ul, config.android_sdks.size());
679 ASSERT_EQ(1u, config.android_sdks.count("v19"));
Shane Farmer67e8a302017-12-06 14:39:10 -0800680
Shane Farmer78c43d72017-12-04 09:08:38 -0800681 auto& out = config.android_sdks["v19"];
Shane Farmer67e8a302017-12-06 14:39:10 -0800682 EXPECT_EQ(19, out.target_sdk_version.value());
Shane Farmer78c43d72017-12-04 09:08:38 -0800683 EXPECT_EQ(19, out.min_sdk_version);
Shane Farmer67e8a302017-12-06 14:39:10 -0800684 EXPECT_FALSE(out.max_sdk_version);
685 }
686}
687
688TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_InvalidVersion) {
Shane Farmer3edd4722017-09-01 14:34:22 -0700689 static constexpr const char* xml = R"xml(
Shane Farmer78c43d72017-12-04 09:08:38 -0800690 <android-sdk
691 label="v19"
692 minSdkVersion="v19"
693 targetSdkVersion="v24"
694 maxSdkVersion="v25">
695 <manifest>
696 <!--- manifest additions here XSLT? TODO -->
697 </manifest>
698 </android-sdk>)xml";
Shane Farmer3edd4722017-09-01 14:34:22 -0700699
700 auto doc = test::BuildXmlDom(xml);
701
702 PostProcessingConfiguration config;
Shane Farmer78c43d72017-12-04 09:08:38 -0800703 bool ok = AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer67e8a302017-12-06 14:39:10 -0800704 ASSERT_FALSE(ok);
705}
706
707TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_NonNumeric) {
Ryan Mitchelleb9c9ac2018-08-09 09:18:26 -0700708 auto doc = test::BuildXmlDom(R"xml(
Shane Farmer67e8a302017-12-06 14:39:10 -0800709 <android-sdk
Ryan Mitchelleb9c9ac2018-08-09 09:18:26 -0700710 label="Q"
Shane Farmer67e8a302017-12-06 14:39:10 -0800711 minSdkVersion="25"
Ryan Mitchelleb9c9ac2018-08-09 09:18:26 -0700712 targetSdkVersion="Q"
713 maxSdkVersion="Q">
714 </android-sdk>)xml");
Shane Farmer67e8a302017-12-06 14:39:10 -0800715
716 PostProcessingConfiguration config;
Ryan Mitchelleb9c9ac2018-08-09 09:18:26 -0700717 ASSERT_TRUE(AndroidSdkTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_));
Shane Farmer78c43d72017-12-04 09:08:38 -0800718 ASSERT_EQ(1ul, config.android_sdks.size());
Ryan Mitchelleb9c9ac2018-08-09 09:18:26 -0700719 ASSERT_EQ(1u, config.android_sdks.count("Q"));
Shane Farmer3edd4722017-09-01 14:34:22 -0700720
721 AndroidSdk sdk;
Shane Farmer67e8a302017-12-06 14:39:10 -0800722 sdk.min_sdk_version = 25;
Ryan Mitchelleb9c9ac2018-08-09 09:18:26 -0700723 sdk.target_sdk_version = 10000;
724 sdk.max_sdk_version = 10000;
725 ASSERT_EQ(sdk, config.android_sdks["Q"]);
Shane Farmer3edd4722017-09-01 14:34:22 -0700726}
727
Shane Farmer74cdea32017-05-12 16:22:36 -0700728TEST_F(ConfigurationParserTest, GlTextureGroupAction) {
729 static constexpr const char* xml = R"xml(
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800730 <gl-texture-group label="dxt1" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -0700731 <gl-texture name="GL_EXT_texture_compression_dxt1">
732 <texture-path>assets/dxt1/main/*</texture-path>
733 <texture-path>
734 assets/dxt1/test/*
735 </texture-path>
736 </gl-texture>
737 </gl-texture-group>)xml";
738
739 auto doc = test::BuildXmlDom(xml);
740
Shane Farmer280be342017-06-21 15:20:15 -0700741 PostProcessingConfiguration config;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800742 bool ok = GlTextureGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700743 ASSERT_TRUE(ok);
744
Shane Farmercb6c3f92017-11-27 13:19:36 -0800745 EXPECT_THAT(config.gl_texture_groups, SizeIs(1ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700746 ASSERT_EQ(1u, config.gl_texture_groups.count("dxt1"));
747
Shane Farmer78c43d72017-12-04 09:08:38 -0800748 auto& out = config.gl_texture_groups["dxt1"].entry;
Shane Farmer74cdea32017-05-12 16:22:36 -0700749
750 GlTexture texture{
751 std::string("GL_EXT_texture_compression_dxt1"),
752 {"assets/dxt1/main/*", "assets/dxt1/test/*"}
753 };
754
755 ASSERT_EQ(1ul, out.size());
756 ASSERT_EQ(texture, out[0]);
757}
758
759TEST_F(ConfigurationParserTest, DeviceFeatureGroupAction) {
760 static constexpr const char* xml = R"xml(
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800761 <device-feature-group label="low-latency" version-code-order="2">
Shane Farmer74cdea32017-05-12 16:22:36 -0700762 <supports-feature>android.hardware.audio.low_latency</supports-feature>
763 <supports-feature>
764 android.hardware.audio.pro
765 </supports-feature>
766 </device-feature-group>)xml";
767
768 auto doc = test::BuildXmlDom(xml);
769
Shane Farmer280be342017-06-21 15:20:15 -0700770 PostProcessingConfiguration config;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800771 bool ok = DeviceFeatureGroupTagHandler(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
Shane Farmer74cdea32017-05-12 16:22:36 -0700772 ASSERT_TRUE(ok);
773
Shane Farmercb6c3f92017-11-27 13:19:36 -0800774 EXPECT_THAT(config.device_feature_groups, SizeIs(1ul));
Shane Farmer74cdea32017-05-12 16:22:36 -0700775 ASSERT_EQ(1u, config.device_feature_groups.count("low-latency"));
776
Shane Farmer78c43d72017-12-04 09:08:38 -0800777 auto& out = config.device_feature_groups["low-latency"].entry;
Shane Farmer74cdea32017-05-12 16:22:36 -0700778
779 DeviceFeature low_latency = "android.hardware.audio.low_latency";
780 DeviceFeature pro = "android.hardware.audio.pro";
781 ASSERT_THAT(out, ElementsAre(low_latency, pro));
782}
783
Shane Farmer11cdc1c2018-01-31 16:43:24 -0800784TEST_F(ConfigurationParserTest, Group_Valid) {
785 Group<int32_t> group;
786 group["item1"].order = 1;
787 group["item2"].order = 2;
788 group["item3"].order = 3;
789 group["item4"].order = 4;
790 group["item5"].order = 5;
791 group["item6"].order = 6;
792
793 EXPECT_TRUE(IsGroupValid(group, "test", &diag_));
794}
795
796TEST_F(ConfigurationParserTest, Group_OverlappingOrder) {
797 Group<int32_t> group;
798 group["item1"].order = 1;
799 group["item2"].order = 2;
800 group["item3"].order = 3;
801 group["item4"].order = 2;
802 group["item5"].order = 5;
803 group["item6"].order = 1;
804
805 EXPECT_FALSE(IsGroupValid(group, "test", &diag_));
806}
807
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700808// Artifact name parser test cases.
809
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700810TEST(ArtifactTest, Simple) {
811 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800812 ConfiguredArtifact x86;
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700813 x86.abi_group = {"x86"};
814
Shane Farmer9ecc0752017-08-24 15:55:36 -0700815 auto x86_result = x86.ToArtifactName("something.${abi}.apk", "", &diag);
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700816 ASSERT_TRUE(x86_result);
817 EXPECT_EQ(x86_result.value(), "something.x86.apk");
818
Shane Farmercb6c3f92017-11-27 13:19:36 -0800819 ConfiguredArtifact arm;
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700820 arm.abi_group = {"armeabi-v7a"};
821
Shane Farmer9ecc0752017-08-24 15:55:36 -0700822 {
823 auto arm_result = arm.ToArtifactName("app.${abi}.apk", "", &diag);
824 ASSERT_TRUE(arm_result);
825 EXPECT_EQ(arm_result.value(), "app.armeabi-v7a.apk");
826 }
827
828 {
829 auto arm_result = arm.ToArtifactName("app.${abi}.apk", "different_name.apk", &diag);
830 ASSERT_TRUE(arm_result);
831 EXPECT_EQ(arm_result.value(), "app.armeabi-v7a.apk");
832 }
833
834 {
835 auto arm_result = arm.ToArtifactName("${basename}.${abi}.apk", "app.apk", &diag);
836 ASSERT_TRUE(arm_result);
837 EXPECT_EQ(arm_result.value(), "app.armeabi-v7a.apk");
838 }
839
840 {
841 auto arm_result = arm.ToArtifactName("app.${abi}.${ext}", "app.apk", &diag);
842 ASSERT_TRUE(arm_result);
843 EXPECT_EQ(arm_result.value(), "app.armeabi-v7a.apk");
844 }
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700845}
846
847TEST(ArtifactTest, Complex) {
848 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800849 ConfiguredArtifact artifact;
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700850 artifact.abi_group = {"mips64"};
851 artifact.screen_density_group = {"ldpi"};
852 artifact.device_feature_group = {"df1"};
853 artifact.gl_texture_group = {"glx1"};
854 artifact.locale_group = {"en-AU"};
Shane Farmer78c43d72017-12-04 09:08:38 -0800855 artifact.android_sdk = {"v26"};
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700856
Shane Farmer9ecc0752017-08-24 15:55:36 -0700857 {
858 auto result = artifact.ToArtifactName(
Shane Farmerefe45392017-08-21 14:39:28 -0700859 "app.${density}_${locale}_${feature}_${gl}.${sdk}.${abi}.apk", "", &diag);
Shane Farmer9ecc0752017-08-24 15:55:36 -0700860 ASSERT_TRUE(result);
Shane Farmerefe45392017-08-21 14:39:28 -0700861 EXPECT_EQ(result.value(), "app.ldpi_en-AU_df1_glx1.v26.mips64.apk");
Shane Farmer9ecc0752017-08-24 15:55:36 -0700862 }
863
864 {
865 auto result = artifact.ToArtifactName(
Shane Farmerefe45392017-08-21 14:39:28 -0700866 "app.${density}_${locale}_${feature}_${gl}.${sdk}.${abi}.apk", "app.apk", &diag);
Shane Farmer9ecc0752017-08-24 15:55:36 -0700867 ASSERT_TRUE(result);
Shane Farmerefe45392017-08-21 14:39:28 -0700868 EXPECT_EQ(result.value(), "app.ldpi_en-AU_df1_glx1.v26.mips64.apk");
Shane Farmer9ecc0752017-08-24 15:55:36 -0700869 }
870
871 {
872 auto result = artifact.ToArtifactName(
Shane Farmerefe45392017-08-21 14:39:28 -0700873 "${basename}.${density}_${locale}_${feature}_${gl}.${sdk}.${abi}.apk", "app.apk", &diag);
Shane Farmer9ecc0752017-08-24 15:55:36 -0700874 ASSERT_TRUE(result);
Shane Farmerefe45392017-08-21 14:39:28 -0700875 EXPECT_EQ(result.value(), "app.ldpi_en-AU_df1_glx1.v26.mips64.apk");
Shane Farmer9ecc0752017-08-24 15:55:36 -0700876 }
877
878 {
879 auto result = artifact.ToArtifactName(
Shane Farmerefe45392017-08-21 14:39:28 -0700880 "app.${density}_${locale}_${feature}_${gl}.${sdk}.${abi}.${ext}", "app.apk", &diag);
Shane Farmer9ecc0752017-08-24 15:55:36 -0700881 ASSERT_TRUE(result);
Shane Farmerefe45392017-08-21 14:39:28 -0700882 EXPECT_EQ(result.value(), "app.ldpi_en-AU_df1_glx1.v26.mips64.apk");
Shane Farmer9ecc0752017-08-24 15:55:36 -0700883 }
884
885 {
886 auto result = artifact.ToArtifactName(
Shane Farmerefe45392017-08-21 14:39:28 -0700887 "${basename}.${density}_${locale}_${feature}_${gl}.${sdk}.${abi}", "app.apk", &diag);
Shane Farmer9ecc0752017-08-24 15:55:36 -0700888 ASSERT_TRUE(result);
Shane Farmerefe45392017-08-21 14:39:28 -0700889 EXPECT_EQ(result.value(), "app.ldpi_en-AU_df1_glx1.v26.mips64.apk");
Shane Farmer9ecc0752017-08-24 15:55:36 -0700890 }
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700891}
892
893TEST(ArtifactTest, Missing) {
894 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800895 ConfiguredArtifact x86;
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700896 x86.abi_group = {"x86"};
897
Shane Farmer9ecc0752017-08-24 15:55:36 -0700898 EXPECT_FALSE(x86.ToArtifactName("something.${density}.apk", "", &diag));
899 EXPECT_FALSE(x86.ToArtifactName("something.apk", "", &diag));
900 EXPECT_FALSE(x86.ToArtifactName("something.${density}.apk", "something.apk", &diag));
901 EXPECT_FALSE(x86.ToArtifactName("something.apk", "something.apk", &diag));
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700902}
903
904TEST(ArtifactTest, Empty) {
905 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800906 ConfiguredArtifact artifact;
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700907
Shane Farmer9ecc0752017-08-24 15:55:36 -0700908 EXPECT_FALSE(artifact.ToArtifactName("something.${density}.apk", "", &diag));
909 EXPECT_TRUE(artifact.ToArtifactName("something.apk", "", &diag));
910 EXPECT_FALSE(artifact.ToArtifactName("something.${density}.apk", "something.apk", &diag));
911 EXPECT_TRUE(artifact.ToArtifactName("something.apk", "something.apk", &diag));
Shane Farmer9f0e7f12017-06-22 12:26:44 -0700912}
913
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700914TEST(ArtifactTest, Repeated) {
915 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800916 ConfiguredArtifact artifact;
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700917 artifact.screen_density_group = {"mdpi"};
918
Shane Farmer9ecc0752017-08-24 15:55:36 -0700919 ASSERT_TRUE(artifact.ToArtifactName("something.${density}.apk", "", &diag));
920 EXPECT_FALSE(artifact.ToArtifactName("something.${density}.${density}.apk", "", &diag));
921 ASSERT_TRUE(artifact.ToArtifactName("something.${density}.apk", "something.apk", &diag));
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700922}
923
924TEST(ArtifactTest, Nesting) {
925 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800926 ConfiguredArtifact x86;
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700927 x86.abi_group = {"x86"};
928
Shane Farmer9ecc0752017-08-24 15:55:36 -0700929 EXPECT_FALSE(x86.ToArtifactName("something.${abi${density}}.apk", "", &diag));
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700930
Shane Farmer9ecc0752017-08-24 15:55:36 -0700931 const Maybe<std::string>& name = x86.ToArtifactName("something.${abi${abi}}.apk", "", &diag);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700932 ASSERT_TRUE(name);
933 EXPECT_EQ(name.value(), "something.${abix86}.apk");
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700934}
935
936TEST(ArtifactTest, Recursive) {
937 StdErrDiagnostics diag;
Shane Farmercb6c3f92017-11-27 13:19:36 -0800938 ConfiguredArtifact artifact;
Shane Farmer0a5b2012017-06-22 12:24:12 -0700939 artifact.device_feature_group = {"${gl}"};
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700940 artifact.gl_texture_group = {"glx1"};
941
Shane Farmer9ecc0752017-08-24 15:55:36 -0700942 EXPECT_FALSE(artifact.ToArtifactName("app.${feature}.${gl}.apk", "", &diag));
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700943
944 artifact.device_feature_group = {"df1"};
Shane Farmer0a5b2012017-06-22 12:24:12 -0700945 artifact.gl_texture_group = {"${feature}"};
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700946 {
Shane Farmer9ecc0752017-08-24 15:55:36 -0700947 const auto& result = artifact.ToArtifactName("app.${feature}.${gl}.apk", "", &diag);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700948 ASSERT_TRUE(result);
949 EXPECT_EQ(result.value(), "app.df1.${feature}.apk");
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700950 }
951
952 // This is an invalid case, but should be the only possible case due to the ordering of
953 // replacement.
Shane Farmer0a5b2012017-06-22 12:24:12 -0700954 artifact.device_feature_group = {"${gl}"};
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700955 artifact.gl_texture_group = {"glx1"};
956 {
Shane Farmer9ecc0752017-08-24 15:55:36 -0700957 const auto& result = artifact.ToArtifactName("app.${feature}.apk", "", &diag);
Shane Farmer0a5b2012017-06-22 12:24:12 -0700958 ASSERT_TRUE(result);
Shane Farmer1a21b8c2017-07-21 09:42:42 -0700959 EXPECT_EQ(result.value(), "app.glx1.apk");
960 }
961}
962
Shane Farmer74cdea32017-05-12 16:22:36 -0700963} // namespace
Shane Farmercb6c3f92017-11-27 13:19:36 -0800964} // namespace handler
965} // namespace configuration
Shane Farmer74cdea32017-05-12 16:22:36 -0700966} // namespace aapt