diff options
Diffstat (limited to 'tools/aapt2/link/ReferenceLinker_test.cpp')
-rw-r--r-- | tools/aapt2/link/ReferenceLinker_test.cpp | 71 |
1 files changed, 63 insertions, 8 deletions
diff --git a/tools/aapt2/link/ReferenceLinker_test.cpp b/tools/aapt2/link/ReferenceLinker_test.cpp index be38b967c986..0b7b1ce03a52 100644 --- a/tools/aapt2/link/ReferenceLinker_test.cpp +++ b/tools/aapt2/link/ReferenceLinker_test.cpp @@ -267,7 +267,7 @@ TEST(ReferenceLinkerTest, AppsWithSamePackageButDifferentIdAreVisibleNonPublic) std::string error; const CallSite call_site{"com.app.test"}; const SymbolTable::Symbol* symbol = ReferenceLinker::ResolveSymbolCheckVisibility( - *test::BuildReference("com.app.test:string/foo"), call_site, &table, &error); + *test::BuildReference("com.app.test:string/foo"), call_site, &table, false, &error); ASSERT_THAT(symbol, NotNull()); EXPECT_TRUE(error.empty()); } @@ -285,13 +285,13 @@ TEST(ReferenceLinkerTest, AppsWithDifferentPackageCanNotUseEachOthersAttribute) std::string error; const CallSite call_site{"com.app.ext"}; - EXPECT_FALSE(ReferenceLinker::CompileXmlAttribute( - *test::BuildReference("com.app.test:attr/foo"), call_site, &table, &error)); + EXPECT_FALSE(ReferenceLinker::CompileXmlAttribute(*test::BuildReference("com.app.test:attr/foo"), + call_site, &table, false, &error)); EXPECT_FALSE(error.empty()); error = ""; ASSERT_TRUE(ReferenceLinker::CompileXmlAttribute( - *test::BuildReference("com.app.test:attr/public_foo"), call_site, &table, &error)); + *test::BuildReference("com.app.test:attr/public_foo"), call_site, &table, false, &error)); EXPECT_TRUE(error.empty()); } @@ -303,19 +303,74 @@ TEST(ReferenceLinkerTest, ReferenceWithNoPackageUsesCallSitePackage) { .AddSymbol("com.app.lib:string/foo", ResourceId(0x7f010001)) .Build()); - const SymbolTable::Symbol* s = ReferenceLinker::ResolveSymbol(*test::BuildReference("string/foo"), - CallSite{"com.app.test"}, &table); + const SymbolTable::Symbol* s = ReferenceLinker::ResolveSymbol( + *test::BuildReference("string/foo"), CallSite{"com.app.test"}, &table, false); ASSERT_THAT(s, NotNull()); EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010000))); s = ReferenceLinker::ResolveSymbol(*test::BuildReference("string/foo"), CallSite{"com.app.lib"}, - &table); + &table, false); ASSERT_THAT(s, NotNull()); EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010001))); EXPECT_THAT(ReferenceLinker::ResolveSymbol(*test::BuildReference("string/foo"), - CallSite{"com.app.bad"}, &table), + CallSite{"com.app.bad"}, &table, false), IsNull()); } +TEST(ReferenceLinkerTest, AutomaticNamespace) { + NameMangler mangler(NameManglerPolicy{"com.example.thislib"}); + SymbolTable table(&mangler); + table.AppendSource( + test::StaticSymbolSourceBuilder() + .AddSymbol("com.example.thislib:string/thislib_string", ResourceId(0x7f010006)) + .AddSymbol("com.example.thislib:string/explicit_override_string", ResourceId(0x7f010007)) + .Build()); + // Lib2 is higher priority than lib1 + table.AppendSource( + test::StaticSymbolSourceBuilder() + .AddSymbol("com.example.lib2:string/lib2_string", ResourceId(0x7f010003)) + .AddSymbol("com.example.lib2:string/explicit_override_string", ResourceId(0x7f010004)) + .AddSymbol("com.example.lib2:string/implicit_override_string", ResourceId(0x7f010005)) + .Build()); + table.AppendSource( + test::StaticSymbolSourceBuilder() + .AddSymbol("com.example.lib1:string/explicit_override_string", ResourceId(0x7f010001)) + .AddSymbol("com.example.lib1:string/implicit_override_string", ResourceId(0x7f010002)) + .Build()); + + // Sanity test: Local references are still fine. + const SymbolTable::Symbol* s = + ReferenceLinker::ResolveSymbol(*test::BuildReference("string/thislib_string"), + CallSite{"com.example.thislib"}, &table, true); + ASSERT_THAT(s, NotNull()); + EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010006))); + + // Local references are fine, even if clash with remote ones. + s = ReferenceLinker::ResolveSymbol(*test::BuildReference("string/explicit_override_string"), + CallSite{"com.example.thislib"}, &table, true); + ASSERT_THAT(s, NotNull()); + EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010007))); + + // An unqualified reference to lib2 is rewritten + s = ReferenceLinker::ResolveSymbol(*test::BuildReference("string/lib2_string"), + CallSite{"com.example.thislib"}, &table, true); + ASSERT_THAT(s, NotNull()); + EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010003))); + + // Qualified references are left alone. + s = ReferenceLinker::ResolveSymbol( + *test::BuildReference("com.example.lib2:string/explicit_override_string"), + CallSite{"com.example.thislib"}, &table, true); + ASSERT_THAT(s, NotNull()); + EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010004))); + + // Implicit overrides respect priority ordering. + s = ReferenceLinker::ResolveSymbol(*test::BuildReference("string/implicit_override_string"), + CallSite{"com.example.thislib"}, &table, true); + ASSERT_THAT(s, NotNull()); + EXPECT_THAT(s->id, Eq(make_value<ResourceId>(0x7f010005))); + + // +} } // namespace aapt |