blob: 1697217222407bae40148e20902c4e2e7f4a8ebf [file] [log] [blame]
Adam Lesinski1ab598f2015-08-14 14:26:04 -07001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Adam Lesinski6a008172016-02-02 17:02:58 -080017#include "filter/ConfigFilter.h"
Adam Lesinskia6fe3452015-12-09 15:20:52 -080018#include "io/FileSystem.h"
Adam Lesinski1ab598f2015-08-14 14:26:04 -070019#include "link/TableMerger.h"
Adam Lesinski1ab598f2015-08-14 14:26:04 -070020#include "test/Builders.h"
21#include "test/Context.h"
22
23#include <gtest/gtest.h>
24
25namespace aapt {
26
27struct TableMergerTest : public ::testing::Test {
28 std::unique_ptr<IAaptContext> mContext;
29
30 void SetUp() override {
31 mContext = test::ContextBuilder()
32 // We are compiling this package.
Adam Lesinskid0f116b2016-07-08 15:00:32 -070033 .setCompilationPackage("com.app.a")
Adam Lesinski1ab598f2015-08-14 14:26:04 -070034
35 // Merge all packages that have this package ID.
36 .setPackageId(0x7f)
37
38 // Mangle all packages that do not have this package name.
Adam Lesinskid0f116b2016-07-08 15:00:32 -070039 .setNameManglerPolicy(NameManglerPolicy{ "com.app.a", { "com.app.b" } })
Adam Lesinski1ab598f2015-08-14 14:26:04 -070040
41 .build();
42 }
43};
44
45TEST_F(TableMergerTest, SimpleMerge) {
46 std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
Adam Lesinskid0f116b2016-07-08 15:00:32 -070047 .setPackageId("com.app.a", 0x7f)
48 .addReference("@com.app.a:id/foo", "@com.app.a:id/bar")
49 .addReference("@com.app.a:id/bar", "@com.app.b:id/foo")
50 .addValue("@com.app.a:styleable/view", test::StyleableBuilder()
51 .addItem("@com.app.b:id/foo")
Adam Lesinski1ab598f2015-08-14 14:26:04 -070052 .build())
53 .build();
54
55 std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
Adam Lesinskid0f116b2016-07-08 15:00:32 -070056 .setPackageId("com.app.b", 0x7f)
57 .addSimple("@com.app.b:id/foo")
Adam Lesinski1ab598f2015-08-14 14:26:04 -070058 .build();
59
60 ResourceTable finalTable;
Adam Lesinskia6fe3452015-12-09 15:20:52 -080061 TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
62 io::FileCollection collection;
Adam Lesinski1ab598f2015-08-14 14:26:04 -070063
Adam Lesinskia6fe3452015-12-09 15:20:52 -080064 ASSERT_TRUE(merger.merge({}, tableA.get()));
Adam Lesinskid0f116b2016-07-08 15:00:32 -070065 ASSERT_TRUE(merger.mergeAndMangle({}, "com.app.b", tableB.get(), &collection));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070066
Adam Lesinskid0f116b2016-07-08 15:00:32 -070067 EXPECT_TRUE(merger.getMergedPackages().count("com.app.b") != 0);
Adam Lesinski1ab598f2015-08-14 14:26:04 -070068
69 // Entries from com.app.a should not be mangled.
Adam Lesinskid0f116b2016-07-08 15:00:32 -070070 AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("@com.app.a:id/foo")));
71 AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("@com.app.a:id/bar")));
72 AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("@com.app.a:styleable/view")));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070073
74 // The unmangled name should not be present.
Adam Lesinskid0f116b2016-07-08 15:00:32 -070075 AAPT_EXPECT_FALSE(finalTable.findResource(test::parseNameOrDie("@com.app.b:id/foo")));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070076
77 // Look for the mangled name.
Adam Lesinskid0f116b2016-07-08 15:00:32 -070078 AAPT_EXPECT_TRUE(finalTable.findResource(test::parseNameOrDie("@com.app.a:id/com.app.b$foo")));
Adam Lesinski1ab598f2015-08-14 14:26:04 -070079}
80
Adam Lesinskia6fe3452015-12-09 15:20:52 -080081TEST_F(TableMergerTest, MergeFile) {
82 ResourceTable finalTable;
83 TableMergerOptions options;
84 options.autoAddOverlay = false;
85 TableMerger merger(mContext.get(), &finalTable, options);
86
87 ResourceFile fileDesc;
88 fileDesc.config = test::parseConfigOrDie("hdpi-v4");
Adam Lesinskid0f116b2016-07-08 15:00:32 -070089 fileDesc.name = test::parseNameOrDie("@layout/main");
Adam Lesinskia6fe3452015-12-09 15:20:52 -080090 fileDesc.source = Source("res/layout-hdpi/main.xml");
91 test::TestFile testFile("path/to/res/layout-hdpi/main.xml.flat");
92
93 ASSERT_TRUE(merger.mergeFile(fileDesc, &testFile));
94
95 FileReference* file = test::getValueForConfig<FileReference>(&finalTable,
Adam Lesinskid0f116b2016-07-08 15:00:32 -070096 "@com.app.a:layout/main",
Adam Lesinskia6fe3452015-12-09 15:20:52 -080097 test::parseConfigOrDie("hdpi-v4"));
98 ASSERT_NE(nullptr, file);
Adam Lesinskid0f116b2016-07-08 15:00:32 -070099 EXPECT_EQ(std::string("res/layout-hdpi-v4/main.xml"), *file->path);
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800100}
101
102TEST_F(TableMergerTest, MergeFileOverlay) {
103 ResourceTable finalTable;
104 TableMergerOptions tableMergerOptions;
105 tableMergerOptions.autoAddOverlay = false;
106 TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
107
108 ResourceFile fileDesc;
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700109 fileDesc.name = test::parseNameOrDie("@xml/foo");
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800110 test::TestFile fileA("path/to/fileA.xml.flat");
111 test::TestFile fileB("path/to/fileB.xml.flat");
112
113 ASSERT_TRUE(merger.mergeFile(fileDesc, &fileA));
114 ASSERT_TRUE(merger.mergeFileOverlay(fileDesc, &fileB));
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800115}
116
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700117TEST_F(TableMergerTest, MergeFileReferences) {
118 std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700119 .setPackageId("com.app.a", 0x7f)
120 .addFileReference("@com.app.a:xml/file", "res/xml/file.xml")
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700121 .build();
122 std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700123 .setPackageId("com.app.b", 0x7f)
124 .addFileReference("@com.app.b:xml/file", "res/xml/file.xml")
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700125 .build();
126
127 ResourceTable finalTable;
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800128 TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
129 io::FileCollection collection;
130 collection.insertFile("res/xml/file.xml");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700131
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800132 ASSERT_TRUE(merger.merge({}, tableA.get()));
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700133 ASSERT_TRUE(merger.mergeAndMangle({}, "com.app.b", tableB.get(), &collection));
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700134
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700135 FileReference* f = test::getValue<FileReference>(&finalTable, "@com.app.a:xml/file");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700136 ASSERT_NE(f, nullptr);
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700137 EXPECT_EQ(std::string("res/xml/file.xml"), *f->path);
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700138
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700139 f = test::getValue<FileReference>(&finalTable, "@com.app.a:xml/com.app.b$file");
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700140 ASSERT_NE(f, nullptr);
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700141 EXPECT_EQ(std::string("res/xml/com.app.b$file.xml"), *f->path);
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800142}
143
144TEST_F(TableMergerTest, OverrideResourceWithOverlay) {
145 std::unique_ptr<ResourceTable> base = test::ResourceTableBuilder()
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700146 .setPackageId("", 0x00)
147 .addValue("@bool/foo", ResourceUtils::tryParseBool("true"))
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800148 .build();
149 std::unique_ptr<ResourceTable> overlay = test::ResourceTableBuilder()
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700150 .setPackageId("", 0x00)
151 .addValue("@bool/foo", ResourceUtils::tryParseBool("false"))
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800152 .build();
153
154 ResourceTable finalTable;
155 TableMergerOptions tableMergerOptions;
156 tableMergerOptions.autoAddOverlay = false;
157 TableMerger merger(mContext.get(), &finalTable, tableMergerOptions);
158
159 ASSERT_TRUE(merger.merge({}, base.get()));
160 ASSERT_TRUE(merger.mergeOverlay({}, overlay.get()));
161
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700162 BinaryPrimitive* foo = test::getValue<BinaryPrimitive>(&finalTable, "@com.app.a:bool/foo");
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800163 ASSERT_NE(nullptr, foo);
164 EXPECT_EQ(0x0u, foo->value.data);
165}
166
167TEST_F(TableMergerTest, MergeAddResourceFromOverlay) {
168 std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700169 .setPackageId("", 0x7f)
170 .setSymbolState("@bool/foo", {}, SymbolState::kUndefined)
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800171 .build();
172 std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700173 .setPackageId("", 0x7f)
174 .addValue("@bool/foo", ResourceUtils::tryParseBool("true"))
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800175 .build();
176
177 ResourceTable finalTable;
178 TableMerger merger(mContext.get(), &finalTable, TableMergerOptions{});
179
180 ASSERT_TRUE(merger.merge({}, tableA.get()));
181 ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
182}
183
184TEST_F(TableMergerTest, MergeAddResourceFromOverlayWithAutoAddOverlay) {
185 std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700186 .setPackageId("", 0x7f)
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800187 .build();
188 std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700189 .setPackageId("", 0x7f)
190 .addValue("@bool/foo", ResourceUtils::tryParseBool("true"))
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800191 .build();
192
193 ResourceTable finalTable;
194 TableMergerOptions options;
195 options.autoAddOverlay = true;
196 TableMerger merger(mContext.get(), &finalTable, options);
197
198 ASSERT_TRUE(merger.merge({}, tableA.get()));
199 ASSERT_TRUE(merger.mergeOverlay({}, tableB.get()));
200}
201
202TEST_F(TableMergerTest, FailToMergeNewResourceWithoutAutoAddOverlay) {
203 std::unique_ptr<ResourceTable> tableA = test::ResourceTableBuilder()
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700204 .setPackageId("", 0x7f)
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800205 .build();
206 std::unique_ptr<ResourceTable> tableB = test::ResourceTableBuilder()
Adam Lesinskid0f116b2016-07-08 15:00:32 -0700207 .setPackageId("", 0x7f)
208 .addValue("@bool/foo", ResourceUtils::tryParseBool("true"))
Adam Lesinskia6fe3452015-12-09 15:20:52 -0800209 .build();
210
211 ResourceTable finalTable;
212 TableMergerOptions options;
213 options.autoAddOverlay = false;
214 TableMerger merger(mContext.get(), &finalTable, options);
215
216 ASSERT_TRUE(merger.merge({}, tableA.get()));
217 ASSERT_FALSE(merger.mergeOverlay({}, tableB.get()));
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700218}
219
Adam Lesinski1ab598f2015-08-14 14:26:04 -0700220} // namespace aapt