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 21d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinskiusing android::StringPiece; 22d5083f6f6b9bc76bbe64052bcec639eee752a321Adam Lesinski 232ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinskinamespace aapt { 242ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 252ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinskistruct ManifestFixerTest : public ::testing::Test { 26cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<IAaptContext> mContext; 27cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 28cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski void SetUp() override { 29cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski mContext = 30cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::ContextBuilder() 31ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .SetCompilationPackage("android") 32ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .SetPackageId(0x01) 33ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .SetNameManglerPolicy(NameManglerPolicy{"android"}) 34ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .AddSymbolSource( 35cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::StaticSymbolSourceBuilder() 36ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .AddSymbol( 37cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "android:attr/package", ResourceId(0x01010000), 38cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::AttributeBuilder() 39ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .SetTypeMask(android::ResTable_map::TYPE_STRING) 40ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .Build()) 41ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .AddSymbol( 42cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "android:attr/minSdkVersion", ResourceId(0x01010001), 43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::AttributeBuilder() 44ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .SetTypeMask(android::ResTable_map::TYPE_STRING | 45cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski android::ResTable_map::TYPE_INTEGER) 46ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .Build()) 47ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .AddSymbol( 48cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "android:attr/targetSdkVersion", ResourceId(0x01010002), 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("android:string/str", ResourceId(0x01060000)) 54ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .Build()) 55ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .Build(); 56cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 57cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 58ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> Verify(const StringPiece& str) { 59ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return VerifyWithOptions(str, {}); 60cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 61cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 62ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> VerifyWithOptions( 63cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski const StringPiece& str, const ManifestFixerOptions& options) { 64ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(str); 65cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixer fixer(options); 66ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (fixer.Consume(mContext.get(), doc.get())) { 67cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski return doc; 682ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski } 69cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski return {}; 70cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 712ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}; 722ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 732ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestIsRootTag) { 74ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_EQ(nullptr, Verify("<other-tag />")); 75ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_EQ(nullptr, Verify("<ns:manifest xmlns:ns=\"com\" />")); 76ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, Verify("<manifest package=\"android\"></manifest>")); 772ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski} 782ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 792ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestHasPackage) { 80ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, Verify("<manifest package=\"android\" />")); 81ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, Verify("<manifest package=\"com.android\" />")); 82ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, Verify("<manifest package=\"com.android.google\" />")); 83cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 84ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Verify("<manifest package=\"com.android.google.Class$1\" />")); 85ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_EQ(nullptr, Verify("<manifest " 86cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "xmlns:android=\"http://schemas.android.com/apk/" 87cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "res/android\" " 88cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "android:package=\"com.android\" />")); 89ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_EQ(nullptr, Verify("<manifest package=\"@string/str\" />")); 902ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski} 912ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 925119e517308b84011fbd4d1a013296f4f5ffb8e4Adam LesinskiTEST_F(ManifestFixerTest, AllowMetaData) { 9386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski auto doc = Verify(R"EOF( 945119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 955119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski package="android"> 965119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski <meta-data /> 975119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski <application> 985119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski <meta-data /> 995119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski <activity android:name=".Hi"><meta-data /></activity> 1005119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski <activity-alias android:name=".Ho"><meta-data /></activity-alias> 10186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <receiver android:name=".OffTo"><meta-data /></receiver> 10286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <provider android:name=".Work"><meta-data /></provider> 10386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <service android:name=".We"><meta-data /></service> 1045119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski </application> 10586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <instrumentation android:name=".Go"><meta-data /></instrumentation> 1065119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski </manifest>)EOF"); 10786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski ASSERT_NE(nullptr, doc); 1085119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski} 1095119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski 1102ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) { 111cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options = {std::string("8"), std::string("22")}; 1122ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 113ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 1142ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 1152ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski package="android"> 1162ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" /> 117cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 118cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 119cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 120cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 121cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* el; 122cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr; 123cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 124ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = xml::FindRootElement(doc.get()); 125cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 126ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = el->FindChild({}, "uses-sdk"); 127cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 128ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 129cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 130cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("7", attr->value); 131ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 132cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 133cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("21", attr->value); 134cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 135ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski doc = VerifyWithOptions(R"EOF( 1362ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 1372ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski package="android"> 1382ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <uses-sdk android:targetSdkVersion="21" /> 139cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 140cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 141cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 142cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 143ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = xml::FindRootElement(doc.get()); 144cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 145ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = el->FindChild({}, "uses-sdk"); 146cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 147ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 148cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 149cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("8", attr->value); 150ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 151cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 152cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("21", attr->value); 153cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 154ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski doc = VerifyWithOptions(R"EOF( 1552ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 1562ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski package="android"> 1572ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <uses-sdk /> 158cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 159cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 160cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 161cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 162ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = xml::FindRootElement(doc.get()); 163cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 164ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = el->FindChild({}, "uses-sdk"); 165cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 166ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 167cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 168cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("8", attr->value); 169ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 170cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 171cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("22", attr->value); 172cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 173ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski doc = VerifyWithOptions(R"EOF( 1742ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 175cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski package="android" />)EOF", 176cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 177cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 178cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 179ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = xml::FindRootElement(doc.get()); 180cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 181ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = el->FindChild({}, "uses-sdk"); 182cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 183ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 184cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 185cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("8", attr->value); 186ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 187cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 188cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("22", attr->value); 1892ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski} 1902ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 191e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam LesinskiTEST_F(ManifestFixerTest, UsesSdkMustComeBeforeApplication) { 192e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ManifestFixerOptions options = {std::string("8"), std::string("22")}; 193e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 194e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 195e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski package="android"> 196e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski <application android:name=".MainApplication" /> 197e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski </manifest>)EOF", 198e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski options); 199e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_NE(nullptr, doc); 200e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 201e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski xml::Element* manifest_el = xml::FindRootElement(doc.get()); 202e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_NE(nullptr, manifest_el); 203e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_EQ("manifest", manifest_el->name); 204e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 205e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski xml::Element* application_el = manifest_el->FindChild("", "application"); 206e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_NE(nullptr, application_el); 207e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 208e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski xml::Element* uses_sdk_el = manifest_el->FindChild("", "uses-sdk"); 209e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_NE(nullptr, uses_sdk_el); 210e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 211e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski // Check that the uses_sdk_el comes before application_el in the children 212e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski // vector. 213e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski // Since there are no namespaces here, these children are direct descendants 214e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski // of manifest. 215e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski auto uses_sdk_iter = 216e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski std::find_if(manifest_el->children.begin(), manifest_el->children.end(), 217e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski [&](const std::unique_ptr<xml::Node>& child) { 218e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski return child.get() == uses_sdk_el; 219e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski }); 220e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 221e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski auto application_iter = 222e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski std::find_if(manifest_el->children.begin(), manifest_el->children.end(), 223e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski [&](const std::unique_ptr<xml::Node>& child) { 224e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski return child.get() == application_el; 225e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski }); 226e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 227e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_NE(manifest_el->children.end(), uses_sdk_iter); 228e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_NE(manifest_el->children.end(), application_iter); 229e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 230e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski // The distance should be positive, meaning uses_sdk_iter comes before 231e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski // application_iter. 232e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski EXPECT_GT(std::distance(uses_sdk_iter, application_iter), 0); 233e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski} 234e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 23552364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) { 236cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options; 237ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski options.rename_manifest_package = std::string("com.android"); 23852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 239ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 24052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 24152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski package="android"> 242cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski <application android:name=".MainApplication" text="hello"> 243cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski <activity android:name=".activity.Start" /> 244cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski <receiver android:name="com.google.android.Receiver" /> 24552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski </application> 246cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 247cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 248cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 24952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 250ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* manifestEl = xml::FindRootElement(doc.get()); 251cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, manifestEl); 25252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 253cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = nullptr; 25452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 255ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = manifestEl->FindAttribute({}, "package"); 256cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 257cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("com.android"), attr->value); 25852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 259ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* applicationEl = manifestEl->FindChild({}, "application"); 260cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, applicationEl); 26152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 262ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = applicationEl->FindAttribute(xml::kSchemaAndroid, "name"); 263cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 264cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("android.MainApplication"), attr->value); 26552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 266ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = applicationEl->FindAttribute({}, "text"); 267cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 268cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("hello"), attr->value); 26952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 270cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* el; 271ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = applicationEl->FindChild({}, "activity"); 272cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 27352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 274ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "name"); 275cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 276cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("android.activity.Start"), attr->value); 27752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 278ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = applicationEl->FindChild({}, "receiver"); 279cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 28052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 281ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "name"); 282cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 283cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value); 28452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski} 28552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 286cacb28f2d60858106e2819cc7d95a65e8bda890bAdam LesinskiTEST_F(ManifestFixerTest, 287cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski RenameManifestInstrumentationPackageAndFullyQualifyTarget) { 288cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options; 289ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski options.rename_instrumentation_target_package = std::string("com.android"); 29052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 291ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 29252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 29352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski package="android"> 29486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <instrumentation android:name=".TestRunner" android:targetPackage="android" /> 295cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 296cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 297cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 29852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 299ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* manifest_el = xml::FindRootElement(doc.get()); 300ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ASSERT_NE(nullptr, manifest_el); 30152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 302ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* instrumentation_el = 303ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski manifest_el->FindChild({}, "instrumentation"); 304ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ASSERT_NE(nullptr, instrumentation_el); 30552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 306cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = 307ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski instrumentation_el->FindAttribute(xml::kSchemaAndroid, "targetPackage"); 308cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 309cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("com.android"), attr->value); 31052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski} 31152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 31252364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) { 313cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options; 314ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski options.version_name_default = std::string("Beta"); 315ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski options.version_code_default = std::string("0x10000000"); 31652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 317ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 31852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 319cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski package="android" />)EOF", 320cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 321cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 32252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 323ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* manifest_el = xml::FindRootElement(doc.get()); 324ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ASSERT_NE(nullptr, manifest_el); 32552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 326cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = 327ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); 328cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 329cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("Beta"), attr->value); 33052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 331ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); 332cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 333cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("0x10000000"), attr->value); 33452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski} 33552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 3366b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) { 337cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 338ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Verify("<manifest package=\"android\" coreApp=\"hello\" />")); 339cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 340ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Verify("<manifest package=\"android\" coreApp=\"1dp\" />")); 3416b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 342cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<xml::XmlResource> doc = 343ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Verify("<manifest package=\"android\" coreApp=\"true\" />"); 344cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 3456b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 346ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* el = xml::FindRootElement(doc.get()); 347cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 3486b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 349cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("manifest", el->name); 3506b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 351ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Attribute* attr = el->FindAttribute("", "coreApp"); 352cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 3536b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 354ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, attr->compiled_value); 355ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, ValueCast<BinaryPrimitive>(attr->compiled_value.get())); 3566b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski} 3576b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 35886d67df8d57b9537666f9b54a9ca563779a2288bAdam LesinskiTEST_F(ManifestFixerTest, UsesFeatureMustHaveNameOrGlEsVersion) { 35986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski std::string input = R"EOF( 36086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 36186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski package="android"> 36286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <uses-feature android:name="feature" /> 36386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <uses-feature android:glEsVersion="1" /> 36486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <feature-group /> 36586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <feature-group> 36686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <uses-feature android:name="feature_in_group" /> 36786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <uses-feature android:glEsVersion="2" /> 36886d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski </feature-group> 36986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski </manifest>)EOF"; 37086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski EXPECT_NE(nullptr, Verify(input)); 37186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski 37286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski input = R"EOF( 37386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 37486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski package="android"> 37586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <uses-feature android:name="feature" android:glEsVersion="1" /> 37686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski </manifest>)EOF"; 37786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski EXPECT_EQ(nullptr, Verify(input)); 37886d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski 37986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski input = R"EOF( 38086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 38186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski package="android"> 38286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <uses-feature /> 38386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski </manifest>)EOF"; 38486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski EXPECT_EQ(nullptr, Verify(input)); 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 <feature-group> 39086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <uses-feature android:name="feature" android:glEsVersion="1" /> 39186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski </feature-group> 39286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski </manifest>)EOF"; 39386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski EXPECT_EQ(nullptr, Verify(input)); 39486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski 39586d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski input = R"EOF( 39686d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 39786d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski package="android"> 39886d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <feature-group> 39986d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski <uses-feature /> 40086d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski </feature-group> 40186d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski </manifest>)EOF"; 40286d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski EXPECT_EQ(nullptr, Verify(input)); 40386d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski} 40486d67df8d57b9537666f9b54a9ca563779a2288bAdam Lesinski 40563699b128e009c65affe50995bd8f86eca1a8694Adam LesinskiTEST_F(ManifestFixerTest, IgnoreNamespacedElements) { 40663699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski std::string input = R"EOF( 40763699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 40863699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski package="android"> 40963699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski <special:tag whoo="true" xmlns:special="http://google.com" /> 41063699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski </manifest>)EOF"; 41163699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski EXPECT_NE(nullptr, Verify(input)); 41263699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski} 41363699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski 41463699b128e009c65affe50995bd8f86eca1a8694Adam LesinskiTEST_F(ManifestFixerTest, DoNotIgnoreNonNamespacedElements) { 41563699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski std::string input = R"EOF( 41663699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 41763699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski package="android"> 41863699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski <tag whoo="true" /> 41963699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski </manifest>)EOF"; 42063699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski EXPECT_EQ(nullptr, Verify(input)); 42163699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski} 42263699b128e009c65affe50995bd8f86eca1a8694Adam Lesinski 423cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace aapt 424