ManifestFixer_test.cpp revision c6284379a5dde6bc5927409eff292db2f0add578
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
2187f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinskiusing ::android::StringPiece;
22c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinskiusing ::testing::Eq;
23c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinskiusing ::testing::Gt;
24c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinskiusing ::testing::IsNull;
25c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinskiusing ::testing::Ne;
2687f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinskiusing ::testing::NotNull;
27c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinskiusing ::testing::StrEq;
28d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski
292ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinskinamespace aapt {
302ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
312ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinskistruct ManifestFixerTest : public ::testing::Test {
32cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<IAaptContext> mContext;
33cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
34cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  void SetUp() override {
35cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    mContext =
36cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski        test::ContextBuilder()
37ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .SetCompilationPackage("android")
38ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .SetPackageId(0x01)
39ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .SetNameManglerPolicy(NameManglerPolicy{"android"})
40ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .AddSymbolSource(
41cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                test::StaticSymbolSourceBuilder()
42ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .AddSymbol(
43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "android:attr/package", ResourceId(0x01010000),
44cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        test::AttributeBuilder()
45ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .SetTypeMask(android::ResTable_map::TYPE_STRING)
46ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .Build())
47ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .AddSymbol(
48cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "android:attr/minSdkVersion", ResourceId(0x01010001),
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(
54cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        "android:attr/targetSdkVersion", ResourceId(0x01010002),
55cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                        test::AttributeBuilder()
56ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .SetTypeMask(android::ResTable_map::TYPE_STRING |
57cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                         android::ResTable_map::TYPE_INTEGER)
58ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                            .Build())
59ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .AddSymbol("android:string/str", ResourceId(0x01060000))
60ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski                    .Build())
61ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski            .Build();
62cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
63cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
64ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> Verify(const StringPiece& str) {
65ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    return VerifyWithOptions(str, {});
66cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
67cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
68ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> VerifyWithOptions(
69cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      const StringPiece& str, const ManifestFixerOptions& options) {
70ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(str);
71cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    ManifestFixer fixer(options);
72ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski    if (fixer.Consume(mContext.get(), doc.get())) {
73cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      return doc;
742ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    }
75cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski    return {};
76cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  }
772ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski};
782ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
792ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestIsRootTag) {
80c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<other-tag />"), IsNull());
81c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<ns:manifest xmlns:ns=\"com\" />"), IsNull());
82c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<manifest package=\"android\"></manifest>"), NotNull());
832ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
842ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
852ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestHasPackage) {
86c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<manifest package=\"android\" />"), NotNull());
87c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<manifest package=\"com.android\" />"), NotNull());
88c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<manifest package=\"com.android.google\" />"), NotNull());
89c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<manifest package=\"com.android.google.Class$1\" />"), IsNull());
90c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" "
91c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski                     "android:package=\"com.android\" />"),
92c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski              IsNull());
93c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<manifest package=\"@string/str\" />"), IsNull());
942ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
952ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
965119e517308b84011fbd4d1a013296f4f5ffb8e4Adam LesinskiTEST_F(ManifestFixerTest, AllowMetaData) {
9786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski  auto doc = Verify(R"EOF(
985119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
995119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski                  package="android">
1005119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski          <meta-data />
1015119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski          <application>
1025119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski            <meta-data />
1035119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski            <activity android:name=".Hi"><meta-data /></activity>
1045119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski            <activity-alias android:name=".Ho"><meta-data /></activity-alias>
10586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski            <receiver android:name=".OffTo"><meta-data /></receiver>
10686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski            <provider android:name=".Work"><meta-data /></provider>
10786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski            <service android:name=".We"><meta-data /></service>
1085119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski          </application>
10986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <instrumentation android:name=".Go"><meta-data /></instrumentation>
1105119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski        </manifest>)EOF");
111c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
1125119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski}
1135119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski
1142ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) {
115cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options = {std::string("8"), std::string("22")};
1162ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
117ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> 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:minSdkVersion="7" android:targetSdkVersion="21" />
121cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
122cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
123c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
124cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
125cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* el;
126cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr;
127cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
1286b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  el = doc->root.get();
129c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
130ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
131c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
132ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
133c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
134c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("7"));
135ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
136c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
137c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("21"));
138cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
139ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  doc = VerifyWithOptions(R"EOF(
1402ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1412ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1422ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk android:targetSdkVersion="21" />
143cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
144cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
145c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
146cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
1476b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  el = doc->root.get();
148c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
149ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
150c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
151ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
152c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
153c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("8"));
154ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
155c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
156c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("21"));
157cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
158ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  doc = VerifyWithOptions(R"EOF(
1592ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1602ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1612ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk />
162cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
163cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
164c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
165cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
1666b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  el = doc->root.get();
167c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
168ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
169c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
170ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
171c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
172c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("8"));
173ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
174c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
175c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("22"));
176cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
177ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  doc = VerifyWithOptions(R"EOF(
1782ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
179cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                package="android" />)EOF",
180cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
181c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
182cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
1836b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  el = doc->root.get();
184c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
185ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
186c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
187ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
188c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
189c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("8"));
190ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
191c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
192c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("22"));
1932ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
1942ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
195e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam LesinskiTEST_F(ManifestFixerTest, UsesSdkMustComeBeforeApplication) {
196e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  ManifestFixerOptions options = {std::string("8"), std::string("22")};
197e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
198e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski          <manifest xmlns:android="http://schemas.android.com/apk/res/android"
199e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                    package="android">
200e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski            <application android:name=".MainApplication" />
201e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski          </manifest>)EOF",
202e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                                                            options);
203c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
204e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
2056b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  xml::Element* manifest_el = doc->root.get();
206c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(manifest_el, NotNull());
207e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  ASSERT_EQ("manifest", manifest_el->name);
208e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
209e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  xml::Element* application_el = manifest_el->FindChild("", "application");
210c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(application_el, NotNull());
211e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
212e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  xml::Element* uses_sdk_el = manifest_el->FindChild("", "uses-sdk");
213c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(uses_sdk_el, NotNull());
214e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
215e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // Check that the uses_sdk_el comes before application_el in the children
216e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // vector.
217e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // Since there are no namespaces here, these children are direct descendants
218e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // of manifest.
219e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  auto uses_sdk_iter =
220e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski      std::find_if(manifest_el->children.begin(), manifest_el->children.end(),
221e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                   [&](const std::unique_ptr<xml::Node>& child) {
222e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                     return child.get() == uses_sdk_el;
223e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                   });
224e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
225e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  auto application_iter =
226e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski      std::find_if(manifest_el->children.begin(), manifest_el->children.end(),
227e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                   [&](const std::unique_ptr<xml::Node>& child) {
228e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                     return child.get() == application_el;
229e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                   });
230e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
231c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(uses_sdk_iter, Ne(manifest_el->children.end()));
232c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(application_iter, Ne(manifest_el->children.end()));
233e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
234e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // The distance should be positive, meaning uses_sdk_iter comes before
235e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // application_iter.
236c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(std::distance(uses_sdk_iter, application_iter), Gt(0));
237e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski}
238e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
23952364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) {
240cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
241ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.rename_manifest_package = std::string("com.android");
24252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
243ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
24452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
24552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android">
24623034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski        <uses-split android:name="feature_a" />
247cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski        <application android:name=".MainApplication" text="hello">
248cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski          <activity android:name=".activity.Start" />
249cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski          <receiver android:name="com.google.android.Receiver" />
25052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        </application>
251cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
252cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
253c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
25452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
25523034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  xml::Element* manifest_el = doc->root.get();
256c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(manifest_el, NotNull());
25752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
258cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr = nullptr;
25952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
26023034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  attr = manifest_el->FindAttribute({}, "package");
261c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
262c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("com.android"));
26352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
26423034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  xml::Element* uses_split_el = manifest_el->FindChild({}, "uses-split");
265c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(uses_split_el, NotNull());
26623034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  attr = uses_split_el->FindAttribute(xml::kSchemaAndroid, "name");
267c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
268c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  // This should NOT have been affected.
269c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("feature_a"));
27023034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski
27123034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  xml::Element* application_el = manifest_el->FindChild({}, "application");
272c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(application_el, NotNull());
27352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
27423034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  attr = application_el->FindAttribute(xml::kSchemaAndroid, "name");
275c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
276c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("android.MainApplication"));
27752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
27823034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  attr = application_el->FindAttribute({}, "text");
279c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
280c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("hello"));
28152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
282cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* el;
28323034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  el = application_el->FindChild({}, "activity");
284c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
28552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
286ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "name");
287c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
288c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("android.activity.Start"));
28952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
29023034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  el = application_el->FindChild({}, "receiver");
291c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
29252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
293ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "name");
294c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
295c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("com.google.android.Receiver"));
29652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
29752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
298cacb28f2d60858106e2819cc7d95a65e8bda890bAdam LesinskiTEST_F(ManifestFixerTest,
299cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski       RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
300cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
301ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.rename_instrumentation_target_package = std::string("com.android");
30252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
303ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
30452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
30552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android">
30686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        <instrumentation android:name=".TestRunner" android:targetPackage="android" />
307cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
308cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
309c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
31052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
3116b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  xml::Element* manifest_el = doc->root.get();
312c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(manifest_el, NotNull());
31352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
314ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* instrumentation_el =
315ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      manifest_el->FindChild({}, "instrumentation");
316c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(instrumentation_el, NotNull());
31752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
318cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr =
319ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      instrumentation_el->FindAttribute(xml::kSchemaAndroid, "targetPackage");
320c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
321c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("com.android"));
32252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
32352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
32452364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
325cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
326ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.version_name_default = std::string("Beta");
327ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.version_code_default = std::string("0x10000000");
32852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
329ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
33052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
331cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                package="android" />)EOF",
332cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
333c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
33452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
3356b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  xml::Element* manifest_el = doc->root.get();
336c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(manifest_el, NotNull());
33752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
338cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr =
339ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName");
340c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
341c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("Beta"));
34252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
343ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode");
344c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
345c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("0x10000000"));
34652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
34752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
3486b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) {
349c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<manifest package=\"android\" coreApp=\"hello\" />"), IsNull());
350c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<manifest package=\"android\" coreApp=\"1dp\" />"), IsNull());
3516b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
352cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<xml::XmlResource> doc =
353ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      Verify("<manifest package=\"android\" coreApp=\"true\" />");
354c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
3556b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
3566b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  xml::Element* el = doc->root.get();
357c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
3586b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
359c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(el->name, StrEq("manifest"));
3606b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
361ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Attribute* attr = el->FindAttribute("", "coreApp");
362c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
3636b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
364c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->compiled_value, NotNull());
365c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(ValueCast<BinaryPrimitive>(attr->compiled_value.get()), NotNull());
3666b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski}
3676b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
36886d67df8d57b9537666f9b54a9ca563779a2288bAdam LesinskiTEST_F(ManifestFixerTest, UsesFeatureMustHaveNameOrGlEsVersion) {
36986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski  std::string input = R"EOF(
37086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
37186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski                  package="android">
37286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <uses-feature android:name="feature" />
37386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <uses-feature android:glEsVersion="1" />
37486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <feature-group />
37586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <feature-group>
37686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski            <uses-feature android:name="feature_in_group" />
37786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski            <uses-feature android:glEsVersion="2" />
37886d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          </feature-group>
37986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        </manifest>)EOF";
380c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), NotNull());
38186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski
38286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski  input = R"EOF(
38386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
38486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski                  package="android">
38586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <uses-feature android:name="feature" android:glEsVersion="1" />
38686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        </manifest>)EOF";
387c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), IsNull());
38886d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski
38986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski  input = R"EOF(
39086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
39186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski                  package="android">
39286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <uses-feature />
39386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        </manifest>)EOF";
394c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), IsNull());
39586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski
39686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski  input = R"EOF(
39786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
39886d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski                  package="android">
39986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <feature-group>
40086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski            <uses-feature android:name="feature" android:glEsVersion="1" />
40186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          </feature-group>
40286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        </manifest>)EOF";
403c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), IsNull());
40486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski
40586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski  input = R"EOF(
40686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
40786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski                  package="android">
40886d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <feature-group>
40986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski            <uses-feature />
41086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          </feature-group>
41186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        </manifest>)EOF";
412c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), IsNull());
41386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski}
41486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski
41563699b128e009c65affe50995bd8f86eca1a8694Adam LesinskiTEST_F(ManifestFixerTest, IgnoreNamespacedElements) {
41663699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski  std::string input = R"EOF(
41763699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
41863699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski                package="android">
41963699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski        <special:tag whoo="true" xmlns:special="http://google.com" />
42063699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski      </manifest>)EOF";
421c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), NotNull());
42263699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski}
42363699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski
42463699b128e009c65affe50995bd8f86eca1a8694Adam LesinskiTEST_F(ManifestFixerTest, DoNotIgnoreNonNamespacedElements) {
42563699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski  std::string input = R"EOF(
42663699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
42763699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski                package="android">
42863699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski        <tag whoo="true" />
42963699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski      </manifest>)EOF";
430c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), IsNull());
43163699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski}
43263699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski
43387f1e0fd31585e0117715f451c379d25c5ef7cb8Adam LesinskiTEST_F(ManifestFixerTest, SupportKeySets) {
43487f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski  std::string input = R"(
43587f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
43687f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          package="android">
43787f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski        <key-sets>
43887f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          <key-set android:name="old-set">
43987f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski            <public-key android:name="old-key" android:value="some+old+key" />
44087f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          </key-set>
44187f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          <key-set android:name="new-set">
44287f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski            <public-key android:name="new-key" android:value="some+new+key" />
44387f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          </key-set>
44487f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          <upgrade-key-set android:name="old-set" />
44587f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          <upgrade-key-set android:name="new-set" />
44687f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski        </key-sets>
44787f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski      </manifest>)";
44887f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski  EXPECT_THAT(Verify(input), NotNull());
44987f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski}
45087f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski
451c6284379a5dde6bc5927409eff292db2f0add578Adam LesinskiTEST_F(ManifestFixerTest, InsertCompileSdkVersions) {
452c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  std::string input = R"(
453c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android" />)";
454c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ManifestFixerOptions options;
455c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  options.compile_sdk_version = {"28"};
456c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  options.compile_sdk_version_codename = {"P"};
457c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski
458c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  std::unique_ptr<xml::XmlResource> manifest = VerifyWithOptions(input, options);
459c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(manifest, NotNull());
460c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski
461c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  xml::Attribute* attr = manifest->root->FindAttribute(xml::kSchemaAndroid, "compileSdkVersion");
462c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
463c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("28"));
464c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski
465c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  attr = manifest->root->FindAttribute(xml::kSchemaAndroid, "compileSdkVersionCodename");
466c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
467c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("P"));
468c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski}
469c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski
470cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace aapt
471