blob: 12a304a39f4b78c2f420ccfad160fb4fd0088bf6 [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) {
93 auto doc = Verify(R"EOF(
94 <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>
101 <receiver android:name=".OffToWork"><meta-data /></receiver>
102 <provider android:name=".We"><meta-data /></provider>
103 <service android:name=".Go"><meta-data /></service>
104 </application>
105 </manifest>)EOF");
106 ASSERT_NE(nullptr, doc);
107}
108
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800109TEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700110 ManifestFixerOptions options = {std::string("8"), std::string("22")};
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800111
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700112 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800113 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
114 package="android">
115 <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700116 </manifest>)EOF",
117 options);
118 ASSERT_NE(nullptr, doc);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800119
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700120 xml::Element* el;
121 xml::Attribute* attr;
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800122
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700123 el = xml::FindRootElement(doc.get());
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700124 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700125 el = el->FindChild({}, "uses-sdk");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700126 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700127 attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700128 ASSERT_NE(nullptr, attr);
129 EXPECT_EQ("7", attr->value);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700130 attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700131 ASSERT_NE(nullptr, attr);
132 EXPECT_EQ("21", attr->value);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800133
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700134 doc = VerifyWithOptions(R"EOF(
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800135 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
136 package="android">
137 <uses-sdk android:targetSdkVersion="21" />
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700138 </manifest>)EOF",
139 options);
140 ASSERT_NE(nullptr, doc);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800141
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700142 el = xml::FindRootElement(doc.get());
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700143 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700144 el = el->FindChild({}, "uses-sdk");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700145 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700146 attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700147 ASSERT_NE(nullptr, attr);
148 EXPECT_EQ("8", attr->value);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700149 attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700150 ASSERT_NE(nullptr, attr);
151 EXPECT_EQ("21", attr->value);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800152
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700153 doc = VerifyWithOptions(R"EOF(
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800154 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
155 package="android">
156 <uses-sdk />
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700157 </manifest>)EOF",
158 options);
159 ASSERT_NE(nullptr, doc);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800160
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700161 el = xml::FindRootElement(doc.get());
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700162 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700163 el = el->FindChild({}, "uses-sdk");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700164 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700165 attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700166 ASSERT_NE(nullptr, attr);
167 EXPECT_EQ("8", attr->value);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700168 attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700169 ASSERT_NE(nullptr, attr);
170 EXPECT_EQ("22", attr->value);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800171
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700172 doc = VerifyWithOptions(R"EOF(
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800173 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700174 package="android" />)EOF",
175 options);
176 ASSERT_NE(nullptr, doc);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800177
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700178 el = xml::FindRootElement(doc.get());
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700179 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700180 el = el->FindChild({}, "uses-sdk");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700181 ASSERT_NE(nullptr, el);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700182 attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700183 ASSERT_NE(nullptr, attr);
184 EXPECT_EQ("8", attr->value);
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700185 attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700186 ASSERT_NE(nullptr, attr);
187 EXPECT_EQ("22", attr->value);
Adam Lesinski2ae4a872015-11-02 16:10:55 -0800188}
189
Adam Lesinskie343eb12016-10-27 16:31:58 -0700190TEST_F(ManifestFixerTest, UsesSdkMustComeBeforeApplication) {
191 ManifestFixerOptions options = {std::string("8"), std::string("22")};
192 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
193 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
194 package="android">
195 <application android:name=".MainApplication" />
196 </manifest>)EOF",
197 options);
198 ASSERT_NE(nullptr, doc);
199
200 xml::Element* manifest_el = xml::FindRootElement(doc.get());
201 ASSERT_NE(nullptr, manifest_el);
202 ASSERT_EQ("manifest", manifest_el->name);
203
204 xml::Element* application_el = manifest_el->FindChild("", "application");
205 ASSERT_NE(nullptr, application_el);
206
207 xml::Element* uses_sdk_el = manifest_el->FindChild("", "uses-sdk");
208 ASSERT_NE(nullptr, uses_sdk_el);
209
210 // Check that the uses_sdk_el comes before application_el in the children
211 // vector.
212 // Since there are no namespaces here, these children are direct descendants
213 // of manifest.
214 auto uses_sdk_iter =
215 std::find_if(manifest_el->children.begin(), manifest_el->children.end(),
216 [&](const std::unique_ptr<xml::Node>& child) {
217 return child.get() == uses_sdk_el;
218 });
219
220 auto application_iter =
221 std::find_if(manifest_el->children.begin(), manifest_el->children.end(),
222 [&](const std::unique_ptr<xml::Node>& child) {
223 return child.get() == application_el;
224 });
225
226 ASSERT_NE(manifest_el->children.end(), uses_sdk_iter);
227 ASSERT_NE(manifest_el->children.end(), application_iter);
228
229 // The distance should be positive, meaning uses_sdk_iter comes before
230 // application_iter.
231 EXPECT_GT(std::distance(uses_sdk_iter, application_iter), 0);
232}
233
Adam Lesinski52364f72016-01-11 13:10:24 -0800234TEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700235 ManifestFixerOptions options;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700236 options.rename_manifest_package = std::string("com.android");
Adam Lesinski52364f72016-01-11 13:10:24 -0800237
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700238 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
Adam Lesinski52364f72016-01-11 13:10:24 -0800239 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
240 package="android">
Adam Lesinskicc5609d2016-04-05 12:41:07 -0700241 <application android:name=".MainApplication" text="hello">
242 <activity android:name=".activity.Start" />
243 <receiver android:name="com.google.android.Receiver" />
Adam Lesinski52364f72016-01-11 13:10:24 -0800244 </application>
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700245 </manifest>)EOF",
246 options);
247 ASSERT_NE(nullptr, doc);
Adam Lesinski52364f72016-01-11 13:10:24 -0800248
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700249 xml::Element* manifestEl = xml::FindRootElement(doc.get());
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700250 ASSERT_NE(nullptr, manifestEl);
Adam Lesinski52364f72016-01-11 13:10:24 -0800251
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700252 xml::Attribute* attr = nullptr;
Adam Lesinski52364f72016-01-11 13:10:24 -0800253
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700254 attr = manifestEl->FindAttribute({}, "package");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700255 ASSERT_NE(nullptr, attr);
256 EXPECT_EQ(std::string("com.android"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800257
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700258 xml::Element* applicationEl = manifestEl->FindChild({}, "application");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700259 ASSERT_NE(nullptr, applicationEl);
Adam Lesinski52364f72016-01-11 13:10:24 -0800260
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700261 attr = applicationEl->FindAttribute(xml::kSchemaAndroid, "name");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700262 ASSERT_NE(nullptr, attr);
263 EXPECT_EQ(std::string("android.MainApplication"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800264
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700265 attr = applicationEl->FindAttribute({}, "text");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700266 ASSERT_NE(nullptr, attr);
267 EXPECT_EQ(std::string("hello"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800268
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700269 xml::Element* el;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700270 el = applicationEl->FindChild({}, "activity");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700271 ASSERT_NE(nullptr, el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800272
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700273 attr = el->FindAttribute(xml::kSchemaAndroid, "name");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700274 ASSERT_NE(nullptr, el);
275 EXPECT_EQ(std::string("android.activity.Start"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800276
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700277 el = applicationEl->FindChild({}, "receiver");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700278 ASSERT_NE(nullptr, el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800279
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700280 attr = el->FindAttribute(xml::kSchemaAndroid, "name");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700281 ASSERT_NE(nullptr, el);
282 EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800283}
284
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700285TEST_F(ManifestFixerTest,
286 RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
287 ManifestFixerOptions options;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700288 options.rename_instrumentation_target_package = std::string("com.android");
Adam Lesinski52364f72016-01-11 13:10:24 -0800289
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700290 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
Adam Lesinski52364f72016-01-11 13:10:24 -0800291 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
292 package="android">
293 <instrumentation android:targetPackage="android" />
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700294 </manifest>)EOF",
295 options);
296 ASSERT_NE(nullptr, doc);
Adam Lesinski52364f72016-01-11 13:10:24 -0800297
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700298 xml::Element* manifest_el = xml::FindRootElement(doc.get());
299 ASSERT_NE(nullptr, manifest_el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800300
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700301 xml::Element* instrumentation_el =
302 manifest_el->FindChild({}, "instrumentation");
303 ASSERT_NE(nullptr, instrumentation_el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800304
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700305 xml::Attribute* attr =
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700306 instrumentation_el->FindAttribute(xml::kSchemaAndroid, "targetPackage");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700307 ASSERT_NE(nullptr, attr);
308 EXPECT_EQ(std::string("com.android"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800309}
310
311TEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700312 ManifestFixerOptions options;
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700313 options.version_name_default = std::string("Beta");
314 options.version_code_default = std::string("0x10000000");
Adam Lesinski52364f72016-01-11 13:10:24 -0800315
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700316 std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
Adam Lesinski52364f72016-01-11 13:10:24 -0800317 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700318 package="android" />)EOF",
319 options);
320 ASSERT_NE(nullptr, doc);
Adam Lesinski52364f72016-01-11 13:10:24 -0800321
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700322 xml::Element* manifest_el = xml::FindRootElement(doc.get());
323 ASSERT_NE(nullptr, manifest_el);
Adam Lesinski52364f72016-01-11 13:10:24 -0800324
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700325 xml::Attribute* attr =
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700326 manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700327 ASSERT_NE(nullptr, attr);
328 EXPECT_EQ(std::string("Beta"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800329
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700330 attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700331 ASSERT_NE(nullptr, attr);
332 EXPECT_EQ(std::string("0x10000000"), attr->value);
Adam Lesinski52364f72016-01-11 13:10:24 -0800333}
334
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700335TEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) {
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700336 EXPECT_EQ(nullptr,
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700337 Verify("<manifest package=\"android\" coreApp=\"hello\" />"));
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700338 EXPECT_EQ(nullptr,
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700339 Verify("<manifest package=\"android\" coreApp=\"1dp\" />"));
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700340
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700341 std::unique_ptr<xml::XmlResource> doc =
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700342 Verify("<manifest package=\"android\" coreApp=\"true\" />");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700343 ASSERT_NE(nullptr, doc);
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700344
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700345 xml::Element* el = xml::FindRootElement(doc.get());
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700346 ASSERT_NE(nullptr, el);
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700347
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700348 EXPECT_EQ("manifest", el->name);
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700349
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700350 xml::Attribute* attr = el->FindAttribute("", "coreApp");
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700351 ASSERT_NE(nullptr, attr);
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700352
Adam Lesinskice5e56e2016-10-21 17:56:45 -0700353 EXPECT_NE(nullptr, attr->compiled_value);
354 EXPECT_NE(nullptr, ValueCast<BinaryPrimitive>(attr->compiled_value.get()));
Adam Lesinski6b17d2c2016-08-10 11:37:06 -0700355}
356
Adam Lesinskicacb28f2016-10-19 12:18:14 -0700357} // namespace aapt