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 "flatten/TableFlattener.h" 18467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#include "test/Builders.h" 19467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski#include "test/Context.h" 201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "unflatten/BinaryResourceParser.h" 211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include "util/Util.h" 221ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 231ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 241ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski#include <gtest/gtest.h> 251ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 261ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiusing namespace android; 271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskinamespace aapt { 291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiclass TableFlattenerTest : public ::testing::Test { 311ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskipublic: 321ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski void SetUp() override { 331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski mContext = test::ContextBuilder() 341ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .setCompilationPackage(u"com.app.test") 351ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .setPackageId(0x7f) 361ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .build(); 371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 391ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ::testing::AssertionResult flatten(ResourceTable* table, ResTable* outTable) { 401ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski BigBuffer buffer(1024); 4159e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski TableFlattener flattener(&buffer); 421ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (!flattener.consume(mContext.get(), table)) { 431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() << "failed to flatten ResourceTable"; 441ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 451ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 461ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<uint8_t[]> data = util::copy(buffer); 471ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (outTable->add(data.get(), buffer.size(), -1, true) != NO_ERROR) { 481ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() << "flattened ResTable is corrupt"; 491ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 501ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionSuccess(); 511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ::testing::AssertionResult flatten(ResourceTable* table, ResourceTable* outTable) { 541ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski BigBuffer buffer(1024); 5559e04c6f92da584b322c87072f18e6cab4de4c60Adam Lesinski TableFlattener flattener(&buffer); 561ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (!flattener.consume(mContext.get(), table)) { 571ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() << "failed to flatten ResourceTable"; 581ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 591ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 601ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<uint8_t[]> data = util::copy(buffer); 611ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski BinaryResourceParser parser(mContext.get(), outTable, {}, data.get(), buffer.size()); 621ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (!parser.parse()) { 631ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() << "flattened ResTable is corrupt"; 641ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 651ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionSuccess(); 661ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 671ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 681ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ::testing::AssertionResult exists(ResTable* table, 691ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski const StringPiece16& expectedName, 701ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski const ResourceId expectedId, 711ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski const ConfigDescription& expectedConfig, 721ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski const uint8_t expectedDataType, const uint32_t expectedData, 731ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski const uint32_t expectedSpecFlags) { 741ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski const ResourceName expectedResName = test::parseNameOrDie(expectedName); 751ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 761ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski table->setParameters(&expectedConfig); 771ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 781ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResTable_config config; 791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Res_value val; 801ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski uint32_t specFlags; 811ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (table->getResource(expectedId.id, &val, false, 0, &specFlags, &config) < 0) { 821ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() << "could not find resource with"; 831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 841ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 851ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (expectedDataType != val.dataType) { 861ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() 871ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << "expected data type " 881ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << std::hex << (int) expectedDataType << " but got data type " 891ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << (int) val.dataType << std::dec << " instead"; 901ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 911ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 921ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (expectedData != val.data) { 931ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() 941ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << "expected data " 951ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << std::hex << expectedData << " but got data " 961ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << val.data << std::dec << " instead"; 971ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 981ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 991ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (expectedSpecFlags != specFlags) { 1001ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() 1011ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << "expected specFlags " 1021ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << std::hex << expectedSpecFlags << " but got specFlags " 1031ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << specFlags << std::dec << " instead"; 1041ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1051ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1061ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResTable::resource_name actualName; 1071ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (!table->getResourceName(expectedId.id, false, &actualName)) { 1081ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() << "failed to find resource name"; 1091ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1101ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1111ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski StringPiece16 package16(actualName.package, actualName.packageLen); 1121ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (package16 != expectedResName.package) { 1131ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() 1141ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << "expected package '" << expectedResName.package << "' but got '" 1151ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << package16 << "'"; 1161ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1171ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1181ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski StringPiece16 type16(actualName.type, actualName.typeLen); 1191ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (type16 != toString(expectedResName.type)) { 1201ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() 1211ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << "expected type '" << expectedResName.type 1221ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << "' but got '" << type16 << "'"; 1231ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1241ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1251ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski StringPiece16 name16(actualName.name, actualName.nameLen); 1261ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (name16 != expectedResName.entry) { 1271ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() 1281ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << "expected name '" << expectedResName.entry 1291ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << "' but got '" << name16 << "'"; 1301ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1311ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1321ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski if (expectedConfig != config) { 1331ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionFailure() 1341ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << "expected config '" << expectedConfig << "' but got '" 1351ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski << ConfigDescription(config) << "'"; 1361ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1371ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski return ::testing::AssertionSuccess(); 1381ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski } 1391ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1401ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinskiprivate: 1411ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<IAaptContext> mContext; 1421ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski}; 1431ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1441ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST_F(TableFlattenerTest, FlattenFullyLinkedTable) { 1451ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder() 1461ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .setPackageId(u"com.app.test", 0x7f) 1471ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .addSimple(u"@com.app.test:id/one", ResourceId(0x7f020000)) 1481ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .addSimple(u"@com.app.test:id/two", ResourceId(0x7f020001)) 1491ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .addValue(u"@com.app.test:id/three", ResourceId(0x7f020002), 1501ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski test::buildReference(u"@com.app.test:id/one", ResourceId(0x7f020000))) 1511ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .addValue(u"@com.app.test:integer/one", ResourceId(0x7f030000), 1521ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski util::make_unique<BinaryPrimitive>(uint8_t(Res_value::TYPE_INT_DEC), 1u)) 1531ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .addValue(u"@com.app.test:integer/one", ResourceId(0x7f030000), 1541ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski test::parseConfigOrDie("v1"), 1551ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski util::make_unique<BinaryPrimitive>(uint8_t(Res_value::TYPE_INT_DEC), 2u)) 1561ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .addString(u"@com.app.test:string/test", ResourceId(0x7f040000), u"foo") 1571ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .addString(u"@com.app.test:layout/bar", ResourceId(0x7f050000), u"res/layout/bar.xml") 1581ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .build(); 1591ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1601ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResTable resTable; 1611ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_TRUE(flatten(table.get(), &resTable)); 1621ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1631ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(exists(&resTable, u"@com.app.test:id/one", ResourceId(0x7f020000), {}, 1641ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Res_value::TYPE_INT_BOOLEAN, 0u, 0u)); 1651ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1661ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(exists(&resTable, u"@com.app.test:id/two", ResourceId(0x7f020001), {}, 1671ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Res_value::TYPE_INT_BOOLEAN, 0u, 0u)); 1681ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1691ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(exists(&resTable, u"@com.app.test:id/three", ResourceId(0x7f020002), {}, 1701ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Res_value::TYPE_REFERENCE, 0x7f020000u, 0u)); 1711ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1721ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(exists(&resTable, u"@com.app.test:integer/one", ResourceId(0x7f030000), 1731ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski {}, Res_value::TYPE_INT_DEC, 1u, 1741ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResTable_config::CONFIG_VERSION)); 1751ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1761ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(exists(&resTable, u"@com.app.test:integer/one", ResourceId(0x7f030000), 1771ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski test::parseConfigOrDie("v1"), Res_value::TYPE_INT_DEC, 2u, 1781ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResTable_config::CONFIG_VERSION)); 1791ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1801ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski StringPiece16 fooStr = u"foo"; 1811ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ssize_t idx = resTable.getTableStringBlock(0)->indexOfString(fooStr.data(), fooStr.size()); 1821ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_GE(idx, 0); 1831ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(exists(&resTable, u"@com.app.test:string/test", ResourceId(0x7f040000), 1841ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski {}, Res_value::TYPE_STRING, (uint32_t) idx, 0u)); 1851ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1861ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski StringPiece16 barPath = u"res/layout/bar.xml"; 1871ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski idx = resTable.getTableStringBlock(0)->indexOfString(barPath.data(), barPath.size()); 1881ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_GE(idx, 0); 1891ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(exists(&resTable, u"@com.app.test:layout/bar", ResourceId(0x7f050000), {}, 1901ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Res_value::TYPE_STRING, (uint32_t) idx, 0u)); 1911ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} 1921ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 1931ab598f46c3ff520a67f9d80194847741f3467abAdam LesinskiTEST_F(TableFlattenerTest, FlattenEntriesWithGapsInIds) { 1941ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder() 1951ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .setPackageId(u"com.app.test", 0x7f) 1961ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .addSimple(u"@com.app.test:id/one", ResourceId(0x7f020001)) 1971ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .addSimple(u"@com.app.test:id/three", ResourceId(0x7f020003)) 1981ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski .build(); 1991ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 2001ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ResTable resTable; 2011ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski ASSERT_TRUE(flatten(table.get(), &resTable)); 2021ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 2031ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(exists(&resTable, u"@com.app.test:id/one", ResourceId(0x7f020001), {}, 2041ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Res_value::TYPE_INT_BOOLEAN, 0u, 0u)); 2051ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski EXPECT_TRUE(exists(&resTable, u"@com.app.test:id/three", ResourceId(0x7f020003), {}, 2061ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski Res_value::TYPE_INT_BOOLEAN, 0u, 0u)); 2071ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} 2081ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski 209a587065721053ad54e34f484868142407d59512dAdam LesinskiTEST_F(TableFlattenerTest, FlattenMinMaxAttributes) { 210a587065721053ad54e34f484868142407d59512dAdam Lesinski Attribute attr(false); 211a587065721053ad54e34f484868142407d59512dAdam Lesinski attr.typeMask = android::ResTable_map::TYPE_INTEGER; 212a587065721053ad54e34f484868142407d59512dAdam Lesinski attr.minInt = 10; 213a587065721053ad54e34f484868142407d59512dAdam Lesinski attr.maxInt = 23; 214a587065721053ad54e34f484868142407d59512dAdam Lesinski std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder() 215a587065721053ad54e34f484868142407d59512dAdam Lesinski .setPackageId(u"android", 0x01) 216a587065721053ad54e34f484868142407d59512dAdam Lesinski .addValue(u"@android:attr/foo", ResourceId(0x01010000), 217a587065721053ad54e34f484868142407d59512dAdam Lesinski util::make_unique<Attribute>(attr)) 218a587065721053ad54e34f484868142407d59512dAdam Lesinski .build(); 219a587065721053ad54e34f484868142407d59512dAdam Lesinski 220a587065721053ad54e34f484868142407d59512dAdam Lesinski ResourceTable result; 221a587065721053ad54e34f484868142407d59512dAdam Lesinski ASSERT_TRUE(flatten(table.get(), &result)); 222a587065721053ad54e34f484868142407d59512dAdam Lesinski 223a587065721053ad54e34f484868142407d59512dAdam Lesinski Attribute* actualAttr = test::getValue<Attribute>(&result, u"@android:attr/foo"); 224a587065721053ad54e34f484868142407d59512dAdam Lesinski ASSERT_NE(nullptr, actualAttr); 225a587065721053ad54e34f484868142407d59512dAdam Lesinski EXPECT_EQ(attr.isWeak(), actualAttr->isWeak()); 226a587065721053ad54e34f484868142407d59512dAdam Lesinski EXPECT_EQ(attr.typeMask, actualAttr->typeMask); 227a587065721053ad54e34f484868142407d59512dAdam Lesinski EXPECT_EQ(attr.minInt, actualAttr->minInt); 228a587065721053ad54e34f484868142407d59512dAdam Lesinski EXPECT_EQ(attr.maxInt, actualAttr->maxInt); 229a587065721053ad54e34f484868142407d59512dAdam Lesinski} 230a587065721053ad54e34f484868142407d59512dAdam Lesinski 2311ab598f46c3ff520a67f9d80194847741f3467abAdam Lesinski} // namespace aapt 232