ManifestFixer_test.cpp revision cacb28f2d60858106e2819cc7d95a65e8bda890b
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#include "test/Builders.h" 192ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski#include "test/Context.h" 202ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 212ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski#include <gtest/gtest.h> 222ae4a877d1623f851040ce69239552c873f1abf0Adam 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() 31cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .setCompilationPackage("android") 32cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .setPackageId(0x01) 33cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .setNameManglerPolicy(NameManglerPolicy{"android"}) 34cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .addSymbolSource( 35cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::StaticSymbolSourceBuilder() 36cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .addSymbol( 37cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "android:attr/package", ResourceId(0x01010000), 38cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::AttributeBuilder() 39cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .setTypeMask(android::ResTable_map::TYPE_STRING) 40cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .build()) 41cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .addSymbol( 42cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "android:attr/minSdkVersion", ResourceId(0x01010001), 43cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::AttributeBuilder() 44cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .setTypeMask(android::ResTable_map::TYPE_STRING | 45cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski android::ResTable_map::TYPE_INTEGER) 46cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .build()) 47cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .addSymbol( 48cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski "android:attr/targetSdkVersion", ResourceId(0x01010002), 49cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski test::AttributeBuilder() 50cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .setTypeMask(android::ResTable_map::TYPE_STRING | 51cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski android::ResTable_map::TYPE_INTEGER) 52cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .build()) 53cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .addSymbol("android:string/str", ResourceId(0x01060000)) 54cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .build()) 55cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski .build(); 56cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 57cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 58cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<xml::XmlResource> verify(const StringPiece& str) { 59cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski return verifyWithOptions(str, {}); 60cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski } 61cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 62cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<xml::XmlResource> verifyWithOptions( 63cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski const StringPiece& str, const ManifestFixerOptions& options) { 64cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(str); 65cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixer fixer(options); 66cacb28f2d60858106e2819cc7d95a65e8bda890bAdam 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) { 74cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, verify("<other-tag />")); 75cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, verify("<ns:manifest xmlns:ns=\"com\" />")); 76cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_NE(nullptr, verify("<manifest package=\"android\"></manifest>")); 772ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski} 782ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 792ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestHasPackage) { 80cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_NE(nullptr, verify("<manifest package=\"android\" />")); 81cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_NE(nullptr, verify("<manifest package=\"com.android\" />")); 82cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_NE(nullptr, verify("<manifest package=\"com.android.google\" />")); 83cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 84cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski verify("<manifest package=\"com.android.google.Class$1\" />")); 85cacb28f2d60858106e2819cc7d95a65e8bda890bAdam 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\" />")); 89cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, verify("<manifest package=\"@string/str\" />")); 902ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski} 912ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 922ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) { 93cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options = {std::string("8"), std::string("22")}; 942ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 95cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF( 962ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 972ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski package="android"> 982ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" /> 99cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 100cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 101cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 102cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 103cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* el; 104cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr; 105cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 106cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski el = xml::findRootElement(doc.get()); 107cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 108cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski el = el->findChild({}, "uses-sdk"); 109cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 110cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion"); 111cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 112cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("7", attr->value); 113cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 114cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 115cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("21", attr->value); 116cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 117cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski doc = verifyWithOptions(R"EOF( 1182ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 1192ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski package="android"> 1202ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <uses-sdk android:targetSdkVersion="21" /> 121cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 122cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 123cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 124cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 125cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski el = xml::findRootElement(doc.get()); 126cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 127cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski el = el->findChild({}, "uses-sdk"); 128cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 129cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion"); 130cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 131cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("8", attr->value); 132cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 133cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 134cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("21", attr->value); 135cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 136cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski doc = verifyWithOptions(R"EOF( 1372ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 1382ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski package="android"> 1392ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <uses-sdk /> 140cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 141cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 142cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 143cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 144cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski el = xml::findRootElement(doc.get()); 145cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 146cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski el = el->findChild({}, "uses-sdk"); 147cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 148cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion"); 149cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 150cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("8", attr->value); 151cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 152cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 153cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("22", attr->value); 154cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 155cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski doc = verifyWithOptions(R"EOF( 1562ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 157cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski package="android" />)EOF", 158cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 159cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 160cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski 161cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski el = xml::findRootElement(doc.get()); 162cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 163cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski el = el->findChild({}, "uses-sdk"); 164cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 165cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = el->findAttribute(xml::kSchemaAndroid, "minSdkVersion"); 166cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 167cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("8", attr->value); 168cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = el->findAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 169cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 170cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("22", attr->value); 1712ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski} 1722ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski 17352364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) { 174cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options; 175cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options.renameManifestPackage = std::string("com.android"); 17652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 177cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF( 17852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 17952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski package="android"> 180cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski <application android:name=".MainApplication" text="hello"> 181cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski <activity android:name=".activity.Start" /> 182cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski <receiver android:name="com.google.android.Receiver" /> 18352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski </application> 184cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 185cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 186cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 18752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 188cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* manifestEl = xml::findRootElement(doc.get()); 189cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, manifestEl); 19052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 191cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = nullptr; 19252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 193cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = manifestEl->findAttribute({}, "package"); 194cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 195cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("com.android"), attr->value); 19652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 197cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* applicationEl = manifestEl->findChild({}, "application"); 198cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, applicationEl); 19952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 200cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = applicationEl->findAttribute(xml::kSchemaAndroid, "name"); 201cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 202cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("android.MainApplication"), attr->value); 20352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 204cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = applicationEl->findAttribute({}, "text"); 205cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 206cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("hello"), attr->value); 20752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 208cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* el; 209cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski el = applicationEl->findChild({}, "activity"); 210cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 21152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 212cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = el->findAttribute(xml::kSchemaAndroid, "name"); 213cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 214cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("android.activity.Start"), attr->value); 21552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 216cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski el = applicationEl->findChild({}, "receiver"); 217cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 21852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 219cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = el->findAttribute(xml::kSchemaAndroid, "name"); 220cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 221cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value); 22252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski} 22352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 224cacb28f2d60858106e2819cc7d95a65e8bda890bAdam LesinskiTEST_F(ManifestFixerTest, 225cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski RenameManifestInstrumentationPackageAndFullyQualifyTarget) { 226cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options; 227cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options.renameInstrumentationTargetPackage = std::string("com.android"); 22852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 229cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF( 23052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 23152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski package="android"> 23252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <instrumentation android:targetPackage="android" /> 233cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski </manifest>)EOF", 234cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 235cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 23652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 237cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* manifestEl = xml::findRootElement(doc.get()); 238cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, manifestEl); 23952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 240cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* instrumentationEl = 241cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski manifestEl->findChild({}, "instrumentation"); 242cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, instrumentationEl); 24352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 244cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = 245cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski instrumentationEl->findAttribute(xml::kSchemaAndroid, "targetPackage"); 246cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 247cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("com.android"), attr->value); 24852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski} 24952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 25052364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) { 251cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ManifestFixerOptions options; 252cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options.versionNameDefault = std::string("Beta"); 253cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options.versionCodeDefault = std::string("0x10000000"); 25452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 255cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF( 25652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski <manifest xmlns:android="http://schemas.android.com/apk/res/android" 257cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski package="android" />)EOF", 258cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski options); 259cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 26052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 261cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* manifestEl = xml::findRootElement(doc.get()); 262cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, manifestEl); 26352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 264cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = 265cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski manifestEl->findAttribute(xml::kSchemaAndroid, "versionName"); 266cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 267cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("Beta"), attr->value); 26852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 269cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski attr = manifestEl->findAttribute(xml::kSchemaAndroid, "versionCode"); 270cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 271cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(std::string("0x10000000"), attr->value); 27252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski} 27352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski 2746b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) { 275cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 276cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski verify("<manifest package=\"android\" coreApp=\"hello\" />")); 277cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ(nullptr, 278cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski verify("<manifest package=\"android\" coreApp=\"1dp\" />")); 2796b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 280cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski std::unique_ptr<xml::XmlResource> doc = 281cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski verify("<manifest package=\"android\" coreApp=\"true\" />"); 282cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, doc); 2836b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 284cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Element* el = xml::findRootElement(doc.get()); 285cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, el); 2866b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 287cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_EQ("manifest", el->name); 2886b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 289cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski xml::Attribute* attr = el->findAttribute("", "coreApp"); 290cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski ASSERT_NE(nullptr, attr); 2916b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 292cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_NE(nullptr, attr->compiledValue); 293cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski EXPECT_NE(nullptr, valueCast<BinaryPrimitive>(attr->compiledValue.get())); 2946b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski} 2956b17d2cec2cc3bd97c684b7da490e3f6eab0d980Adam Lesinski 296cacb28f2d60858106e2819cc7d95a65e8bda890bAdam Lesinski} // namespace aapt 297