ManifestFixer_test.cpp revision d5083f6f6b9bc76bbe64052bcec639eee752a321
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) { 935119e517308b84011fbd4d1a013296f4f5ffb8e4Adam 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> 1015119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski <receiver android:name=".OffToWork"><meta-data /></receiver> 1025119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski <provider android:name=".We"><meta-data /></provider> 1035119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski <service android:name=".Go"><meta-data /></service> 1045119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski </application> 1055119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski </manifest>)EOF"); 1065119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski ASSERT_NE(nullptr, doc); 1075119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski} 1085119e517308b84011fbd4d1a013296f4f5ffb8e4Adam Lesinski 1092ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) { 110cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options = {std::string("8"), std::string("22")}; 1112ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 112ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 1132ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 1142ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski package="android"> 1152ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" /> 116cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 117cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 118cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 119cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 120cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* el; 121cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr; 122cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 123ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = xml::FindRootElement(doc.get()); 124cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 125ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = el->FindChild({}, "uses-sdk"); 126cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 127ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 128cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 129cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("7", attr->value); 130ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 131cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 132cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("21", attr->value); 133cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 134ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski doc = VerifyWithOptions(R"EOF( 1352ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 1362ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski package="android"> 1372ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <uses-sdk android:targetSdkVersion="21" /> 138cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 139cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 140cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 141cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 142ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = xml::FindRootElement(doc.get()); 143cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 144ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = el->FindChild({}, "uses-sdk"); 145cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 146ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 147cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 148cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("8", attr->value); 149ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 150cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 151cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("21", attr->value); 152cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 153ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski doc = VerifyWithOptions(R"EOF( 1542ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 1552ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski package="android"> 1562ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <uses-sdk /> 157cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 158cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 159cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 160cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 161ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = xml::FindRootElement(doc.get()); 162cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 163ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = el->FindChild({}, "uses-sdk"); 164cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 165ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 166cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 167cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("8", attr->value); 168ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 169cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 170cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("22", attr->value); 171cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 172ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski doc = VerifyWithOptions(R"EOF( 1732ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 174cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski package="android" />)EOF", 175cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 176cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 177cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 178ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = xml::FindRootElement(doc.get()); 179cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 180ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = el->FindChild({}, "uses-sdk"); 181cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 182ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 183cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 184cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("8", attr->value); 185ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 186cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 187cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("22", attr->value); 1882ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski} 1892ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 190e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam LesinskiTEST_F(ManifestFixerTest, UsesSdkMustComeBeforeApplication) { 191e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ManifestFixerOptions options = {std::string("8"), std::string("22")}; 192e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 193e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 194e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski package="android"> 195e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski <application android:name=".MainApplication" /> 196e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski </manifest>)EOF", 197e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski options); 198e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_NE(nullptr, doc); 199e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 200e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski xml::Element* manifest_el = xml::FindRootElement(doc.get()); 201e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_NE(nullptr, manifest_el); 202e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_EQ("manifest", manifest_el->name); 203e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 204e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski xml::Element* application_el = manifest_el->FindChild("", "application"); 205e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_NE(nullptr, application_el); 206e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 207e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski xml::Element* uses_sdk_el = manifest_el->FindChild("", "uses-sdk"); 208e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_NE(nullptr, uses_sdk_el); 209e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 210e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski // Check that the uses_sdk_el comes before application_el in the children 211e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski // vector. 212e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski // Since there are no namespaces here, these children are direct descendants 213e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski // of manifest. 214e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski auto uses_sdk_iter = 215e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski std::find_if(manifest_el->children.begin(), manifest_el->children.end(), 216e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski [&](const std::unique_ptr<xml::Node>& child) { 217e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski return child.get() == uses_sdk_el; 218e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski }); 219e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 220e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski auto application_iter = 221e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski std::find_if(manifest_el->children.begin(), manifest_el->children.end(), 222e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski [&](const std::unique_ptr<xml::Node>& child) { 223e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski return child.get() == application_el; 224e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski }); 225e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 226e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_NE(manifest_el->children.end(), uses_sdk_iter); 227e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski ASSERT_NE(manifest_el->children.end(), application_iter); 228e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 229e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski // The distance should be positive, meaning uses_sdk_iter comes before 230e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski // application_iter. 231e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski EXPECT_GT(std::distance(uses_sdk_iter, application_iter), 0); 232e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski} 233e343eb145c42d00c4fd3fdde93cd0be55cb5b855Adam Lesinski 23452364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) { 235cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options; 236ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski options.rename_manifest_package = std::string("com.android"); 23752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 238ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 23952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 24052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski package="android"> 241cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski <application android:name=".MainApplication" text="hello"> 242cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski <activity android:name=".activity.Start" /> 243cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski <receiver android:name="com.google.android.Receiver" /> 24452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski </application> 245cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 246cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 247cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 24852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 249ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* manifestEl = xml::FindRootElement(doc.get()); 250cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, manifestEl); 25152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 252cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = nullptr; 25352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 254ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = manifestEl->FindAttribute({}, "package"); 255cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 256cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("com.android"), attr->value); 25752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 258ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* applicationEl = manifestEl->FindChild({}, "application"); 259cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, applicationEl); 26052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 261ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = applicationEl->FindAttribute(xml::kSchemaAndroid, "name"); 262cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 263cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("android.MainApplication"), attr->value); 26452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 265ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = applicationEl->FindAttribute({}, "text"); 266cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 267cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("hello"), attr->value); 26852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 269cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* el; 270ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = applicationEl->FindChild({}, "activity"); 271cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 27252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 273ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "name"); 274cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 275cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("android.activity.Start"), attr->value); 27652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 277ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = applicationEl->FindChild({}, "receiver"); 278cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 27952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 280ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "name"); 281cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 282cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value); 28352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski} 28452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 285cacb28f2d60858106e2819cc7d95a65e8bda890bAdam LesinskiTEST_F(ManifestFixerTest, 286cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski RenameManifestInstrumentationPackageAndFullyQualifyTarget) { 287cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options; 288ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski options.rename_instrumentation_target_package = std::string("com.android"); 28952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 290ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 29152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 29252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski package="android"> 29352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <instrumentation android:targetPackage="android" /> 294cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 295cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 296cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 29752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 298ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* manifest_el = xml::FindRootElement(doc.get()); 299ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ASSERT_NE(nullptr, manifest_el); 30052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 301ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* instrumentation_el = 302ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski manifest_el->FindChild({}, "instrumentation"); 303ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ASSERT_NE(nullptr, instrumentation_el); 30452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 305cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = 306ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski instrumentation_el->FindAttribute(xml::kSchemaAndroid, "targetPackage"); 307cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 308cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("com.android"), attr->value); 30952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski} 31052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 31152364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) { 312cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options; 313ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski options.version_name_default = std::string("Beta"); 314ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski options.version_code_default = std::string("0x10000000"); 31552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 316ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 31752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 318cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski package="android" />)EOF", 319cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 320cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 32152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 322ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* manifest_el = xml::FindRootElement(doc.get()); 323ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ASSERT_NE(nullptr, manifest_el); 32452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 325cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = 326ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); 327cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 328cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("Beta"), attr->value); 32952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 330ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); 331cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 332cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("0x10000000"), attr->value); 33352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski} 33452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 3356b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) { 336cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 337ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Verify("<manifest package=\"android\" coreApp=\"hello\" />")); 338cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 339ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Verify("<manifest package=\"android\" coreApp=\"1dp\" />")); 3406b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 341cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<xml::XmlResource> doc = 342ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Verify("<manifest package=\"android\" coreApp=\"true\" />"); 343cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 3446b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 345ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* el = xml::FindRootElement(doc.get()); 346cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 3476b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 348cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("manifest", el->name); 3496b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 350ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Attribute* attr = el->FindAttribute("", "coreApp"); 351cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 3526b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 353ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, attr->compiled_value); 354ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, ValueCast<BinaryPrimitive>(attr->compiled_value.get())); 3556b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski} 3566b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 357cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace aapt 358