blob: da7f410b8b0860e95b7a72ec857e68874f3e917e [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 Lesinski87f1e0f2017-06-27 16:21:58 -070021using ::android::StringPiece;
22using ::testing::NotNull;
Adam Lesinskid5083f62017-01-16 15:07:21 -080023
Adam Lesinski2ae4a872015-11-02 16:10:55 -080024namespace aapt {
25
26struct ManifestFixerTest : public ::testing::Test {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070027 std::unique_ptr<IAaptContext> mContext;
Adam Lesinski2ae4a872015-11-02 16:10:55 -080028
Adam Lesinskicacb28f2016-10-19 12:18:14 -070029 void SetUp() override {
30 mContext =
31 test::ContextBuilder()
Adam Lesinskice5e56e2016-10-21 17:56:45 -070032 .SetCompilationPackage("android")
33 .SetPackageId(0x01)
34 .SetNameManglerPolicy(NameManglerPolicy{"android"})
35 .AddSymbolSource(
Adam Lesinskicacb28f2016-10-19 12:18:14 -070036 test::StaticSymbolSourceBuilder()
Adam Lesinskice5e56e2016-10-21 17:56:45 -070037 .AddSymbol(
Adam Lesinskicacb28f2016-10-19 12:18:14 -070038 "android:attr/package", ResourceId(0x01010000),
39 test::AttributeBuilder()
Adam Lesinskice5e56e2016-10-21 17:56:45 -070040 .SetTypeMask(android::ResTable_map::TYPE_STRING)
41 .Build())
42 .AddSymbol(
Adam Lesinskicacb28f2016-10-19 12:18:14 -070043 "android:attr/minSdkVersion", ResourceId(0x01010001),
44 test::AttributeBuilder()
Adam Lesinskice5e56e2016-10-21 17:56:45 -070045 .SetTypeMask(android::ResTable_map::TYPE_STRING |
Adam Lesinskicacb28f2016-10-19 12:18:14 -070046 android::ResTable_map::TYPE_INTEGER)
Adam Lesinskice5e56e2016-10-21 17:56:45 -070047 .Build())
48 .AddSymbol(
Adam Lesinskicacb28f2016-10-19 12:18:14 -070049 "android:attr/targetSdkVersion", ResourceId(0x01010002),
50 test::AttributeBuilder()
Adam Lesinskice5e56e2016-10-21 17:56:45 -070051 .SetTypeMask(android::ResTable_map::TYPE_STRING |
Adam Lesinskicacb28f2016-10-19 12:18:14 -070052 android::ResTable_map::TYPE_INTEGER)
Adam Lesinskice5e56e2016-10-21 17:56:45 -070053 .Build())
54 .AddSymbol("android:string/str", ResourceId(0x01060000))
55 .Build())
56 .Build();
Adam Lesinskicacb28f2016-10-19 12:18:14 -070057 }
Adam Lesinski2ae4a872015-11-02 16:10:55 -080058
Adam Lesinskice5e56e2016-10-21 17:56:45 -070059 std::unique_ptr<xml::XmlResource> Verify(const StringPiece& str) {
60 return VerifyWithOptions(str, {});
Adam Lesinskicacb28f2016-10-19 12:18:14 -070061 }
Adam Lesinski2ae4a872015-11-02 16:10:55 -080062
Adam Lesinskice5e56e2016-10-21 17:56:45 -070063 std::unique_ptr<xml::XmlResource> VerifyWithOptions(
Adam Lesinskicacb28f2016-10-19 12:18:14 -070064 const StringPiece& str, const ManifestFixerOptions& options) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070065 std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(str);
Adam Lesinskicacb28f2016-10-19 12:18:14 -070066 ManifestFixer fixer(options);
Adam Lesinskice5e56e2016-10-21 17:56:45 -070067 if (fixer.Consume(mContext.get(), doc.get())) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -070068 return doc;
Adam Lesinski2ae4a872015-11-02 16:10:55 -080069 }
Adam Lesinskicacb28f2016-10-19 12:18:14 -070070 return {};
71 }
Adam Lesinski2ae4a872015-11-02 16:10:55 -080072};
73
74TEST_F(ManifestFixerTest, EnsureManifestIsRootTag) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070075 EXPECT_EQ(nullptr, Verify("<other-tag />"));
76 EXPECT_EQ(nullptr, Verify("<ns:manifest xmlns:ns=\"com\" />"));
77 EXPECT_NE(nullptr, Verify("<manifest package=\"android\"></manifest>"));
Adam Lesinski2ae4a872015-11-02 16:10:55 -080078}
79
80TEST_F(ManifestFixerTest, EnsureManifestHasPackage) {
Adam Lesinskice5e56e2016-10-21 17:56:45 -070081 EXPECT_NE(nullptr, Verify("<manifest package=\"android\" />"));
82 EXPECT_NE(nullptr, Verify("<manifest package=\"com.android\" />"));
83 EXPECT_NE(nullptr, Verify("<manifest package=\"com.android.google\" />"));
Adam Lesinskicacb28f2016-10-19 12:18:14 -070084 EXPECT_EQ(nullptr,
Adam Lesinskice5e56e2016-10-21 17:56:45 -070085 Verify("<manifest package=\"com.android.google.Class$1\" />"));
86 EXPECT_EQ(nullptr, Verify("<manifest "
Adam Lesinskicacb28f2016-10-19 12:18:14 -070087 "xmlns:android=\"http://schemas.android.com/apk/"
88 "res/android\" "
89 "android:package=\"com.android\" />"));
Adam Lesinskice5e56e2016-10-21 17:56:45 -070090 EXPECT_EQ(nullptr, Verify("<manifest package=\"@string/str\" />"));
Adam Lesinski2ae4a872015-11-02 16:10:55 -080091}
92
Adam Lesinski5119e512016-12-05 19:48:20 -080093TEST_F(ManifestFixerTest, AllowMetaData) {
Adam Lesinski86d67df2017-01-31 13:47:27 -080094 auto doc = Verify(R"EOF(
Adam Lesinski5119e512016-12-05 19:48:20 -080095 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
96 package="android">
97 <meta-data />
98 <application>
99 <meta-data />
100 <activity android:name=".Hi"><meta-data /></activity>
101 <activity-alias android:name=".Ho"><meta-data /></activity-alias>
Adam Lesinski86d67df2017-01-31 13:47:27 -0800102 <receiver android:name=".OffTo"><meta-data /></receiver>
103 <provider android:name=".Work"><meta-data /></provider>
104 <service android:name=".We"><meta-data /></service>
Adam Lesinski5119e512016-12-05 19:48:20 -0800105 </application>
Adam Lesinski86d67df2017-01-31 13:47:27 -0800106 <instrumentation android:name=".Go"><meta-data /></instrumentation>
Adam Lesinski5119e512016-12-05 19:48:20 -0800107 </manifest>)EOF");
Adam Lesinski86d67df2017-01-31 13:47:27 -0800108 ASSERT_NE(nullptr, doc);
Adam Lesinski5119e512016-12-05 19:48:20 -0800109}
110
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800111TEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700112 ManifestFixerOptions options = {std::string("8"), std::string("22")};
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800113
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700114 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800115 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
116 package="android">
117 <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700118 </manifest>)EOF",
119 options);
120 ASSERT_NE(nullptr, doc);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800121
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700122 xml::Element* el;
123 xml::Attribute* attr;
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800124
Adam Lesinski6b372992017-08-09 10:54:23 -0700125 el = doc->root.get();
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700126 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700127 el = el->FindChild({}, "uses-sdk");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700128 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700129 attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700130 ASSERT_NE(nullptr, attr);
131 EXPECT_EQ("7", attr->value);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700132 attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700133 ASSERT_NE(nullptr, attr);
134 EXPECT_EQ("21", attr->value);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800135
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700136 doc = VerifyWithOptions(R"EOF(
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800137 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
138 package="android">
139 <uses-sdk android:targetSdkVersion="21" />
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700140 </manifest>)EOF",
141 options);
142 ASSERT_NE(nullptr, doc);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800143
Adam Lesinski6b372992017-08-09 10:54:23 -0700144 el = doc->root.get();
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700145 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700146 el = el->FindChild({}, "uses-sdk");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700147 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700148 attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700149 ASSERT_NE(nullptr, attr);
150 EXPECT_EQ("8", attr->value);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700151 attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700152 ASSERT_NE(nullptr, attr);
153 EXPECT_EQ("21", attr->value);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800154
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700155 doc = VerifyWithOptions(R"EOF(
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800156 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
157 package="android">
158 <uses-sdk />
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700159 </manifest>)EOF",
160 options);
161 ASSERT_NE(nullptr, doc);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800162
Adam Lesinski6b372992017-08-09 10:54:23 -0700163 el = doc->root.get();
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700164 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700165 el = el->FindChild({}, "uses-sdk");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700166 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700167 attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700168 ASSERT_NE(nullptr, attr);
169 EXPECT_EQ("8", attr->value);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700170 attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700171 ASSERT_NE(nullptr, attr);
172 EXPECT_EQ("22", attr->value);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800173
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700174 doc = VerifyWithOptions(R"EOF(
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800175 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700176 package="android" />)EOF",
177 options);
178 ASSERT_NE(nullptr, doc);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800179
Adam Lesinski6b372992017-08-09 10:54:23 -0700180 el = doc->root.get();
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700181 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700182 el = el->FindChild({}, "uses-sdk");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700183 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700184 attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700185 ASSERT_NE(nullptr, attr);
186 EXPECT_EQ("8", attr->value);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700187 attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700188 ASSERT_NE(nullptr, attr);
189 EXPECT_EQ("22", attr->value);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800190}
191
Adam Lesinskie343eb12016-10-27 16:31:58 -0700192TEST_F(ManifestFixerTest, UsesSdkMustComeBeforeApplication) {
193 ManifestFixerOptions options = {std::string("8"), std::string("22")};
194 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
195 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
196 package="android">
197 <application android:name=".MainApplication" />
198 </manifest>)EOF",
199 options);
200 ASSERT_NE(nullptr, doc);
201
Adam Lesinski6b372992017-08-09 10:54:23 -0700202 xml::Element* manifest_el = doc->root.get();
Adam Lesinskie343eb12016-10-27 16:31:58 -0700203 ASSERT_NE(nullptr, manifest_el);
204 ASSERT_EQ("manifest", manifest_el->name);
205
206 xml::Element* application_el = manifest_el->FindChild("", "application");
207 ASSERT_NE(nullptr, application_el);
208
209 xml::Element* uses_sdk_el = manifest_el->FindChild("", "uses-sdk");
210 ASSERT_NE(nullptr, uses_sdk_el);
211
212 // Check that the uses_sdk_el comes before application_el in the children
213 // vector.
214 // Since there are no namespaces here, these children are direct descendants
215 // of manifest.
216 auto uses_sdk_iter =
217 std::find_if(manifest_el->children.begin(), manifest_el->children.end(),
218 [&](const std::unique_ptr<xml::Node>& child) {
219 return child.get() == uses_sdk_el;
220 });
221
222 auto application_iter =
223 std::find_if(manifest_el->children.begin(), manifest_el->children.end(),
224 [&](const std::unique_ptr<xml::Node>& child) {
225 return child.get() == application_el;
226 });
227
228 ASSERT_NE(manifest_el->children.end(), uses_sdk_iter);
229 ASSERT_NE(manifest_el->children.end(), application_iter);
230
231 // The distance should be positive, meaning uses_sdk_iter comes before
232 // application_iter.
233 EXPECT_GT(std::distance(uses_sdk_iter, application_iter), 0);
234}
235
Adam Lesinski52364f72016-01-11 13:10:24 -0800236TEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700237 ManifestFixerOptions options;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700238 options.rename_manifest_package = std::string("com.android");
Adam Lesinski52364f72016-01-11 13:10:24 -0800239
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700240 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
Adam Lesinski52364f72016-01-11 13:10:24 -0800241 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
242 package="android">
Adam Lesinskicc5609d2016-04-05 12:41:07 -0700243 <application android:name=".MainApplication" text="hello">
244 <activity android:name=".activity.Start" />
245 <receiver android:name="com.google.android.Receiver" />
Adam Lesinski52364f72016-01-11 13:10:24 -0800246 </application>
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700247 </manifest>)EOF",
248 options);
249 ASSERT_NE(nullptr, doc);
Adam Lesinski52364f72016-01-11 13:10:24 -0800250
Adam Lesinski6b372992017-08-09 10:54:23 -0700251 xml::Element* manifestEl = doc->root.get();
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700252 ASSERT_NE(nullptr, manifestEl);
Adam Lesinski52364f72016-01-11 13:10:24 -0800253
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700254 xml::Attribute* attr = nullptr;
Adam Lesinski52364f72016-01-11 13:10:24 -0800255
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700256 attr = manifestEl->FindAttribute({}, "package");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700257 ASSERT_NE(nullptr, attr);
258 EXPECT_EQ(std::string("com.android"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800259
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700260 xml::Element* applicationEl = manifestEl->FindChild({}, "application");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700261 ASSERT_NE(nullptr, applicationEl);
Adam Lesinski52364f72016-01-11 13:10:24 -0800262
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700263 attr = applicationEl->FindAttribute(xml::kSchemaAndroid, "name");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700264 ASSERT_NE(nullptr, attr);
265 EXPECT_EQ(std::string("android.MainApplication"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800266
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700267 attr = applicationEl->FindAttribute({}, "text");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700268 ASSERT_NE(nullptr, attr);
269 EXPECT_EQ(std::string("hello"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800270
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700271 xml::Element* el;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700272 el = applicationEl->FindChild({}, "activity");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700273 ASSERT_NE(nullptr, el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800274
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700275 attr = el->FindAttribute(xml::kSchemaAndroid, "name");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700276 ASSERT_NE(nullptr, el);
277 EXPECT_EQ(std::string("android.activity.Start"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800278
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700279 el = applicationEl->FindChild({}, "receiver");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700280 ASSERT_NE(nullptr, el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800281
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700282 attr = el->FindAttribute(xml::kSchemaAndroid, "name");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700283 ASSERT_NE(nullptr, el);
284 EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800285}
286
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700287TEST_F(ManifestFixerTest,
288 RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
289 ManifestFixerOptions options;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700290 options.rename_instrumentation_target_package = std::string("com.android");
Adam Lesinski52364f72016-01-11 13:10:24 -0800291
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700292 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
Adam Lesinski52364f72016-01-11 13:10:24 -0800293 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
294 package="android">
Adam Lesinski86d67df2017-01-31 13:47:27 -0800295 <instrumentation android:name=".TestRunner" android:targetPackage="android" />
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700296 </manifest>)EOF",
297 options);
298 ASSERT_NE(nullptr, doc);
Adam Lesinski52364f72016-01-11 13:10:24 -0800299
Adam Lesinski6b372992017-08-09 10:54:23 -0700300 xml::Element* manifest_el = doc->root.get();
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700301 ASSERT_NE(nullptr, manifest_el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800302
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700303 xml::Element* instrumentation_el =
304 manifest_el->FindChild({}, "instrumentation");
305 ASSERT_NE(nullptr, instrumentation_el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800306
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700307 xml::Attribute* attr =
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700308 instrumentation_el->FindAttribute(xml::kSchemaAndroid, "targetPackage");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700309 ASSERT_NE(nullptr, attr);
310 EXPECT_EQ(std::string("com.android"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800311}
312
313TEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700314 ManifestFixerOptions options;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700315 options.version_name_default = std::string("Beta");
316 options.version_code_default = std::string("0x10000000");
Adam Lesinski52364f72016-01-11 13:10:24 -0800317
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700318 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
Adam Lesinski52364f72016-01-11 13:10:24 -0800319 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700320 package="android" />)EOF",
321 options);
322 ASSERT_NE(nullptr, doc);
Adam Lesinski52364f72016-01-11 13:10:24 -0800323
Adam Lesinski6b372992017-08-09 10:54:23 -0700324 xml::Element* manifest_el = doc->root.get();
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700325 ASSERT_NE(nullptr, manifest_el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800326
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700327 xml::Attribute* attr =
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700328 manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700329 ASSERT_NE(nullptr, attr);
330 EXPECT_EQ(std::string("Beta"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800331
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700332 attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700333 ASSERT_NE(nullptr, attr);
334 EXPECT_EQ(std::string("0x10000000"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800335}
336
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700337TEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700338 EXPECT_EQ(nullptr,
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700339 Verify("<manifest package=\"android\" coreApp=\"hello\" />"));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700340 EXPECT_EQ(nullptr,
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700341 Verify("<manifest package=\"android\" coreApp=\"1dp\" />"));
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700342
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700343 std::unique_ptr<xml::XmlResource> doc =
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700344 Verify("<manifest package=\"android\" coreApp=\"true\" />");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700345 ASSERT_NE(nullptr, doc);
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700346
Adam Lesinski6b372992017-08-09 10:54:23 -0700347 xml::Element* el = doc->root.get();
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700348 ASSERT_NE(nullptr, el);
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700349
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700350 EXPECT_EQ("manifest", el->name);
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700351
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700352 xml::Attribute* attr = el->FindAttribute("", "coreApp");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700353 ASSERT_NE(nullptr, attr);
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700354
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700355 EXPECT_NE(nullptr, attr->compiled_value);
356 EXPECT_NE(nullptr, ValueCast<BinaryPrimitive>(attr->compiled_value.get()));
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700357}
358
Adam Lesinski86d67df2017-01-31 13:47:27 -0800359TEST_F(ManifestFixerTest, UsesFeatureMustHaveNameOrGlEsVersion) {
360 std::string input = R"EOF(
361 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
362 package="android">
363 <uses-feature android:name="feature" />
364 <uses-feature android:glEsVersion="1" />
365 <feature-group />
366 <feature-group>
367 <uses-feature android:name="feature_in_group" />
368 <uses-feature android:glEsVersion="2" />
369 </feature-group>
370 </manifest>)EOF";
371 EXPECT_NE(nullptr, Verify(input));
372
373 input = R"EOF(
374 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
375 package="android">
376 <uses-feature android:name="feature" android:glEsVersion="1" />
377 </manifest>)EOF";
378 EXPECT_EQ(nullptr, Verify(input));
379
380 input = R"EOF(
381 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
382 package="android">
383 <uses-feature />
384 </manifest>)EOF";
385 EXPECT_EQ(nullptr, Verify(input));
386
387 input = R"EOF(
388 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
389 package="android">
390 <feature-group>
391 <uses-feature android:name="feature" android:glEsVersion="1" />
392 </feature-group>
393 </manifest>)EOF";
394 EXPECT_EQ(nullptr, Verify(input));
395
396 input = R"EOF(
397 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
398 package="android">
399 <feature-group>
400 <uses-feature />
401 </feature-group>
402 </manifest>)EOF";
403 EXPECT_EQ(nullptr, Verify(input));
404}
405
Adam Lesinski63699b12017-05-08 18:36:33 -0700406TEST_F(ManifestFixerTest, IgnoreNamespacedElements) {
407 std::string input = R"EOF(
408 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
409 package="android">
410 <special:tag whoo="true" xmlns:special="http://google.com" />
411 </manifest>)EOF";
412 EXPECT_NE(nullptr, Verify(input));
413}
414
415TEST_F(ManifestFixerTest, DoNotIgnoreNonNamespacedElements) {
416 std::string input = R"EOF(
417 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
418 package="android">
419 <tag whoo="true" />
420 </manifest>)EOF";
421 EXPECT_EQ(nullptr, Verify(input));
422}
423
Adam Lesinski87f1e0f2017-06-27 16:21:58 -0700424TEST_F(ManifestFixerTest, SupportKeySets) {
425 std::string input = R"(
426 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
427 package="android">
428 <key-sets>
429 <key-set android:name="old-set">
430 <public-key android:name="old-key" android:value="some+old+key" />
431 </key-set>
432 <key-set android:name="new-set">
433 <public-key android:name="new-key" android:value="some+new+key" />
434 </key-set>
435 <upgrade-key-set android:name="old-set" />
436 <upgrade-key-set android:name="new-set" />
437 </key-sets>
438 </manifest>)";
439 EXPECT_THAT(Verify(input), NotNull());
440}
441
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700442} // namespace aapt