ManifestFixer_test.cpp revision 2ae4a877d1623f851040ce69239552c873f1abf0
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
192ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski#include "test/Builders.h"
202ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski#include "test/Context.h"
212ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
222ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski#include <gtest/gtest.h>
232ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
242ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinskinamespace aapt {
252ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
262ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinskistruct ManifestFixerTest : public ::testing::Test {
272ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    std::unique_ptr<IAaptContext> mContext;
282ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
292ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    void SetUp() override {
302ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        mContext = test::ContextBuilder()
312ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                .setCompilationPackage(u"android")
322ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                .setPackageId(0x01)
332ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                .setNameManglerPolicy(NameManglerPolicy{ u"android" })
342ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                .setSymbolTable(test::StaticSymbolTableBuilder()
352ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                        .addSymbol(u"@android:attr/package", ResourceId(0x01010000),
362ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                   test::AttributeBuilder()
372ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                        .setTypeMask(android::ResTable_map::TYPE_STRING)
382ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                        .build())
392ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                        .addSymbol(u"@android:attr/minSdkVersion", ResourceId(0x01010001),
402ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                   test::AttributeBuilder()
412ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                        .setTypeMask(android::ResTable_map::TYPE_STRING |
422ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                                     android::ResTable_map::TYPE_INTEGER)
432ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                        .build())
442ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                        .addSymbol(u"@android:attr/targetSdkVersion", ResourceId(0x01010002),
452ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                   test::AttributeBuilder()
462ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                        .setTypeMask(android::ResTable_map::TYPE_STRING |
472ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                                     android::ResTable_map::TYPE_INTEGER)
482ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                        .build())
492ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                        .addSymbol(u"@android:string/str", ResourceId(0x01060000))
502ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                        .build())
512ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                .build();
522ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    }
532ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
542ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    std::unique_ptr<XmlResource> verify(const StringPiece& str) {
552ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        return verifyWithOptions(str, {});
562ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    }
572ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
582ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    std::unique_ptr<XmlResource> verifyWithOptions(const StringPiece& str,
592ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                                                   const ManifestFixerOptions& options) {
602ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        std::unique_ptr<XmlResource> doc = test::buildXmlDom(str);
612ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        ManifestFixer fixer(options);
622ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        if (fixer.consume(mContext.get(), doc.get())) {
632ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski            return doc;
642ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        }
652ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        return {};
662ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    }
672ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski};
682ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
692ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestIsRootTag) {
702ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(nullptr, verify("<other-tag />"));
712ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(nullptr, verify("<ns:manifest xmlns:ns=\"com\" />"));
722ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_NE(nullptr, verify("<manifest package=\"android\"></manifest>"));
732ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
742ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
752ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, EnsureManifestHasPackage) {
762ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_NE(nullptr, verify("<manifest package=\"android\" />"));
772ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_NE(nullptr, verify("<manifest package=\"com.android\" />"));
782ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_NE(nullptr, verify("<manifest package=\"com.android.google\" />"));
792ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(nullptr, verify("<manifest package=\"com.android.google.Class$1\" />"));
802ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(nullptr,
812ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski              verify("<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" "
822ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                     "android:package=\"com.android\" />"));
832ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(nullptr, verify("<manifest package=\"@string/str\" />"));
842ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
852ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
862ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
872ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
882ae4a877d1623f851040ce69239552c873f1abf0Adam LesinskiTEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) {
892ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ManifestFixerOptions options = { std::u16string(u"8"), std::u16string(u"22") };
902ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
912ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    std::unique_ptr<XmlResource> doc = verifyWithOptions(R"EOF(
922ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
932ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
942ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
952ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      </manifest>)EOF", options);
962ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, doc);
972ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
982ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    xml::Element* el;
992ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    xml::Attribute* attr;
1002ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
1012ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    el = xml::findRootElement(doc->root.get());
1022ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1032ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    el = el->findChild({}, u"uses-sdk");
1042ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1052ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion");
1062ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1072ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"7", attr->value);
1082ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion");
1092ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1102ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"21", attr->value);
1112ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
1122ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    doc = verifyWithOptions(R"EOF(
1132ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1142ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1152ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk android:targetSdkVersion="21" />
1162ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      </manifest>)EOF", options);
1172ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, doc);
1182ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
1192ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    el = xml::findRootElement(doc->root.get());
1202ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1212ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    el = el->findChild({}, u"uses-sdk");
1222ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1232ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion");
1242ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1252ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"8", attr->value);
1262ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion");
1272ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1282ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"21", attr->value);
1292ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
1302ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    doc = verifyWithOptions(R"EOF(
1312ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1322ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android">
1332ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski        <uses-sdk />
1342ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      </manifest>)EOF", options);
1352ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, doc);
1362ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
1372ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    el = xml::findRootElement(doc->root.get());
1382ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1392ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    el = el->findChild({}, u"uses-sdk");
1402ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1412ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion");
1422ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1432ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"8", attr->value);
1442ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion");
1452ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1462ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"22", attr->value);
1472ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
1482ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    doc = verifyWithOptions(R"EOF(
1492ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
1502ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski                package="android" />)EOF", options);
1512ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, doc);
1522ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
1532ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    el = xml::findRootElement(doc->root.get());
1542ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1552ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    el = el->findChild({}, u"uses-sdk");
1562ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, el);
1572ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion");
1582ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1592ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"8", attr->value);
1602ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion");
1612ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    ASSERT_NE(nullptr, attr);
1622ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski    EXPECT_EQ(u"22", attr->value);
1632ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski}
1642ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski
1652ae4a877d1623f851040ce69239552c873f1abf0Adam Lesinski} // namespace aapt
166