Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a1f8dbd authored by Alexandria Cornwall's avatar Alexandria Cornwall
Browse files

AAPT2: Fix resource type id symbol merging

By the looks of things, AAPT2 should be able to merge public type and entry
symbols iff their types and resource IDs match.

Change-Id: Ie99071418aa89aad56de5e5b96e98b96d0d15d7a
parent ce656462
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -142,7 +142,7 @@ bool TableMerger::doMerge(const Source& src,
        ResourceTableType* dstType = mMasterPackage->findOrCreateType(srcType->type);
        if (srcType->symbolStatus.state == SymbolState::kPublic) {
            if (dstType->symbolStatus.state == SymbolState::kPublic && dstType->id && srcType->id
                    && dstType->id.value() == srcType->id.value()) {
                    && dstType->id.value() != srcType->id.value()) {
                // Both types are public and have different IDs.
                mContext->getDiagnostics()->error(DiagMessage(src)
                                                  << "can not merge type '"
+57 −0
Original line number Diff line number Diff line
@@ -164,6 +164,63 @@ TEST_F(TableMergerTest, OverrideResourceWithOverlay) {
    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("", 0x7f)