blob: ce84993feebeb54f0fed21f0cca426865039630f [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"
Adam Lesinski2ae4a872015-11-02 16:10:55 -080018
Adam Lesinskice5e56e2016-10-21 17:56:45 -070019#include "test/Test.h"
Adam Lesinski2ae4a872015-11-02 16:10:55 -080020
Adam Lesinskid5083f62017-01-16 15:07:21 -080021using android::StringPiece;
22
Adam Lesinski2ae4a872015-11-02 16:10:55 -080023namespace aapt {
24
25struct ManifestFixerTest : public ::testing::Test {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070026 std::unique_ptr<IAaptContext> mContext;
Adam Lesinski2ae4a872015-11-02 16:10:55 -080027
Adam Lesinskicacb28f2016-10-19 12:18:14 -070028 void SetUp() override {
29 mContext =
30 test::ContextBuilder()
Adam Lesinskice5e56e2016-10-21 17:56:45 -070031 .SetCompilationPackage("android")
32 .SetPackageId(0x01)
33 .SetNameManglerPolicy(NameManglerPolicy{"android"})
34 .AddSymbolSource(
Adam Lesinskicacb28f2016-10-19 12:18:14 -070035 test::StaticSymbolSourceBuilder()
Adam Lesinskice5e56e2016-10-21 17:56:45 -070036 .AddSymbol(
Adam Lesinskicacb28f2016-10-19 12:18:14 -070037 "android:attr/package", ResourceId(0x01010000),
38 test::AttributeBuilder()
Adam Lesinskice5e56e2016-10-21 17:56:45 -070039 .SetTypeMask(android::ResTable_map::TYPE_STRING)
40 .Build())
41 .AddSymbol(
Adam Lesinskicacb28f2016-10-19 12:18:14 -070042 "android:attr/minSdkVersion", ResourceId(0x01010001),
43 test::AttributeBuilder()
Adam Lesinskice5e56e2016-10-21 17:56:45 -070044 .SetTypeMask(android::ResTable_map::TYPE_STRING |
Adam Lesinskicacb28f2016-10-19 12:18:14 -070045 android::ResTable_map::TYPE_INTEGER)
Adam Lesinskice5e56e2016-10-21 17:56:45 -070046 .Build())
47 .AddSymbol(
Adam Lesinskicacb28f2016-10-19 12:18:14 -070048 "android:attr/targetSdkVersion", ResourceId(0x01010002),
49 test::AttributeBuilder()
Adam Lesinskice5e56e2016-10-21 17:56:45 -070050 .SetTypeMask(android::ResTable_map::TYPE_STRING |
Adam Lesinskicacb28f2016-10-19 12:18:14 -070051 android::ResTable_map::TYPE_INTEGER)
Adam Lesinskice5e56e2016-10-21 17:56:45 -070052 .Build())
53 .AddSymbol("android:string/str", ResourceId(0x01060000))
54 .Build())
55 .Build();
Adam Lesinskicacb28f2016-10-19 12:18:14 -070056 }
Adam Lesinski2ae4a872015-11-02 16:10:55 -080057
Adam Lesinskice5e56e2016-10-21 17:56:45 -070058 std::unique_ptr<xml::XmlResource> Verify(const StringPiece& str) {
59 return VerifyWithOptions(str, {});
Adam Lesinskicacb28f2016-10-19 12:18:14 -070060 }
Adam Lesinski2ae4a872015-11-02 16:10:55 -080061
Adam Lesinskice5e56e2016-10-21 17:56:45 -070062 std::unique_ptr<xml::XmlResource> VerifyWithOptions(
Adam Lesinskicacb28f2016-10-19 12:18:14 -070063 const StringPiece& str, const ManifestFixerOptions& options) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070064 std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(str);
Adam Lesinskicacb28f2016-10-19 12:18:14 -070065 ManifestFixer fixer(options);
Adam Lesinskice5e56e2016-10-21 17:56:45 -070066 if (fixer.Consume(mContext.get(), doc.get())) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070067 return doc;
Adam Lesinski2ae4a872015-11-02 16:10:55 -080068 }
Adam Lesinskicacb28f2016-10-19 12:18:14 -070069 return {};
70 }
Adam Lesinski2ae4a872015-11-02 16:10:55 -080071};
72
73TEST_F(ManifestFixerTest, EnsureManifestIsRootTag) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070074 EXPECT_EQ(nullptr, Verify("<other-tag />"));
75 EXPECT_EQ(nullptr, Verify("<ns:manifest xmlns:ns=\"com\" />"));
76 EXPECT_NE(nullptr, Verify("<manifest package=\"android\"></manifest>"));
Adam Lesinski2ae4a872015-11-02 16:10:55 -080077}
78
79TEST_F(ManifestFixerTest, EnsureManifestHasPackage) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070080 EXPECT_NE(nullptr, Verify("<manifest package=\"android\" />"));
81 EXPECT_NE(nullptr, Verify("<manifest package=\"com.android\" />"));
82 EXPECT_NE(nullptr, Verify("<manifest package=\"com.android.google\" />"));
Adam Lesinskicacb28f2016-10-19 12:18:14 -070083 EXPECT_EQ(nullptr,
Adam Lesinskice5e56e2016-10-21 17:56:45 -070084 Verify("<manifest package=\"com.android.google.Class$1\" />"));
85 EXPECT_EQ(nullptr, Verify("<manifest "
Adam Lesinskicacb28f2016-10-19 12:18:14 -070086 "xmlns:android=\"http://schemas.android.com/apk/"
87 "res/android\" "
88 "android:package=\"com.android\" />"));
Adam Lesinskice5e56e2016-10-21 17:56:45 -070089 EXPECT_EQ(nullptr, Verify("<manifest package=\"@string/str\" />"));
Adam Lesinski2ae4a872015-11-02 16:10:55 -080090}
91
Adam Lesinski5119e512016-12-05 19:48:20 -080092TEST_F(ManifestFixerTest, AllowMetaData) {
Adam Lesinski86d67df2017-01-31 13:47:27 -080093 auto doc = Verify(R"EOF(
Adam Lesinski5119e512016-12-05 19:48:20 -080094 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
95 package="android">
96 <meta-data />
97 <application>
98 <meta-data />
99 <activity android:name=".Hi"><meta-data /></activity>
100 <activity-alias android:name=".Ho"><meta-data /></activity-alias>
Adam Lesinski86d67df2017-01-31 13:47:27 -0800101 <receiver android:name=".OffTo"><meta-data /></receiver>
102 <provider android:name=".Work"><meta-data /></provider>
103 <service android:name=".We"><meta-data /></service>
Adam Lesinski5119e512016-12-05 19:48:20 -0800104 </application>
Adam Lesinski86d67df2017-01-31 13:47:27 -0800105 <instrumentation android:name=".Go"><meta-data /></instrumentation>
Adam Lesinski5119e512016-12-05 19:48:20 -0800106 </manifest>)EOF");
Adam Lesinski86d67df2017-01-31 13:47:27 -0800107 ASSERT_NE(nullptr, doc);
Adam Lesinski5119e512016-12-05 19:48:20 -0800108}
109
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800110TEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700111 ManifestFixerOptions options = {std::string("8"), std::string("22")};
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800112
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700113 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800114 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
115 package="android">
116 <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700117 </manifest>)EOF",
118 options);
119 ASSERT_NE(nullptr, doc);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800120
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700121 xml::Element* el;
122 xml::Attribute* attr;
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800123
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700124 el = xml::FindRootElement(doc.get());
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700125 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700126 el = el->FindChild({}, "uses-sdk");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700127 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700128 attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700129 ASSERT_NE(nullptr, attr);
130 EXPECT_EQ("7", attr->value);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700131 attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700132 ASSERT_NE(nullptr, attr);
133 EXPECT_EQ("21", attr->value);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800134
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700135 doc = VerifyWithOptions(R"EOF(
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800136 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
137 package="android">
138 <uses-sdk android:targetSdkVersion="21" />
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700139 </manifest>)EOF",
140 options);
141 ASSERT_NE(nullptr, doc);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800142
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700143 el = xml::FindRootElement(doc.get());
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700144 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700145 el = el->FindChild({}, "uses-sdk");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700146 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700147 attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700148 ASSERT_NE(nullptr, attr);
149 EXPECT_EQ("8", attr->value);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700150 attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700151 ASSERT_NE(nullptr, attr);
152 EXPECT_EQ("21", attr->value);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800153
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700154 doc = VerifyWithOptions(R"EOF(
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800155 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
156 package="android">
157 <uses-sdk />
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700158 </manifest>)EOF",
159 options);
160 ASSERT_NE(nullptr, doc);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800161
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700162 el = xml::FindRootElement(doc.get());
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700163 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700164 el = el->FindChild({}, "uses-sdk");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700165 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700166 attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700167 ASSERT_NE(nullptr, attr);
168 EXPECT_EQ("8", attr->value);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700169 attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700170 ASSERT_NE(nullptr, attr);
171 EXPECT_EQ("22", attr->value);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800172
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700173 doc = VerifyWithOptions(R"EOF(
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800174 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700175 package="android" />)EOF",
176 options);
177 ASSERT_NE(nullptr, doc);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800178
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700179 el = xml::FindRootElement(doc.get());
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700180 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700181 el = el->FindChild({}, "uses-sdk");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700182 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700183 attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700184 ASSERT_NE(nullptr, attr);
185 EXPECT_EQ("8", attr->value);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700186 attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700187 ASSERT_NE(nullptr, attr);
188 EXPECT_EQ("22", attr->value);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800189}
190
Adam Lesinskie343eb12016-10-27 16:31:58 -0700191TEST_F(ManifestFixerTest, UsesSdkMustComeBeforeApplication) {
192 ManifestFixerOptions options = {std::string("8"), std::string("22")};
193 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
194 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
195 package="android">
196 <application android:name=".MainApplication" />
197 </manifest>)EOF",
198 options);
199 ASSERT_NE(nullptr, doc);
200
201 xml::Element* manifest_el = xml::FindRootElement(doc.get());
202 ASSERT_NE(nullptr, manifest_el);
203 ASSERT_EQ("manifest", manifest_el->name);
204
205 xml::Element* application_el = manifest_el->FindChild("", "application");
206 ASSERT_NE(nullptr, application_el);
207
208 xml::Element* uses_sdk_el = manifest_el->FindChild("", "uses-sdk");
209 ASSERT_NE(nullptr, uses_sdk_el);
210
211 // Check that the uses_sdk_el comes before application_el in the children
212 // vector.
213 // Since there are no namespaces here, these children are direct descendants
214 // of manifest.
215 auto uses_sdk_iter =
216 std::find_if(manifest_el->children.begin(), manifest_el->children.end(),
217 [&](const std::unique_ptr<xml::Node>& child) {
218 return child.get() == uses_sdk_el;
219 });
220
221 auto application_iter =
222 std::find_if(manifest_el->children.begin(), manifest_el->children.end(),
223 [&](const std::unique_ptr<xml::Node>& child) {
224 return child.get() == application_el;
225 });
226
227 ASSERT_NE(manifest_el->children.end(), uses_sdk_iter);
228 ASSERT_NE(manifest_el->children.end(), application_iter);
229
230 // The distance should be positive, meaning uses_sdk_iter comes before
231 // application_iter.
232 EXPECT_GT(std::distance(uses_sdk_iter, application_iter), 0);
233}
234
Adam Lesinski52364f72016-01-11 13:10:24 -0800235TEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700236 ManifestFixerOptions options;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700237 options.rename_manifest_package = std::string("com.android");
Adam Lesinski52364f72016-01-11 13:10:24 -0800238
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700239 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
Adam Lesinski52364f72016-01-11 13:10:24 -0800240 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
241 package="android">
Adam Lesinskicc5609d2016-04-05 12:41:07 -0700242 <application android:name=".MainApplication" text="hello">
243 <activity android:name=".activity.Start" />
244 <receiver android:name="com.google.android.Receiver" />
Adam Lesinski52364f72016-01-11 13:10:24 -0800245 </application>
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700246 </manifest>)EOF",
247 options);
248 ASSERT_NE(nullptr, doc);
Adam Lesinski52364f72016-01-11 13:10:24 -0800249
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700250 xml::Element* manifestEl = xml::FindRootElement(doc.get());
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700251 ASSERT_NE(nullptr, manifestEl);
Adam Lesinski52364f72016-01-11 13:10:24 -0800252
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700253 xml::Attribute* attr = nullptr;
Adam Lesinski52364f72016-01-11 13:10:24 -0800254
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700255 attr = manifestEl->FindAttribute({}, "package");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700256 ASSERT_NE(nullptr, attr);
257 EXPECT_EQ(std::string("com.android"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800258
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700259 xml::Element* applicationEl = manifestEl->FindChild({}, "application");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700260 ASSERT_NE(nullptr, applicationEl);
Adam Lesinski52364f72016-01-11 13:10:24 -0800261
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700262 attr = applicationEl->FindAttribute(xml::kSchemaAndroid, "name");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700263 ASSERT_NE(nullptr, attr);
264 EXPECT_EQ(std::string("android.MainApplication"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800265
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700266 attr = applicationEl->FindAttribute({}, "text");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700267 ASSERT_NE(nullptr, attr);
268 EXPECT_EQ(std::string("hello"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800269
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700270 xml::Element* el;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700271 el = applicationEl->FindChild({}, "activity");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700272 ASSERT_NE(nullptr, el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800273
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700274 attr = el->FindAttribute(xml::kSchemaAndroid, "name");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700275 ASSERT_NE(nullptr, el);
276 EXPECT_EQ(std::string("android.activity.Start"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800277
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700278 el = applicationEl->FindChild({}, "receiver");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700279 ASSERT_NE(nullptr, el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800280
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700281 attr = el->FindAttribute(xml::kSchemaAndroid, "name");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700282 ASSERT_NE(nullptr, el);
283 EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800284}
285
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700286TEST_F(ManifestFixerTest,
287 RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
288 ManifestFixerOptions options;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700289 options.rename_instrumentation_target_package = std::string("com.android");
Adam Lesinski52364f72016-01-11 13:10:24 -0800290
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700291 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
Adam Lesinski52364f72016-01-11 13:10:24 -0800292 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
293 package="android">
Adam Lesinski86d67df2017-01-31 13:47:27 -0800294 <instrumentation android:name=".TestRunner" android:targetPackage="android" />
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700295 </manifest>)EOF",
296 options);
297 ASSERT_NE(nullptr, doc);
Adam Lesinski52364f72016-01-11 13:10:24 -0800298
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700299 xml::Element* manifest_el = xml::FindRootElement(doc.get());
300 ASSERT_NE(nullptr, manifest_el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800301
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700302 xml::Element* instrumentation_el =
303 manifest_el->FindChild({}, "instrumentation");
304 ASSERT_NE(nullptr, instrumentation_el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800305
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700306 xml::Attribute* attr =
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700307 instrumentation_el->FindAttribute(xml::kSchemaAndroid, "targetPackage");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700308 ASSERT_NE(nullptr, attr);
309 EXPECT_EQ(std::string("com.android"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800310}
311
312TEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700313 ManifestFixerOptions options;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700314 options.version_name_default = std::string("Beta");
315 options.version_code_default = std::string("0x10000000");
Adam Lesinski52364f72016-01-11 13:10:24 -0800316
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700317 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
Adam Lesinski52364f72016-01-11 13:10:24 -0800318 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700319 package="android" />)EOF",
320 options);
321 ASSERT_NE(nullptr, doc);
Adam Lesinski52364f72016-01-11 13:10:24 -0800322
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700323 xml::Element* manifest_el = xml::FindRootElement(doc.get());
324 ASSERT_NE(nullptr, manifest_el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800325
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700326 xml::Attribute* attr =
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700327 manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700328 ASSERT_NE(nullptr, attr);
329 EXPECT_EQ(std::string("Beta"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800330
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700331 attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700332 ASSERT_NE(nullptr, attr);
333 EXPECT_EQ(std::string("0x10000000"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800334}
335
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700336TEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700337 EXPECT_EQ(nullptr,
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700338 Verify("<manifest package=\"android\" coreApp=\"hello\" />"));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700339 EXPECT_EQ(nullptr,
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700340 Verify("<manifest package=\"android\" coreApp=\"1dp\" />"));
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700341
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700342 std::unique_ptr<xml::XmlResource> doc =
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700343 Verify("<manifest package=\"android\" coreApp=\"true\" />");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700344 ASSERT_NE(nullptr, doc);
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700345
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700346 xml::Element* el = xml::FindRootElement(doc.get());
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700347 ASSERT_NE(nullptr, el);
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700348
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700349 EXPECT_EQ("manifest", el->name);
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700350
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700351 xml::Attribute* attr = el->FindAttribute("", "coreApp");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700352 ASSERT_NE(nullptr, attr);
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700353
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700354 EXPECT_NE(nullptr, attr->compiled_value);
355 EXPECT_NE(nullptr, ValueCast<BinaryPrimitive>(attr->compiled_value.get()));
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700356}
357
Adam Lesinski86d67df2017-01-31 13:47:27 -0800358TEST_F(ManifestFixerTest, UsesFeatureMustHaveNameOrGlEsVersion) {
359 std::string input = R"EOF(
360 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
361 package="android">
362 <uses-feature android:name="feature" />
363 <uses-feature android:glEsVersion="1" />
364 <feature-group />
365 <feature-group>
366 <uses-feature android:name="feature_in_group" />
367 <uses-feature android:glEsVersion="2" />
368 </feature-group>
369 </manifest>)EOF";
370 EXPECT_NE(nullptr, Verify(input));
371
372 input = R"EOF(
373 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
374 package="android">
375 <uses-feature android:name="feature" android:glEsVersion="1" />
376 </manifest>)EOF";
377 EXPECT_EQ(nullptr, Verify(input));
378
379 input = R"EOF(
380 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
381 package="android">
382 <uses-feature />
383 </manifest>)EOF";
384 EXPECT_EQ(nullptr, Verify(input));
385
386 input = R"EOF(
387 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
388 package="android">
389 <feature-group>
390 <uses-feature android:name="feature" android:glEsVersion="1" />
391 </feature-group>
392 </manifest>)EOF";
393 EXPECT_EQ(nullptr, Verify(input));
394
395 input = R"EOF(
396 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
397 package="android">
398 <feature-group>
399 <uses-feature />
400 </feature-group>
401 </manifest>)EOF";
402 EXPECT_EQ(nullptr, Verify(input));
403}
404
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700405} // namespace aapt