diff options
Diffstat (limited to 'tools/aapt2/link/TableMerger_test.cpp')
-rw-r--r-- | tools/aapt2/link/TableMerger_test.cpp | 184 |
1 files changed, 140 insertions, 44 deletions
diff --git a/tools/aapt2/link/TableMerger_test.cpp b/tools/aapt2/link/TableMerger_test.cpp index 4a80d3f48777..fb1cb21dde92 100644 --- a/tools/aapt2/link/TableMerger_test.cpp +++ b/tools/aapt2/link/TableMerger_test.cpp @@ -30,13 +30,13 @@ struct TableMergerTest : public ::testing::Test { void SetUp() override { mContext = test::ContextBuilder() // We are compiling this package. - .setCompilationPackage(u"com.app.a") + .setCompilationPackage("com.app.a") // Merge all packages that have this package ID. .setPackageId(0x7f) // Mangle all packages that do not have this package name. - .setNameManglerPolicy(NameManglerPolicy{ u"com.app.a", { u"com.app.b" } }) + .setNameManglerPolicy(NameManglerPolicy{ "com.app.a", { "com.app.b" } }) .build(); } @@ -44,17 +44,17 @@ struct TableMergerTest : public ::testing::Test { TEST_F(TableMergerTest, SimpleMerge) { std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder() - .setPackageId(u"com.app.a", 0x7f) - .addReference(u"@com.app.a:id/foo", u"@com.app.a:id/bar") - .addReference(u"@com.app.a:id/bar", u"@com.app.b:id/foo") - .addValue(u"@com.app.a:styleable/view", test::StyleableBuilder() - .addItem(u"@com.app.b:id/foo") + .setPackageId("com.app.a", 0x7f) + .addReference("com.app.a:id/foo", "com.app.a:id/bar") + .addReference("com.app.a:id/bar", "com.app.b:id/foo") + .addValue("com.app.a:styleable/view", test::StyleableBuilder() + .addItem("com.app.b:id/foo") .build()) .build(); std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder() - .setPackageId(u"com.app.b", 0x7f) - .addSimple(u"@com.app.b:id/foo") + .setPackageId("com.app.b", 0x7f) + .addSimple("com.app.b:id/foo") .build(); ResourceTable finalTable; @@ -62,20 +62,20 @@ TEST_F(TableMergerTest, SimpleMerge) { io::FileCollection collection; ASSERT_TRUE(merger.merge({}, tableA.get())); - ASSERT_TRUE(merger.mergeAndMangle({}, u"com.app.b", tableB.get(), &collection)); + ASSERT_TRUE(merger.mergeAndMangle({}, "com.app.b", tableB.get(), &collection)); - EXPECT_TRUE(merger.getMergedPackages().count(u"com.app.b") != 0); + EXPECT_TRUE(merger.getMergedPackages().count("com.app.b") != 0); // Entries from com.app.a should not be mangled. - AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie(u"@com.app.a:id/foo"))); - AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie(u"@com.app.a:id/bar"))); - AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie(u"@com.app.a:styleable/view"))); + AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("com.app.a:id/foo"))); + AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("com.app.a:id/bar"))); + AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("com.app.a:styleable/view"))); // The unmangled name should not be present. - AAPT_EXPECT_FALSE(finalTable.findResource(test::parseNameOrDie(u"@com.app.b:id/foo"))); + AAPT_EXPECT_FALSE(finalTable.findResource(test::parseNameOrDie("com.app.b:id/foo"))); // Look for the mangled name. - AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie(u"@com.app.a:id/com.app.b$foo"))); + AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("com.app.a:id/com.app.b$foo"))); } TEST_F(TableMergerTest, MergeFile) { @@ -86,17 +86,17 @@ TEST_F(TableMergerTest, MergeFile) { ResourceFile fileDesc; fileDesc.config = test::parseConfigOrDie("hdpi-v4"); - fileDesc.name = test::parseNameOrDie(u"@layout/main"); + fileDesc.name = test::parseNameOrDie("layout/main"); fileDesc.source = Source("res/layout-hdpi/main.xml"); test::TestFile testFile("path/to/res/layout-hdpi/main.xml.flat"); ASSERT_TRUE(merger.mergeFile(fileDesc, &testFile)); FileReference* file = test::getValueForConfig<FileReference>(&finalTable, - u"@com.app.a:layout/main", + "com.app.a:layout/main", test::parseConfigOrDie("hdpi-v4")); ASSERT_NE(nullptr, file); - EXPECT_EQ(std::u16string(u"res/layout-hdpi-v4/main.xml"), *file->path); + EXPECT_EQ(std::string("res/layout-hdpi-v4/main.xml"), *file->path); } TEST_F(TableMergerTest, MergeFileOverlay) { @@ -106,7 +106,7 @@ TEST_F(TableMergerTest, MergeFileOverlay) { TableMerger merger(mContext.get(), &finalTable, tableMergerOptions); ResourceFile fileDesc; - fileDesc.name = test::parseNameOrDie(u"@xml/foo"); + fileDesc.name = test::parseNameOrDie("xml/foo"); test::TestFile fileA("path/to/fileA.xml.flat"); test::TestFile fileB("path/to/fileB.xml.flat"); @@ -116,12 +116,12 @@ TEST_F(TableMergerTest, MergeFileOverlay) { TEST_F(TableMergerTest, MergeFileReferences) { std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder() - .setPackageId(u"com.app.a", 0x7f) - .addFileReference(u"@com.app.a:xml/file", u"res/xml/file.xml") + .setPackageId("com.app.a", 0x7f) + .addFileReference("com.app.a:xml/file", "res/xml/file.xml") .build(); std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder() - .setPackageId(u"com.app.b", 0x7f) - .addFileReference(u"@com.app.b:xml/file", u"res/xml/file.xml") + .setPackageId("com.app.b", 0x7f) + .addFileReference("com.app.b:xml/file", "res/xml/file.xml") .build(); ResourceTable finalTable; @@ -130,25 +130,25 @@ TEST_F(TableMergerTest, MergeFileReferences) { collection.insertFile("res/xml/file.xml"); ASSERT_TRUE(merger.merge({}, tableA.get())); - ASSERT_TRUE(merger.mergeAndMangle({}, u"com.app.b", tableB.get(), &collection)); + ASSERT_TRUE(merger.mergeAndMangle({}, "com.app.b", tableB.get(), &collection)); - FileReference* f = test::getValue<FileReference>(&finalTable, u"@com.app.a:xml/file"); + FileReference* f = test::getValue<FileReference>(&finalTable, "com.app.a:xml/file"); ASSERT_NE(f, nullptr); - EXPECT_EQ(std::u16string(u"res/xml/file.xml"), *f->path); + EXPECT_EQ(std::string("res/xml/file.xml"), *f->path); - f = test::getValue<FileReference>(&finalTable, u"@com.app.a:xml/com.app.b$file"); + f = test::getValue<FileReference>(&finalTable, "com.app.a:xml/com.app.b$file"); ASSERT_NE(f, nullptr); - EXPECT_EQ(std::u16string(u"res/xml/com.app.b$file.xml"), *f->path); + EXPECT_EQ(std::string("res/xml/com.app.b$file.xml"), *f->path); } TEST_F(TableMergerTest, OverrideResourceWithOverlay) { std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder() - .setPackageId(u"", 0x00) - .addValue(u"@bool/foo", ResourceUtils::tryParseBool(u"true")) + .setPackageId("", 0x00) + .addValue("bool/foo", ResourceUtils::tryParseBool("true")) .build(); std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder() - .setPackageId(u"", 0x00) - .addValue(u"@bool/foo", ResourceUtils::tryParseBool(u"false")) + .setPackageId("", 0x00) + .addValue("bool/foo", ResourceUtils::tryParseBool("false")) .build(); ResourceTable finalTable; @@ -159,19 +159,76 @@ TEST_F(TableMergerTest, OverrideResourceWithOverlay) { ASSERT_TRUE(merger.merge({}, base.get())); ASSERT_TRUE(merger.mergeOverlay({}, overlay.get())); - BinaryPrimitive* foo = test::getValue<BinaryPrimitive>(&finalTable, u"@com.app.a:bool/foo"); + BinaryPrimitive* foo = test::getValue<BinaryPrimitive>(&finalTable, "com.app.a:bool/foo"); ASSERT_NE(nullptr, foo); EXPECT_EQ(0x0u, foo->value.data); } +TEST_F(TableMergerTest, OverrideSameResourceIdsWithOverlay) { + std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder() + .setPackageId("", 0x7f) + .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), SymbolState::kPublic) + .build(); + std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder() + .setPackageId("", 0x7f) + .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), SymbolState::kPublic) + .build(); + + ResourceTable finalTable; + TableMergerOptions tableMergerOptions; + tableMergerOptions.autoAddOverlay = false; + TableMerger merger(mContext.get(), &finalTable, tableMergerOptions); + + ASSERT_TRUE(merger.merge({}, base.get())); + ASSERT_TRUE(merger.mergeOverlay({}, overlay.get())); +} + +TEST_F(TableMergerTest, FailToOverrideConflictingTypeIdsWithOverlay) { + std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder() + .setPackageId("", 0x7f) + .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), SymbolState::kPublic) + .build(); + std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder() + .setPackageId("", 0x7f) + .setSymbolState("bool/foo", ResourceId(0x7f, 0x02, 0x0001), SymbolState::kPublic) + .build(); + + ResourceTable finalTable; + TableMergerOptions tableMergerOptions; + tableMergerOptions.autoAddOverlay = false; + TableMerger merger(mContext.get(), &finalTable, tableMergerOptions); + + ASSERT_TRUE(merger.merge({}, base.get())); + ASSERT_FALSE(merger.mergeOverlay({}, overlay.get())); +} + +TEST_F(TableMergerTest, FailToOverrideConflictingEntryIdsWithOverlay) { + std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder() + .setPackageId("", 0x7f) + .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0001), SymbolState::kPublic) + .build(); + std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder() + .setPackageId("", 0x7f) + .setSymbolState("bool/foo", ResourceId(0x7f, 0x01, 0x0002), SymbolState::kPublic) + .build(); + + ResourceTable finalTable; + TableMergerOptions tableMergerOptions; + tableMergerOptions.autoAddOverlay = false; + TableMerger merger(mContext.get(), &finalTable, tableMergerOptions); + + ASSERT_TRUE(merger.merge({}, base.get())); + ASSERT_FALSE(merger.mergeOverlay({}, overlay.get())); +} + TEST_F(TableMergerTest, MergeAddResourceFromOverlay) { std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder() - .setPackageId(u"", 0x7f) - .setSymbolState(u"@bool/foo", {}, SymbolState::kUndefined) + .setPackageId("", 0x7f) + .setSymbolState("bool/foo", {}, SymbolState::kUndefined) .build(); std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder() - .setPackageId(u"", 0x7f) - .addValue(u"@bool/foo", ResourceUtils::tryParseBool(u"true")) + .setPackageId("", 0x7f) + .addValue("bool/foo", ResourceUtils::tryParseBool("true")) .build(); ResourceTable finalTable; @@ -183,11 +240,11 @@ TEST_F(TableMergerTest, MergeAddResourceFromOverlay) { TEST_F(TableMergerTest, MergeAddResourceFromOverlayWithAutoAddOverlay) { std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder() - .setPackageId(u"", 0x7f) + .setPackageId("", 0x7f) .build(); std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder() - .setPackageId(u"", 0x7f) - .addValue(u"@bool/foo", ResourceUtils::tryParseBool(u"true")) + .setPackageId("", 0x7f) + .addValue("bool/foo", ResourceUtils::tryParseBool("true")) .build(); ResourceTable finalTable; @@ -201,11 +258,11 @@ TEST_F(TableMergerTest, MergeAddResourceFromOverlayWithAutoAddOverlay) { TEST_F(TableMergerTest, FailToMergeNewResourceWithoutAutoAddOverlay) { std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder() - .setPackageId(u"", 0x7f) + .setPackageId("", 0x7f) .build(); std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder() - .setPackageId(u"", 0x7f) - .addValue(u"@bool/foo", ResourceUtils::tryParseBool(u"true")) + .setPackageId("", 0x7f) + .addValue("bool/foo", ResourceUtils::tryParseBool("true")) .build(); ResourceTable finalTable; @@ -217,4 +274,43 @@ TEST_F(TableMergerTest, FailToMergeNewResourceWithoutAutoAddOverlay) { ASSERT_FALSE(merger.mergeOverlay({}, tableB.get())); } +TEST_F(TableMergerTest, OverlaidStyleablesShouldBeMerged) { + std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder() + .setPackageId("com.app.a", 0x7f) + .addValue("com.app.a:styleable/Foo", test::StyleableBuilder() + .addItem("com.app.a:attr/bar") + .addItem("com.app.a:attr/foo", ResourceId(0x01010000)) + .build()) + .build(); + + std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder() + .setPackageId("com.app.a", 0x7f) + .addValue("com.app.a:styleable/Foo", test::StyleableBuilder() + .addItem("com.app.a:attr/bat") + .addItem("com.app.a:attr/foo") + .build()) + .build(); + + ResourceTable finalTable; + TableMergerOptions options; + options.autoAddOverlay = true; + TableMerger merger(mContext.get(), &finalTable, options); + + ASSERT_TRUE(merger.merge({}, tableA.get())); + ASSERT_TRUE(merger.mergeOverlay({}, tableB.get())); + + Debug::printTable(&finalTable, {}); + + Styleable* styleable = test::getValue<Styleable>(&finalTable, "com.app.a:styleable/Foo"); + ASSERT_NE(nullptr, styleable); + + std::vector<Reference> expectedRefs = { + Reference(test::parseNameOrDie("com.app.a:attr/bar")), + Reference(test::parseNameOrDie("com.app.a:attr/bat")), + Reference(test::parseNameOrDie("com.app.a:attr/foo"), ResourceId(0x01010000)), + }; + + EXPECT_EQ(expectedRefs, styleable->entries); +} + } // namespace aapt |