Idmap_test.cpp revision f90f2f8dc36e7243b85e0b6a7fd5a590893c827e
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 23#include <gtest/gtest.h> 24 25using namespace android; 26 27namespace { 28 29/** 30 * Include a binary resource table. 31 * 32 * Package: com.android.test.basic 33 */ 34#include "data/basic/basic_arsc.h" 35 36/** 37 * Include a binary resource table. 38 * This table is an overlay. 39 * 40 * Package: com.android.test.basic 41 */ 42#include "data/overlay/overlay_arsc.h" 43 44enum { MAY_NOT_BE_BAG = false }; 45 46static const uint32_t attr_attr1 = 0x7f010000; 47static const uint32_t attr_attr2 = 0x7f010001; 48static const uint32_t string_test1 = 0x7f020000; 49static const uint32_t string_test2 = 0x7f020001; 50static const uint32_t integer_number1 = 0x7f030000; 51static const uint32_t integer_number2 = 0x7f030001; 52static const uint32_t style_Theme1 = 0x7f040000; 53static const uint32_t style_Theme2 = 0x7f040001; 54static const uint32_t array_integerArray1 = 0x7f050000; 55 56class IdmapTest : public ::testing::Test { 57protected: 58 virtual void SetUp() { 59 ASSERT_EQ(NO_ERROR, mTargetTable.add(basic_arsc, basic_arsc_len)); 60 ASSERT_EQ(NO_ERROR, mOverlayTable.add(overlay_arsc, overlay_arsc_len)); 61 char targetName[256] = "com.android.test.basic"; 62 ASSERT_EQ(NO_ERROR, mTargetTable.createIdmap(mOverlayTable, 0, 0, 63 targetName, targetName, &mData, &mDataSize)); 64 } 65 66 virtual void TearDown() { 67 free(mData); 68 } 69 70 ResTable mTargetTable; 71 ResTable mOverlayTable; 72 void* mData; 73 size_t mDataSize; 74}; 75 76TEST_F(IdmapTest, canLoadIdmap) { 77 ASSERT_EQ(NO_ERROR, mTargetTable.add(overlay_arsc, overlay_arsc_len, mData, mDataSize)); 78} 79 80TEST_F(IdmapTest, overlayOverridesResourceValue) { 81 Res_value val; 82 ssize_t block = mTargetTable.getResource(string_test2, &val, false); 83 ASSERT_GE(block, 0); 84 ASSERT_EQ(Res_value::TYPE_STRING, val.dataType); 85 const ResStringPool* pool = mTargetTable.getTableStringBlock(block); 86 ASSERT_TRUE(pool != NULL); 87 ASSERT_LT(val.data, pool->size()); 88 89 size_t strLen; 90 const char16_t* targetStr16 = pool->stringAt(val.data, &strLen); 91 ASSERT_TRUE(targetStr16 != NULL); 92 ASSERT_EQ(String16("test2"), String16(targetStr16, strLen)); 93 94 ASSERT_EQ(NO_ERROR, mTargetTable.add(overlay_arsc, overlay_arsc_len, mData, mDataSize)); 95 96 ssize_t newBlock = mTargetTable.getResource(string_test2, &val, false); 97 ASSERT_GE(newBlock, 0); 98 ASSERT_NE(block, newBlock); 99 ASSERT_EQ(Res_value::TYPE_STRING, val.dataType); 100 pool = mTargetTable.getTableStringBlock(newBlock); 101 ASSERT_TRUE(pool != NULL); 102 ASSERT_LT(val.data, pool->size()); 103 104 targetStr16 = pool->stringAt(val.data, &strLen); 105 ASSERT_TRUE(targetStr16 != NULL); 106 ASSERT_EQ(String16("test2-overlay"), String16(targetStr16, strLen)); 107} 108 109TEST_F(IdmapTest, overlaidResourceHasSameName) { 110 ASSERT_EQ(NO_ERROR, mTargetTable.add(overlay_arsc, overlay_arsc_len, mData, mDataSize)); 111 112 ResTable::resource_name resName; 113 ASSERT_TRUE(mTargetTable.getResourceName(array_integerArray1, false, &resName)); 114 115 ASSERT_TRUE(resName.package != NULL); 116 ASSERT_TRUE(resName.type != NULL); 117 ASSERT_TRUE(resName.name != NULL); 118 119 EXPECT_EQ(String16("com.android.test.basic"), String16(resName.package, resName.packageLen)); 120 EXPECT_EQ(String16("array"), String16(resName.type, resName.typeLen)); 121 EXPECT_EQ(String16("integerArray1"), String16(resName.name, resName.nameLen)); 122} 123 124} // namespace 125