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) {
115ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  ManifestFixerOptions options;
116ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  options.min_sdk_version_default = std::string("8");
117ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  options.target_sdk_version_default = std::string("22");
1182ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
119ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
1202ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1212ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1222ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
123cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
124cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
125c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
126cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
127cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* el;
128cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr;
129cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
1306b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  el = doc->root.get();
131c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
132ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
133c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
134ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
135c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
136c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("7"));
137ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
138c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
139c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("21"));
140cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
141ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  doc = VerifyWithOptions(R"EOF(
1422ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1432ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1442ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk android:targetSdkVersion="21" />
145cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
146cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
147c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
148cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
1496b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  el = doc->root.get();
150c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
151ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
152c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
153ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
154c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
155c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("8"));
156ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
157c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
158c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("21"));
159cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
160ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  doc = VerifyWithOptions(R"EOF(
1612ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1622ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1632ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk />
164cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
165cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
166c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
167cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
1686b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  el = doc->root.get();
169c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
170ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
171c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
172ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
173c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
174c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("8"));
175ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
176c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
177c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("22"));
178cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
179ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  doc = VerifyWithOptions(R"EOF(
1802ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
181cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                package="android" />)EOF",
182cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                          options);
183c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
184cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski
1856b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  el = doc->root.get();
186c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
187ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  el = el->FindChild({}, "uses-sdk");
188c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
189ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion");
190c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
191c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("8"));
192ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion");
193c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
194c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("22"));
1952ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
1962ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
197e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam LesinskiTEST_F(ManifestFixerTest, UsesSdkMustComeBeforeApplication) {
198ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  ManifestFixerOptions options;
199ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  options.min_sdk_version_default = std::string("8");
200ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  options.target_sdk_version_default = std::string("22");
201e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
202e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski          <manifest xmlns:android="http://schemas.android.com/apk/res/android"
203e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                    package="android">
204e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski            <application android:name=".MainApplication" />
205e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski          </manifest>)EOF",
206e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                                                            options);
207c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
208e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
2096b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  xml::Element* manifest_el = doc->root.get();
210c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(manifest_el, NotNull());
211e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  ASSERT_EQ("manifest", manifest_el->name);
212e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
213e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  xml::Element* application_el = manifest_el->FindChild("", "application");
214c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(application_el, NotNull());
215e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
216e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  xml::Element* uses_sdk_el = manifest_el->FindChild("", "uses-sdk");
217c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(uses_sdk_el, NotNull());
218e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
219e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // Check that the uses_sdk_el comes before application_el in the children
220e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // vector.
221e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // Since there are no namespaces here, these children are direct descendants
222e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // of manifest.
223e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  auto uses_sdk_iter =
224e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski      std::find_if(manifest_el->children.begin(), manifest_el->children.end(),
225e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                   [&](const std::unique_ptr<xml::Node>& child) {
226e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                     return child.get() == uses_sdk_el;
227e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                   });
228e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
229e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  auto application_iter =
230e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski      std::find_if(manifest_el->children.begin(), manifest_el->children.end(),
231e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                   [&](const std::unique_ptr<xml::Node>& child) {
232e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                     return child.get() == application_el;
233e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski                   });
234e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
235c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(uses_sdk_iter, Ne(manifest_el->children.end()));
236c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(application_iter, Ne(manifest_el->children.end()));
237e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
238e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // The distance should be positive, meaning uses_sdk_iter comes before
239e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski  // application_iter.
240c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(std::distance(uses_sdk_iter, application_iter), Gt(0));
241e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski}
242e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski
24352364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) {
244cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
245ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.rename_manifest_package = std::string("com.android");
24652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
247ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
24852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
24952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android">
25023034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski        <uses-split android:name="feature_a" />
251cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski        <application android:name=".MainApplication" text="hello">
252cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski          <activity android:name=".activity.Start" />
253cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski          <receiver android:name="com.google.android.Receiver" />
25452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        </application>
255cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
256cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
257c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
25852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
25923034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  xml::Element* manifest_el = doc->root.get();
260c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(manifest_el, NotNull());
26152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
262cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr = nullptr;
26352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
26423034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  attr = manifest_el->FindAttribute({}, "package");
265c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
266c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("com.android"));
26752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
26823034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  xml::Element* uses_split_el = manifest_el->FindChild({}, "uses-split");
269c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(uses_split_el, NotNull());
27023034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  attr = uses_split_el->FindAttribute(xml::kSchemaAndroid, "name");
271c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
272c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  // This should NOT have been affected.
273c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("feature_a"));
27423034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski
27523034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  xml::Element* application_el = manifest_el->FindChild({}, "application");
276c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(application_el, NotNull());
27752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
27823034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  attr = application_el->FindAttribute(xml::kSchemaAndroid, "name");
279c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
280c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("android.MainApplication"));
28152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
28223034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  attr = application_el->FindAttribute({}, "text");
283c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
284c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("hello"));
28552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
286cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Element* el;
28723034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  el = application_el->FindChild({}, "activity");
288c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
28952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
290ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "name");
291c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
292c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("android.activity.Start"));
29352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
29423034b911c60d4a24ca036436b3a3c138d904255Adam Lesinski  el = application_el->FindChild({}, "receiver");
295c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
29652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
297ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = el->FindAttribute(xml::kSchemaAndroid, "name");
298c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
299c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("com.google.android.Receiver"));
30052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
30152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
302cacb28f2d60858106e2819cc7d95a65e8bda890bAdam LesinskiTEST_F(ManifestFixerTest,
303cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski       RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
304cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
305ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.rename_instrumentation_target_package = std::string("com.android");
30652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
307ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
30852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
30952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android">
31086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        <instrumentation android:name=".TestRunner" android:targetPackage="android" />
311cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski      </manifest>)EOF",
312cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
313c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
31452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
3156b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  xml::Element* manifest_el = doc->root.get();
316c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(manifest_el, NotNull());
31752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
318ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Element* instrumentation_el =
319ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      manifest_el->FindChild({}, "instrumentation");
320c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(instrumentation_el, NotNull());
32152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
322cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr =
323ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      instrumentation_el->FindAttribute(xml::kSchemaAndroid, "targetPackage");
324c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
325c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("com.android"));
32652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
32752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
32852364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
329cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  ManifestFixerOptions options;
330ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.version_name_default = std::string("Beta");
331ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  options.version_code_default = std::string("0x10000000");
33252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
333ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF(
33452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
335cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                package="android" />)EOF",
336cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski                                                            options);
337c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
33852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
3396b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  xml::Element* manifest_el = doc->root.get();
340c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(manifest_el, NotNull());
34152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
342cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  xml::Attribute* attr =
343ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName");
344c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
345c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("Beta"));
34652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
347ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode");
348c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
349c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("0x10000000"));
35052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
35152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
3526b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) {
353c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<manifest package=\"android\" coreApp=\"hello\" />"), IsNull());
354c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify("<manifest package=\"android\" coreApp=\"1dp\" />"), IsNull());
3556b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
356cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski  std::unique_ptr<xml::XmlResource> doc =
357ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski      Verify("<manifest package=\"android\" coreApp=\"true\" />");
358c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(doc, NotNull());
3596b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
3606b372991296c9f2bd6f8f8847dcd23d50970d06dAdam Lesinski  xml::Element* el = doc->root.get();
361c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(el, NotNull());
3626b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
363c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(el->name, StrEq("manifest"));
3646b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
365ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski  xml::Attribute* attr = el->FindAttribute("", "coreApp");
366c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
3676b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
368c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->compiled_value, NotNull());
369c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(ValueCast<BinaryPrimitive>(attr->compiled_value.get()), NotNull());
3706b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski}
3716b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski
37286d67df8d57b9537666f9b54a9ca563779a2288bAdam LesinskiTEST_F(ManifestFixerTest, UsesFeatureMustHaveNameOrGlEsVersion) {
37386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski  std::string input = R"EOF(
37486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
37586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski                  package="android">
37686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <uses-feature android:name="feature" />
37786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <uses-feature android:glEsVersion="1" />
37886d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <feature-group />
37986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <feature-group>
38086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski            <uses-feature android:name="feature_in_group" />
38186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski            <uses-feature android:glEsVersion="2" />
38286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          </feature-group>
38386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        </manifest>)EOF";
384c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), NotNull());
38586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski
38686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski  input = R"EOF(
38786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
38886d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski                  package="android">
38986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <uses-feature android:name="feature" android:glEsVersion="1" />
39086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        </manifest>)EOF";
391c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), IsNull());
39286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski
39386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski  input = R"EOF(
39486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
39586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski                  package="android">
39686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <uses-feature />
39786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        </manifest>)EOF";
398c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), IsNull());
39986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski
40086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski  input = R"EOF(
40186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
40286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski                  package="android">
40386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <feature-group>
40486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski            <uses-feature android:name="feature" android:glEsVersion="1" />
40586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          </feature-group>
40686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        </manifest>)EOF";
407c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), IsNull());
40886d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski
40986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski  input = R"EOF(
41086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
41186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski                  package="android">
41286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          <feature-group>
41386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski            <uses-feature />
41486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski          </feature-group>
41586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski        </manifest>)EOF";
416c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), IsNull());
41786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski}
41886d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski
419e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan MitchellTEST_F(ManifestFixerTest, ApplicationInjectDebuggable) {
420e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  ManifestFixerOptions options;
421e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  options.debug_mode = true;
422e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell
423e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  std::string no_d = R"(
424e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
425e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell          package="android">
426e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell        <application>
427e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell        </application>
428e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell      </manifest>)";
429e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell
430e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  std::string false_d = R"(
431e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
432e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell          package="android">
433e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell        <application android:debuggable="false">
434e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell        </application>
435e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell      </manifest>)";
436e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell
437e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  std::string true_d = R"(
438e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
439e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell          package="android">
440e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell        <application android:debuggable="true">
441e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell        </application>
442e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell      </manifest>)";
443e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell
444e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  // Inject the debuggable attribute when the attribute is not present and the
445e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  // flag is present
446e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  std::unique_ptr<xml::XmlResource> manifest = VerifyWithOptions(no_d, options);
447e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  EXPECT_THAT(manifest->root.get()->FindChildWithAttribute(
448e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell      {}, "application", xml::kSchemaAndroid, "debuggable", "true"), NotNull());
449e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell
450e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  // Set the debuggable flag to true if the attribute is false and the flag is
451e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  // present
452e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  manifest = VerifyWithOptions(false_d, options);
453e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  EXPECT_THAT(manifest->root.get()->FindChildWithAttribute(
454e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell      {}, "application", xml::kSchemaAndroid, "debuggable", "true"), NotNull());
455e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell
456e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  // Keep debuggable flag true if the attribute is true and the flag is present
457e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  manifest = VerifyWithOptions(true_d, options);
458e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  EXPECT_THAT(manifest->root.get()->FindChildWithAttribute(
459e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell      {}, "application", xml::kSchemaAndroid, "debuggable", "true"), NotNull());
460e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell
461e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  // Do not inject the debuggable attribute when the attribute is not present
462e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  // and the flag is not present
463e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  manifest = Verify(no_d);
464e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  EXPECT_THAT(manifest->root.get()->FindChildWithAttribute(
465e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell      {}, "application", xml::kSchemaAndroid, "debuggable", "true"), IsNull());
466e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell
467e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  // Do not set the debuggable flag to true if the attribute is false and the
468e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  // flag is not present
469e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  manifest = Verify(false_d);
470e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  EXPECT_THAT(manifest->root.get()->FindChildWithAttribute(
471e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell      {}, "application", xml::kSchemaAndroid, "debuggable", "true"), IsNull());
472e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell
473e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  // Keep debuggable flag true if the attribute is true and the flag is not
474e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  // present
475e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  manifest = Verify(true_d);
476e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell  EXPECT_THAT(manifest->root.get()->FindChildWithAttribute(
477e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell      {}, "application", xml::kSchemaAndroid, "debuggable", "true"), NotNull());
478e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell}
479e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell
480e5b38a676ce0fe6ee08635a7167ee5d76a225a06Ryan Mitchell
48163699b128e009c65affe50995bd8f86eca1a8694Adam LesinskiTEST_F(ManifestFixerTest, IgnoreNamespacedElements) {
48263699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski  std::string input = R"EOF(
48363699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
48463699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski                package="android">
48563699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski        <special:tag whoo="true" xmlns:special="http://google.com" />
48663699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski      </manifest>)EOF";
487c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), NotNull());
48863699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski}
48963699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski
49063699b128e009c65affe50995bd8f86eca1a8694Adam LesinskiTEST_F(ManifestFixerTest, DoNotIgnoreNonNamespacedElements) {
49163699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski  std::string input = R"EOF(
49263699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
49363699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski                package="android">
49463699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski        <tag whoo="true" />
49563699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski      </manifest>)EOF";
496c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(Verify(input), IsNull());
49763699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski}
49863699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski
49987f1e0fd31585e0117715f451c379d25c5ef7cb8Adam LesinskiTEST_F(ManifestFixerTest, SupportKeySets) {
50087f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski  std::string input = R"(
50187f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
50287f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          package="android">
50387f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski        <key-sets>
50487f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          <key-set android:name="old-set">
50587f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski            <public-key android:name="old-key" android:value="some+old+key" />
50687f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          </key-set>
50787f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          <key-set android:name="new-set">
50887f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski            <public-key android:name="new-key" android:value="some+new+key" />
50987f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          </key-set>
51087f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          <upgrade-key-set android:name="old-set" />
51187f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski          <upgrade-key-set android:name="new-set" />
51287f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski        </key-sets>
51387f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski      </manifest>)";
51487f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski  EXPECT_THAT(Verify(input), NotNull());
51587f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski}
51687f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski
517c6284379a5dde6bc5927409eff292db2f0add578Adam LesinskiTEST_F(ManifestFixerTest, InsertCompileSdkVersions) {
518c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  std::string input = R"(
519c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android" />)";
520c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ManifestFixerOptions options;
521c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  options.compile_sdk_version = {"28"};
522c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  options.compile_sdk_version_codename = {"P"};
523c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski
524c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  std::unique_ptr<xml::XmlResource> manifest = VerifyWithOptions(input, options);
525c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(manifest, NotNull());
526c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski
527c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  xml::Attribute* attr = manifest->root->FindAttribute(xml::kSchemaAndroid, "compileSdkVersion");
528c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
529c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("28"));
530c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski
531c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  attr = manifest->root->FindAttribute(xml::kSchemaAndroid, "compileSdkVersionCodename");
532c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  ASSERT_THAT(attr, NotNull());
533c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski  EXPECT_THAT(attr->value, StrEq("P"));
534c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski}
535c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski
536ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela OrlowskaTEST_F(ManifestFixerTest, UnexpectedElementsInManifest) {
537ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  std::string input = R"(
538ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
539ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska          package="android">
540ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska        <beep/>
541ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska      </manifest>)";
542ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  ManifestFixerOptions options;
543ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  options.warn_validation = true;
544ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska
545ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  // Unexpected element should result in a warning if the flag is set to 'true'.
546ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  std::unique_ptr<xml::XmlResource> manifest = VerifyWithOptions(input, options);
547ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  ASSERT_THAT(manifest, NotNull());
548ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska
549ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  // Unexpected element should result in an error if the flag is set to 'false'.
550ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  options.warn_validation = false;
551ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  manifest = VerifyWithOptions(input, options);
552ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  ASSERT_THAT(manifest, IsNull());
553ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska
554ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  // By default the flag should be set to 'false'.
555ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  manifest = Verify(input);
556ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska  ASSERT_THAT(manifest, IsNull());
557ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska}
558ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska
5597cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan MitchellTEST_F(ManifestFixerTest, InsertPlatformBuildVersions) {
5607cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell  // Test for insertion when versionCode and versionName are included in the manifest
5617cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell  {
5627cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    std::string input = R"(
5637cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell        <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android"
5647cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell          android:versionCode="27" android:versionName="O"/>)";
5657cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    std::unique_ptr<xml::XmlResource> manifest = Verify(input);
5667cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    ASSERT_THAT(manifest, NotNull());
5677cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell
5687cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    xml::Attribute* attr = manifest->root->FindAttribute("", "platformBuildVersionCode");
5697cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    ASSERT_THAT(attr, NotNull());
5707cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    EXPECT_THAT(attr->value, StrEq("27"));
5717cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    attr = manifest->root->FindAttribute("", "platformBuildVersionName");
5727cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    ASSERT_THAT(attr, NotNull());
5737cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    EXPECT_THAT(attr->value, StrEq("O"));
5747cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell  }
5757cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell
5767cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell  // Test for insertion when versionCode and versionName defaults are specified
5777cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell  {
5787cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    std::string input = R"(
5797cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell      <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android"/>)";
5807cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    ManifestFixerOptions options;
5817cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    options.version_code_default = {"27"};
5827cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    options.version_name_default = {"O"};
5837cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    std::unique_ptr<xml::XmlResource> manifest = VerifyWithOptions(input, options);
5847cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    ASSERT_THAT(manifest, NotNull());
5857cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell
5867cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    xml::Attribute* attr = manifest->root->FindAttribute("", "platformBuildVersionCode");
5877cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    ASSERT_THAT(attr, NotNull());
5887cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    EXPECT_THAT(attr->value, StrEq("27"));
5897cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    attr = manifest->root->FindAttribute("", "platformBuildVersionName");
5907cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    ASSERT_THAT(attr, NotNull());
5917cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    EXPECT_THAT(attr->value, StrEq("O"));
5927cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell  }
5937cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell
5947cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell  // Test that the platform build version attributes are not changed if they are currently present
5957cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell  {
5967cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    std::string input = R"(
5977cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell        <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android"
5987cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell          android:versionCode="28" android:versionName="P"
5997cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell          platformBuildVersionCode="27" platformBuildVersionName="O"/>)";
6007cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    std::unique_ptr<xml::XmlResource> manifest = Verify(input);
6017cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    ASSERT_THAT(manifest, NotNull());
6027cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell
6037cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    xml::Attribute* attr = manifest->root->FindAttribute("", "platformBuildVersionCode");
6047cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    ASSERT_THAT(attr, NotNull());
6057cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    EXPECT_THAT(attr->value, StrEq("27"));
6067cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    attr = manifest->root->FindAttribute("", "platformBuildVersionName");
6077cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    ASSERT_THAT(attr, NotNull());
6087cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell    EXPECT_THAT(attr->value, StrEq("O"));
6097cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell  }
6107cb82a86beda55a178d76dc8dd90d0b01a4b9c91Ryan Mitchell}
611fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski
612fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam LesinskiTEST_F(ManifestFixerTest, UsesLibraryMustHaveNonEmptyName) {
613fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski  std::string input = R"(
614fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
615fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski          package="android">
616fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski        <application>
617fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski          <uses-library android:name="" />
618fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski        </application>
619fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski      </manifest>)";
620fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski  EXPECT_THAT(Verify(input), IsNull());
621fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski
622fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski  input = R"(
623fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
624fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski          package="android">
625fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski        <application>
626fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski          <uses-library />
627fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski        </application>
628fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski      </manifest>)";
629fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski  EXPECT_THAT(Verify(input), IsNull());
630fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski
631fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski  input = R"(
632fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski       <manifest xmlns:android="http://schemas.android.com/apk/res/android"
633fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski           package="android">
634fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski         <application>
635fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski           <uses-library android:name="blahhh" />
636fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski         </application>
637fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski       </manifest>)";
638fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski  EXPECT_THAT(Verify(input), NotNull());
639fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski}
640fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski
641cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski}  // namespace aapt
642