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