ManifestFixer_test.cpp revision fca5e427e21f69e42a732600474bb97bf1f0eb7d
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 41963699b128e009c65affe50995bd8f86eca1a8694Adam LesinskiTEST_F(ManifestFixerTest, IgnoreNamespacedElements) { 42063699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski std::string input = R"EOF( 42163699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 42263699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski package="android"> 42363699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski <special:tag whoo="true" xmlns:special="http://google.com" /> 42463699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski </manifest>)EOF"; 425c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski EXPECT_THAT(Verify(input), NotNull()); 42663699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski} 42763699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski 42863699b128e009c65affe50995bd8f86eca1a8694Adam LesinskiTEST_F(ManifestFixerTest, DoNotIgnoreNonNamespacedElements) { 42963699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski std::string input = R"EOF( 43063699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 43163699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski package="android"> 43263699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski <tag whoo="true" /> 43363699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski </manifest>)EOF"; 434c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski EXPECT_THAT(Verify(input), IsNull()); 43563699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski} 43663699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski 43787f1e0fd31585e0117715f451c379d25c5ef7cb8Adam LesinskiTEST_F(ManifestFixerTest, SupportKeySets) { 43887f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski std::string input = R"( 43987f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 44087f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski package="android"> 44187f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski <key-sets> 44287f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski <key-set android:name="old-set"> 44387f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski <public-key android:name="old-key" android:value="some+old+key" /> 44487f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski </key-set> 44587f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski <key-set android:name="new-set"> 44687f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski <public-key android:name="new-key" android:value="some+new+key" /> 44787f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski </key-set> 44887f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski <upgrade-key-set android:name="old-set" /> 44987f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski <upgrade-key-set android:name="new-set" /> 45087f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski </key-sets> 45187f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski </manifest>)"; 45287f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski EXPECT_THAT(Verify(input), NotNull()); 45387f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski} 45487f1e0fd31585e0117715f451c379d25c5ef7cb8Adam Lesinski 455c6284379a5dde6bc5927409eff292db2f0add578Adam LesinskiTEST_F(ManifestFixerTest, InsertCompileSdkVersions) { 456c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski std::string input = R"( 457c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="android" />)"; 458c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski ManifestFixerOptions options; 459c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski options.compile_sdk_version = {"28"}; 460c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski options.compile_sdk_version_codename = {"P"}; 461c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski 462c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski std::unique_ptr<xml::XmlResource> manifest = VerifyWithOptions(input, options); 463c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski ASSERT_THAT(manifest, NotNull()); 464c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski 465c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski xml::Attribute* attr = manifest->root->FindAttribute(xml::kSchemaAndroid, "compileSdkVersion"); 466c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski ASSERT_THAT(attr, NotNull()); 467c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski EXPECT_THAT(attr->value, StrEq("28")); 468c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski 469c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski attr = manifest->root->FindAttribute(xml::kSchemaAndroid, "compileSdkVersionCodename"); 470c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski ASSERT_THAT(attr, NotNull()); 471c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski EXPECT_THAT(attr->value, StrEq("P")); 472c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski} 473c6284379a5dde6bc5927409eff292db2f0add578Adam Lesinski 474ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela OrlowskaTEST_F(ManifestFixerTest, UnexpectedElementsInManifest) { 475ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska std::string input = R"( 476ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska <manifest xmlns:android="http://schemas.android.com/apk/res/android" 477ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska package="android"> 478ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska <beep/> 479ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska </manifest>)"; 480ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska ManifestFixerOptions options; 481ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska options.warn_validation = true; 482ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska 483ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska // Unexpected element should result in a warning if the flag is set to 'true'. 484ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska std::unique_ptr<xml::XmlResource> manifest = VerifyWithOptions(input, options); 485ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska ASSERT_THAT(manifest, NotNull()); 486ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska 487ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska // Unexpected element should result in an error if the flag is set to 'false'. 488ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska options.warn_validation = false; 489ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska manifest = VerifyWithOptions(input, options); 490ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska ASSERT_THAT(manifest, IsNull()); 491ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska 492ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska // By default the flag should be set to 'false'. 493ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska manifest = Verify(input); 494ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska ASSERT_THAT(manifest, IsNull()); 495ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska} 496ad9e1324ff2c459d0ee6ee571d4a3e458c02cc81Izabela Orlowska 497fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski 498fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam LesinskiTEST_F(ManifestFixerTest, UsesLibraryMustHaveNonEmptyName) { 499fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski std::string input = R"( 500fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 501fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski package="android"> 502fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski <application> 503fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski <uses-library android:name="" /> 504fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski </application> 505fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski </manifest>)"; 506fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski EXPECT_THAT(Verify(input), IsNull()); 507fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski 508fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski input = R"( 509fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 510fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski package="android"> 511fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski <application> 512fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski <uses-library /> 513fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski </application> 514fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski </manifest>)"; 515fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski EXPECT_THAT(Verify(input), IsNull()); 516fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski 517fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski input = R"( 518fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 519fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski package="android"> 520fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski <application> 521fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski <uses-library android:name="blahhh" /> 522fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski </application> 523fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski </manifest>)"; 524fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski EXPECT_THAT(Verify(input), NotNull()); 525fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski} 526fca5e427e21f69e42a732600474bb97bf1f0eb7dAdam Lesinski 527cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace aapt 528