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