ManifestFixer_test.cpp revision 7cb82a86beda55a178d76dc8dd90d0b01a4b9c91
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