diff options
Diffstat (limited to 'tools/aapt2/compile/IdAssigner_test.cpp')
-rw-r--r-- | tools/aapt2/compile/IdAssigner_test.cpp | 202 |
1 files changed, 113 insertions, 89 deletions
diff --git a/tools/aapt2/compile/IdAssigner_test.cpp b/tools/aapt2/compile/IdAssigner_test.cpp index 5cff0048c062..663776645990 100644 --- a/tools/aapt2/compile/IdAssigner_test.cpp +++ b/tools/aapt2/compile/IdAssigner_test.cpp @@ -20,42 +20,40 @@ namespace aapt { -::testing::AssertionResult VerifyIds(ResourceTable* table); +struct IdAssignerTests : public ::testing::Test { + void SetUp() override { + context = test::ContextBuilder().SetCompilationPackage("android").SetPackageId(0x01).Build(); + } + std::unique_ptr<IAaptContext> context; +}; -TEST(IdAssignerTest, AssignIds) { - std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder() - .AddSimple("android:attr/foo") - .AddSimple("android:attr/bar") - .AddSimple("android:id/foo") - .SetPackageId("android", 0x01) - .Build(); +::testing::AssertionResult VerifyIds(ResourceTable* table); - std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); +TEST_F(IdAssignerTests, AssignIds) { + auto table = test::ResourceTableBuilder() + .AddSimple("android:attr/foo") + .AddSimple("android:attr/bar") + .AddSimple("android:id/foo") + .Build(); IdAssigner assigner; ASSERT_TRUE(assigner.Consume(context.get(), table.get())); ASSERT_TRUE(VerifyIds(table.get())); } -TEST(IdAssignerTest, AssignIdsWithReservedIds) { - std::unique_ptr<ResourceTable> table = - test::ResourceTableBuilder() - .AddSimple("android:id/foo", ResourceId(0x01010000)) - .AddSimple("android:dimen/two") - .AddSimple("android:integer/three") - .AddSimple("android:string/five") - .AddSimple("android:attr/fun", ResourceId(0x01040000)) - .AddSimple("android:attr/foo", ResourceId(0x01040006)) - .AddSimple("android:attr/bar") - .AddSimple("android:attr/baz") - .AddSimple("app:id/biz") - .SetPackageId("android", 0x01) - .SetPackageId("app", 0x7f) - .Build(); - - std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); - IdAssigner assigner; +TEST_F(IdAssignerTests, AssignIdsWithReservedIds) { + auto table = test::ResourceTableBuilder() + .AddSimple("android:id/foo", ResourceId(0x01010000)) + .AddSimple("android:dimen/two") + .AddSimple("android:integer/three") + .AddSimple("android:string/five") + .AddSimple("android:attr/fun", ResourceId(0x01040000)) + .AddSimple("android:attr/foo", ResourceId(0x01040006)) + .AddSimple("android:attr/bar") + .AddSimple("android:attr/baz") + .Build(); + IdAssigner assigner; ASSERT_TRUE(assigner.Consume(context.get(), table.get())); ASSERT_TRUE(VerifyIds(table.get())); @@ -65,12 +63,12 @@ TEST(IdAssignerTest, AssignIdsWithReservedIds) { maybe_result = table->FindResource(test::ParseNameOrDie("android:dimen/two")); ASSERT_TRUE(maybe_result); - EXPECT_EQ(make_value<uint8_t>(2), maybe_result.value().type->id); + EXPECT_EQ(make_value<ResourceId>(0x01020000), maybe_result.value().entry->id); maybe_result = table->FindResource(test::ParseNameOrDie("android:integer/three")); ASSERT_TRUE(maybe_result); - EXPECT_EQ(make_value<uint8_t>(3), maybe_result.value().type->id); + EXPECT_EQ(make_value<ResourceId>(0x01030000), maybe_result.value().entry->id); // Expect to bypass the reserved 0x0104XXXX IDs and use the next 0x0105XXXX // IDs. @@ -78,107 +76,133 @@ TEST(IdAssignerTest, AssignIdsWithReservedIds) { maybe_result = table->FindResource(test::ParseNameOrDie("android:string/five")); ASSERT_TRUE(maybe_result); - EXPECT_EQ(make_value<uint8_t>(5), maybe_result.value().type->id); + EXPECT_EQ(make_value<ResourceId>(0x01050000), maybe_result.value().entry->id); // Expect to fill in the gaps between 0x01040000 and 0x01040006. maybe_result = table->FindResource(test::ParseNameOrDie("android:attr/bar")); ASSERT_TRUE(maybe_result); - EXPECT_EQ(make_value<uint16_t>(1), maybe_result.value().entry->id); + EXPECT_EQ(make_value<ResourceId>(0x01040001), maybe_result.value().entry->id); maybe_result = table->FindResource(test::ParseNameOrDie("android:attr/baz")); ASSERT_TRUE(maybe_result); - EXPECT_EQ(make_value<uint16_t>(2), maybe_result.value().entry->id); + EXPECT_EQ(make_value<ResourceId>(0x01040002), maybe_result.value().entry->id); } -TEST(IdAssignerTest, FailWhenNonUniqueIdsAssigned) { - std::unique_ptr<ResourceTable> table = - test::ResourceTableBuilder() - .AddSimple("android:attr/foo", ResourceId(0x01040006)) - .AddSimple("android:attr/bar", ResourceId(0x01040006)) - .SetPackageId("android", 0x01) - .SetPackageId("app", 0x7f) - .Build(); +TEST_F(IdAssignerTests, FailWhenNonUniqueIdsAssigned) { + auto table = test::ResourceTableBuilder() + .AddSimple("android:attr/foo", ResourceId(0x01040006)) + .AddSimple("android:attr/bar", ResourceId(0x01040006)) + .Build(); + IdAssigner assigner; + ASSERT_FALSE(assigner.Consume(context.get(), table.get())); +} - std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); +TEST_F(IdAssignerTests, FailWhenNonUniqueTypeIdsAssigned) { + auto table = test::ResourceTableBuilder() + .AddSimple("android:string/foo", ResourceId(0x01040000)) + .AddSimple("android:attr/bar", ResourceId(0x01040006)) + .Build(); IdAssigner assigner; + ASSERT_FALSE(assigner.Consume(context.get(), table.get())); +} +TEST_F(IdAssignerTests, FailWhenTypeHasTwoNonStagedIds) { + auto table = test::ResourceTableBuilder() + .AddSimple("android:attr/foo", ResourceId(0x01050000)) + .AddSimple("android:attr/bar", ResourceId(0x01040006)) + .Build(); + IdAssigner assigner; ASSERT_FALSE(assigner.Consume(context.get(), table.get())); } -TEST(IdAssignerTest, AssignIdsWithIdMap) { - std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder() - .AddSimple("android:attr/foo") - .AddSimple("android:attr/bar") - .SetPackageId("android", 0x01) - .Build(); +TEST_F(IdAssignerTests, FailWhenTypeHasTwoNonStagedIdsRegardlessOfStagedId) { + auto table = test::ResourceTableBuilder() + .AddSimple("android:attr/foo", ResourceId(0x01050000)) + .AddSimple("android:attr/bar", ResourceId(0x01ff0006)) + .Add(NewResourceBuilder("android:attr/staged_baz") + .SetId(0x01ff0000) + .SetVisibility({.staged_api = true}) + .Build()) + .Build(); + IdAssigner assigner; + ASSERT_FALSE(assigner.Consume(context.get(), table.get())); +} - std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); +TEST_F(IdAssignerTests, AssignIdsWithIdMap) { + auto table = test::ResourceTableBuilder() + .AddSimple("android:attr/foo") + .AddSimple("android:attr/bar") + .Build(); std::unordered_map<ResourceName, ResourceId> id_map = { {test::ParseNameOrDie("android:attr/foo"), ResourceId(0x01010002)}}; IdAssigner assigner(&id_map); ASSERT_TRUE(assigner.Consume(context.get(), table.get())); ASSERT_TRUE(VerifyIds(table.get())); - Maybe<ResourceTable::SearchResult> result = - table->FindResource(test::ParseNameOrDie("android:attr/foo")); + auto result = table->FindResource(test::ParseNameOrDie("android:attr/foo")); ASSERT_TRUE(result); const ResourceTable::SearchResult& search_result = result.value(); - EXPECT_EQ(make_value<uint8_t>(0x01), search_result.package->id); - EXPECT_EQ(make_value<uint8_t>(0x01), search_result.type->id); - EXPECT_EQ(make_value<uint16_t>(0x0002), search_result.entry->id); + EXPECT_EQ(make_value<ResourceId>(0x01010002), search_result.entry->id); } -::testing::AssertionResult VerifyIds(ResourceTable* table) { - std::set<uint8_t> package_ids; - for (auto& package : table->packages) { - if (!package->id) { - return ::testing::AssertionFailure() << "package " << package->name - << " has no ID"; - } - - if (!package_ids.insert(package->id.value()).second) { - return ::testing::AssertionFailure() - << "package " << package->name << " has non-unique ID " << std::hex - << (int)package->id.value() << std::dec; - } +TEST_F(IdAssignerTests, UseAllEntryIds) { + ResourceTable table; + const size_t max_entry_id = std::numeric_limits<uint16_t>::max(); + for (size_t i = 0; i <= max_entry_id; i++) { + ASSERT_TRUE( + table.AddResource(NewResourceBuilder("android:attr/res" + std::to_string(i)).Build(), + context->GetDiagnostics())); } + IdAssigner assigner; + ASSERT_TRUE(assigner.Consume(context.get(), &table)); +} - for (auto& package : table->packages) { - std::set<uint8_t> type_ids; - for (auto& type : package->types) { - if (!type->id) { - return ::testing::AssertionFailure() << "type " << type->type - << " of package " << package->name - << " has no ID"; - } +TEST_F(IdAssignerTests, ExaustEntryIds) { + ResourceTable table; + const size_t max_entry_id = std::numeric_limits<uint16_t>::max() + 1u; + for (size_t i = 0; i <= max_entry_id; i++) { + ASSERT_TRUE( + table.AddResource(NewResourceBuilder("android:attr/res" + std::to_string(i)).Build(), + context->GetDiagnostics())); + } + IdAssigner assigner; + ASSERT_FALSE(assigner.Consume(context.get(), &table)); +} - if (!type_ids.insert(type->id.value()).second) { - return ::testing::AssertionFailure() - << "type " << type->type << " of package " << package->name - << " has non-unique ID " << std::hex << (int)type->id.value() - << std::dec; - } - } +TEST_F(IdAssignerTests, ExaustEntryIdsLastIdIsPublic) { + ResourceTable table; + ASSERT_TRUE(table.AddResource(NewResourceBuilder("android:attr/res").SetId(0x0101ffff).Build(), + context->GetDiagnostics())); + const size_t max_entry_id = std::numeric_limits<uint16_t>::max(); + for (size_t i = 0; i <= max_entry_id; i++) { + ASSERT_TRUE( + table.AddResource(NewResourceBuilder("android:attr/res" + std::to_string(i)).Build(), + context->GetDiagnostics())); + } + IdAssigner assigner; + ASSERT_FALSE(assigner.Consume(context.get(), &table)); +} +::testing::AssertionResult VerifyIds(ResourceTable* table) { + std::set<ResourceId> seen_ids; + for (auto& package : table->packages) { for (auto& type : package->types) { - std::set<uint16_t> entry_ids; for (auto& entry : type->entries) { if (!entry->id) { return ::testing::AssertionFailure() - << "entry " << entry->name << " of type " << type->type - << " of package " << package->name << " has no ID"; + << "resource " << ResourceNameRef(package->name, type->type, entry->name) + << " has no ID"; } - - if (!entry_ids.insert(entry->id.value()).second) { + if (!seen_ids.insert(entry->id.value()).second) { return ::testing::AssertionFailure() - << "entry " << entry->name << " of type " << type->type - << " of package " << package->name << " has non-unique ID " - << std::hex << (int)entry->id.value() << std::dec; + << "resource " << ResourceNameRef(package->name, type->type, entry->name) + << " has a non-unique ID" << std::hex << entry->id.value() << std::dec; } } } } + return ::testing::AssertionSuccess() << "all IDs are unique and assigned"; } |