ManifestFixer_test.cpp revision 2ae4a877d1623f851040ce69239552c873f1abf0
1/*
2 * Copyright (C) 2015 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 "link/ManifestFixer.h"
18
19#include "test/Builders.h"
20#include "test/Context.h"
21
22#include <gtest/gtest.h>
23
24namespace aapt {
25
26struct ManifestFixerTest : public ::testing::Test {
27    std::unique_ptr<IAaptContext> mContext;
28
29    void SetUp() override {
30        mContext = test::ContextBuilder()
31                .setCompilationPackage(u"android")
32                .setPackageId(0x01)
33                .setNameManglerPolicy(NameManglerPolicy{ u"android" })
34                .setSymbolTable(test::StaticSymbolTableBuilder()
35                        .addSymbol(u"@android:attr/package", ResourceId(0x01010000),
36                                   test::AttributeBuilder()
37                                        .setTypeMask(android::ResTable_map::TYPE_STRING)
38                                        .build())
39                        .addSymbol(u"@android:attr/minSdkVersion", ResourceId(0x01010001),
40                                   test::AttributeBuilder()
41                                        .setTypeMask(android::ResTable_map::TYPE_STRING |
42                                                     android::ResTable_map::TYPE_INTEGER)
43                                        .build())
44                        .addSymbol(u"@android:attr/targetSdkVersion", ResourceId(0x01010002),
45                                   test::AttributeBuilder()
46                                        .setTypeMask(android::ResTable_map::TYPE_STRING |
47                                                     android::ResTable_map::TYPE_INTEGER)
48                                        .build())
49                        .addSymbol(u"@android:string/str", ResourceId(0x01060000))
50                        .build())
51                .build();
52    }
53
54    std::unique_ptr<XmlResource> verify(const StringPiece& str) {
55        return verifyWithOptions(str, {});
56    }
57
58    std::unique_ptr<XmlResource> verifyWithOptions(const StringPiece& str,
59                                                   const ManifestFixerOptions& options) {
60        std::unique_ptr<XmlResource> doc = test::buildXmlDom(str);
61        ManifestFixer fixer(options);
62        if (fixer.consume(mContext.get(), doc.get())) {
63            return doc;
64        }
65        return {};
66    }
67};
68
69TEST_F(ManifestFixerTest, EnsureManifestIsRootTag) {
70    EXPECT_EQ(nullptr, verify("<other-tag />"));
71    EXPECT_EQ(nullptr, verify("<ns:manifest xmlns:ns=\"com\" />"));
72    EXPECT_NE(nullptr, verify("<manifest package=\"android\"></manifest>"));
73}
74
75TEST_F(ManifestFixerTest, EnsureManifestHasPackage) {
76    EXPECT_NE(nullptr, verify("<manifest package=\"android\" />"));
77    EXPECT_NE(nullptr, verify("<manifest package=\"com.android\" />"));
78    EXPECT_NE(nullptr, verify("<manifest package=\"com.android.google\" />"));
79    EXPECT_EQ(nullptr, verify("<manifest package=\"com.android.google.Class$1\" />"));
80    EXPECT_EQ(nullptr,
81              verify("<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" "
82                     "android:package=\"com.android\" />"));
83    EXPECT_EQ(nullptr, verify("<manifest package=\"@string/str\" />"));
84}
85
86
87
88TEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) {
89    ManifestFixerOptions options = { std::u16string(u"8"), std::u16string(u"22") };
90
91    std::unique_ptr<XmlResource> doc = verifyWithOptions(R"EOF(
92      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
93                package="android">
94        <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
95      </manifest>)EOF", options);
96    ASSERT_NE(nullptr, doc);
97
98    xml::Element* el;
99    xml::Attribute* attr;
100
101    el = xml::findRootElement(doc->root.get());
102    ASSERT_NE(nullptr, el);
103    el = el->findChild({}, u"uses-sdk");
104    ASSERT_NE(nullptr, el);
105    attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion");
106    ASSERT_NE(nullptr, attr);
107    EXPECT_EQ(u"7", attr->value);
108    attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion");
109    ASSERT_NE(nullptr, attr);
110    EXPECT_EQ(u"21", attr->value);
111
112    doc = verifyWithOptions(R"EOF(
113      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
114                package="android">
115        <uses-sdk android:targetSdkVersion="21" />
116      </manifest>)EOF", options);
117    ASSERT_NE(nullptr, doc);
118
119    el = xml::findRootElement(doc->root.get());
120    ASSERT_NE(nullptr, el);
121    el = el->findChild({}, u"uses-sdk");
122    ASSERT_NE(nullptr, el);
123    attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion");
124    ASSERT_NE(nullptr, attr);
125    EXPECT_EQ(u"8", attr->value);
126    attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion");
127    ASSERT_NE(nullptr, attr);
128    EXPECT_EQ(u"21", attr->value);
129
130    doc = verifyWithOptions(R"EOF(
131      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
132                package="android">
133        <uses-sdk />
134      </manifest>)EOF", options);
135    ASSERT_NE(nullptr, doc);
136
137    el = xml::findRootElement(doc->root.get());
138    ASSERT_NE(nullptr, el);
139    el = el->findChild({}, u"uses-sdk");
140    ASSERT_NE(nullptr, el);
141    attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion");
142    ASSERT_NE(nullptr, attr);
143    EXPECT_EQ(u"8", attr->value);
144    attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion");
145    ASSERT_NE(nullptr, attr);
146    EXPECT_EQ(u"22", attr->value);
147
148    doc = verifyWithOptions(R"EOF(
149      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
150                package="android" />)EOF", options);
151    ASSERT_NE(nullptr, doc);
152
153    el = xml::findRootElement(doc->root.get());
154    ASSERT_NE(nullptr, el);
155    el = el->findChild({}, u"uses-sdk");
156    ASSERT_NE(nullptr, el);
157    attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion");
158    ASSERT_NE(nullptr, attr);
159    EXPECT_EQ(u"8", attr->value);
160    attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion");
161    ASSERT_NE(nullptr, attr);
162    EXPECT_EQ(u"22", attr->value);
163}
164
165} // namespace aapt
166