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