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