ManifestFixer_test.cpp revision cacb28f2d60858106e2819cc7d95a65e8bda890b
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#include "test/Builders.h"
192ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski#include "test/Context.h"
202ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
212ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski#include <gtest/gtest.h>
222ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
232ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinskinamespace aapt {
242ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
252ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinskistruct ManifestFixerTest : public ::testing::Test {
26cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<IAaptContext> mContext;
27cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
28cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  void SetUp() override {
29cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    mContext =
30cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski        test::ContextBuilder()
31cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            .setCompilationPackage("android")
32cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            .setPackageId(0x01)
33cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            .setNameManglerPolicy(NameManglerPolicy{"android"})
34cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            .addSymbolSource(
35cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                test::StaticSymbolSourceBuilder()
36cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                    .addSymbol(
37cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "android:attr/package", ResourceId(0x01010000),
38cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        test::AttributeBuilder()
39cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                            .setTypeMask(android::ResTable_map::TYPE_STRING)
40cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                            .build())
41cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                    .addSymbol(
42cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "android:attr/minSdkVersion", ResourceId(0x01010001),
43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        test::AttributeBuilder()
44cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                            .setTypeMask(android::ResTable_map::TYPE_STRING |
45cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                         android::ResTable_map::TYPE_INTEGER)
46cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                            .build())
47cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                    .addSymbol(
48cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "android:attr/targetSdkVersion", ResourceId(0x01010002),
49cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        test::AttributeBuilder()
50cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                            .setTypeMask(android::ResTable_map::TYPE_STRING |
51cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                         android::ResTable_map::TYPE_INTEGER)
52cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                            .build())
53cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                    .addSymbol("android:string/str", ResourceId(0x01060000))
54cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                    .build())
55cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            .build();
56cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
57cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
58cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<xml::XmlResource> verify(const StringPiece& str) {
59cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    return verifyWithOptions(str, {});
60cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
61cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
62cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<xml::XmlResource> verifyWithOptions(
63cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      const StringPiece& str, const ManifestFixerOptions& options) {
64cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(str);
65cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    ManifestFixer fixer(options);
66cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    if (fixer.consume(mContext.get(), doc.get())) {
67cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      return doc;
682ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    }
69cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    return {};
70cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
712ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski};
722ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
732ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestIsRootTag) {
74cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr, verify("<other-tag />"));
75cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr, verify("<ns:manifest xmlns:ns=\"com\" />"));
76cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_NE(nullptr, verify("<manifest package=\"android\"></manifest>"));
772ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
782ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
792ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestHasPackage) {
80cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_NE(nullptr, verify("<manifest package=\"android\" />"));
81cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_NE(nullptr, verify("<manifest package=\"com.android\" />"));
82cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_NE(nullptr, verify("<manifest package=\"com.android.google\" />"));
83cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
84cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            verify("<manifest package=\"com.android.google.Class$1\" />"));
85cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr, verify("<manifest "
86cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                            "xmlns:android=\"http://schemas.android.com/apk/"
87cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                            "res/android\" "
88cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                            "android:package=\"com.android\" />"));
89cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr, verify("<manifest package=\"@string/str\" />"));
902ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
912ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
922ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) {
93cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options = {std::string("8"), std::string("22")};
942ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
95cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
962ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
972ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
982ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
99cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
100cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
101cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
102cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
103cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* el;
104cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr;
105cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
106cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  el = xml::findRootElement(doc.get());
107cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
108cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  el = el->findChild({}, "uses-sdk");
109cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
110cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
111cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
112cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("7", attr->value);
113cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
114cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
115cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("21", attr->value);
116cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
117cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  doc = verifyWithOptions(R"EOF(
1182ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1192ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1202ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk android:targetSdkVersion="21" />
121cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
122cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
123cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
124cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
125cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  el = xml::findRootElement(doc.get());
126cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
127cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  el = el->findChild({}, "uses-sdk");
128cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
129cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
130cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
131cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("8", attr->value);
132cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
133cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
134cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("21", attr->value);
135cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
136cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  doc = verifyWithOptions(R"EOF(
1372ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1382ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1392ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk />
140cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
141cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
142cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
143cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
144cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  el = xml::findRootElement(doc.get());
145cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
146cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  el = el->findChild({}, "uses-sdk");
147cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
148cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
149cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
150cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("8", attr->value);
151cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
152cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
153cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("22", attr->value);
154cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
155cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  doc = verifyWithOptions(R"EOF(
1562ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
157cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                package="android" />)EOF",
158cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
159cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
160cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
161cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  el = xml::findRootElement(doc.get());
162cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
163cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  el = el->findChild({}, "uses-sdk");
164cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
165cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion");
166cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
167cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("8", attr->value);
168cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion");
169cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
170cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("22", attr->value);
1712ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
1722ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
17352364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) {
174cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
175cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  options.renameManifestPackage = std::string("com.android");
17652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
177cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
17852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
17952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android">
180cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski        <application android:name=".MainApplication" text="hello">
181cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski          <activity android:name=".activity.Start" />
182cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski          <receiver android:name="com.google.android.Receiver" />
18352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        </application>
184cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
185cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
186cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
18752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
188cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* manifestEl = xml::findRootElement(doc.get());
189cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, manifestEl);
19052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
191cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr = nullptr;
19252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
193cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = manifestEl->findAttribute({}, "package");
194cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
195cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("com.android"), attr->value);
19652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
197cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* applicationEl = manifestEl->findChild({}, "application");
198cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, applicationEl);
19952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
200cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = applicationEl->findAttribute(xml::kSchemaAndroid, "name");
201cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
202cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("android.MainApplication"), attr->value);
20352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
204cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = applicationEl->findAttribute({}, "text");
205cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
206cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("hello"), attr->value);
20752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
208cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* el;
209cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  el = applicationEl->findChild({}, "activity");
210cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
21152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
212cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = el->findAttribute(xml::kSchemaAndroid, "name");
213cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
214cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("android.activity.Start"), attr->value);
21552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
216cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  el = applicationEl->findChild({}, "receiver");
217cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
21852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
219cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = el->findAttribute(xml::kSchemaAndroid, "name");
220cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
221cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value);
22252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
22352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
224cacb28f2d60858106e2819cc7d95a65e8bda890bAdam LesinskiTEST_F(ManifestFixerTest,
225cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski       RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
226cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
227cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  options.renameInstrumentationTargetPackage = std::string("com.android");
22852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
229cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
23052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
23152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android">
23252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        <instrumentation android:targetPackage="android" />
233cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
234cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
235cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
23652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
237cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* manifestEl = xml::findRootElement(doc.get());
238cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, manifestEl);
23952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
240cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* instrumentationEl =
241cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      manifestEl->findChild({}, "instrumentation");
242cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, instrumentationEl);
24352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
244cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr =
245cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      instrumentationEl->findAttribute(xml::kSchemaAndroid, "targetPackage");
246cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
247cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("com.android"), attr->value);
24852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
24952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
25052364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
251cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
252cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  options.versionNameDefault = std::string("Beta");
253cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  options.versionCodeDefault = std::string("0x10000000");
25452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
255cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
25652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
257cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                package="android" />)EOF",
258cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
259cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
26052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
261cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* manifestEl = xml::findRootElement(doc.get());
262cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, manifestEl);
26352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
264cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr =
265cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      manifestEl->findAttribute(xml::kSchemaAndroid, "versionName");
266cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
267cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("Beta"), attr->value);
26852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
269cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  attr = manifestEl->findAttribute(xml::kSchemaAndroid, "versionCode");
270cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
271cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("0x10000000"), attr->value);
27252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
27352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
2746b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) {
275cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
276cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            verify("<manifest package=\"android\" coreApp=\"hello\" />"));
277cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
278cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski            verify("<manifest package=\"android\" coreApp=\"1dp\" />"));
2796b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
280cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<xml::XmlResource> doc =
281cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      verify("<manifest package=\"android\" coreApp=\"true\" />");
282cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
2836b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
284cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* el = xml::findRootElement(doc.get());
285cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
2866b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
287cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("manifest", el->name);
2886b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
289cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr = el->findAttribute("", "coreApp");
290cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
2916b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
292cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_NE(nullptr, attr->compiledValue);
293cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_NE(nullptr, valueCast<BinaryPrimitive>(attr->compiledValue.get()));
2946b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski}
2956b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
296cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace aapt
297