blob: d6d7890882a81889ad46657dab2b5b404111e5c1 [file] [log] [blame]
Adam Lesinski7a37b742016-10-12 14:05:55 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "androidfw/AttributeResolution.h"
Adam Lesinskiea789792016-11-10 14:33:11 -080018
19#include "android-base/file.h"
20#include "android-base/logging.h"
21#include "android-base/macros.h"
22
Adam Lesinski7a37b742016-10-12 14:05:55 -070023#include "TestHelpers.h"
24#include "data/styles/R.h"
25
Adam Lesinski7a37b742016-10-12 14:05:55 -070026using com::android::app::R;
27
Adam Lesinskiea789792016-11-10 14:33:11 -080028namespace android {
29
Adam Lesinski7a37b742016-10-12 14:05:55 -070030class AttributeResolutionTest : public ::testing::Test {
31 public:
32 virtual void SetUp() override {
Adam Lesinskiea789792016-11-10 14:33:11 -080033 std::string test_source_dir = GetTestDataPath();
Adam Lesinski7a37b742016-10-12 14:05:55 -070034 std::string contents;
Adam Lesinskiea789792016-11-10 14:33:11 -080035 CHECK(base::ReadFileToString(test_source_dir + "/styles/resources.arsc",
36 &contents));
37 CHECK(table_.add(contents.data(), contents.size(), 1 /*cookie*/,
38 true /*copyData*/) == NO_ERROR);
Adam Lesinski7a37b742016-10-12 14:05:55 -070039 }
40
41 protected:
42 ResTable table_;
43};
44
45class AttributeResolutionXmlTest : public AttributeResolutionTest {
46 public:
47 virtual void SetUp() override {
48 AttributeResolutionTest::SetUp();
Adam Lesinskiea789792016-11-10 14:33:11 -080049 std::string test_source_dir = GetTestDataPath();
Adam Lesinski7a37b742016-10-12 14:05:55 -070050 std::string contents;
Adam Lesinskiea789792016-11-10 14:33:11 -080051 CHECK(base::ReadFileToString(test_source_dir + "/styles/layout.xml",
52 &contents));
53 CHECK(xml_parser_.setTo(contents.data(), contents.size(),
54 true /*copyData*/) == NO_ERROR);
Adam Lesinski7a37b742016-10-12 14:05:55 -070055
56 // Skip to the first tag.
57 while (xml_parser_.next() != ResXMLParser::START_TAG) {
58 }
59 }
60
61 protected:
62 ResXMLTree xml_parser_;
63};
64
65TEST_F(AttributeResolutionTest, Theme) {
66 ResTable::Theme theme(table_);
67 ASSERT_EQ(NO_ERROR, theme.applyStyle(R::style::StyleTwo));
68
69 uint32_t attrs[] = {R::attr::attr_one, R::attr::attr_two, R::attr::attr_three,
70 R::attr::attr_four};
71 std::vector<uint32_t> values;
72 values.resize(arraysize(attrs) * 6);
73
74 ASSERT_TRUE(ResolveAttrs(&theme, 0 /*def_style_attr*/, 0 /*def_style_res*/,
Adam Lesinskiea789792016-11-10 14:33:11 -080075 nullptr /*src_values*/, 0 /*src_values_length*/,
76 attrs, arraysize(attrs), values.data(),
77 nullptr /*out_indices*/));
Adam Lesinski7a37b742016-10-12 14:05:55 -070078
79 const uint32_t public_flag = ResTable_typeSpec::SPEC_PUBLIC;
80
81 const uint32_t* values_cursor = values.data();
82 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]);
83 EXPECT_EQ(1u, values_cursor[STYLE_DATA]);
84 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]);
85 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]);
86 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
87 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
88
89 values_cursor += STYLE_NUM_ENTRIES;
90 EXPECT_EQ(Res_value::TYPE_STRING, values_cursor[STYLE_TYPE]);
91 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]);
92 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]);
93 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
94 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
95
96 values_cursor += STYLE_NUM_ENTRIES;
97 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]);
98 EXPECT_EQ(3u, values_cursor[STYLE_DATA]);
99 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]);
100 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]);
101 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
102 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
103
104 values_cursor += STYLE_NUM_ENTRIES;
105 EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]);
106 EXPECT_EQ(Res_value::DATA_NULL_UNDEFINED, values_cursor[STYLE_DATA]);
107 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]);
108 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]);
109 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
110 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
111}
112
113TEST_F(AttributeResolutionXmlTest, XmlParser) {
114 uint32_t attrs[] = {R::attr::attr_one, R::attr::attr_two, R::attr::attr_three,
115 R::attr::attr_four};
116 std::vector<uint32_t> values;
117 values.resize(arraysize(attrs) * 6);
118
Adam Lesinskiea789792016-11-10 14:33:11 -0800119 ASSERT_TRUE(RetrieveAttributes(&table_, &xml_parser_, attrs, arraysize(attrs),
120 values.data(), nullptr /*out_indices*/));
Adam Lesinski7a37b742016-10-12 14:05:55 -0700121
122 uint32_t* values_cursor = values.data();
123 EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]);
124 EXPECT_EQ(0u, values_cursor[STYLE_DATA]);
125 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]);
126 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]);
127 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
128 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
129
130 values_cursor += STYLE_NUM_ENTRIES;
131 EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]);
132 EXPECT_EQ(0u, values_cursor[STYLE_DATA]);
133 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]);
134 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]);
135 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
136 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
137
138 values_cursor += STYLE_NUM_ENTRIES;
139 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]);
140 EXPECT_EQ(10u, values_cursor[STYLE_DATA]);
141 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]);
142 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]);
143 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
144 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
145
146 values_cursor += STYLE_NUM_ENTRIES;
147 EXPECT_EQ(Res_value::TYPE_ATTRIBUTE, values_cursor[STYLE_TYPE]);
148 EXPECT_EQ(R::attr::attr_indirect, values_cursor[STYLE_DATA]);
149 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]);
150 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]);
151 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
152 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
153}
154
155TEST_F(AttributeResolutionXmlTest, ThemeAndXmlParser) {
156 ResTable::Theme theme(table_);
157 ASSERT_EQ(NO_ERROR, theme.applyStyle(R::style::StyleTwo));
158
Adam Lesinskiea789792016-11-10 14:33:11 -0800159 uint32_t attrs[] = {R::attr::attr_one, R::attr::attr_two, R::attr::attr_three,
160 R::attr::attr_four, R::attr::attr_five};
Adam Lesinski7a37b742016-10-12 14:05:55 -0700161 std::vector<uint32_t> values;
162 values.resize(arraysize(attrs) * 6);
163
Adam Lesinskiea789792016-11-10 14:33:11 -0800164 ASSERT_TRUE(ApplyStyle(&theme, &xml_parser_, 0 /*def_style_attr*/,
165 0 /*def_style_res*/, attrs, arraysize(attrs),
166 values.data(), nullptr /*out_indices*/));
Adam Lesinski7a37b742016-10-12 14:05:55 -0700167
168 const uint32_t public_flag = ResTable_typeSpec::SPEC_PUBLIC;
169
170 uint32_t* values_cursor = values.data();
171 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]);
172 EXPECT_EQ(1u, values_cursor[STYLE_DATA]);
173 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]);
174 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]);
175 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
176 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
177
178 values_cursor += STYLE_NUM_ENTRIES;
179 EXPECT_EQ(Res_value::TYPE_STRING, values_cursor[STYLE_TYPE]);
180 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]);
181 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]);
182 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
183 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
184
185 values_cursor += STYLE_NUM_ENTRIES;
186 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]);
187 EXPECT_EQ(10u, values_cursor[STYLE_DATA]);
188 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]);
189 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]);
190 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
191 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
192
193 values_cursor += STYLE_NUM_ENTRIES;
194 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]);
195 EXPECT_EQ(3u, values_cursor[STYLE_DATA]);
196 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]);
197 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]);
198 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
199 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
200
201 values_cursor += STYLE_NUM_ENTRIES;
202 EXPECT_EQ(Res_value::TYPE_STRING, values_cursor[STYLE_TYPE]);
203 EXPECT_EQ(R::string::string_one, values_cursor[STYLE_RESOURCE_ID]);
204 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]);
205 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]);
206 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]);
207}
Adam Lesinskiea789792016-11-10 14:33:11 -0800208
209} // namespace android