ManifestFixer_test.cpp revision 5119e517308b84011fbd4d1a013296f4f5ffb8e4
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/* 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Copyright (C) 2015 The Android Open Source Project 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * Licensed under the Apache License, Version 2.0 (the "License"); 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * you may not use this file except in compliance with the License. 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * You may obtain a copy of the License at 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * http://www.apache.org/licenses/LICENSE-2.0 9cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao * 10d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao * Unless required by applicable law or agreed to in writing, software 1187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines * See the License for the specific language governing permissions and 14cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao * limitations under the License. 15d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao */ 1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include "link/ManifestFixer.h" 1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include "test/Test.h" 20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace aapt { 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 23b0d0eb206527b43c771933602e147bbd7b471082Stephen Hinesstruct ManifestFixerTest : public ::testing::Test { 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines std::unique_ptr<IAaptContext> mContext; 2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines void SetUp() override { 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines mContext = 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines test::ContextBuilder() 2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines .SetCompilationPackage("android") 3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines .SetPackageId(0x01) 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines .SetNameManglerPolicy(NameManglerPolicy{"android"}) 32b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines .AddSymbolSource( 33b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines test::StaticSymbolSourceBuilder() 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines .AddSymbol( 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines "android:attr/package", ResourceId(0x01010000), 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines test::AttributeBuilder() 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines .SetTypeMask(android::ResTable_map::TYPE_STRING) 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines .Build()) 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines .AddSymbol( 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines "android:attr/minSdkVersion", ResourceId(0x01010001), 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines test::AttributeBuilder() 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao .SetTypeMask(android::ResTable_map::TYPE_STRING | 430dea6bc96bb52346737966839ac68644f7939f58Stephen Hines android::ResTable_map::TYPE_INTEGER) 440dea6bc96bb52346737966839ac68644f7939f58Stephen Hines .Build()) 450dea6bc96bb52346737966839ac68644f7939f58Stephen Hines .AddSymbol( 460dea6bc96bb52346737966839ac68644f7939f58Stephen Hines "android:attr/targetSdkVersion", ResourceId(0x01010002), 4737b74a387bb3993387029859c2d9d051c41c724eStephen Hines test::AttributeBuilder() 480dea6bc96bb52346737966839ac68644f7939f58Stephen Hines .SetTypeMask(android::ResTable_map::TYPE_STRING | 490dea6bc96bb52346737966839ac68644f7939f58Stephen Hines android::ResTable_map::TYPE_INTEGER) 50b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines .Build()) 510dea6bc96bb52346737966839ac68644f7939f58Stephen Hines .AddSymbol("android:string/str", ResourceId(0x01060000)) 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines .Build()) 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao .Build(); 54b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines } 55b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 56b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines std::unique_ptr<xml::XmlResource> Verify(const StringPiece& str) { 57b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines return VerifyWithOptions(str, {}); 58b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines } 59b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 60b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines std::unique_ptr<xml::XmlResource> VerifyWithOptions( 61b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines const StringPiece& str, const ManifestFixerOptions& options) { 62b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(str); 63b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines ManifestFixer fixer(options); 64b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines if (fixer.Consume(mContext.get(), doc.get())) { 65b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines return doc; 66b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines } 67b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines return {}; 68b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines } 69b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines}; 70b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 71b0d0eb206527b43c771933602e147bbd7b471082Stephen HinesTEST_F(ManifestFixerTest, EnsureManifestIsRootTag) { 72b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines EXPECT_EQ(nullptr, Verify("<other-tag />")); 73b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines EXPECT_EQ(nullptr, Verify("<ns:manifest xmlns:ns=\"com\" />")); 74b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines EXPECT_NE(nullptr, Verify("<manifest package=\"android\"></manifest>")); 75b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines} 76b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 77b0d0eb206527b43c771933602e147bbd7b471082Stephen HinesTEST_F(ManifestFixerTest, EnsureManifestHasPackage) { 78b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines EXPECT_NE(nullptr, Verify("<manifest package=\"android\" />")); 79b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines EXPECT_NE(nullptr, Verify("<manifest package=\"com.android\" />")); 80b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines EXPECT_NE(nullptr, Verify("<manifest package=\"com.android.google\" />")); 81b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines EXPECT_EQ(nullptr, 82b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines Verify("<manifest package=\"com.android.google.Class$1\" />")); 83b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines EXPECT_EQ(nullptr, Verify("<manifest " 84b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines "xmlns:android=\"http://schemas.android.com/apk/" 85b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines "res/android\" " 86b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines "android:package=\"com.android\" />")); 87b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines EXPECT_EQ(nullptr, Verify("<manifest package=\"@string/str\" />")); 88b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines} 89b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 90b0d0eb206527b43c771933602e147bbd7b471082Stephen HinesTEST_F(ManifestFixerTest, AllowMetaData) { 91b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines auto doc = Verify(R"EOF( 92b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines <manifest xmlns:android="http://schemas.android.com/apk/res/android" 93b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines package="android"> 94b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines <meta-data /> 95b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines <application> 96b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines <meta-data /> 97b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines <activity android:name=".Hi"><meta-data /></activity> 98b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines <activity-alias android:name=".Ho"><meta-data /></activity-alias> 99b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines <receiver android:name=".OffToWork"><meta-data /></receiver> 100b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines <provider android:name=".We"><meta-data /></provider> 101b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines <service android:name=".Go"><meta-data /></service> 102b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines </application> 103b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines </manifest>)EOF"); 104b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines ASSERT_NE(nullptr, doc); 105b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines} 106b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 107b0d0eb206527b43c771933602e147bbd7b471082Stephen HinesTEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) { 108b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines ManifestFixerOptions options = {std::string("8"), std::string("22")}; 109b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 110b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 111b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines <manifest xmlns:android="http://schemas.android.com/apk/res/android" 112b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines package="android"> 113b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" /> 114b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines </manifest>)EOF", 115b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines options); 116b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines ASSERT_NE(nullptr, doc); 117b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines 118b0d0eb206527b43c771933602e147bbd7b471082Stephen Hines xml::Element* el; 119cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao xml::Attribute* attr; 120cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 121cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao el = xml::FindRootElement(doc.get()); 122d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ASSERT_NE(nullptr, el); 12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines el = el->FindChild({}, "uses-sdk"); 12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, el); 12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, attr); 12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines EXPECT_EQ("7", attr->value); 12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 12937b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, attr); 13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines EXPECT_EQ("21", attr->value); 13137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 13237b74a387bb3993387029859c2d9d051c41c724eStephen Hines doc = VerifyWithOptions(R"EOF( 13337b74a387bb3993387029859c2d9d051c41c724eStephen Hines <manifest xmlns:android="http://schemas.android.com/apk/res/android" 13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines package="android"> 13537b74a387bb3993387029859c2d9d051c41c724eStephen Hines <uses-sdk android:targetSdkVersion="21" /> 13637b74a387bb3993387029859c2d9d051c41c724eStephen Hines </manifest>)EOF", 13737b74a387bb3993387029859c2d9d051c41c724eStephen Hines options); 13837b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, doc); 13937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 140d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao el = xml::FindRootElement(doc.get()); 14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ASSERT_NE(nullptr, el); 14222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao el = el->FindChild({}, "uses-sdk"); 14322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ASSERT_NE(nullptr, el); 14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ASSERT_NE(nullptr, attr); 14687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines EXPECT_EQ("8", attr->value); 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_NE(nullptr, attr); 14937b74a387bb3993387029859c2d9d051c41c724eStephen Hines EXPECT_EQ("21", attr->value); 15037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 15137b74a387bb3993387029859c2d9d051c41c724eStephen Hines doc = VerifyWithOptions(R"EOF( 15237b74a387bb3993387029859c2d9d051c41c724eStephen Hines <manifest xmlns:android="http://schemas.android.com/apk/res/android" 15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines package="android"> 15437b74a387bb3993387029859c2d9d051c41c724eStephen Hines <uses-sdk /> 15537b74a387bb3993387029859c2d9d051c41c724eStephen Hines </manifest>)EOF", 15637b74a387bb3993387029859c2d9d051c41c724eStephen Hines options); 15737b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, doc); 15837b74a387bb3993387029859c2d9d051c41c724eStephen Hines 15937b74a387bb3993387029859c2d9d051c41c724eStephen Hines el = xml::FindRootElement(doc.get()); 16037b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, el); 16137b74a387bb3993387029859c2d9d051c41c724eStephen Hines el = el->FindChild({}, "uses-sdk"); 16237b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, el); 16337b74a387bb3993387029859c2d9d051c41c724eStephen Hines attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 16437b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, attr); 16537b74a387bb3993387029859c2d9d051c41c724eStephen Hines EXPECT_EQ("8", attr->value); 16637b74a387bb3993387029859c2d9d051c41c724eStephen Hines attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 16737b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, attr); 16837b74a387bb3993387029859c2d9d051c41c724eStephen Hines EXPECT_EQ("22", attr->value); 16922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines doc = VerifyWithOptions(R"EOF( 17187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines <manifest xmlns:android="http://schemas.android.com/apk/res/android" 17287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines package="android" />)EOF", 17387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines options); 17422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ASSERT_NE(nullptr, doc); 17522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 17622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao el = xml::FindRootElement(doc.get()); 17722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ASSERT_NE(nullptr, el); 17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao el = el->FindChild({}, "uses-sdk"); 17922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ASSERT_NE(nullptr, el); 18022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao attr = el->FindAttribute(xml::kSchemaAndroid, "minSdkVersion"); 18122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ASSERT_NE(nullptr, attr); 18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao EXPECT_EQ("8", attr->value); 18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao attr = el->FindAttribute(xml::kSchemaAndroid, "targetSdkVersion"); 18422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ASSERT_NE(nullptr, attr); 18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao EXPECT_EQ("22", attr->value); 18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao} 18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoTEST_F(ManifestFixerTest, UsesSdkMustComeBeforeApplication) { 189d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ManifestFixerOptions options = {std::string("8"), std::string("22")}; 19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 19122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao <manifest xmlns:android="http://schemas.android.com/apk/res/android" 19222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao package="android"> 193d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao <application android:name=".MainApplication" /> 19422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao </manifest>)EOF", 19522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao options); 19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ASSERT_NE(nullptr, doc); 19737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao xml::Element* manifest_el = xml::FindRootElement(doc.get()); 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_NE(nullptr, manifest_el); 200f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines ASSERT_EQ("manifest", manifest_el->name); 20137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 20237b74a387bb3993387029859c2d9d051c41c724eStephen Hines xml::Element* application_el = manifest_el->FindChild("", "application"); 20337b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, application_el); 20437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 20537b74a387bb3993387029859c2d9d051c41c724eStephen Hines xml::Element* uses_sdk_el = manifest_el->FindChild("", "uses-sdk"); 20637b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, uses_sdk_el); 20737b74a387bb3993387029859c2d9d051c41c724eStephen Hines 20837b74a387bb3993387029859c2d9d051c41c724eStephen Hines // Check that the uses_sdk_el comes before application_el in the children 20937b74a387bb3993387029859c2d9d051c41c724eStephen Hines // vector. 21037b74a387bb3993387029859c2d9d051c41c724eStephen Hines // Since there are no namespaces here, these children are direct descendants 211f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines // of manifest. 21237b74a387bb3993387029859c2d9d051c41c724eStephen Hines auto uses_sdk_iter = 2136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines std::find_if(manifest_el->children.begin(), manifest_el->children.end(), 21437b74a387bb3993387029859c2d9d051c41c724eStephen Hines [&](const std::unique_ptr<xml::Node>& child) { 21537b74a387bb3993387029859c2d9d051c41c724eStephen Hines return child.get() == uses_sdk_el; 21637b74a387bb3993387029859c2d9d051c41c724eStephen Hines }); 2176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 21837b74a387bb3993387029859c2d9d051c41c724eStephen Hines auto application_iter = 21937b74a387bb3993387029859c2d9d051c41c724eStephen Hines std::find_if(manifest_el->children.begin(), manifest_el->children.end(), 22037b74a387bb3993387029859c2d9d051c41c724eStephen Hines [&](const std::unique_ptr<xml::Node>& child) { 22137b74a387bb3993387029859c2d9d051c41c724eStephen Hines return child.get() == application_el; 22237b74a387bb3993387029859c2d9d051c41c724eStephen Hines }); 22337b74a387bb3993387029859c2d9d051c41c724eStephen Hines 22437b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(manifest_el->children.end(), uses_sdk_iter); 22537b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(manifest_el->children.end(), application_iter); 22637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 22737b74a387bb3993387029859c2d9d051c41c724eStephen Hines // The distance should be positive, meaning uses_sdk_iter comes before 22837b74a387bb3993387029859c2d9d051c41c724eStephen Hines // application_iter. 22937b74a387bb3993387029859c2d9d051c41c724eStephen Hines EXPECT_GT(std::distance(uses_sdk_iter, application_iter), 0); 23037b74a387bb3993387029859c2d9d051c41c724eStephen Hines} 23137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 23237b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) { 23337b74a387bb3993387029859c2d9d051c41c724eStephen Hines ManifestFixerOptions options; 23437b74a387bb3993387029859c2d9d051c41c724eStephen Hines options.rename_manifest_package = std::string("com.android"); 23537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 23637b74a387bb3993387029859c2d9d051c41c724eStephen Hines std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 2376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines <manifest xmlns:android="http://schemas.android.com/apk/res/android" 23837b74a387bb3993387029859c2d9d051c41c724eStephen Hines package="android"> 239f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines <application android:name=".MainApplication" text="hello"> 24037b74a387bb3993387029859c2d9d051c41c724eStephen Hines <activity android:name=".activity.Start" /> 241f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines <receiver android:name="com.google.android.Receiver" /> 2426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines </application> 2436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines </manifest>)EOF", 24437b74a387bb3993387029859c2d9d051c41c724eStephen Hines options); 24537b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, doc); 24637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 24737b74a387bb3993387029859c2d9d051c41c724eStephen Hines xml::Element* manifestEl = xml::FindRootElement(doc.get()); 24837b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, manifestEl); 24937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 25037b74a387bb3993387029859c2d9d051c41c724eStephen Hines xml::Attribute* attr = nullptr; 25137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 25237b74a387bb3993387029859c2d9d051c41c724eStephen Hines attr = manifestEl->FindAttribute({}, "package"); 25337b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, attr); 25437b74a387bb3993387029859c2d9d051c41c724eStephen Hines EXPECT_EQ(std::string("com.android"), attr->value); 25537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 25637b74a387bb3993387029859c2d9d051c41c724eStephen Hines xml::Element* applicationEl = manifestEl->FindChild({}, "application"); 25737b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, applicationEl); 25837b74a387bb3993387029859c2d9d051c41c724eStephen Hines 25937b74a387bb3993387029859c2d9d051c41c724eStephen Hines attr = applicationEl->FindAttribute(xml::kSchemaAndroid, "name"); 26037b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, attr); 26137b74a387bb3993387029859c2d9d051c41c724eStephen Hines EXPECT_EQ(std::string("android.MainApplication"), attr->value); 26237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 2636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines attr = applicationEl->FindAttribute({}, "text"); 2645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_NE(nullptr, attr); 2655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao EXPECT_EQ(std::string("hello"), attr->value); 26637b74a387bb3993387029859c2d9d051c41c724eStephen Hines 26737b74a387bb3993387029859c2d9d051c41c724eStephen Hines xml::Element* el; 268f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines el = applicationEl->FindChild({}, "activity"); 269d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ASSERT_NE(nullptr, el); 270d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 271d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao attr = el->FindAttribute(xml::kSchemaAndroid, "name"); 272d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao ASSERT_NE(nullptr, el); 27337b74a387bb3993387029859c2d9d051c41c724eStephen Hines EXPECT_EQ(std::string("android.activity.Start"), attr->value); 27437b74a387bb3993387029859c2d9d051c41c724eStephen Hines 2750dea6bc96bb52346737966839ac68644f7939f58Stephen Hines el = applicationEl->FindChild({}, "receiver"); 2760dea6bc96bb52346737966839ac68644f7939f58Stephen Hines ASSERT_NE(nullptr, el); 2770dea6bc96bb52346737966839ac68644f7939f58Stephen Hines 27837b74a387bb3993387029859c2d9d051c41c724eStephen Hines attr = el->FindAttribute(xml::kSchemaAndroid, "name"); 27937b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, el); 280d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao EXPECT_EQ(std::string("com.google.android.Receiver"), attr->value); 281d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao} 282d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao 28337b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(ManifestFixerTest, 2846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines RenameManifestInstrumentationPackageAndFullyQualifyTarget) { 28537b74a387bb3993387029859c2d9d051c41c724eStephen Hines ManifestFixerOptions options; 2866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines options.rename_instrumentation_target_package = std::string("com.android"); 2876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 28887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 28987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines <manifest xmlns:android="http://schemas.android.com/apk/res/android" 29087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines package="android"> 29122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao <instrumentation android:targetPackage="android" /> 29222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao </manifest>)EOF", 29322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao options); 29437b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, doc); 29537b74a387bb3993387029859c2d9d051c41c724eStephen Hines 29622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao xml::Element* manifest_el = xml::FindRootElement(doc.get()); 2976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ASSERT_NE(nullptr, manifest_el); 29822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 29922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao xml::Element* instrumentation_el = 30022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao manifest_el->FindChild({}, "instrumentation"); 30122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ASSERT_NE(nullptr, instrumentation_el); 30222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 30322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao xml::Attribute* attr = 304d0fbbb227051be16931a1aa9b4a7722ac039c698Shih-wei Liao instrumentation_el->FindAttribute(xml::kSchemaAndroid, "targetPackage"); 30522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ASSERT_NE(nullptr, attr); 3066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines EXPECT_EQ(std::string("com.android"), attr->value); 30737b74a387bb3993387029859c2d9d051c41c724eStephen Hines} 30837b74a387bb3993387029859c2d9d051c41c724eStephen Hines 30937b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) { 31037b74a387bb3993387029859c2d9d051c41c724eStephen Hines ManifestFixerOptions options; 31137b74a387bb3993387029859c2d9d051c41c724eStephen Hines options.version_name_default = std::string("Beta"); 3126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines options.version_code_default = std::string("0x10000000"); 31322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 31422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao std::unique_ptr<xml::XmlResource> doc = VerifyWithOptions(R"EOF( 3156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines <manifest xmlns:android="http://schemas.android.com/apk/res/android" 31637b74a387bb3993387029859c2d9d051c41c724eStephen Hines package="android" />)EOF", 31737b74a387bb3993387029859c2d9d051c41c724eStephen Hines options); 31837b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, doc); 31937b74a387bb3993387029859c2d9d051c41c724eStephen Hines 32037b74a387bb3993387029859c2d9d051c41c724eStephen Hines xml::Element* manifest_el = xml::FindRootElement(doc.get()); 3216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines ASSERT_NE(nullptr, manifest_el); 3225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao xml::Attribute* attr = 3245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao manifest_el->FindAttribute(xml::kSchemaAndroid, "versionName"); 32537b74a387bb3993387029859c2d9d051c41c724eStephen Hines ASSERT_NE(nullptr, attr); 32637b74a387bb3993387029859c2d9d051c41c724eStephen Hines EXPECT_EQ(std::string("Beta"), attr->value); 3275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao attr = manifest_el->FindAttribute(xml::kSchemaAndroid, "versionCode"); 3295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_NE(nullptr, attr); 3305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao EXPECT_EQ(std::string("0x10000000"), attr->value); 3315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 33237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 3335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F(ManifestFixerTest, EnsureManifestAttributesAreTyped) { 3345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao EXPECT_EQ(nullptr, 3355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Verify("<manifest package=\"android\" coreApp=\"hello\" />")); 3365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao EXPECT_EQ(nullptr, 3375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Verify("<manifest package=\"android\" coreApp=\"1dp\" />")); 3385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::unique_ptr<xml::XmlResource> doc = 34037b74a387bb3993387029859c2d9d051c41c724eStephen Hines Verify("<manifest package=\"android\" coreApp=\"true\" />"); 34122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ASSERT_NE(nullptr, doc); 3425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao xml::Element* el = xml::FindRootElement(doc.get()); 3445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_NE(nullptr, el); 3455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao EXPECT_EQ("manifest", el->name); 3475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao xml::Attribute* attr = el->FindAttribute("", "coreApp"); 3495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_NE(nullptr, attr); 3505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao EXPECT_NE(nullptr, attr->compiled_value); 35237b74a387bb3993387029859c2d9d051c41c724eStephen Hines EXPECT_NE(nullptr, ValueCast<BinaryPrimitive>(attr->compiled_value.get())); 35337b74a387bb3993387029859c2d9d051c41c724eStephen Hines} 3545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 3555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace aapt 3565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao