11ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski/*
21ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Copyright (C) 2015 The Android Open Source Project
31ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski *
41ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
51ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * you may not use this file except in compliance with the License.
61ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * You may obtain a copy of the License at
71ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski *
81ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
91ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski *
101ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * Unless required by applicable law or agreed to in writing, software
111ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
121ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * See the License for the specific language governing permissions and
141ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski * limitations under the License.
151ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski */
161ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
17467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#include "link/ReferenceLinker.h"
1864587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski#include "test/Test.h"
191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
2064587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinskiusing android::ResTable_map;
211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
221ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskinamespace aapt {
231ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
241ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(ReferenceLinkerTest, LinkSimpleReferences) {
251ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
261ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setPackageId(u"com.app.test", 0x7f)
271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .addReference(u"@com.app.test:string/foo", ResourceId(0x7f020000),
281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                          u"@com.app.test:string/bar")
291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            // Test use of local reference (w/o package name).
311ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .addReference(u"@com.app.test:string/bar", ResourceId(0x7f020001), u"@string/baz")
321ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .addReference(u"@com.app.test:string/baz", ResourceId(0x7f020002),
341ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                          u"@android:string/ok")
351ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .build();
361ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setCompilationPackage(u"com.app.test")
391ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setPackageId(0x7f)
401ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"com.app.test" })
4164587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
4264587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski            .addSymbolSource(test::StaticSymbolSourceBuilder()
4364587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .addPublicSymbol(u"@android:string/ok", ResourceId(0x01040034))
4464587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .build())
451ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .build();
461ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
471ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ReferenceLinker linker;
481ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ASSERT_TRUE(linker.consume(context.get(), table.get()));
491ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
501ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    Reference* ref = test::getValue<Reference>(table.get(), u"@com.app.test:string/foo");
511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ASSERT_NE(ref, nullptr);
521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    AAPT_ASSERT_TRUE(ref->id);
531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_EQ(ref->id.value(), ResourceId(0x7f020001));
541ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
551ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ref = test::getValue<Reference>(table.get(), u"@com.app.test:string/bar");
561ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ASSERT_NE(ref, nullptr);
571ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    AAPT_ASSERT_TRUE(ref->id);
581ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_EQ(ref->id.value(), ResourceId(0x7f020002));
591ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
601ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ref = test::getValue<Reference>(table.get(), u"@com.app.test:string/baz");
611ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ASSERT_NE(ref, nullptr);
621ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    AAPT_ASSERT_TRUE(ref->id);
631ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_EQ(ref->id.value(), ResourceId(0x01040034));
641ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}
651ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
661ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(ReferenceLinkerTest, LinkStyleAttributes) {
671ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
681ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setPackageId(u"com.app.test", 0x7f)
691ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .addValue(u"@com.app.test:style/Theme", test::StyleBuilder()
701ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                    .setParent(u"@android:style/Theme.Material")
711ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                    .addItem(u"@android:attr/foo", ResourceUtils::tryParseColor(u"#ff00ff"))
721ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                    .addItem(u"@android:attr/bar", {} /* placeholder */)
731ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                    .build())
741ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .build();
751ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
761ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    {
771ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        // We need to fill in the value for the attribute android:attr/bar after we build the
781ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        // table, because we need access to the string pool.
791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        Style* style = test::getValue<Style>(table.get(), u"@com.app.test:style/Theme");
801ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        ASSERT_NE(style, nullptr);
811ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski        style->entries.back().value = util::make_unique<RawString>(
821ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                table->stringPool.makeRef(u"one|two"));
831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    }
841ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
851ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
861ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setCompilationPackage(u"com.app.test")
871ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setPackageId(0x7f)
881ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"com.app.test" })
8964587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski            .addSymbolSource(test::StaticSymbolSourceBuilder()
9064587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .addPublicSymbol(u"@android:style/Theme.Material",
9164587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                      ResourceId(0x01060000))
9264587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .addPublicSymbol(u"@android:attr/foo", ResourceId(0x01010001),
9364587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                      test::AttributeBuilder()
9464587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                              .setTypeMask(ResTable_map::TYPE_COLOR)
9564587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                              .build())
9664587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .addPublicSymbol(u"@android:attr/bar", ResourceId(0x01010002),
9764587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                      test::AttributeBuilder()
9864587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                              .setTypeMask(ResTable_map::TYPE_FLAGS)
9964587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                              .addItem(u"one", 0x01)
10064587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                              .addItem(u"two", 0x02)
10164587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                              .build())
10264587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .build())
1031ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .build();
1041ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1051ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ReferenceLinker linker;
1061ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ASSERT_TRUE(linker.consume(context.get(), table.get()));
1071ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1081ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    Style* style = test::getValue<Style>(table.get(), u"@com.app.test:style/Theme");
1091ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ASSERT_NE(style, nullptr);
1101ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    AAPT_ASSERT_TRUE(style->parent);
1111ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    AAPT_ASSERT_TRUE(style->parent.value().id);
1121ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_EQ(style->parent.value().id.value(), ResourceId(0x01060000));
1131ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1141ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ASSERT_EQ(2u, style->entries.size());
1151ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1161ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    AAPT_ASSERT_TRUE(style->entries[0].key.id);
1171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_EQ(style->entries[0].key.id.value(), ResourceId(0x01010001));
1181ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ASSERT_NE(valueCast<BinaryPrimitive>(style->entries[0].value.get()), nullptr);
1191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    AAPT_ASSERT_TRUE(style->entries[1].key.id);
1211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_EQ(style->entries[1].key.id.value(), ResourceId(0x01010002));
1221ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ASSERT_NE(valueCast<BinaryPrimitive>(style->entries[1].value.get()), nullptr);
1231ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}
1241ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1251ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(ReferenceLinkerTest, LinkMangledReferencesAndAttributes) {
1261ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
1271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setCompilationPackage(u"com.app.test")
1281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setPackageId(0x7f)
1291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"com.app.test", { u"com.android.support" } })
13064587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski            .addSymbolSource(test::StaticSymbolSourceBuilder()
13164587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .addPublicSymbol(u"@com.app.test:attr/com.android.support$foo",
13264587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                      ResourceId(0x7f010000),
13364587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                      test::AttributeBuilder()
13464587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                              .setTypeMask(ResTable_map::TYPE_COLOR)
13564587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                              .build())
13664587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .build())
1371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .build();
1381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1391ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
1401ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .setPackageId(u"com.app.test", 0x7f)
1411ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .addValue(u"@com.app.test:style/Theme", ResourceId(0x7f020000),
1421ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                      test::StyleBuilder().addItem(u"@com.android.support:attr/foo",
1431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                                   ResourceUtils::tryParseColor(u"#ff0000"))
1441ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski                                          .build())
1451ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski            .build();
1461ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1471ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ReferenceLinker linker;
1481ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ASSERT_TRUE(linker.consume(context.get(), table.get()));
1491ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
1501ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    Style* style = test::getValue<Style>(table.get(), u"@com.app.test:style/Theme");
1511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ASSERT_NE(style, nullptr);
1521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    ASSERT_EQ(1u, style->entries.size());
1531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    AAPT_ASSERT_TRUE(style->entries.front().key.id);
1541ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski    EXPECT_EQ(style->entries.front().key.id.value(), ResourceId(0x7f010000));
1551ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}
1561ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
157467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam LesinskiTEST(ReferenceLinkerTest, FailToLinkPrivateSymbols) {
158467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
159467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .setPackageId(u"com.app.test", 0x7f)
160467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .addReference(u"@com.app.test:string/foo", ResourceId(0x7f020000),
161467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski                          u"@android:string/hidden")
162467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .build();
163467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
164467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
165467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .setCompilationPackage(u"com.app.test")
166467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .setPackageId(0x7f)
167467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"com.app.test" })
16864587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
16964587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski            .addSymbolSource(test::StaticSymbolSourceBuilder()
17064587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .addSymbol(u"@android:string/hidden", ResourceId(0x01040034))
17164587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .build())
172467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .build();
173467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
174467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    ReferenceLinker linker;
175467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    ASSERT_FALSE(linker.consume(context.get(), table.get()));
176467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski}
177467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
178467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam LesinskiTEST(ReferenceLinkerTest, FailToLinkPrivateMangledSymbols) {
179467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
180467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .setPackageId(u"com.app.test", 0x7f)
181467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .addReference(u"@com.app.test:string/foo", ResourceId(0x7f020000),
182467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski                          u"@com.app.lib:string/hidden")
183467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .build();
184467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
185467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
186467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .setCompilationPackage(u"com.app.test")
187467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .setPackageId(0x7f)
188467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"com.app.test", { u"com.app.lib" } })
18964587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
19064587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski            .addSymbolSource(test::StaticSymbolSourceBuilder()
19164587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .addSymbol(u"@com.app.test:string/com.app.lib$hidden",
19264587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                ResourceId(0x7f040034))
19364587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .build())
19464587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski
195467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .build();
196467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
197467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    ReferenceLinker linker;
198467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    ASSERT_FALSE(linker.consume(context.get(), table.get()));
199467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski}
200467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
201467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam LesinskiTEST(ReferenceLinkerTest, FailToLinkPrivateStyleAttributes) {
202467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
203467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .setPackageId(u"com.app.test", 0x7f)
204467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .addValue(u"@com.app.test:style/Theme", test::StyleBuilder()
205467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski                    .addItem(u"@android:attr/hidden", ResourceUtils::tryParseColor(u"#ff00ff"))
206467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski                    .build())
207467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .build();
208467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
209467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder()
210467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .setCompilationPackage(u"com.app.test")
211467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .setPackageId(0x7f)
212467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .setNameManglerPolicy(NameManglerPolicy{ u"com.app.test" })
21364587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski            .addSymbolSource(util::make_unique<ResourceTableSymbolSource>(table.get()))
21464587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski            .addSymbolSource(test::StaticSymbolSourceBuilder()
21564587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .addSymbol(u"@android:attr/hidden", ResourceId(0x01010001),
21664587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                test::AttributeBuilder()
21764587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                        .setTypeMask(
21864587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                                android::ResTable_map::TYPE_COLOR)
21964587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                                        .build())
22064587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                                     .build())
221467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski            .build();
222467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
223467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    ReferenceLinker linker;
224467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    ASSERT_FALSE(linker.consume(context.get(), table.get()));
225467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski}
226467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski
2271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} // namespace aapt
228