ManifestFixer_test.cpp revision d5083f6f6b9bc76bbe64052bcec639eee752a321
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
21d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiusing android::StringPiece;
22d5083f6f6b9bc76bbe64052bcec639eee752a321Adam 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()
31ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .SetCompilationPackage("android")
32ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .SetPackageId(0x01)
33ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .SetNameManglerPolicy(NameManglerPolicy{"android"})
34ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .AddSymbolSource(
35cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                test::StaticSymbolSourceBuilder()
36ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .AddSymbol(
37cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "android:attr/package", ResourceId(0x01010000),
38cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        test::AttributeBuilder()
39ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .SetTypeMask(android::ResTable_map::TYPE_STRING)
40ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .Build())
41ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .AddSymbol(
42cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "android:attr/minSdkVersion", ResourceId(0x01010001),
43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        test::AttributeBuilder()
44ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .SetTypeMask(android::ResTable_map::TYPE_STRING |
45cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                         android::ResTable_map::TYPE_INTEGER)
46ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .Build())
47ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .AddSymbol(
48cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "android:attr/targetSdkVersion", ResourceId(0x01010002),
49cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        test::AttributeBuilder()
50ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .SetTypeMask(android::ResTable_map::TYPE_STRING |
51cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                         android::ResTable_map::TYPE_INTEGER)
52ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .Build())
53ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .AddSymbol("android:string/str", ResourceId(0x01060000))
54ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .Build())
55ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .Build();
56cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
57cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
58ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> Verify(const StringPiece& str) {
59ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    return VerifyWithOptions(str, {});
60cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
61cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
62ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> VerifyWithOptions(
63cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      const StringPiece& str, const ManifestFixerOptions& options) {
64ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(str);
65cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    ManifestFixer fixer(options);
66ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam 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) {
74ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_EQ(nullptr, Verify("<other-tag />"));
75ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_EQ(nullptr, Verify("<ns:manifest xmlns:ns=\"com\" />"));
76ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr, Verify("<manifest package=\"android\"></manifest>"));
772ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
782ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
792ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestHasPackage) {
80ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr, Verify("<manifest package=\"android\" />"));
81ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr, Verify("<manifest package=\"com.android\" />"));
82ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr, Verify("<manifest package=\"com.android.google\" />"));
83cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
84ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            Verify("<manifest package=\"com.android.google.Class$1\" />"));
85ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam 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\" />"));
89ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_EQ(nullptr, Verify("<manifest package=\"@string/str\" />"));
902ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
912ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
925119e517308b84011fbd4d1a013296f4f5ffb8e4Adam LesinskiTEST_F(ManifestFixerTest, AllowMetaData) {
935119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski    auto doc = Verify(R"EOF(
945119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
955119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski                  package="android">
965119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski          <meta-data />
975119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski          <application>
985119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski            <meta-data />
995119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski            <activity android:name=".Hi"><meta-data /></activity>
1005119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski            <activity-alias android:name=".Ho"><meta-data /></activity-alias>
1015119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski            <receiver android:name=".OffToWork"><meta-data /></receiver>
1025119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski            <provider android:name=".We"><meta-data /></provider>
1035119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski            <service android:name=".Go"><meta-data /></service>
1045119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski          </application>
1055119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski        </manifest>)EOF");
1065119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski    ASSERT_NE(nullptr, doc);
1075119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski}
1085119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski
1092ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) {
110cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options = {std::string("8"), std::string("22")};
1112ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
112ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
1132ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1142ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1152ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
116cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
117cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
118cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
119cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
120cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* el;
121cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr;
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("7", 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 android:targetSdkVersion="21" />
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("21", attr->value);
152cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
153ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  doc = VerifyWithOptions(R"EOF(
1542ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1552ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1562ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk />
157cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
158cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
159cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
160cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
161ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = xml::FindRootElement(doc.get());
162cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
163ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
164cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
165ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
166cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
167cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("8", attr->value);
168ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
169cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
170cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("22", attr->value);
171cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
172ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  doc = VerifyWithOptions(R"EOF(
1732ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
174cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                package="android" />)EOF",
175cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
176cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
177cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
178ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = xml::FindRootElement(doc.get());
179cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
180ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
181cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
182ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
183cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
184cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("8", attr->value);
185ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
186cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
187cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("22", attr->value);
1882ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
1892ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
190e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam LesinskiTEST_F(ManifestFixerTest, UsesSdkMustComeBeforeApplication) {
191e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  ManifestFixerOptions options = {std::string("8"), std::string("22")};
192e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
193e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski          <manifest xmlns:android="http://schemas.android.com/apk/res/android"
194e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                    package="android">
195e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski            <application android:name=".MainApplication" />
196e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski          </manifest>)EOF",
197e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                                                            options);
198e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  ASSERT_NE(nullptr, doc);
199e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
200e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  xml::Element* manifest_el = xml::FindRootElement(doc.get());
201e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  ASSERT_NE(nullptr, manifest_el);
202e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  ASSERT_EQ("manifest", manifest_el->name);
203e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
204e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  xml::Element* application_el = manifest_el->FindChild("", "application");
205e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  ASSERT_NE(nullptr, application_el);
206e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
207e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  xml::Element* uses_sdk_el = manifest_el->FindChild("", "uses-sdk");
208e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  ASSERT_NE(nullptr, uses_sdk_el);
209e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
210e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // Check that the uses_sdk_el comes before application_el in the children
211e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // vector.
212e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // Since there are no namespaces here, these children are direct descendants
213e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // of manifest.
214e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  auto uses_sdk_iter =
215e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski      std::find_if(manifest_el->children.begin(), manifest_el->children.end(),
216e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                   [&](const std::unique_ptr<xml::Node>& child) {
217e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                     return child.get() == uses_sdk_el;
218e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                   });
219e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
220e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  auto application_iter =
221e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski      std::find_if(manifest_el->children.begin(), manifest_el->children.end(),
222e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                   [&](const std::unique_ptr<xml::Node>& child) {
223e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                     return child.get() == application_el;
224e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                   });
225e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
226e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  ASSERT_NE(manifest_el->children.end(), uses_sdk_iter);
227e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  ASSERT_NE(manifest_el->children.end(), application_iter);
228e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
229e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // The distance should be positive, meaning uses_sdk_iter comes before
230e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // application_iter.
231e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  EXPECT_GT(std::distance(uses_sdk_iter, application_iter), 0);
232e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski}
233e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
23452364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) {
235cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
236ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.rename_manifest_package = std::string("com.android");
23752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
238ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
23952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
24052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android">
241cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski        <application android:name=".MainApplication" text="hello">
242cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski          <activity android:name=".activity.Start" />
243cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski          <receiver android:name="com.google.android.Receiver" />
24452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        </application>
245cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
246cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
247cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
24852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
249ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* manifestEl = xml::FindRootElement(doc.get());
250cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, manifestEl);
25152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
252cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr = nullptr;
25352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
254ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = manifestEl->FindAttribute({}, "package");
255cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
256cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("com.android"), attr->value);
25752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
258ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* applicationEl = manifestEl->FindChild({}, "application");
259cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, applicationEl);
26052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
261ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = applicationEl->FindAttribute(xml::kSchemaAndroid, "name");
262cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
263cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("android.MainApplication"), attr->value);
26452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
265ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = applicationEl->FindAttribute({}, "text");
266cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
267cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("hello"), attr->value);
26852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
269cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* el;
270ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = applicationEl->FindChild({}, "activity");
271cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
27252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
273ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "name");
274cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
275cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("android.activity.Start"), attr->value);
27652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
277ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = applicationEl->FindChild({}, "receiver");
278cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
27952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
280ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "name");
281cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
282cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value);
28352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
28452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
285cacb28f2d60858106e2819cc7d95a65e8bda890bAdam LesinskiTEST_F(ManifestFixerTest,
286cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski       RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
287cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
288ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.rename_instrumentation_target_package = std::string("com.android");
28952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
290ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
29152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
29252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android">
29352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        <instrumentation android:targetPackage="android" />
294cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
295cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
296cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
29752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
298ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* manifest_el = xml::FindRootElement(doc.get());
299ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_NE(nullptr, manifest_el);
30052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
301ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* instrumentation_el =
302ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      manifest_el->FindChild({}, "instrumentation");
303ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_NE(nullptr, instrumentation_el);
30452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
305cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr =
306ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      instrumentation_el->FindAttribute(xml::kSchemaAndroid, "targetPackage");
307cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
308cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("com.android"), attr->value);
30952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
31052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
31152364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
312cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
313ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.version_name_default = std::string("Beta");
314ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.version_code_default = std::string("0x10000000");
31552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
316ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
31752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
318cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                package="android" />)EOF",
319cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
320cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
32152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
322ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* manifest_el = xml::FindRootElement(doc.get());
323ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  ASSERT_NE(nullptr, manifest_el);
32452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
325cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr =
326ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName");
327cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
328cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("Beta"), attr->value);
32952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
330ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode");
331cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
332cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(std::string("0x10000000"), attr->value);
33352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
33452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
3356b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) {
336cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
337ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            Verify("<manifest package=\"android\" coreApp=\"hello\" />"));
338cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ(nullptr,
339ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            Verify("<manifest package=\"android\" coreApp=\"1dp\" />"));
3406b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
341cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<xml::XmlResource> doc =
342ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      Verify("<manifest package=\"android\" coreApp=\"true\" />");
343cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, doc);
3446b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
345ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* el = xml::FindRootElement(doc.get());
346cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, el);
3476b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
348cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  EXPECT_EQ("manifest", el->name);
3496b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
350ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Attribute* attr = el->FindAttribute("", "coreApp");
351cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ASSERT_NE(nullptr, attr);
3526b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
353ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr, attr->compiled_value);
354ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  EXPECT_NE(nullptr, ValueCast<BinaryPrimitive>(attr->compiled_value.get()));
3556b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski}
3566b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
357cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace aapt
358