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(&param, 0, sizeof(param));
173f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    param.density = 320;
174f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    table.setParameters(&param);
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(&param, 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(&param);
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(&param, 0, sizeof(param));
308ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski    param.language[0] = 'v';
309ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski    param.language[1] = 's';
310ff5808d223d6359448afc532717b8ccfdc5182d8Adam Lesinski    sharedTable.setParameters(&param);
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(&param, 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(&param);
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