AttributeResolution_test.cpp revision 4c67a475a334e4f65238d439a3339195e03c03be
1/* 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" 18 19#include "android-base/file.h" 20#include "android-base/logging.h" 21#include "android-base/macros.h" 22 23#include "TestHelpers.h" 24#include "data/styles/R.h" 25 26using com::android::app::R; 27 28namespace android { 29 30class AttributeResolutionTest : public ::testing::Test { 31 public: 32 virtual void SetUp() override { 33 std::string contents; 34 ASSERT_TRUE(ReadFileFromZipToString( 35 GetTestDataPath() + "/styles/styles.apk", "resources.arsc", &contents)); 36 ASSERT_EQ(NO_ERROR, table_.add(contents.data(), contents.size(), 37 1 /*cookie*/, true /*copyData*/)); 38 } 39 40 protected: 41 ResTable table_; 42}; 43 44class AttributeResolutionXmlTest : public AttributeResolutionTest { 45 public: 46 virtual void SetUp() override { 47 AttributeResolutionTest::SetUp(); 48 49 std::string contents; 50 ASSERT_TRUE( 51 ReadFileFromZipToString(GetTestDataPath() + "/styles/styles.apk", 52 "res/layout/layout.xml", &contents)); 53 54 ASSERT_EQ(NO_ERROR, xml_parser_.setTo(contents.data(), contents.size(), 55 true /*copyData*/)); 56 57 // Skip to the first tag. 58 while (xml_parser_.next() != ResXMLParser::START_TAG) { 59 } 60 } 61 62 protected: 63 ResXMLTree xml_parser_; 64}; 65 66TEST_F(AttributeResolutionTest, Theme) { 67 ResTable::Theme theme(table_); 68 ASSERT_EQ(NO_ERROR, theme.applyStyle(R::style::StyleTwo)); 69 70 uint32_t attrs[] = {R::attr::attr_one, R::attr::attr_two, R::attr::attr_three, 71 R::attr::attr_four}; 72 std::vector<uint32_t> values; 73 values.resize(arraysize(attrs) * 6); 74 75 ASSERT_TRUE(ResolveAttrs(&theme, 0 /*def_style_attr*/, 0 /*def_style_res*/, 76 nullptr /*src_values*/, 0 /*src_values_length*/, 77 attrs, arraysize(attrs), values.data(), 78 nullptr /*out_indices*/)); 79 80 const uint32_t public_flag = ResTable_typeSpec::SPEC_PUBLIC; 81 82 const uint32_t* values_cursor = values.data(); 83 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 84 EXPECT_EQ(1u, values_cursor[STYLE_DATA]); 85 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 86 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 87 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 88 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 89 90 values_cursor += STYLE_NUM_ENTRIES; 91 EXPECT_EQ(Res_value::TYPE_STRING, values_cursor[STYLE_TYPE]); 92 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 93 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 94 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 95 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 96 97 values_cursor += STYLE_NUM_ENTRIES; 98 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 99 EXPECT_EQ(3u, values_cursor[STYLE_DATA]); 100 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 101 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 102 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 103 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 104 105 values_cursor += STYLE_NUM_ENTRIES; 106 EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]); 107 EXPECT_EQ(Res_value::DATA_NULL_UNDEFINED, values_cursor[STYLE_DATA]); 108 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 109 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 110 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 111 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 112} 113 114TEST_F(AttributeResolutionXmlTest, XmlParser) { 115 uint32_t attrs[] = {R::attr::attr_one, R::attr::attr_two, R::attr::attr_three, 116 R::attr::attr_four}; 117 std::vector<uint32_t> values; 118 values.resize(arraysize(attrs) * 6); 119 120 ASSERT_TRUE(RetrieveAttributes(&table_, &xml_parser_, attrs, arraysize(attrs), 121 values.data(), nullptr /*out_indices*/)); 122 123 uint32_t* values_cursor = values.data(); 124 EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]); 125 EXPECT_EQ(0u, values_cursor[STYLE_DATA]); 126 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 127 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 128 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 129 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 130 131 values_cursor += STYLE_NUM_ENTRIES; 132 EXPECT_EQ(Res_value::TYPE_NULL, values_cursor[STYLE_TYPE]); 133 EXPECT_EQ(0u, values_cursor[STYLE_DATA]); 134 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 135 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 136 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 137 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 138 139 values_cursor += STYLE_NUM_ENTRIES; 140 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 141 EXPECT_EQ(10u, values_cursor[STYLE_DATA]); 142 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 143 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 144 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 145 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 146 147 values_cursor += STYLE_NUM_ENTRIES; 148 EXPECT_EQ(Res_value::TYPE_ATTRIBUTE, values_cursor[STYLE_TYPE]); 149 EXPECT_EQ(R::attr::attr_indirect, values_cursor[STYLE_DATA]); 150 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 151 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 152 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 153 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 154} 155 156TEST_F(AttributeResolutionXmlTest, ThemeAndXmlParser) { 157 ResTable::Theme theme(table_); 158 ASSERT_EQ(NO_ERROR, theme.applyStyle(R::style::StyleTwo)); 159 160 uint32_t attrs[] = {R::attr::attr_one, R::attr::attr_two, R::attr::attr_three, 161 R::attr::attr_four, R::attr::attr_five}; 162 std::vector<uint32_t> values; 163 values.resize(arraysize(attrs) * 6); 164 165 ApplyStyle(&theme, &xml_parser_, 0 /*def_style_attr*/, 166 0 /*def_style_res*/, attrs, arraysize(attrs), 167 values.data(), nullptr /*out_indices*/); 168 169 const uint32_t public_flag = ResTable_typeSpec::SPEC_PUBLIC; 170 171 uint32_t* values_cursor = values.data(); 172 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 173 EXPECT_EQ(1u, values_cursor[STYLE_DATA]); 174 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 175 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 176 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 177 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 178 179 values_cursor += STYLE_NUM_ENTRIES; 180 EXPECT_EQ(Res_value::TYPE_STRING, values_cursor[STYLE_TYPE]); 181 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 182 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 183 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 184 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 185 186 values_cursor += STYLE_NUM_ENTRIES; 187 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 188 EXPECT_EQ(10u, values_cursor[STYLE_DATA]); 189 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 190 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 191 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 192 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 193 194 values_cursor += STYLE_NUM_ENTRIES; 195 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 196 EXPECT_EQ(3u, values_cursor[STYLE_DATA]); 197 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 198 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 199 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 200 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 201 202 values_cursor += STYLE_NUM_ENTRIES; 203 EXPECT_EQ(Res_value::TYPE_STRING, values_cursor[STYLE_TYPE]); 204 EXPECT_EQ(R::string::string_one, values_cursor[STYLE_RESOURCE_ID]); 205 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 206 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 207 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 208} 209 210} // namespace android 211