AttributeResolution_test.cpp revision 7ad1110ecd6a840fcd2895c62668828a1ca029c6
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 <array> 20 21#include "android-base/file.h" 22#include "android-base/logging.h" 23#include "android-base/macros.h" 24 25#include "TestHelpers.h" 26#include "data/styles/R.h" 27 28using com::android::app::R; 29 30namespace android { 31 32class AttributeResolutionTest : public ::testing::Test { 33 public: 34 virtual void SetUp() override { 35 std::string contents; 36 ASSERT_TRUE(ReadFileFromZipToString( 37 GetTestDataPath() + "/styles/styles.apk", "resources.arsc", &contents)); 38 ASSERT_EQ(NO_ERROR, table_.add(contents.data(), contents.size(), 39 1 /*cookie*/, true /*copyData*/)); 40 } 41 42 protected: 43 ResTable table_; 44}; 45 46class AttributeResolutionXmlTest : public AttributeResolutionTest { 47 public: 48 virtual void SetUp() override { 49 AttributeResolutionTest::SetUp(); 50 51 std::string contents; 52 ASSERT_TRUE( 53 ReadFileFromZipToString(GetTestDataPath() + "/styles/styles.apk", 54 "res/layout/layout.xml", &contents)); 55 56 ASSERT_EQ(NO_ERROR, xml_parser_.setTo(contents.data(), contents.size(), 57 true /*copyData*/)); 58 59 // Skip to the first tag. 60 while (xml_parser_.next() != ResXMLParser::START_TAG) { 61 } 62 } 63 64 protected: 65 ResXMLTree xml_parser_; 66}; 67 68TEST_F(AttributeResolutionTest, Theme) { 69 ResTable::Theme theme(table_); 70 ASSERT_EQ(NO_ERROR, theme.applyStyle(R::style::StyleTwo)); 71 72 std::array<uint32_t, 4> attrs{ 73 {R::attr::attr_one, R::attr::attr_two, R::attr::attr_three, R::attr::attr_four}}; 74 std::array<uint32_t, attrs.size() * STYLE_NUM_ENTRIES> values; 75 76 ASSERT_TRUE(ResolveAttrs(&theme, 0 /*def_style_attr*/, 0 /*def_style_res*/, 77 nullptr /*src_values*/, 0 /*src_values_length*/, attrs.data(), 78 attrs.size(), values.data(), 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 std::array<uint32_t, 4> attrs{ 116 {R::attr::attr_one, R::attr::attr_two, R::attr::attr_three, R::attr::attr_four}}; 117 std::array<uint32_t, attrs.size() * STYLE_NUM_ENTRIES> values; 118 119 ASSERT_TRUE(RetrieveAttributes(&table_, &xml_parser_, attrs.data(), attrs.size(), values.data(), 120 nullptr /*out_indices*/)); 121 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 159 std::array<uint32_t, 5> attrs{{R::attr::attr_one, R::attr::attr_two, R::attr::attr_three, 160 R::attr::attr_four, R::attr::attr_five}}; 161 std::array<uint32_t, attrs.size() * STYLE_NUM_ENTRIES> values; 162 std::array<uint32_t, attrs.size()> indices; 163 164 ApplyStyle(&theme, &xml_parser_, 0 /*def_style_attr*/, 0 /*def_style_res*/, attrs.data(), 165 attrs.size(), values.data(), indices.data()); 166 167 const uint32_t public_flag = ResTable_typeSpec::SPEC_PUBLIC; 168 169 uint32_t* values_cursor = values.data(); 170 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 171 EXPECT_EQ(1u, values_cursor[STYLE_DATA]); 172 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 173 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 174 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 175 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 176 177 values_cursor += STYLE_NUM_ENTRIES; 178 EXPECT_EQ(Res_value::TYPE_STRING, values_cursor[STYLE_TYPE]); 179 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 180 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 181 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 182 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 183 184 values_cursor += STYLE_NUM_ENTRIES; 185 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 186 EXPECT_EQ(10u, values_cursor[STYLE_DATA]); 187 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 188 EXPECT_EQ(uint32_t(-1), values_cursor[STYLE_ASSET_COOKIE]); 189 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 190 EXPECT_EQ(0u, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 191 192 values_cursor += STYLE_NUM_ENTRIES; 193 EXPECT_EQ(Res_value::TYPE_INT_DEC, values_cursor[STYLE_TYPE]); 194 EXPECT_EQ(3u, values_cursor[STYLE_DATA]); 195 EXPECT_EQ(0u, values_cursor[STYLE_RESOURCE_ID]); 196 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 197 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 198 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 199 200 values_cursor += STYLE_NUM_ENTRIES; 201 EXPECT_EQ(Res_value::TYPE_STRING, values_cursor[STYLE_TYPE]); 202 EXPECT_EQ(R::string::string_one, values_cursor[STYLE_RESOURCE_ID]); 203 EXPECT_EQ(1u, values_cursor[STYLE_ASSET_COOKIE]); 204 EXPECT_EQ(0u, values_cursor[STYLE_DENSITY]); 205 EXPECT_EQ(public_flag, values_cursor[STYLE_CHANGING_CONFIGURATIONS]); 206} 207 208} // namespace android 209 210