ManifestFixer_test.cpp revision 2ae4a877d1623f851040ce69239552c873f1abf0
1/* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "link/ManifestFixer.h" 18 19#include "test/Builders.h" 20#include "test/Context.h" 21 22#include <gtest/gtest.h> 23 24namespace aapt { 25 26struct ManifestFixerTest : public ::testing::Test { 27 std::unique_ptr<IAaptContext> mContext; 28 29 void SetUp() override { 30 mContext = test::ContextBuilder() 31 .setCompilationPackage(u"android") 32 .setPackageId(0x01) 33 .setNameManglerPolicy(NameManglerPolicy{ u"android" }) 34 .setSymbolTable(test::StaticSymbolTableBuilder() 35 .addSymbol(u"@android:attr/package", ResourceId(0x01010000), 36 test::AttributeBuilder() 37 .setTypeMask(android::ResTable_map::TYPE_STRING) 38 .build()) 39 .addSymbol(u"@android:attr/minSdkVersion", ResourceId(0x01010001), 40 test::AttributeBuilder() 41 .setTypeMask(android::ResTable_map::TYPE_STRING | 42 android::ResTable_map::TYPE_INTEGER) 43 .build()) 44 .addSymbol(u"@android:attr/targetSdkVersion", ResourceId(0x01010002), 45 test::AttributeBuilder() 46 .setTypeMask(android::ResTable_map::TYPE_STRING | 47 android::ResTable_map::TYPE_INTEGER) 48 .build()) 49 .addSymbol(u"@android:string/str", ResourceId(0x01060000)) 50 .build()) 51 .build(); 52 } 53 54 std::unique_ptr<XmlResource> verify(const StringPiece& str) { 55 return verifyWithOptions(str, {}); 56 } 57 58 std::unique_ptr<XmlResource> verifyWithOptions(const StringPiece& str, 59 const ManifestFixerOptions& options) { 60 std::unique_ptr<XmlResource> doc = test::buildXmlDom(str); 61 ManifestFixer fixer(options); 62 if (fixer.consume(mContext.get(), doc.get())) { 63 return doc; 64 } 65 return {}; 66 } 67}; 68 69TEST_F(ManifestFixerTest, EnsureManifestIsRootTag) { 70 EXPECT_EQ(nullptr, verify("<other-tag />")); 71 EXPECT_EQ(nullptr, verify("<ns:manifest xmlns:ns=\"com\" />")); 72 EXPECT_NE(nullptr, verify("<manifest package=\"android\"></manifest>")); 73} 74 75TEST_F(ManifestFixerTest, EnsureManifestHasPackage) { 76 EXPECT_NE(nullptr, verify("<manifest package=\"android\" />")); 77 EXPECT_NE(nullptr, verify("<manifest package=\"com.android\" />")); 78 EXPECT_NE(nullptr, verify("<manifest package=\"com.android.google\" />")); 79 EXPECT_EQ(nullptr, verify("<manifest package=\"com.android.google.Class$1\" />")); 80 EXPECT_EQ(nullptr, 81 verify("<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" " 82 "android:package=\"com.android\" />")); 83 EXPECT_EQ(nullptr, verify("<manifest package=\"@string/str\" />")); 84} 85 86 87 88TEST_F(ManifestFixerTest, UseDefaultSdkVersionsIfNonePresent) { 89 ManifestFixerOptions options = { std::u16string(u"8"), std::u16string(u"22") }; 90 91 std::unique_ptr<XmlResource> doc = verifyWithOptions(R"EOF( 92 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 93 package="android"> 94 <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" /> 95 </manifest>)EOF", options); 96 ASSERT_NE(nullptr, doc); 97 98 xml::Element* el; 99 xml::Attribute* attr; 100 101 el = xml::findRootElement(doc->root.get()); 102 ASSERT_NE(nullptr, el); 103 el = el->findChild({}, u"uses-sdk"); 104 ASSERT_NE(nullptr, el); 105 attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion"); 106 ASSERT_NE(nullptr, attr); 107 EXPECT_EQ(u"7", attr->value); 108 attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion"); 109 ASSERT_NE(nullptr, attr); 110 EXPECT_EQ(u"21", attr->value); 111 112 doc = verifyWithOptions(R"EOF( 113 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 114 package="android"> 115 <uses-sdk android:targetSdkVersion="21" /> 116 </manifest>)EOF", options); 117 ASSERT_NE(nullptr, doc); 118 119 el = xml::findRootElement(doc->root.get()); 120 ASSERT_NE(nullptr, el); 121 el = el->findChild({}, u"uses-sdk"); 122 ASSERT_NE(nullptr, el); 123 attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion"); 124 ASSERT_NE(nullptr, attr); 125 EXPECT_EQ(u"8", attr->value); 126 attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion"); 127 ASSERT_NE(nullptr, attr); 128 EXPECT_EQ(u"21", attr->value); 129 130 doc = verifyWithOptions(R"EOF( 131 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 132 package="android"> 133 <uses-sdk /> 134 </manifest>)EOF", options); 135 ASSERT_NE(nullptr, doc); 136 137 el = xml::findRootElement(doc->root.get()); 138 ASSERT_NE(nullptr, el); 139 el = el->findChild({}, u"uses-sdk"); 140 ASSERT_NE(nullptr, el); 141 attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion"); 142 ASSERT_NE(nullptr, attr); 143 EXPECT_EQ(u"8", attr->value); 144 attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion"); 145 ASSERT_NE(nullptr, attr); 146 EXPECT_EQ(u"22", attr->value); 147 148 doc = verifyWithOptions(R"EOF( 149 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 150 package="android" />)EOF", options); 151 ASSERT_NE(nullptr, doc); 152 153 el = xml::findRootElement(doc->root.get()); 154 ASSERT_NE(nullptr, el); 155 el = el->findChild({}, u"uses-sdk"); 156 ASSERT_NE(nullptr, el); 157 attr = el->findAttribute(xml::kSchemaAndroid, u"minSdkVersion"); 158 ASSERT_NE(nullptr, attr); 159 EXPECT_EQ(u"8", attr->value); 160 attr = el->findAttribute(xml::kSchemaAndroid, u"targetSdkVersion"); 161 ASSERT_NE(nullptr, attr); 162 EXPECT_EQ(u"22", attr->value); 163} 164 165} // namespace aapt 166