diff options
Diffstat (limited to 'tools/aapt2/java/ProguardRules_test.cpp')
-rw-r--r-- | tools/aapt2/java/ProguardRules_test.cpp | 112 |
1 files changed, 107 insertions, 5 deletions
diff --git a/tools/aapt2/java/ProguardRules_test.cpp b/tools/aapt2/java/ProguardRules_test.cpp index 900b07339715..df3ac8b0809f 100644 --- a/tools/aapt2/java/ProguardRules_test.cpp +++ b/tools/aapt2/java/ProguardRules_test.cpp @@ -15,6 +15,7 @@ */ #include "java/ProguardRules.h" +#include "link/Linkers.h" #include "test/Test.h" @@ -31,7 +32,7 @@ TEST(ProguardRulesTest, FragmentNameRuleIsEmitted) { layout->file.name = test::ParseNameOrDie("layout/foo"); proguard::KeepSet set; - ASSERT_TRUE(proguard::CollectProguardRules({}, layout.get(), &set)); + ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set)); std::stringstream out; ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); @@ -47,7 +48,7 @@ TEST(ProguardRulesTest, FragmentClassRuleIsEmitted) { layout->file.name = test::ParseNameOrDie("layout/foo"); proguard::KeepSet set; - ASSERT_TRUE(proguard::CollectProguardRules({}, layout.get(), &set)); + ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set)); std::stringstream out; ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); @@ -65,7 +66,7 @@ TEST(ProguardRulesTest, FragmentNameAndClassRulesAreEmitted) { layout->file.name = test::ParseNameOrDie("layout/foo"); proguard::KeepSet set; - ASSERT_TRUE(proguard::CollectProguardRules({}, layout.get(), &set)); + ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set)); std::stringstream out; ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); @@ -75,6 +76,107 @@ TEST(ProguardRulesTest, FragmentNameAndClassRulesAreEmitted) { EXPECT_THAT(actual, HasSubstr("com.foo.Baz")); } +TEST(ProguardRulesTest, CustomViewRulesAreEmitted) { + std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); + std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"( + <View xmlns:android="http://schemas.android.com/apk/res/android"> + <com.foo.Bar /> + </View>)"); + layout->file.name = test::ParseNameOrDie("layout/foo"); + + proguard::KeepSet set; + ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set)); + + std::stringstream out; + ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); + + std::string actual = out.str(); + EXPECT_THAT(actual, HasSubstr("com.foo.Bar")); +} + +TEST(ProguardRulesTest, IncludedLayoutRulesAreConditional) { + std::unique_ptr<xml::XmlResource> bar_layout = test::BuildXmlDom(R"( + <View xmlns:android="http://schemas.android.com/apk/res/android"> + <com.foo.Bar /> + </View>)"); + bar_layout->file.name = test::ParseNameOrDie("com.foo:layout/bar"); + + ResourceTable table; + StdErrDiagnostics errDiagnostics; + table.AddResource(bar_layout->file.name, ConfigDescription::DefaultConfig(), "", + util::make_unique<FileReference>(), &errDiagnostics); + + std::unique_ptr<IAaptContext> context = + test::ContextBuilder() + .SetCompilationPackage("com.foo") + .AddSymbolSource(util::make_unique<ResourceTableSymbolSource>(&table)) + .Build(); + + std::unique_ptr<xml::XmlResource> foo_layout = test::BuildXmlDom(R"( + <View xmlns:android="http://schemas.android.com/apk/res/android"> + <include layout="@layout/bar" /> + </View>)"); + foo_layout->file.name = test::ParseNameOrDie("com.foo:layout/foo"); + + XmlReferenceLinker xml_linker; + ASSERT_TRUE(xml_linker.Consume(context.get(), bar_layout.get())); + ASSERT_TRUE(xml_linker.Consume(context.get(), foo_layout.get())); + + proguard::KeepSet set = proguard::KeepSet(true); + ASSERT_TRUE(proguard::CollectProguardRules(bar_layout.get(), &set)); + ASSERT_TRUE(proguard::CollectProguardRules(foo_layout.get(), &set)); + + std::stringstream out; + ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); + + std::string actual = out.str(); + EXPECT_THAT(actual, HasSubstr("ifused class **.R$layout")); + EXPECT_THAT(actual, HasSubstr("int foo")); + EXPECT_THAT(actual, HasSubstr("int bar")); + EXPECT_THAT(actual, HasSubstr("com.foo.Bar")); +} + +TEST(ProguardRulesTest, AliasedLayoutRulesAreConditional) { + std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); + std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"( + <View xmlns:android="http://schemas.android.com/apk/res/android"> + <com.foo.Bar /> + </View>)"); + layout->file.name = test::ParseNameOrDie("layout/foo"); + + proguard::KeepSet set = proguard::KeepSet(true); + set.AddReference({test::ParseNameOrDie("layout/bar"), {}}, layout->file.name); + ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set)); + + std::stringstream out; + ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); + + std::string actual = out.str(); + EXPECT_THAT(actual, HasSubstr("ifused class **.R$layout")); + EXPECT_THAT(actual, HasSubstr("int foo")); + EXPECT_THAT(actual, HasSubstr("int bar")); + EXPECT_THAT(actual, HasSubstr("com.foo.Bar")); +} + +TEST(ProguardRulesTest, NonLayoutReferencesAreUnconditional) { + std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); + std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"( + <View xmlns:android="http://schemas.android.com/apk/res/android"> + <com.foo.Bar /> + </View>)"); + layout->file.name = test::ParseNameOrDie("layout/foo"); + + proguard::KeepSet set = proguard::KeepSet(true); + set.AddReference({test::ParseNameOrDie("style/MyStyle"), {}}, layout->file.name); + ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set)); + + std::stringstream out; + ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); + + std::string actual = out.str(); + EXPECT_THAT(actual, Not(HasSubstr("ifused"))); +} + TEST(ProguardRulesTest, ViewOnClickRuleIsEmitted) { std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); std::unique_ptr<xml::XmlResource> layout = test::BuildXmlDom(R"( @@ -83,7 +185,7 @@ TEST(ProguardRulesTest, ViewOnClickRuleIsEmitted) { layout->file.name = test::ParseNameOrDie("layout/foo"); proguard::KeepSet set; - ASSERT_TRUE(proguard::CollectProguardRules({}, layout.get(), &set)); + ASSERT_TRUE(proguard::CollectProguardRules(layout.get(), &set)); std::stringstream out; ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); @@ -104,7 +206,7 @@ TEST(ProguardRulesTest, MenuRulesAreEmitted) { menu->file.name = test::ParseNameOrDie("menu/foo"); proguard::KeepSet set; - ASSERT_TRUE(proguard::CollectProguardRules({}, menu.get(), &set)); + ASSERT_TRUE(proguard::CollectProguardRules(menu.get(), &set)); std::stringstream out; ASSERT_TRUE(proguard::WriteKeepSet(&out, set)); |