Split_test.cpp revision e60a87f5529b2867ba3f4e60b39d7b47b67f8ca3
1/* 2 * Copyright (C) 2014 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/ResourceTypes.h> 18 19#include <utils/String8.h> 20#include <utils/String16.h> 21#include "TestHelpers.h" 22#include "data/basic/R.h" 23 24#include <gtest/gtest.h> 25 26using namespace android; 27 28namespace { 29 30/** 31 * Include a binary resource table. This table 32 * is a base table for an APK split. 33 * 34 * Package: com.android.test.basic 35 */ 36#include "data/basic/basic_arsc.h" 37 38/** 39 * Include a binary resource table. This table 40 * is a configuration split table for an APK split. 41 * 42 * Package: com.android.test.basic 43 */ 44#include "data/basic/split_de_fr_arsc.h" 45 46/** 47 * Include a binary resource table. This table 48 * is a feature split table for an APK split. 49 * 50 * Package: com.android.test.basic 51 */ 52#include "data/feature/feature_arsc.h" 53 54enum { MAY_NOT_BE_BAG = false }; 55 56void makeConfigFrench(ResTable_config* config) { 57 memset(config, 0, sizeof(*config)); 58 config->language[0] = 'f'; 59 config->language[1] = 'r'; 60} 61 62TEST(SplitTest, TestLoadBase) { 63 ResTable table; 64 ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 65} 66 67TEST(SplitTest, TestGetResourceFromBase) { 68 ResTable_config frenchConfig; 69 makeConfigFrench(&frenchConfig); 70 71 ResTable table; 72 table.setParameters(&frenchConfig); 73 74 ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 75 76 ResTable_config expectedConfig; 77 memset(&expectedConfig, 0, sizeof(expectedConfig)); 78 79 Res_value val; 80 ResTable_config config; 81 ssize_t block = table.getResource(base::R::string::test1, &val, MAY_NOT_BE_BAG, 0, NULL, &config); 82 83 // The returned block should tell us which string pool to get the value, if it is a string. 84 EXPECT_GE(block, 0); 85 86 // We expect the default resource to be selected since it is the only resource configuration. 87 EXPECT_EQ(0, expectedConfig.compare(config)); 88 89 EXPECT_EQ(Res_value::TYPE_STRING, val.dataType); 90} 91 92TEST(SplitTest, TestGetResourceFromSplit) { 93 ResTable_config expectedConfig; 94 makeConfigFrench(&expectedConfig); 95 96 ResTable table; 97 table.setParameters(&expectedConfig); 98 99 ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 100 ASSERT_EQ(NO_ERROR, table.add(split_de_fr_arsc, split_de_fr_arsc_len)); 101 102 Res_value val; 103 ResTable_config config; 104 ssize_t block = table.getResource(base::R::string::test1, &val, MAY_NOT_BE_BAG, 0, NULL, &config); 105 106 EXPECT_GE(block, 0); 107 108 EXPECT_EQ(0, expectedConfig.compare(config)); 109 110 EXPECT_EQ(Res_value::TYPE_STRING, val.dataType); 111} 112 113TEST(SplitTest, ResourcesFromBaseAndSplitHaveSameNames) { 114 ResTable_config expectedConfig; 115 makeConfigFrench(&expectedConfig); 116 117 ResTable table; 118 table.setParameters(&expectedConfig); 119 120 ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 121 122 ResTable::resource_name baseName; 123 EXPECT_TRUE(table.getResourceName(base::R::string::test1, false, &baseName)); 124 125 ASSERT_EQ(NO_ERROR, table.add(split_de_fr_arsc, split_de_fr_arsc_len)); 126 127 ResTable::resource_name frName; 128 EXPECT_TRUE(table.getResourceName(base::R::string::test1, false, &frName)); 129 130 EXPECT_EQ( 131 String16(baseName.package, baseName.packageLen), 132 String16(frName.package, frName.packageLen)); 133 134 EXPECT_EQ( 135 String16(baseName.type, baseName.typeLen), 136 String16(frName.type, frName.typeLen)); 137 138 EXPECT_EQ( 139 String16(baseName.name, baseName.nameLen), 140 String16(frName.name, frName.nameLen)); 141} 142 143TEST(SplitTest, TypeEntrySpecFlagsAreUpdated) { 144 ResTable_config defaultConfig; 145 memset(&defaultConfig, 0, sizeof(defaultConfig)); 146 147 ResTable table; 148 ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 149 150 Res_value val; 151 uint32_t specFlags = 0; 152 ssize_t block = table.getResource(base::R::string::test1, &val, MAY_NOT_BE_BAG, 0, &specFlags, NULL); 153 EXPECT_GE(block, 0); 154 155 EXPECT_EQ(static_cast<uint32_t>(0), specFlags); 156 157 ASSERT_EQ(NO_ERROR, table.add(split_de_fr_arsc, split_de_fr_arsc_len)); 158 159 uint32_t frSpecFlags = 0; 160 block = table.getResource(base::R::string::test1, &val, MAY_NOT_BE_BAG, 0, &frSpecFlags, NULL); 161 EXPECT_GE(block, 0); 162 163 EXPECT_EQ(ResTable_config::CONFIG_LOCALE, frSpecFlags); 164} 165 166TEST(SplitFeatureTest, TestNewResourceIsAccessible) { 167 ResTable table; 168 ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 169 170 Res_value val; 171 ssize_t block = table.getResource(base::R::string::test3, &val, MAY_NOT_BE_BAG); 172 EXPECT_LT(block, 0); 173 174 ASSERT_EQ(NO_ERROR, table.add(feature_arsc, feature_arsc_len)); 175 176 block = table.getResource(base::R::string::test3, &val, MAY_NOT_BE_BAG); 177 EXPECT_GE(block, 0); 178 179 EXPECT_EQ(Res_value::TYPE_STRING, val.dataType); 180} 181 182TEST(SplitFeatureTest, TestNewResourceNameHasCorrectName) { 183 ResTable table; 184 ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 185 186 ResTable::resource_name name; 187 EXPECT_FALSE(table.getResourceName(base::R::string::test3, false, &name)); 188 189 ASSERT_EQ(NO_ERROR, table.add(feature_arsc, feature_arsc_len)); 190 191 EXPECT_TRUE(table.getResourceName(base::R::string::test3, false, &name)); 192 193 EXPECT_EQ(String16("com.android.test.basic"), 194 String16(name.package, name.packageLen)); 195 196 EXPECT_EQ(String16("string"), 197 String16(name.type, name.typeLen)); 198 199 EXPECT_EQ(String16("test3"), 200 String16(name.name, name.nameLen)); 201} 202 203TEST(SplitFeatureTest, TestNewResourceIsAccessibleByName) { 204 ResTable table; 205 ASSERT_EQ(NO_ERROR, table.add(basic_arsc, basic_arsc_len)); 206 ASSERT_EQ(NO_ERROR, table.add(feature_arsc, feature_arsc_len)); 207 208 const String16 name("test3"); 209 const String16 type("string"); 210 const String16 package("com.android.test.basic"); 211 ASSERT_EQ(base::R::string::test3, table.identifierForName(name.string(), name.size(), 212 type.string(), type.size(), 213 package.string(), package.size())); 214} 215 216} // namespace 217