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