174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer/*
274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer * Copyright (C) 2017 The Android Open Source Project
374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer *
474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer * Licensed under the Apache License, Version 2.0 (the "License");
574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer * you may not use this file except in compliance with the License.
674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer * You may obtain a copy of the License at
774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer *
874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer *      http://www.apache.org/licenses/LICENSE-2.0
974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer *
1074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer * Unless required by applicable law or agreed to in writing, software
1174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer * distributed under the License is distributed on an "AS IS" BASIS,
1274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer * See the License for the specific language governing permissions and
1474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer * limitations under the License.
1574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer */
1674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
1774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer#include "configuration/ConfigurationParser.h"
1874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
1974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer#include <string>
2074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
2174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer#include "androidfw/ResourceTypes.h"
2274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
2374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer#include "test/Test.h"
2474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer#include "xml/XmlDom.h"
2574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
2674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmernamespace aapt {
2774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmernamespace {
2874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
295c33fb5408d6c02dc2c73f53d89d1494fe04f208Adam Lesinskiusing ::android::ResTable_config;
3074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmerusing configuration::Abi;
3174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmerusing configuration::AndroidSdk;
329f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmerusing configuration::Artifact;
33280be34fa6311de90dff6c595a147fd5a182223dShane Farmerusing configuration::PostProcessingConfiguration;
3474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmerusing configuration::DeviceFeature;
3574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmerusing configuration::GlTexture;
3674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmerusing configuration::Locale;
3774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmerusing configuration::AndroidManifest;
385c33fb5408d6c02dc2c73f53d89d1494fe04f208Adam Lesinskiusing ::testing::ElementsAre;
3974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmerusing xml::Element;
4074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmerusing xml::NodeCast;
4174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
4274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmerconstexpr const char* kValidConfig = R"(<?xml version="1.0" encoding="utf-8" ?>
4374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer<post-process xmlns="http://schemas.android.com/tools/aapt">
4474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  <groups>
4574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <abi-group label="arm">
4674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <abi>armeabi-v7a</abi>
4774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <abi>arm64-v8a</abi>
4874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </abi-group>
4974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <abi-group label="other">
5074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <abi>x86</abi>
5174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <abi>mips</abi>
5274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </abi-group>
5374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <screen-density-group label="large">
5474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <screen-density>xhdpi</screen-density>
5574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <screen-density>xxhdpi</screen-density>
5674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <screen-density>xxxhdpi</screen-density>
5774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </screen-density-group>
5874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <screen-density-group label="alldpi">
5974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <screen-density>ldpi</screen-density>
6074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <screen-density>mdpi</screen-density>
6174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <screen-density>hdpi</screen-density>
6274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <screen-density>xhdpi</screen-density>
6374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <screen-density>xxhdpi</screen-density>
6474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <screen-density>xxxhdpi</screen-density>
6574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </screen-density-group>
6674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <locale-group label="europe">
6774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <locale lang="en"/>
6874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <locale lang="es"/>
6974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <locale lang="fr"/>
7074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <locale lang="de"/>
7174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </locale-group>
7274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <locale-group label="north-america">
7374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <locale lang="en"/>
7474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <locale lang="es" region="MX"/>
7574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <locale lang="fr" region="CA"/>
7674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </locale-group>
7774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <locale-group label="all">
7874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <locale/>
7974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </locale-group>
8074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <android-sdk-group label="19">
8174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <android-sdk
8274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer          minSdkVersion="19"
8374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer          targetSdkVersion="24"
8474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer          maxSdkVersion="25">
8574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        <manifest>
8674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer          <!--- manifest additions here XSLT? TODO -->
8774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        </manifest>
8874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      </android-sdk>
8974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </android-sdk-group>
9074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <gl-texture-group label="dxt1">
9174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <gl-texture name="GL_EXT_texture_compression_dxt1">
9274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        <texture-path>assets/dxt1/*</texture-path>
9374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      </gl-texture>
9474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </gl-texture-group>
9574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <device-feature-group label="low-latency">
9674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <supports-feature>android.hardware.audio.low_latency</supports-feature>
9774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </device-feature-group>
9874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  </groups>
9974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  <artifacts>
10074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <artifact-format>
10174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      ${base}.${abi}.${screen-density}.${locale}.${sdk}.${gl}.${feature}.release
10274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </artifact-format>
10374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <artifact
10474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        name="art1"
10574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        abi-group="arm"
10674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        screen-density-group="large"
10774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        locale-group="europe"
10874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        android-sdk-group="19"
10974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        gl-texture-group="dxt1"
11074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        device-feature-group="low-latency"/>
11174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <artifact
11274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        name="art2"
11374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        abi-group="other"
11474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        screen-density-group="alldpi"
11574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        locale-group="north-america"
11674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        android-sdk-group="19"
11774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        gl-texture-group="dxt1"
11874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        device-feature-group="low-latency"/>
11974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  </artifacts>
12074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer</post-process>
12174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer)";
12274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
12374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmerclass ConfigurationParserTest : public ConfigurationParser, public ::testing::Test {
12474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer public:
12574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ConfigurationParserTest() : ConfigurationParser("") {}
12674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
12774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer protected:
12874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  StdErrDiagnostics diag_;
12974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer};
13074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
131b102727771b9ac3d28d4f9b0a4a54b98bd1af958Shane FarmerTEST_F(ConfigurationParserTest, ForPath_NoFile) {
132b102727771b9ac3d28d4f9b0a4a54b98bd1af958Shane Farmer  auto result = ConfigurationParser::ForPath("./does_not_exist.xml");
133b102727771b9ac3d28d4f9b0a4a54b98bd1af958Shane Farmer  EXPECT_FALSE(result);
134b102727771b9ac3d28d4f9b0a4a54b98bd1af958Shane Farmer}
135b102727771b9ac3d28d4f9b0a4a54b98bd1af958Shane Farmer
13674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane FarmerTEST_F(ConfigurationParserTest, ValidateFile) {
13774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto parser = ConfigurationParser::ForContents(kValidConfig).WithDiagnostics(&diag_);
13874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto result = parser.Parse();
13974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_TRUE(result);
140280be34fa6311de90dff6c595a147fd5a182223dShane Farmer  PostProcessingConfiguration& value = result.value();
14174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(2ul, value.artifacts.size());
14274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_TRUE(value.artifact_format);
14374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(
14474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      "${base}.${abi}.${screen-density}.${locale}.${sdk}.${gl}.${feature}.release",
14574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      value.artifact_format.value()
14674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  );
14774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
14874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(2ul, value.abi_groups.size());
14974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(2ul, value.abi_groups["arm"].size());
15074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(2ul, value.abi_groups["other"].size());
15174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
15274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(2ul, value.screen_density_groups.size());
15374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(3ul, value.screen_density_groups["large"].size());
15474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(6ul, value.screen_density_groups["alldpi"].size());
15574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
15674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(3ul, value.locale_groups.size());
15774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(4ul, value.locale_groups["europe"].size());
15874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(3ul, value.locale_groups["north-america"].size());
15974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(1ul, value.locale_groups["all"].size());
16074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
16174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(1ul, value.android_sdk_groups.size());
16274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(1ul, value.android_sdk_groups["19"].size());
16374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
16474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(1ul, value.gl_texture_groups.size());
16574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(1ul, value.gl_texture_groups["dxt1"].size());
16674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
16774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(1ul, value.device_feature_groups.size());
16874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(1ul, value.device_feature_groups["low-latency"].size());
16974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer}
17074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
17174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane FarmerTEST_F(ConfigurationParserTest, InvalidNamespace) {
17274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  constexpr const char* invalid_ns = R"(<?xml version="1.0" encoding="utf-8" ?>
17374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  <post-process xmlns="http://schemas.android.com/tools/another-unknown-tool" />)";
17474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
17574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto result = ConfigurationParser::ForContents(invalid_ns).Parse();
17674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_FALSE(result);
17774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer}
17874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
17974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane FarmerTEST_F(ConfigurationParserTest, ArtifactAction) {
18074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  static constexpr const char* xml = R"xml(
18174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <artifact
18274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        abi-group="arm"
18374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        screen-density-group="large"
18474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        locale-group="europe"
18574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        android-sdk-group="19"
18674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        gl-texture-group="dxt1"
18774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        device-feature-group="low-latency"/>)xml";
18874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
18974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto doc = test::BuildXmlDom(xml);
19074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
191280be34fa6311de90dff6c595a147fd5a182223dShane Farmer  PostProcessingConfiguration config;
1925c33fb5408d6c02dc2c73f53d89d1494fe04f208Adam Lesinski  bool ok = artifact_handler_(&config, NodeCast<Element>(doc->root.get()), &diag_);
19374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_TRUE(ok);
19474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
19574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(1ul, config.artifacts.size());
19674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
1975766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer  auto& artifact = config.artifacts.front();
19874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ("", artifact.name); // TODO: make this fail.
19974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ("arm", artifact.abi_group.value());
20074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ("large", artifact.screen_density_group.value());
20174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ("europe", artifact.locale_group.value());
20274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ("19", artifact.android_sdk_group.value());
20374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ("dxt1", artifact.gl_texture_group.value());
20474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ("low-latency", artifact.device_feature_group.value());
2055766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer
2065766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer  // Perform a second action to ensure we get 2 artifacts.
2075766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer  static constexpr const char* second = R"xml(
2085766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer    <artifact
2095766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer        abi-group="other"
2105766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer        screen-density-group="large"
2115766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer        locale-group="europe"
2125766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer        android-sdk-group="19"
2135766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer        gl-texture-group="dxt1"
2145766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer        device-feature-group="low-latency"/>)xml";
2155766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer  doc = test::BuildXmlDom(second);
2165766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer
2175766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer  ok = artifact_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
2185766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer  ASSERT_TRUE(ok);
2195766943f558c8fccc714bb3d0a96af70816a5545Shane Farmer  EXPECT_EQ(2ul, config.artifacts.size());
22074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer}
22174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
22274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane FarmerTEST_F(ConfigurationParserTest, ArtifactFormatAction) {
22374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  static constexpr const char* xml = R"xml(
22474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <artifact-format>
22574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      ${base}.${abi}.${screen-density}.${locale}.${sdk}.${gl}.${feature}.release
22674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </artifact-format>)xml";
22774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
22874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto doc = test::BuildXmlDom(xml);
22974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
230280be34fa6311de90dff6c595a147fd5a182223dShane Farmer  PostProcessingConfiguration config;
23174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  bool ok = artifact_format_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
23274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_TRUE(ok);
23374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_TRUE(config.artifact_format);
23474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(
23574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      "${base}.${abi}.${screen-density}.${locale}.${sdk}.${gl}.${feature}.release",
23674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      static_cast<std::string>(config.artifact_format.value())
23774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  );
23874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer}
23974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
24074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane FarmerTEST_F(ConfigurationParserTest, AbiGroupAction) {
24174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  static constexpr const char* xml = R"xml(
24274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <abi-group label="arm">
24374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <!-- First comment. -->
24474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <abi>
24574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        armeabi-v7a
24674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      </abi>
24774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <!-- Another comment. -->
24874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <abi>arm64-v8a</abi>
24974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </abi-group>)xml";
25074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
25174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto doc = test::BuildXmlDom(xml);
25274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
253280be34fa6311de90dff6c595a147fd5a182223dShane Farmer  PostProcessingConfiguration config;
25474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  bool ok = abi_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
25574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_TRUE(ok);
25674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
25774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(1ul, config.abi_groups.size());
25874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_EQ(1u, config.abi_groups.count("arm"));
25974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
26074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto& out = config.abi_groups["arm"];
26174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_THAT(out, ElementsAre(Abi::kArmV7a, Abi::kArm64V8a));
26274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer}
26374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
26474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane FarmerTEST_F(ConfigurationParserTest, ScreenDensityGroupAction) {
26574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  static constexpr const char* xml = R"xml(
26674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <screen-density-group label="large">
26774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <screen-density>xhdpi</screen-density>
26874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <screen-density>
26974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        xxhdpi
27074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      </screen-density>
27174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <screen-density>xxxhdpi</screen-density>
27274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </screen-density-group>)xml";
27374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
27474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto doc = test::BuildXmlDom(xml);
27574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
276280be34fa6311de90dff6c595a147fd5a182223dShane Farmer  PostProcessingConfiguration config;
27774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  bool ok =
27874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      screen_density_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
27974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_TRUE(ok);
28074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
28174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(1ul, config.screen_density_groups.size());
28274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_EQ(1u, config.screen_density_groups.count("large"));
28374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
28474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ConfigDescription xhdpi;
28574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  xhdpi.density = ResTable_config::DENSITY_XHIGH;
28674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ConfigDescription xxhdpi;
28774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  xxhdpi.density = ResTable_config::DENSITY_XXHIGH;
28874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ConfigDescription xxxhdpi;
28974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  xxxhdpi.density = ResTable_config::DENSITY_XXXHIGH;
29074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
29174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto& out = config.screen_density_groups["large"];
29274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_THAT(out, ElementsAre(xhdpi, xxhdpi, xxxhdpi));
29374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer}
29474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
29574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane FarmerTEST_F(ConfigurationParserTest, LocaleGroupAction) {
29674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  static constexpr const char* xml = R"xml(
29774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <locale-group label="europe">
29874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <locale lang="en"/>
29974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <locale lang="es"/>
30074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <locale lang="fr"/>
30174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <locale lang="de"/>
30274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </locale-group>)xml";
30374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
30474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto doc = test::BuildXmlDom(xml);
30574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
306280be34fa6311de90dff6c595a147fd5a182223dShane Farmer  PostProcessingConfiguration config;
30774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  bool ok = locale_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
30874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_TRUE(ok);
30974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
31074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_EQ(1ul, config.locale_groups.size());
31174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_EQ(1u, config.locale_groups.count("europe"));
31274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
31374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto& out = config.locale_groups["europe"];
31474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
31574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  Locale en;
31674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  en.lang = std::string("en");
31774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  Locale es;
31874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  es.lang = std::string("es");
31974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  Locale fr;
32074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  fr.lang = std::string("fr");
32174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  Locale de;
32274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  de.lang = std::string("de");
32374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
32474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_THAT(out, ElementsAre(en, es, fr, de));
32574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer}
32674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
32774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane FarmerTEST_F(ConfigurationParserTest, AndroidSdkGroupAction) {
32874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  static constexpr const char* xml = R"xml(
32974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <android-sdk-group label="19">
33074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <android-sdk
33174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer          minSdkVersion="19"
33274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer          targetSdkVersion="24"
33374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer          maxSdkVersion="25">
33474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        <manifest>
33574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer          <!--- manifest additions here XSLT? TODO -->
33674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        </manifest>
33774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      </android-sdk>
33874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </android-sdk-group>)xml";
33974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
34074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto doc = test::BuildXmlDom(xml);
34174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
342280be34fa6311de90dff6c595a147fd5a182223dShane Farmer  PostProcessingConfiguration config;
34374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
34474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_TRUE(ok);
34574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
34674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_EQ(1ul, config.android_sdk_groups.size());
34774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_EQ(1u, config.android_sdk_groups.count("19"));
34874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
34974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto& out = config.android_sdk_groups["19"];
35074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
35174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  AndroidSdk sdk;
35274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  sdk.min_sdk_version = std::string("19");
35374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  sdk.target_sdk_version = std::string("24");
35474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  sdk.max_sdk_version = std::string("25");
35574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  sdk.manifest = AndroidManifest();
35674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
35774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_EQ(1ul, out.size());
35874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_EQ(sdk, out[0]);
35974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer}
36074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
36174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane FarmerTEST_F(ConfigurationParserTest, GlTextureGroupAction) {
36274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  static constexpr const char* xml = R"xml(
36374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <gl-texture-group label="dxt1">
36474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <gl-texture name="GL_EXT_texture_compression_dxt1">
36574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        <texture-path>assets/dxt1/main/*</texture-path>
36674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        <texture-path>
36774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer          assets/dxt1/test/*
36874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        </texture-path>
36974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      </gl-texture>
37074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </gl-texture-group>)xml";
37174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
37274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto doc = test::BuildXmlDom(xml);
37374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
374280be34fa6311de90dff6c595a147fd5a182223dShane Farmer  PostProcessingConfiguration config;
37574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  bool ok = gl_texture_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
37674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_TRUE(ok);
37774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
37874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(1ul, config.gl_texture_groups.size());
37974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_EQ(1u, config.gl_texture_groups.count("dxt1"));
38074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
38174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto& out = config.gl_texture_groups["dxt1"];
38274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
38374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  GlTexture texture{
38474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      std::string("GL_EXT_texture_compression_dxt1"),
38574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      {"assets/dxt1/main/*", "assets/dxt1/test/*"}
38674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  };
38774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
38874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_EQ(1ul, out.size());
38974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_EQ(texture, out[0]);
39074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer}
39174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
39274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane FarmerTEST_F(ConfigurationParserTest, DeviceFeatureGroupAction) {
39374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  static constexpr const char* xml = R"xml(
39474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    <device-feature-group label="low-latency">
39574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <supports-feature>android.hardware.audio.low_latency</supports-feature>
39674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      <supports-feature>
39774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer        android.hardware.audio.pro
39874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      </supports-feature>
39974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer    </device-feature-group>)xml";
40074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
40174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto doc = test::BuildXmlDom(xml);
40274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
403280be34fa6311de90dff6c595a147fd5a182223dShane Farmer  PostProcessingConfiguration config;
40474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  bool ok
40574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer      = device_feature_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_);
40674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_TRUE(ok);
40774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
40874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  EXPECT_EQ(1ul, config.device_feature_groups.size());
40974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_EQ(1u, config.device_feature_groups.count("low-latency"));
41074cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
41174cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  auto& out = config.device_feature_groups["low-latency"];
41274cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
41374cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  DeviceFeature low_latency = "android.hardware.audio.low_latency";
41474cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  DeviceFeature pro = "android.hardware.audio.pro";
41574cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer  ASSERT_THAT(out, ElementsAre(low_latency, pro));
41674cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer}
41774cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer
4189f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane FarmerTEST(ArtifactTest, Simple) {
4199f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  StdErrDiagnostics diag;
4209f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  Artifact x86;
4219f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  x86.abi_group = {"x86"};
4229f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer
4239f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  auto x86_result = x86.ToArtifactName("something.{abi}.apk", &diag);
4249f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  ASSERT_TRUE(x86_result);
4259f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  EXPECT_EQ(x86_result.value(), "something.x86.apk");
4269f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer
4279f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  Artifact arm;
4289f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  arm.abi_group = {"armeabi-v7a"};
4299f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer
4309f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  auto arm_result = arm.ToArtifactName("app.{abi}.apk", &diag);
4319f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  ASSERT_TRUE(arm_result);
4329f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  EXPECT_EQ(arm_result.value(), "app.armeabi-v7a.apk");
4339f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer}
4349f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer
4359f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane FarmerTEST(ArtifactTest, Complex) {
4369f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  StdErrDiagnostics diag;
4379f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  Artifact artifact;
4389f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  artifact.abi_group = {"mips64"};
4399f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  artifact.screen_density_group = {"ldpi"};
4409f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  artifact.device_feature_group = {"df1"};
4419f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  artifact.gl_texture_group = {"glx1"};
4429f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  artifact.locale_group = {"en-AU"};
4439f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  artifact.android_sdk_group = {"26"};
4449f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer
4459f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  auto result =
4469f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer      artifact.ToArtifactName("app.{density}_{locale}_{feature}_{gl}.sdk{sdk}.{abi}.apk", &diag);
4479f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  ASSERT_TRUE(result);
4489f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  EXPECT_EQ(result.value(), "app.ldpi_en-AU_df1_glx1.sdk26.mips64.apk");
4499f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer}
4509f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer
4519f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane FarmerTEST(ArtifactTest, Missing) {
4529f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  StdErrDiagnostics diag;
4539f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  Artifact x86;
4549f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  x86.abi_group = {"x86"};
4559f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer
4569f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  EXPECT_FALSE(x86.ToArtifactName("something.{density}.apk", &diag));
4579f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  EXPECT_FALSE(x86.ToArtifactName("something.apk", &diag));
4589f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer}
4599f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer
4609f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane FarmerTEST(ArtifactTest, Empty) {
4619f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  StdErrDiagnostics diag;
4629f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  Artifact artifact;
4639f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer
4649f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  EXPECT_FALSE(artifact.ToArtifactName("something.{density}.apk", &diag));
4659f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer  EXPECT_TRUE(artifact.ToArtifactName("something.apk", &diag));
4669f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer}
4679f0e7f1dbade4b35b85e23954fa2b7c31d5f2009Shane Farmer
46874cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer}  // namespace
46974cdea34cd6dce8bf9b4adaa2cd7cb02330120d5Shane Farmer}  // namespace aapt
470