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