ManifestFixer_test.cpp revision ce5e56e243d262a9b65459c3bd0bb9eaadd40628
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 212ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinskinamespace aapt { 222ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 232ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinskistruct ManifestFixerTest : public ::testing::Test { 24cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<IAaptContext> mContext; 25cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 26cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski void SetUp() override { 27cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski mContext = 28cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::ContextBuilder() 29ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .SetCompilationPackage("android") 30ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .SetPackageId(0x01) 31ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .SetNameManglerPolicy(NameManglerPolicy{"android"}) 32ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .AddSymbolSource( 33cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::StaticSymbolSourceBuilder() 34ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .AddSymbol( 35cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "android:attr/package", ResourceId(0x01010000), 36cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::AttributeBuilder() 37ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .SetTypeMask(android::ResTable_map::TYPE_STRING) 38ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .Build()) 39ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .AddSymbol( 40cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "android:attr/minSdkVersion", ResourceId(0x01010001), 41cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::AttributeBuilder() 42ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .SetTypeMask(android::ResTable_map::TYPE_STRING | 43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski android::ResTable_map::TYPE_INTEGER) 44ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .Build()) 45ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .AddSymbol( 46cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "android:attr/targetSdkVersion", ResourceId(0x01010002), 47cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::AttributeBuilder() 48ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .SetTypeMask(android::ResTable_map::TYPE_STRING | 49cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski android::ResTable_map::TYPE_INTEGER) 50ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .Build()) 51ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .AddSymbol("android:string/str", ResourceId(0x01060000)) 52ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .Build()) 53ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski .Build(); 54cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 55cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 56ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> Verify(const StringPiece& str) { 57ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski return VerifyWithOptions(str, {}); 58cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 59cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 60ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> VerifyWithOptions( 61cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski const StringPiece& str, const ManifestFixerOptions& options) { 62ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(str); 63cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixer fixer(options); 64ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski if (fixer.Consume(mContext.get(), doc.get())) { 65cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski return doc; 662ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski } 67cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski return {}; 68cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 692ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}; 702ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 712ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestIsRootTag) { 72ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_EQ(nullptr, Verify("<other-tag />")); 73ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_EQ(nullptr, Verify("<ns:manifest xmlns:ns=\"com\" />")); 74ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, Verify("<manifest package=\"android\"></manifest>")); 752ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski} 762ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 772ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestHasPackage) { 78ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, Verify("<manifest package=\"android\" />")); 79ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, Verify("<manifest package=\"com.android\" />")); 80ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, Verify("<manifest package=\"com.android.google\" />")); 81cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 82ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Verify("<manifest package=\"com.android.google.Class$1\" />")); 83ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_EQ(nullptr, Verify("<manifest " 84cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "xmlns:android=\"http://schemas.android.com/apk/" 85cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "res/android\" " 86cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "android:package=\"com.android\" />")); 87ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_EQ(nullptr, Verify("<manifest package=\"@string/str\" />")); 882ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski} 892ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 902ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) { 91cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options = {std::string("8"), std::string("22")}; 922ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 93ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 942ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 952ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski package="android"> 962ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" /> 97cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 98cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 99cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 100cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 101cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* el; 102cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr; 103cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 104ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = xml::FindRootElement(doc.get()); 105cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 106ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = el->FindChild({}, "uses-sdk"); 107cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 108ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 109cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 110cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("7", attr->value); 111ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 112cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 113cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("21", attr->value); 114cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 115ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski doc = VerifyWithOptions(R"EOF( 1162ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 1172ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski package="android"> 1182ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <uses-sdk android:targetSdkVersion="21" /> 119cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 120cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 121cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 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("8", 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 /> 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("22", attr->value); 152cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 153ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski doc = VerifyWithOptions(R"EOF( 1542ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 155cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski package="android" />)EOF", 156cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 157cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 158cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 159ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = xml::FindRootElement(doc.get()); 160cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 161ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = el->FindChild({}, "uses-sdk"); 162cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 163ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 164cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 165cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("8", attr->value); 166ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 167cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 168cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("22", attr->value); 1692ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski} 1702ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 17152364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) { 172cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options; 173ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski options.rename_manifest_package = std::string("com.android"); 17452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 175ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 17652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 17752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski package="android"> 178cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski <application android:name=".MainApplication" text="hello"> 179cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski <activity android:name=".activity.Start" /> 180cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski <receiver android:name="com.google.android.Receiver" /> 18152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski </application> 182cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 183cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 184cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 18552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 186ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* manifestEl = xml::FindRootElement(doc.get()); 187cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, manifestEl); 18852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 189cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = nullptr; 19052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 191ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = manifestEl->FindAttribute({}, "package"); 192cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 193cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("com.android"), attr->value); 19452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 195ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* applicationEl = manifestEl->FindChild({}, "application"); 196cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, applicationEl); 19752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 198ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = applicationEl->FindAttribute(xml::kSchemaAndroid, "name"); 199cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 200cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("android.MainApplication"), attr->value); 20152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 202ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = applicationEl->FindAttribute({}, "text"); 203cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 204cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("hello"), attr->value); 20552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 206cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* el; 207ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = applicationEl->FindChild({}, "activity"); 208cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 20952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 210ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "name"); 211cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 212cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("android.activity.Start"), attr->value); 21352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 214ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski el = applicationEl->FindChild({}, "receiver"); 215cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 21652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 217ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = el->FindAttribute(xml::kSchemaAndroid, "name"); 218cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 219cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value); 22052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski} 22152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 222cacb28f2d60858106e2819cc7d95a65e8bda890bAdam LesinskiTEST_F(ManifestFixerTest, 223cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski RenameManifestInstrumentationPackageAndFullyQualifyTarget) { 224cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options; 225ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski options.rename_instrumentation_target_package = std::string("com.android"); 22652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 227ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 22852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 22952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski package="android"> 23052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <instrumentation android:targetPackage="android" /> 231cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 232cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 233cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 23452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 235ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* manifest_el = xml::FindRootElement(doc.get()); 236ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ASSERT_NE(nullptr, manifest_el); 23752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 238ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* instrumentation_el = 239ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski manifest_el->FindChild({}, "instrumentation"); 240ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ASSERT_NE(nullptr, instrumentation_el); 24152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 242cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = 243ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski instrumentation_el->FindAttribute(xml::kSchemaAndroid, "targetPackage"); 244cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 245cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("com.android"), attr->value); 24652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski} 24752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 24852364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) { 249cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options; 250ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski options.version_name_default = std::string("Beta"); 251ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski options.version_code_default = std::string("0x10000000"); 25252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 253ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 25452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 255cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski package="android" />)EOF", 256cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 257cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 25852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 259ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* manifest_el = xml::FindRootElement(doc.get()); 260ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski ASSERT_NE(nullptr, manifest_el); 26152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 262cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = 263ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); 264cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 265cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("Beta"), attr->value); 26652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 267ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); 268cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 269cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("0x10000000"), attr->value); 27052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski} 27152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 2726b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) { 273cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 274ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Verify("<manifest package=\"android\" coreApp=\"hello\" />")); 275cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 276ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Verify("<manifest package=\"android\" coreApp=\"1dp\" />")); 2776b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 278cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<xml::XmlResource> doc = 279ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski Verify("<manifest package=\"android\" coreApp=\"true\" />"); 280cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 2816b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 282ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Element* el = xml::FindRootElement(doc.get()); 283cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 2846b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 285cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("manifest", el->name); 2866b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 287ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski xml::Attribute* attr = el->FindAttribute("", "coreApp"); 288cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 2896b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 290ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, attr->compiled_value); 291ce5e56e243d262a9b65459c3bd0bb9eaadd40628Adam Lesinski EXPECT_NE(nullptr, ValueCast<BinaryPrimitive>(attr->compiled_value.get())); 2926b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski} 2936b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 294cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace aapt 295