Loading tools/aapt2/configuration/ConfigurationParser.cpp +11 −3 Original line number Diff line number Diff line Loading @@ -519,14 +519,22 @@ ConfigurationParser::ActionHandler ConfigurationParser::android_sdk_group_handle } else { AndroidSdk entry; for (const auto& attr : child->attributes) { Maybe<int>* target = nullptr; if (attr.name == "minSdkVersion") { entry.min_sdk_version = ResourceUtils::ParseSdkVersion(attr.value); target = &entry.min_sdk_version; } else if (attr.name == "targetSdkVersion") { entry.target_sdk_version = ResourceUtils::ParseSdkVersion(attr.value); target = &entry.target_sdk_version; } else if (attr.name == "maxSdkVersion") { entry.max_sdk_version = ResourceUtils::ParseSdkVersion(attr.value); target = &entry.max_sdk_version; } else { diag->Warn(DiagMessage() << "Unknown attribute: " << attr.name << " = " << attr.value); continue; } *target = ResourceUtils::ParseSdkVersion(attr.value); if (!*target) { diag->Error(DiagMessage() << "Invalid attribute: " << attr.name << " = " << attr.value); valid = false; } } Loading tools/aapt2/configuration/ConfigurationParser_test.cpp +109 −17 Original line number Diff line number Diff line Loading @@ -18,8 +18,10 @@ #include <string> #include "android-base/stringprintf.h" #include "androidfw/ResourceTypes.h" #include "SdkConstants.h" #include "test/Test.h" #include "xml/XmlDom.h" Loading @@ -35,18 +37,19 @@ void PrintTo(const AndroidSdk& sdk, std::ostream* os) { namespace { using ::aapt::configuration::Abi; using ::aapt::configuration::AndroidManifest; using ::aapt::configuration::AndroidSdk; using ::aapt::configuration::Artifact; using ::aapt::configuration::DeviceFeature; using ::aapt::configuration::GlTexture; using ::aapt::configuration::Locale; using ::aapt::configuration::PostProcessingConfiguration; using ::aapt::xml::Element; using ::aapt::xml::NodeCast; using ::android::ResTable_config; using configuration::Abi; using configuration::AndroidSdk; using configuration::Artifact; using configuration::PostProcessingConfiguration; using configuration::DeviceFeature; using configuration::GlTexture; using configuration::Locale; using configuration::AndroidManifest; using ::android::base::StringPrintf; using ::testing::ElementsAre; using xml::Element; using xml::NodeCast; constexpr const char* kValidConfig = R"(<?xml version="1.0" encoding="utf-8" ?> <post-process xmlns="http://schemas.android.com/tools/aapt"> Loading Loading @@ -421,17 +424,106 @@ TEST_F(ConfigurationParserTest, AndroidSdkGroupAction) { ASSERT_EQ(sdk, out); } TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_SingleVersion) { { static constexpr const char* xml = R"xml( <android-sdk-group label="v19"> <android-sdk minSdkVersion="19"></android-sdk> </android-sdk-group>)xml"; auto doc = test::BuildXmlDom(xml); PostProcessingConfiguration config; bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); ASSERT_TRUE(ok); ASSERT_EQ(1ul, config.android_sdk_groups.size()); ASSERT_EQ(1u, config.android_sdk_groups.count("v19")); auto& out = config.android_sdk_groups["v19"]; EXPECT_EQ(19, out.min_sdk_version.value()); EXPECT_FALSE(out.max_sdk_version); EXPECT_FALSE(out.target_sdk_version); } { static constexpr const char* xml = R"xml( <android-sdk-group label="v19"> <android-sdk maxSdkVersion="19"></android-sdk> </android-sdk-group>)xml"; auto doc = test::BuildXmlDom(xml); PostProcessingConfiguration config; bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); ASSERT_TRUE(ok); ASSERT_EQ(1ul, config.android_sdk_groups.size()); ASSERT_EQ(1u, config.android_sdk_groups.count("v19")); auto& out = config.android_sdk_groups["v19"]; EXPECT_EQ(19, out.max_sdk_version.value()); EXPECT_FALSE(out.min_sdk_version); EXPECT_FALSE(out.target_sdk_version); } { static constexpr const char* xml = R"xml( <android-sdk-group label="v19"> <android-sdk targetSdkVersion="19"></android-sdk> </android-sdk-group>)xml"; auto doc = test::BuildXmlDom(xml); PostProcessingConfiguration config; bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); ASSERT_TRUE(ok); ASSERT_EQ(1ul, config.android_sdk_groups.size()); ASSERT_EQ(1u, config.android_sdk_groups.count("v19")); auto& out = config.android_sdk_groups["v19"]; EXPECT_EQ(19, out.target_sdk_version.value()); EXPECT_FALSE(out.min_sdk_version); EXPECT_FALSE(out.max_sdk_version); } } TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_InvalidVersion) { static constexpr const char* xml = R"xml( <android-sdk-group label="v19"> <android-sdk minSdkVersion="v19" targetSdkVersion="v24" maxSdkVersion="v25"> <manifest> <!--- manifest additions here XSLT? TODO --> </manifest> </android-sdk> </android-sdk-group>)xml"; auto doc = test::BuildXmlDom(xml); PostProcessingConfiguration config; bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); ASSERT_FALSE(ok); } TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_NonNumeric) { static constexpr const char* xml = R"xml( <android-sdk-group label="P"> <android-sdk minSdkVersion="M" targetSdkVersion="P" maxSdkVersion="P"> minSdkVersion="25" targetSdkVersion="%s" maxSdkVersion="%s"> </android-sdk> </android-sdk-group>)xml"; auto doc = test::BuildXmlDom(xml); const auto& dev_sdk = GetDevelopmentSdkCodeNameAndVersion(); const char* codename = dev_sdk.first.data(); const ApiVersion& version = dev_sdk.second; auto doc = test::BuildXmlDom(StringPrintf(xml, codename, codename)); PostProcessingConfiguration config; bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); Loading @@ -443,9 +535,9 @@ TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_NonNumeric) { auto& out = config.android_sdk_groups["P"]; AndroidSdk sdk; sdk.min_sdk_version = {}; // Only the latest development version is supported. sdk.target_sdk_version = 28; sdk.max_sdk_version = 28; sdk.min_sdk_version = 25; sdk.target_sdk_version = version; sdk.max_sdk_version = version; ASSERT_EQ(sdk, out); } Loading Loading
tools/aapt2/configuration/ConfigurationParser.cpp +11 −3 Original line number Diff line number Diff line Loading @@ -519,14 +519,22 @@ ConfigurationParser::ActionHandler ConfigurationParser::android_sdk_group_handle } else { AndroidSdk entry; for (const auto& attr : child->attributes) { Maybe<int>* target = nullptr; if (attr.name == "minSdkVersion") { entry.min_sdk_version = ResourceUtils::ParseSdkVersion(attr.value); target = &entry.min_sdk_version; } else if (attr.name == "targetSdkVersion") { entry.target_sdk_version = ResourceUtils::ParseSdkVersion(attr.value); target = &entry.target_sdk_version; } else if (attr.name == "maxSdkVersion") { entry.max_sdk_version = ResourceUtils::ParseSdkVersion(attr.value); target = &entry.max_sdk_version; } else { diag->Warn(DiagMessage() << "Unknown attribute: " << attr.name << " = " << attr.value); continue; } *target = ResourceUtils::ParseSdkVersion(attr.value); if (!*target) { diag->Error(DiagMessage() << "Invalid attribute: " << attr.name << " = " << attr.value); valid = false; } } Loading
tools/aapt2/configuration/ConfigurationParser_test.cpp +109 −17 Original line number Diff line number Diff line Loading @@ -18,8 +18,10 @@ #include <string> #include "android-base/stringprintf.h" #include "androidfw/ResourceTypes.h" #include "SdkConstants.h" #include "test/Test.h" #include "xml/XmlDom.h" Loading @@ -35,18 +37,19 @@ void PrintTo(const AndroidSdk& sdk, std::ostream* os) { namespace { using ::aapt::configuration::Abi; using ::aapt::configuration::AndroidManifest; using ::aapt::configuration::AndroidSdk; using ::aapt::configuration::Artifact; using ::aapt::configuration::DeviceFeature; using ::aapt::configuration::GlTexture; using ::aapt::configuration::Locale; using ::aapt::configuration::PostProcessingConfiguration; using ::aapt::xml::Element; using ::aapt::xml::NodeCast; using ::android::ResTable_config; using configuration::Abi; using configuration::AndroidSdk; using configuration::Artifact; using configuration::PostProcessingConfiguration; using configuration::DeviceFeature; using configuration::GlTexture; using configuration::Locale; using configuration::AndroidManifest; using ::android::base::StringPrintf; using ::testing::ElementsAre; using xml::Element; using xml::NodeCast; constexpr const char* kValidConfig = R"(<?xml version="1.0" encoding="utf-8" ?> <post-process xmlns="http://schemas.android.com/tools/aapt"> Loading Loading @@ -421,17 +424,106 @@ TEST_F(ConfigurationParserTest, AndroidSdkGroupAction) { ASSERT_EQ(sdk, out); } TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_SingleVersion) { { static constexpr const char* xml = R"xml( <android-sdk-group label="v19"> <android-sdk minSdkVersion="19"></android-sdk> </android-sdk-group>)xml"; auto doc = test::BuildXmlDom(xml); PostProcessingConfiguration config; bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); ASSERT_TRUE(ok); ASSERT_EQ(1ul, config.android_sdk_groups.size()); ASSERT_EQ(1u, config.android_sdk_groups.count("v19")); auto& out = config.android_sdk_groups["v19"]; EXPECT_EQ(19, out.min_sdk_version.value()); EXPECT_FALSE(out.max_sdk_version); EXPECT_FALSE(out.target_sdk_version); } { static constexpr const char* xml = R"xml( <android-sdk-group label="v19"> <android-sdk maxSdkVersion="19"></android-sdk> </android-sdk-group>)xml"; auto doc = test::BuildXmlDom(xml); PostProcessingConfiguration config; bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); ASSERT_TRUE(ok); ASSERT_EQ(1ul, config.android_sdk_groups.size()); ASSERT_EQ(1u, config.android_sdk_groups.count("v19")); auto& out = config.android_sdk_groups["v19"]; EXPECT_EQ(19, out.max_sdk_version.value()); EXPECT_FALSE(out.min_sdk_version); EXPECT_FALSE(out.target_sdk_version); } { static constexpr const char* xml = R"xml( <android-sdk-group label="v19"> <android-sdk targetSdkVersion="19"></android-sdk> </android-sdk-group>)xml"; auto doc = test::BuildXmlDom(xml); PostProcessingConfiguration config; bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); ASSERT_TRUE(ok); ASSERT_EQ(1ul, config.android_sdk_groups.size()); ASSERT_EQ(1u, config.android_sdk_groups.count("v19")); auto& out = config.android_sdk_groups["v19"]; EXPECT_EQ(19, out.target_sdk_version.value()); EXPECT_FALSE(out.min_sdk_version); EXPECT_FALSE(out.max_sdk_version); } } TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_InvalidVersion) { static constexpr const char* xml = R"xml( <android-sdk-group label="v19"> <android-sdk minSdkVersion="v19" targetSdkVersion="v24" maxSdkVersion="v25"> <manifest> <!--- manifest additions here XSLT? TODO --> </manifest> </android-sdk> </android-sdk-group>)xml"; auto doc = test::BuildXmlDom(xml); PostProcessingConfiguration config; bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); ASSERT_FALSE(ok); } TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_NonNumeric) { static constexpr const char* xml = R"xml( <android-sdk-group label="P"> <android-sdk minSdkVersion="M" targetSdkVersion="P" maxSdkVersion="P"> minSdkVersion="25" targetSdkVersion="%s" maxSdkVersion="%s"> </android-sdk> </android-sdk-group>)xml"; auto doc = test::BuildXmlDom(xml); const auto& dev_sdk = GetDevelopmentSdkCodeNameAndVersion(); const char* codename = dev_sdk.first.data(); const ApiVersion& version = dev_sdk.second; auto doc = test::BuildXmlDom(StringPrintf(xml, codename, codename)); PostProcessingConfiguration config; bool ok = android_sdk_group_handler_(&config, NodeCast<Element>(doc.get()->root.get()), &diag_); Loading @@ -443,9 +535,9 @@ TEST_F(ConfigurationParserTest, AndroidSdkGroupAction_NonNumeric) { auto& out = config.android_sdk_groups["P"]; AndroidSdk sdk; sdk.min_sdk_version = {}; // Only the latest development version is supported. sdk.target_sdk_version = 28; sdk.max_sdk_version = 28; sdk.min_sdk_version = 25; sdk.target_sdk_version = version; sdk.max_sdk_version = version; ASSERT_EQ(sdk, out); } Loading