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 {
262ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    std::unique_ptr<IAaptContext> mContext;
272ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
282ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    void SetUp() override {
292ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        mContext = test::ContextBuilder()
302ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                .setCompilationPackage(u"android")
312ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                .setPackageId(0x01)
322ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                .setNameManglerPolicy(NameManglerPolicy{ u"android" })
3364587af8179affd38ee26543b748f2d63b7f67bbAdam Lesinski                .addSymbolSource(test::StaticSymbolSourceBuilder()
342ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                        .addSymbol(u"@android:attr/package", ResourceId(0x01010000),
352ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                   test::AttributeBuilder()
362ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                        .setTypeMask(android::ResTable_map::TYPE_STRING)
372ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                        .build())
382ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                        .addSymbol(u"@android:attr/minSdkVersion", ResourceId(0x01010001),
392ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                   test::AttributeBuilder()
402ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                        .setTypeMask(android::ResTable_map::TYPE_STRING |
412ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                                     android::ResTable_map::TYPE_INTEGER)
422ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                        .build())
432ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                        .addSymbol(u"@android:attr/targetSdkVersion", ResourceId(0x01010002),
442ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                   test::AttributeBuilder()
452ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                        .setTypeMask(android::ResTable_map::TYPE_STRING |
462ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                                     android::ResTable_map::TYPE_INTEGER)
472ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                        .build())
482ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                        .addSymbol(u"@android:string/str", ResourceId(0x01060000))
492ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                        .build())
502ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                .build();
512ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    }
522ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
53467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    std::unique_ptr<xml::XmlResource> verify(const StringPiece& str) {
542ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        return verifyWithOptions(str, {});
552ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    }
562ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
57467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    std::unique_ptr<xml::XmlResource> verifyWithOptions(const StringPiece& str,
58467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski                                                        const ManifestFixerOptions& options) {
59467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski        std::unique_ptr<xml::XmlResource> doc = test::buildXmlDom(str);
602ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        ManifestFixer fixer(options);
612ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        if (fixer.consume(mContext.get(), doc.get())) {
622ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski            return doc;
632ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        }
642ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        return {};
652ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    }
662ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski};
672ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
682ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestIsRootTag) {
692ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(nullptr, verify("<other-tag />"));
702ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(nullptr, verify("<ns:manifest xmlns:ns=\"com\" />"));
712ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_NE(nullptr, verify("<manifest package=\"android\"></manifest>"));
722ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
732ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
742ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestHasPackage) {
752ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_NE(nullptr, verify("<manifest package=\"android\" />"));
762ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_NE(nullptr, verify("<manifest package=\"com.android\" />"));
772ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_NE(nullptr, verify("<manifest package=\"com.android.google\" />"));
782ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(nullptr, verify("<manifest package=\"com.android.google.Class$1\" />"));
792ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(nullptr,
802ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski              verify("<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" "
812ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                     "android:package=\"com.android\" />"));
822ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(nullptr, verify("<manifest package=\"@string/str\" />"));
832ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
842ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
852ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) {
862ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ManifestFixerOptions options = { std::u16string(u"8"), std::u16string(u"22") };
872ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
88467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
892ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
902ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
912ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
922ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      </manifest>)EOF", options);
932ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, doc);
942ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
952ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    xml::Element* el;
962ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    xml::Attribute* attr;
972ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
9852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    el = xml::findRootElement(doc.get());
992ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1002ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    el = el->findChild({}, u"uses-sdk");
1012ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1022ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion");
1032ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1042ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"7", attr->value);
1052ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion");
1062ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1072ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"21", attr->value);
1082ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
1092ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    doc = verifyWithOptions(R"EOF(
1102ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1112ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1122ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk android:targetSdkVersion="21" />
1132ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      </manifest>)EOF", options);
1142ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, doc);
1152ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
11652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    el = xml::findRootElement(doc.get());
1172ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1182ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    el = el->findChild({}, u"uses-sdk");
1192ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1202ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion");
1212ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1222ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"8", attr->value);
1232ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion");
1242ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1252ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"21", attr->value);
1262ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
1272ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    doc = verifyWithOptions(R"EOF(
1282ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1292ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1302ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk />
1312ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      </manifest>)EOF", options);
1322ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, doc);
1332ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
13452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    el = xml::findRootElement(doc.get());
1352ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1362ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    el = el->findChild({}, u"uses-sdk");
1372ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1382ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion");
1392ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1402ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"8", attr->value);
1412ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion");
1422ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1432ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"22", attr->value);
1442ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
1452ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    doc = verifyWithOptions(R"EOF(
1462ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1472ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android" />)EOF", options);
1482ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, doc);
1492ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
15052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    el = xml::findRootElement(doc.get());
1512ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1522ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    el = el->findChild({}, u"uses-sdk");
1532ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1542ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion");
1552ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1562ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"8", attr->value);
1572ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion");
1582ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1592ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"22", attr->value);
1602ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
1612ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
16252364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, RenameManifestPackageAndFullyQualifyClasses) {
16352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ManifestFixerOptions options;
16452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    options.renameManifestPackage = std::u16string(u"com.android");
16552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
16652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
16752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
16852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android">
169cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski        <application android:name=".MainApplication" text="hello">
170cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski          <activity android:name=".activity.Start" />
171cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski          <receiver android:name="com.google.android.Receiver" />
17252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        </application>
17352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      </manifest>)EOF", options);
17452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, doc);
17552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
17652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    xml::Element* manifestEl = xml::findRootElement(doc.get());
17752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, manifestEl);
17852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
17952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    xml::Attribute* attr = nullptr;
18052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
18152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    attr = manifestEl->findAttribute({}, u"package");
18252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, attr);
18352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    EXPECT_EQ(std::u16string(u"com.android"), attr->value);
18452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
18552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    xml::Element* applicationEl = manifestEl->findChild({}, u"application");
18652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, applicationEl);
18752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
188cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    attr = applicationEl->findAttribute(xml::kSchemaAndroid, u"name");
18952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, attr);
19052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    EXPECT_EQ(std::u16string(u"android.MainApplication"), attr->value);
19152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
19252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    attr = applicationEl->findAttribute({}, u"text");
19352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, attr);
19452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    EXPECT_EQ(std::u16string(u"hello"), attr->value);
19552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
19652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    xml::Element* el;
19752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    el = applicationEl->findChild({}, u"activity");
19852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, el);
19952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
200cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"name");
20152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, el);
20252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    EXPECT_EQ(std::u16string(u"android.activity.Start"), attr->value);
20352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
20452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    el = applicationEl->findChild({}, u"receiver");
20552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, el);
20652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
207cc5609d8e484ec82ef1dced793af7f674f059b1cAdam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"name");
20852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, el);
20952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    EXPECT_EQ(std::u16string(u"com.google.android.Receiver"), attr->value);
21052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
21152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
21252364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, RenameManifestInstrumentationPackageAndFullyQualifyTarget) {
21352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ManifestFixerOptions options;
21452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    options.renameInstrumentationTargetPackage = std::u16string(u"com.android");
21552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
21652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
21752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
21852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android">
21952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski        <instrumentation android:targetPackage="android" />
22052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      </manifest>)EOF", options);
22152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, doc);
22252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
22352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    xml::Element* manifestEl = xml::findRootElement(doc.get());
22452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, manifestEl);
22552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
22652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    xml::Element* instrumentationEl = manifestEl->findChild({}, u"instrumentation");
22752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, instrumentationEl);
22852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
22952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    xml::Attribute* attr = instrumentationEl->findAttribute(xml::kSchemaAndroid, u"targetPackage");
23052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, attr);
23152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    EXPECT_EQ(std::u16string(u"com.android"), attr->value);
23252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
23352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
23452364f7ae31716d7827ea8f8566f4a28bd30a921Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultVersionNameAndCode) {
23552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ManifestFixerOptions options;
23652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    options.versionNameDefault = std::u16string(u"Beta");
23752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    options.versionCodeDefault = std::u16string(u"0x10000000");
23852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
23952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    std::unique_ptr<xml::XmlResource> doc = verifyWithOptions(R"EOF(
24052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
24152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski                package="android" />)EOF", options);
24252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, doc);
24352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
24452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    xml::Element* manifestEl = xml::findRootElement(doc.get());
24552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, manifestEl);
24652364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
24752364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    xml::Attribute* attr = manifestEl->findAttribute(xml::kSchemaAndroid, u"versionName");
24852364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, attr);
24952364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    EXPECT_EQ(std::u16string(u"Beta"), attr->value);
25052364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
25152364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    attr = manifestEl->findAttribute(xml::kSchemaAndroid, u"versionCode");
25252364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    ASSERT_NE(nullptr, attr);
25352364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski    EXPECT_EQ(std::u16string(u"0x10000000"), attr->value);
25452364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski}
25552364f7ae31716d7827ea8f8566f4a28bd30a921Adam Lesinski
2562ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski} // namespace aapt
257