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
171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "link/Linkers.h"
18ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski
19d0f116b619feede0cfdb647157ce5ab4d50a1c46Adam Lesinski#include "test/Test.h"
201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskinamespace aapt {
221ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
231ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST(PrivateAttributeMoverTest, MovePrivateAttributes) {
24ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
251ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
26cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<ResourceTable> table =
27cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      test::ResourceTableBuilder()
28ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:attr/publicA")
29ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:attr/privateA")
30ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:attr/publicB")
31ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .AddSimple("android:attr/privateB")
32ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetSymbolState("android:attr/publicA", ResourceId(0x01010000),
33cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          SymbolState::kPublic)
34ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .SetSymbolState("android:attr/publicB", ResourceId(0x01010000),
35cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          SymbolState::kPublic)
36ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski          .Build();
371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
38cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  PrivateAttributeMover mover;
39ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_TRUE(mover.Consume(context.get(), table.get()));
401ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
41ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ResourceTablePackage* package = table->FindPackage("android");
42cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(package, nullptr);
431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
44ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ResourceTableType* type = package->FindType(ResourceType::kAttr);
45cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(type, nullptr);
46cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_EQ(type->entries.size(), 2u);
47ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(type->FindEntry("publicA"), nullptr);
48ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(type->FindEntry("publicB"), nullptr);
491ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
50ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  type = package->FindType(ResourceType::kAttrPrivate);
51cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(type, nullptr);
52cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_EQ(type->entries.size(), 2u);
53ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(type->FindEntry("privateA"), nullptr);
54ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(type->FindEntry("privateB"), nullptr);
551ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}
561ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
57ceb9b2f80f853059233cdd29057f39a5960a74aeAdam LesinskiTEST(PrivateAttributeMoverTest, LeavePrivateAttributesWhenNoPublicAttributesDefined) {
58ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
591ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
60cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
61ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                             .AddSimple("android:attr/privateA")
62ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                             .AddSimple("android:attr/privateB")
63ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                                             .Build();
641ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
65cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  PrivateAttributeMover mover;
66ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_TRUE(mover.Consume(context.get(), table.get()));
671ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
68ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ResourceTablePackage* package = table->FindPackage("android");
69cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(package, nullptr);
701ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
71ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ResourceTableType* type = package->FindType(ResourceType::kAttr);
72cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(type, nullptr);
73cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_EQ(type->entries.size(), 2u);
741ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
75ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  type = package->FindType(ResourceType::kAttrPrivate);
76cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_EQ(type, nullptr);
771ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}
781ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski
79ceb9b2f80f853059233cdd29057f39a5960a74aeAdam LesinskiTEST(PrivateAttributeMoverTest, DoNotCreatePrivateAttrsIfNoneExist) {
80ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
81ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  std::unique_ptr<ResourceTable> table =
82ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski      test::ResourceTableBuilder()
83ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski          .AddSimple("android:attr/pub")
84ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski          .SetSymbolState("android:attr/pub", ResourceId(0x01010000), SymbolState::kPublic)
85ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski          .Build();
86ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski
87ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  ResourceTablePackage* package = table->FindPackage("android");
88ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  ASSERT_NE(nullptr, package);
89ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski
90ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  ASSERT_EQ(nullptr, package->FindType(ResourceType::kAttrPrivate));
91ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski
92ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  PrivateAttributeMover mover;
93ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  ASSERT_TRUE(mover.Consume(context.get(), table.get()));
94ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski
95ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski  ASSERT_EQ(nullptr, package->FindType(ResourceType::kAttrPrivate));
96ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski}
97ceb9b2f80f853059233cdd29057f39a5960a74aeAdam Lesinski
98cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace aapt
99