ManifestFixer_test.cpp revision ce5e56e243d262a9b65459c3bd0bb9eaadd40628
12ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski/*
22ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski * Copyright (C) 2015 The Android Open Source Project
32ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski *
42ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
52ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski * you may not use this file except in compliance with the License.
62ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski * You may obtain a copy of the License at
72ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski *
82ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
92ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski *
102ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski * Unless required by applicable law or agreed to in writing, software
112ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
122ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski * See the License for the specific language governing permissions and
142ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski * limitations under the License.
152ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski */
162ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
172ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski#include "link/ManifestFixer.h"
182ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
19ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski#include "test/Test.h"
202ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
212ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinskinamespace aapt {
222ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
232ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinskistruct ManifestFixerTest : public ::testing::Test {
24cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<IAaptContext> mContext;
25cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
26cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  void SetUp() override {
27cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    mContext =
28cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski        test::ContextBuilder()
29ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .SetCompilationPackage("android")
30ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .SetPackageId(0x01)
31ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .SetNameManglerPolicy(NameManglerPolicy{"android"})
32ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .AddSymbolSource(
33cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                test::StaticSymbolSourceBuilder()
34ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .AddSymbol(
35cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "android:attr/package", ResourceId(0x01010000),
36cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        test::AttributeBuilder()
37ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .SetTypeMask(android::ResTable_map::TYPE_STRING)
38ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .Build())
39ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .AddSymbol(
40cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "android:attr/minSdkVersion", ResourceId(0x01010001),
41cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        test::AttributeBuilder()
42ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .SetTypeMask(android::ResTable_map::TYPE_STRING |
43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                         android::ResTable_map::TYPE_INTEGER)
44ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .Build())
45ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .AddSymbol(
46cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "android:attr/targetSdkVersion", ResourceId(0x01010002),
47cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        test::AttributeBuilder()
48ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .SetTypeMask(android::ResTable_map::TYPE_STRING |
49cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                         android::ResTable_map::TYPE_INTEGER)
50ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .Build())
51ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .AddSymbol("android:string/str", ResourceId(0x01060000))
52ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .Build())
53ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .Build();
54cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
55cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
56ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> Verify(const StringPiece& str) {
57ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    return VerifyWithOptions(str, {});
58cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
59cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
60ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> VerifyWithOptions(
61cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      const StringPiece& str, const ManifestFixerOptions& options) {
62ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(str);
63cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    ManifestFixer fixer(options);
64ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    if (fixer.Consume(mContext.get(), doc.get())) {
65cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      return doc;
662ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    }
67cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    return {};
68cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
692ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski};
702ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
712ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestIsRootTag) {
72ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_EQ(nullptr, Verify("<other-tag />"));
73ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_EQ(nullptr, Verify("<ns:manifest xmlns:ns=\"com\" />"));
74ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr, Verify("<manifest package=\"android\"></manifest>"));
752ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
762ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
772ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestHasPackage) {
78ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr, Verify("<manifest package=\"android\" />"));
79ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr, Verify("<manifest package=\"com.android\" />"));
80ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr, Verify("<manifest package=\"com.android.google\" />"));
81cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
82ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            Verify("<manifest package=\"com.android.google.Class$1\" />"));
83ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_EQ(nullptr, Verify("<manifest "
84cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                            "xmlns:android=\"http://schemas.android.com/apk/"
85cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                            "res/android\" "
86cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                            "android:package=\"com.android\" />"));
87ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_EQ(nullptr, Verify("<manifest package=\"@string/str\" />"));
882ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
892ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
902ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) {
91cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options = {std::string("8"), std::string("22")};
922ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
93ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
942ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
952ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
962ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
97cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
98cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
99cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
100cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
101cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* el;
102cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr;
103cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
104ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = xml::FindRootElement(doc.get());
105cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
106ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
107cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
108ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
109cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
110cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("7", attr->value);
111ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
112cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
113cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("21", attr->value);
114cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
115ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  doc = VerifyWithOptions(R"EOF(
1162ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1172ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1182ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk android:targetSdkVersion="21" />
119cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
120cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
121cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
122cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
123ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = xml::FindRootElement(doc.get());
124cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
125ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
126cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
127ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
128cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
129cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("8", attr->value);
130ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
131cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
132cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("21", attr->value);
133cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
134ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  doc = VerifyWithOptions(R"EOF(
1352ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1362ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1372ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk />
138cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
139cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
140cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
141cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
142ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = xml::FindRootElement(doc.get());
143cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
144ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
145cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
146ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
147cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
148cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("8", attr->value);
149ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
150cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
151cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("22", attr->value);
152cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
153ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  doc = VerifyWithOptions(R"EOF(
1542ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
155cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                package="android" />)EOF",
156cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
157cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
158cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
159ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = xml::FindRootElement(doc.get());
160cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
161ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
162cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
163ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
164cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
165cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("8", attr->value);
166ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
167cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
168cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("22", attr->value);
1692ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
1702ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
17152364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) {
172cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
173ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.rename_manifest_package = std::string("com.android");
17452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
175ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
17652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
17752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android">
178cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski        <application android:name=".MainApplication" text="hello">
179cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski          <activity android:name=".activity.Start" />
180cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski          <receiver android:name="com.google.android.Receiver" />
18152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        </application>
182cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
183cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
184cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
18552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
186ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* manifestEl = xml::FindRootElement(doc.get());
187cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, manifestEl);
18852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
189cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr = nullptr;
19052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
191ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = manifestEl->FindAttribute({}, "package");
192cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
193cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("com.android"), attr->value);
19452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
195ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* applicationEl = manifestEl->FindChild({}, "application");
196cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, applicationEl);
19752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
198ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = applicationEl->FindAttribute(xml::kSchemaAndroid, "name");
199cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
200cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("android.MainApplication"), attr->value);
20152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
202ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = applicationEl->FindAttribute({}, "text");
203cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
204cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("hello"), attr->value);
20552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
206cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* el;
207ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = applicationEl->FindChild({}, "activity");
208cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
20952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
210ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "name");
211cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
212cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("android.activity.Start"), attr->value);
21352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
214ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = applicationEl->FindChild({}, "receiver");
215cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
21652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
217ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "name");
218cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
219cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value);
22052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
22152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
222cacb28f2d60858106e2819cc7d95a65e8bda890bAdam LesinskiTEST_F(ManifestFixerTest,
223cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski       RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
224cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
225ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.rename_instrumentation_target_package = std::string("com.android");
22652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
227ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
22852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
22952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android">
23052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        <instrumentation android:targetPackage="android" />
231cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
232cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
233cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
23452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
235ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* manifest_el = xml::FindRootElement(doc.get());
236ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_NE(nullptr, manifest_el);
23752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
238ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* instrumentation_el =
239ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      manifest_el->FindChild({}, "instrumentation");
240ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_NE(nullptr, instrumentation_el);
24152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
242cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr =
243ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      instrumentation_el->FindAttribute(xml::kSchemaAndroid, "targetPackage");
244cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
245cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("com.android"), attr->value);
24652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
24752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
24852364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
249cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
250ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.version_name_default = std::string("Beta");
251ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.version_code_default = std::string("0x10000000");
25252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
253ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
25452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
255cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                package="android" />)EOF",
256cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
257cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
25852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
259ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* manifest_el = xml::FindRootElement(doc.get());
260ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_NE(nullptr, manifest_el);
26152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
262cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr =
263ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName");
264cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
265cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("Beta"), attr->value);
26652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
267ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode");
268cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
269cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("0x10000000"), attr->value);
27052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
27152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
2726b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) {
273cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
274ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            Verify("<manifest package=\"android\" coreApp=\"hello\" />"));
275cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
276ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            Verify("<manifest package=\"android\" coreApp=\"1dp\" />"));
2776b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
278cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<xml::XmlResource> doc =
279ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      Verify("<manifest package=\"android\" coreApp=\"true\" />");
280cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
2816b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
282ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* el = xml::FindRootElement(doc.get());
283cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
2846b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
285cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("manifest", el->name);
2866b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
287ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Attribute* attr = el->FindAttribute("", "coreApp");
288cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
2896b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
290ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr, attr->compiled_value);
291ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr, ValueCast<BinaryPrimitive>(attr->compiled_value.get()));
2926b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski}
2936b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
294cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace aapt
295