1f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski/* 2f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * Copyright (C) 2014 The Android Open Source Project 3f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * 4f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * you may not use this file except in compliance with the License. 6f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * You may obtain a copy of the License at 7f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * 8f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * 10f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * Unless required by applicable law or agreed to in writing, software 11f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * See the License for the specific language governing permissions and 14f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * limitations under the License. 15f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski */ 16f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 17f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski#include <androidfw/ResourceTypes.h> 18f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 191b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert#include <codecvt> 201b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert#include <locale> 211b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert#include <string> 221b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 23f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski#include <utils/String8.h> 24f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski#include <utils/String16.h> 25f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski#include "TestHelpers.h" 26ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski#include "data/basic/R.h" 27ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski#include "data/lib/R.h" 28f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 29f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski#include <gtest/gtest.h> 30f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 31f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinskiusing namespace android; 32f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 33f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinskinamespace { 34f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 35f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski/** 36f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * Include a binary resource table. 37f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * 38f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * Package: com.android.test.basic 39f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski */ 40f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski#include "data/basic/basic_arsc.h" 41f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 42b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski/** 43b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski * Include a binary library resource table. 44b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski * 45b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski * Package: com.android.test.basic 46b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski */ 47ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski#include "data/lib/lib_arsc.h" 48ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski 49b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski/** 50b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski * Include a system resource table. 51b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski * 52b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski * Package: android 53b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski */ 54b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski#include "data/system/system_arsc.h" 55b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski 56f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam LesinskiTEST(ResTableTest, shouldLoadSuccessfully) { 57f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ResTable table; 58f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 59f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski} 60f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 61f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam LesinskiTEST(ResTableTest, simpleTypeIsRetrievedCorrectly) { 62f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ResTable table; 63f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 64f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 6560293197379e522c870c4a28462804207bab505dAdam Lesinski EXPECT_TRUE(IsStringEqual(table, base::R::string::test1, "test1")); 66f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski} 67f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 68f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam LesinskiTEST(ResTableTest, resourceNameIsResolved) { 69f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ResTable table; 70f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 71f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 72f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski String16 defPackage("com.android.test.basic"); 73f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski String16 testName("@string/test1"); 74f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski uint32_t resID = table.identifierForName(testName.string(), testName.size(), 75f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 0, 0, 76f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski defPackage.string(), defPackage.size()); 77f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_NE(uint32_t(0x00000000), resID); 78ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ASSERT_EQ(base::R::string::test1, resID); 79f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski} 80f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 81f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam LesinskiTEST(ResTableTest, noParentThemeIsAppliedCorrectly) { 82f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ResTable table; 83f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 84f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 85f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ResTable::Theme theme(table); 86ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ASSERT_EQ(NO_ERROR, theme.applyStyle(base::R::style::Theme1)); 87f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 88f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski Res_value val; 89f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski uint32_t specFlags = 0; 90ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ssize_t index = theme.getAttribute(base::R::attr::attr1, &val, &specFlags); 91f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_GE(index, 0); 92f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(Res_value::TYPE_INT_DEC, val.dataType); 93f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(uint32_t(100), val.data); 94f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 95ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski index = theme.getAttribute(base::R::attr::attr2, &val, &specFlags); 96f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_GE(index, 0); 97f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(Res_value::TYPE_REFERENCE, val.dataType); 98ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ASSERT_EQ(base::R::integer::number1, val.data); 99f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski} 100f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 101f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam LesinskiTEST(ResTableTest, parentThemeIsAppliedCorrectly) { 102f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ResTable table; 103f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 104f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 105f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ResTable::Theme theme(table); 106ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ASSERT_EQ(NO_ERROR, theme.applyStyle(base::R::style::Theme2)); 107f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 108f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski Res_value val; 109f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski uint32_t specFlags = 0; 110ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ssize_t index = theme.getAttribute(base::R::attr::attr1, &val, &specFlags); 111f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_GE(index, 0); 112f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(Res_value::TYPE_INT_DEC, val.dataType); 113f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(uint32_t(300), val.data); 114f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 115ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski index = theme.getAttribute(base::R::attr::attr2, &val, &specFlags); 116f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_GE(index, 0); 117f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(Res_value::TYPE_REFERENCE, val.dataType); 118ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ASSERT_EQ(base::R::integer::number1, val.data); 119ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski} 120ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski 121ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam LesinskiTEST(ResTableTest, libraryThemeIsAppliedCorrectly) { 122ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ResTable table; 123ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ASSERT_EQ(NO_ERROR, table.add(lib_arsc, lib_arsc_len)); 124ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski 125ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ResTable::Theme theme(table); 126ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ASSERT_EQ(NO_ERROR, theme.applyStyle(lib::R::style::Theme)); 127ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski 128ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski Res_value val; 129ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski uint32_t specFlags = 0; 130ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ssize_t index = theme.getAttribute(lib::R::attr::attr1, &val, &specFlags); 131ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ASSERT_GE(index, 0); 132ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ASSERT_EQ(Res_value::TYPE_INT_DEC, val.dataType); 133ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ASSERT_EQ(uint32_t(700), val.data); 1348ac51d14b614ba6a12df2ba90d50a01f50d548aaAdam Lesinski 1358ac51d14b614ba6a12df2ba90d50a01f50d548aaAdam Lesinski index = theme.getAttribute(lib::R::attr::attr2, &val, &specFlags); 1368ac51d14b614ba6a12df2ba90d50a01f50d548aaAdam Lesinski ASSERT_GE(index, 0); 1378ac51d14b614ba6a12df2ba90d50a01f50d548aaAdam Lesinski ASSERT_EQ(Res_value::TYPE_INT_DEC, val.dataType); 1388ac51d14b614ba6a12df2ba90d50a01f50d548aaAdam Lesinski ASSERT_EQ(uint32_t(700), val.data); 139f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski} 140f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 141f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam LesinskiTEST(ResTableTest, referenceToBagIsNotResolved) { 142f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ResTable table; 143f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 144f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 145f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski Res_value val; 146ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ssize_t block = table.getResource(base::R::integer::number2, &val, MAY_NOT_BE_BAG); 147f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_GE(block, 0); 148f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(Res_value::TYPE_REFERENCE, val.dataType); 149ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ASSERT_EQ(base::R::array::integerArray1, val.data); 150f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 151f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ssize_t newBlock = table.resolveReference(&val, block); 152f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski EXPECT_EQ(block, newBlock); 153f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski EXPECT_EQ(Res_value::TYPE_REFERENCE, val.dataType); 154ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski EXPECT_EQ(base::R::array::integerArray1, val.data); 155f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski} 156f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 157f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam LesinskiTEST(ResTableTest, resourcesStillAccessibleAfterParameterChange) { 158f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ResTable table; 159f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 160f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 161f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski Res_value val; 162ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ssize_t block = table.getResource(base::R::integer::number1, &val, MAY_NOT_BE_BAG); 163f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_GE(block, 0); 164f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(Res_value::TYPE_INT_DEC, val.dataType); 165f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 166f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski const ResTable::bag_entry* entry; 167ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ssize_t count = table.lockBag(base::R::array::integerArray1, &entry); 168f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_GE(count, 0); 169f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski table.unlockBag(entry); 170f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 171f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ResTable_config param; 172f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski memset(¶m, 0, sizeof(param)); 173f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski param.density = 320; 174f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski table.setParameters(¶m); 175f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 176ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski block = table.getResource(base::R::integer::number1, &val, MAY_NOT_BE_BAG); 177f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_GE(block, 0); 178f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(Res_value::TYPE_INT_DEC, val.dataType); 179f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 180ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski count = table.lockBag(base::R::array::integerArray1, &entry); 181f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_GE(count, 0); 182f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski table.unlockBag(entry); 183f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski} 184f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 185f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam LesinskiTEST(ResTableTest, resourceIsOverridenWithBetterConfig) { 186f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ResTable table; 187f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 188f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 189f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski Res_value val; 190ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski ssize_t block = table.getResource(base::R::integer::number1, &val, MAY_NOT_BE_BAG); 191f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_GE(block, 0); 192f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(Res_value::TYPE_INT_DEC, val.dataType); 193f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(uint32_t(200), val.data); 194f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 195f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ResTable_config param; 196f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski memset(¶m, 0, sizeof(param)); 197f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski param.language[0] = 's'; 198f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski param.language[1] = 'v'; 199f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski param.country[0] = 'S'; 200f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski param.country[1] = 'E'; 201f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski table.setParameters(¶m); 202f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 203ccf25c7bf69eb8c04246e3f79da31b52c2922a80Adam Lesinski block = table.getResource(base::R::integer::number1, &val, MAY_NOT_BE_BAG); 204f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_GE(block, 0); 205f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(Res_value::TYPE_INT_DEC, val.dataType); 206f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski ASSERT_EQ(uint32_t(400), val.data); 207f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski} 208f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski 2092cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam LesinskiTEST(ResTableTest, emptyTableHasSensibleDefaults) { 2102cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski const int32_t assetCookie = 1; 2112cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski 2122cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski ResTable table; 2132cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski ASSERT_EQ(NO_ERROR, table.addEmpty(assetCookie)); 2142cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski 2152cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski // Adding an empty table gives us one table! 2162cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski ASSERT_EQ(uint32_t(1), table.getTableCount()); 2172cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski 2182cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski // Adding an empty table doesn't mean we get packages. 2192cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski ASSERT_EQ(uint32_t(0), table.getBasePackageCount()); 2202cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski 2212cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski Res_value val; 2222cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski ASSERT_LT(table.getResource(base::R::integer::number1, &val, MAY_NOT_BE_BAG), 0); 2232cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski} 2242cb761e3ddb9d68ab430013e9cd15ecaab9fbc62Adam Lesinski 2251b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albertvoid testU16StringToInt(const char16_t* str, uint32_t expectedValue, 2261b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert bool expectSuccess, bool expectHex) { 2271b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert size_t len = std::char_traits<char16_t>::length(str); 2281b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2291b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert // Gtest can't print UTF-16 strings, so we have to convert to UTF-8 :( 2301b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> convert; 2311b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert std::string s = convert.to_bytes(std::u16string(str, len)); 2321b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2331b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert Res_value out = {}; 2341b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert ASSERT_EQ(expectSuccess, U16StringToInt(str, len, &out)) 2351b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert << "Failed with " << s; 2361b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2371b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert if (!expectSuccess) { 2381b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert ASSERT_EQ(out.TYPE_NULL, out.dataType) << "Failed with " << s; 2391b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert return; 2401b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert } 2411b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2421b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert if (expectHex) { 2431b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert ASSERT_EQ(out.TYPE_INT_HEX, out.dataType) << "Failed with " << s; 2441b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert } else { 2451b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert ASSERT_EQ(out.TYPE_INT_DEC, out.dataType) << "Failed with " << s; 2461b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert } 2471b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2481b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert ASSERT_EQ(expectedValue, out.data) << "Failed with " << s; 2491b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert} 2501b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2511b4f316651096f0ef9301b4ffde4816a08a54ab5Dan AlbertTEST(ResTableTest, U16StringToInt) { 2521b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"", 0U, false, false); 2531b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u" ", 0U, false, false); 2541b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"\t\n", 0U, false, false); 2551b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2561b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"abcd", 0U, false, false); 2571b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"10abcd", 0U, false, false); 2581b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"42 42", 0U, false, false); 2591b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"- 42", 0U, false, false); 2601b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"-", 0U, false, false); 2611b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2621b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"0x", 0U, false, true); 2631b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"0xnope", 0U, false, true); 2641b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"0X42", 0U, false, true); 2651b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"0x42 0x42", 0U, false, true); 2661b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"-0x0", 0U, false, true); 2671b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"-0x42", 0U, false, true); 2681b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"- 0x42", 0U, false, true); 2691b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2701b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert // Note that u" 42" would pass. This preserves the old behavior, but it may 2711b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert // not be desired. 2721b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"42 ", 0U, false, false); 2731b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"0x42 ", 0U, false, true); 2741b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2751b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert // Decimal cases. 2761b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"0", 0U, true, false); 2771b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"-0", 0U, true, false); 2781b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"42", 42U, true, false); 2791b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u" 42", 42U, true, false); 2801b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"-42", static_cast<uint32_t>(-42), true, false); 2811b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u" -42", static_cast<uint32_t>(-42), true, false); 2821b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"042", 42U, true, false); 2831b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"-042", static_cast<uint32_t>(-42), true, false); 2841b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2851b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert // Hex cases. 2861b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"0x0", 0x0, true, true); 2871b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"0x42", 0x42, true, true); 2881b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u" 0x42", 0x42, true, true); 2891b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2901b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert // Just before overflow cases: 2911b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"2147483647", INT_MAX, true, false); 2921b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"-2147483648", static_cast<uint32_t>(INT_MIN), true, 2931b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert false); 2941b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"0xffffffff", UINT_MAX, true, true); 2951b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 2961b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert // Overflow cases: 2971b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"2147483648", 0U, false, false); 2981b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"-2147483649", 0U, false, false); 2991b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert testU16StringToInt(u"0x1ffffffff", 0U, false, true); 3001b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert} 3011b4f316651096f0ef9301b4ffde4816a08a54ab5Dan Albert 302ff5808d223d6359448afc532717b8ccfdc5182d8Adam LesinskiTEST(ResTableTest, ShareButDontModifyResTable) { 303ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ResTable sharedTable; 304ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ASSERT_EQ(NO_ERROR, sharedTable.add(basic_arsc, basic_arsc_len)); 305ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski 306ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ResTable_config param; 307ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski memset(¶m, 0, sizeof(param)); 308ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski param.language[0] = 'v'; 309ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski param.language[1] = 's'; 310ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski sharedTable.setParameters(¶m); 311ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski 312ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski // Check that we get the default value for @integer:number1 313ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski Res_value val; 314ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ssize_t block = sharedTable.getResource(base::R::integer::number1, &val, MAY_NOT_BE_BAG); 315ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ASSERT_GE(block, 0); 316ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ASSERT_EQ(Res_value::TYPE_INT_DEC, val.dataType); 317ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ASSERT_EQ(uint32_t(600), val.data); 318ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski 319ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski // Create a new table that shares the entries of the shared table. 320ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ResTable table; 321ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ASSERT_EQ(NO_ERROR, table.add(&sharedTable, false)); 322ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski 323ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski // Set a new configuration on the new table. 324ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski memset(¶m, 0, sizeof(param)); 325ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski param.language[0] = 's'; 326ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski param.language[1] = 'v'; 327ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski param.country[0] = 'S'; 328ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski param.country[1] = 'E'; 329ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski table.setParameters(¶m); 330ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski 331ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski // Check that we get a new value in the new table. 332ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski block = table.getResource(base::R::integer::number1, &val, MAY_NOT_BE_BAG); 333ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ASSERT_GE(block, 0); 334ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ASSERT_EQ(Res_value::TYPE_INT_DEC, val.dataType); 335ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ASSERT_EQ(uint32_t(400), val.data); 336ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski 337ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski // Check that we still get the old value in the shared table. 338ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski block = sharedTable.getResource(base::R::integer::number1, &val, MAY_NOT_BE_BAG); 339ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ASSERT_GE(block, 0); 340ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ASSERT_EQ(Res_value::TYPE_INT_DEC, val.dataType); 341ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski ASSERT_EQ(uint32_t(600), val.data); 342f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski} 343ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski 344b7e1ce07756aaca829828c2053eca0d66dd4d440Adam LesinskiTEST(ResTableTest, GetConfigurationsReturnsUniqueList) { 345b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski ResTable table; 346b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski ASSERT_EQ(NO_ERROR, table.add(system_arsc, system_arsc_len)); 347b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 348b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski 349b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski ResTable_config configSv; 350b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski memset(&configSv, 0, sizeof(configSv)); 351b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski configSv.language[0] = 's'; 352b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski configSv.language[1] = 'v'; 353b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski 354b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski Vector<ResTable_config> configs; 355b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski table.getConfigurations(&configs); 356b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski 357b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski EXPECT_EQ(1, std::count(configs.begin(), configs.end(), configSv)); 358b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski 359b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski Vector<String8> locales; 360b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski table.getLocales(&locales); 361b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski 362b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski EXPECT_EQ(1, std::count(locales.begin(), locales.end(), String8("sv"))); 363b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski} 364b7e1ce07756aaca829828c2053eca0d66dd4d440Adam Lesinski 365ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski} // namespace 366