blob: 5c5d8afa610de52f500431115dcac12937ce86ac [file] [log] [blame]
Adam Lesinski2ae4a872015-11-02 16:10:55 -08001/*
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