blob: 010cfa3fb4c1bb6352ec1ca489819eb84742bc30 [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.manifmerger;
import com.android.sdklib.mock.MockLog;
import junit.framework.TestCase;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.util.logging.Logger;
import javax.xml.parsers.ParserConfigurationException;
/**
* Tests for the {@link com.android.manifmerger.PreValidator} class.
*/
public class PreValidatorTest extends TestCase {
public void testCorrectInstructions()
throws ParserConfigurationException, SAXException, IOException {
MockLog mockLog = new MockLog();
String input = ""
+ "<manifest\n"
+ " xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
+ " xmlns:tools=\"http://schemas.android.com/tools\"\n"
+ " package=\"com.example.lib3\">\n"
+ "\n"
+ " <application android:label=\"@string/lib_name\" />\n"
+ "\n"
+ " <activity android:name=\"activityOne\" "
+ " android:exported=\"false\""
+ " tools:replace=\"exported\"/>\n"
+ "\n"
+ "</manifest>";
XmlDocument xmlDocument = TestUtils.xmlDocumentFromString(
TestUtils.sourceFile(getClass(), "testIncorrectRemove"), input);
MergingReport.Builder mergingReport = new MergingReport.Builder(mockLog);
MergingReport.Result validated = PreValidator.validate(mergingReport, xmlDocument);
assertEquals(MergingReport.Result.SUCCESS, validated);
assertTrue(mockLog.toString().isEmpty());
}
public void testIncorrectReplace()
throws ParserConfigurationException, SAXException, IOException {
MockLog mockLog = new MockLog();
String input = ""
+ "<manifest\n"
+ " xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
+ " xmlns:tools=\"http://schemas.android.com/tools\"\n"
+ " package=\"com.example.lib3\">\n"
+ "\n"
+ " <application android:label=\"@string/lib_name\" />\n"
+ "\n"
+ " <activity android:name=\"activityOne\" "
+ " tools:replace=\"exported\"/>\n"
+ "\n"
+ "</manifest>";
XmlDocument xmlDocument = TestUtils.xmlDocumentFromString(
TestUtils.sourceFile(getClass(), "testIncorrectRemove"), input);
MergingReport.Builder mergingReport = new MergingReport.Builder(mockLog);
MergingReport.Result validated = PreValidator.validate(mergingReport, xmlDocument);
assertEquals(MergingReport.Result.ERROR, validated);
// assert the error message complains about the bad instruction usage.
assertStringPresenceInLogRecords(mergingReport, "tools:replace");
}
public void testIncorrectRemove()
throws ParserConfigurationException, SAXException, IOException {
MockLog mockLog = new MockLog();
String input = ""
+ "<manifest\n"
+ " xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
+ " xmlns:tools=\"http://schemas.android.com/tools\"\n"
+ " package=\"com.example.lib3\">\n"
+ "\n"
+ " <application android:label=\"@string/lib_name\" />\n"
+ "\n"
+ " <activity android:name=\"activityOne\" "
+ " android:exported=\"true\""
+ " tools:remove=\"exported\"/>\n"
+ "\n"
+ "</manifest>";
XmlDocument xmlDocument = TestUtils.xmlDocumentFromString(
TestUtils.sourceFile(getClass(), "testIncorrectRemove"), input);
MergingReport.Builder mergingReport = new MergingReport.Builder(mockLog);
MergingReport.Result validated = PreValidator.validate(mergingReport, xmlDocument);
assertEquals(MergingReport.Result.ERROR, validated);
// assert the error message complains about the bad instruction usage.
assertStringPresenceInLogRecords(mergingReport, "tools:remove");
}
public void testIncorrectRemoveAll()
throws ParserConfigurationException, SAXException, IOException {
MockLog mockLog = new MockLog();
String input = ""
+ "<manifest\n"
+ " xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
+ " xmlns:tools=\"http://schemas.android.com/tools\"\n"
+ " package=\"com.example.lib3\">\n"
+ "\n"
+ " <permission "
+ " android:label=\"@string/lib_name\""
+ " android:name=\"permissionOne\""
+ " tools:node=\"removeAll\">\n"
+ " </permission>\n"
+ "\n"
+ "</manifest>";
XmlDocument xmlDocument = TestUtils.xmlDocumentFromString(
TestUtils.sourceFile(getClass(), "testIncorrectRemove"), input);
MergingReport.Builder mergingReport = new MergingReport.Builder(mockLog);
MergingReport.Result validated = PreValidator.validate(mergingReport, xmlDocument);
assertEquals(MergingReport.Result.ERROR, validated);
// assert the error message complains about the bad instruction usage.
assertStringPresenceInLogRecords(mergingReport, "tools:node=\"removeAll\"");
}
public void testIncorrectSelector()
throws ParserConfigurationException, SAXException, IOException {
MockLog mockLog = new MockLog();
String input = ""
+ "<manifest\n"
+ " xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
+ " xmlns:tools=\"http://schemas.android.com/tools\"\n"
+ " package=\"com.example.lib3\">\n"
+ "\n"
+ " <permission "
+ " android:label=\"@string/lib_name\""
+ " android:name=\"permissionOne\""
+ " tools:node=\"replace\" tools:selector=\"foo\">\n"
+ " </permission>\n"
+ "\n"
+ "</manifest>";
XmlDocument xmlDocument = TestUtils.xmlDocumentFromString(
TestUtils.sourceFile(getClass(), "testIncorrectRemove"), input);
MergingReport.Builder mergingReport = new MergingReport.Builder(mockLog);
MergingReport.Result validated = PreValidator.validate(mergingReport, xmlDocument);
assertEquals(MergingReport.Result.ERROR, validated);
// assert the error message complains about the bad instruction usage.
assertStringPresenceInLogRecords(mergingReport, "tools:selector=\"foo\"");
}
public void testNoKeyElement()
throws ParserConfigurationException, SAXException, IOException {
MockLog mockLog = new MockLog();
String input = ""
+ "<manifest\n"
+ " xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
+ " xmlns:tools=\"http://schemas.android.com/tools\"\n"
+ " package=\"com.example.lib3\">\n"
+ "\n"
+ " <compatible-screens>\n"
+ " <!-- all small size screens -->\n"
+ " <screen android:screenSize=\"small\" android:screenDensity=\"ldpi\" />\n"
+ " <screen android:screenSize=\"small\" android:screenDensity=\"mdpi\" />\n"
+ " <screen android:screenSize=\"small\" android:screenDensity=\"xhdpi\" />\n"
+ " <!-- all normal size screens -->\n"
+ " <screen android:screenSize=\"normal\" android:screenDensity=\"ldpi\" />\n"
+ " <screen android:screenSize=\"normal\" android:screenDensity=\"hdpi\" />\n"
+ " <screen android:screenSize=\"normal\" android:screenDensity=\"xhdpi\" />\n"
+ " </compatible-screens>"
+ "\n"
+ "</manifest>";
XmlDocument xmlDocument = TestUtils.xmlDocumentFromString(
TestUtils.sourceFile(getClass(), "testScreenMerging"), input);
MergingReport.Builder mergingReport = new MergingReport.Builder(mockLog);
MergingReport.Result validated = PreValidator.validate(mergingReport, xmlDocument);
assertEquals(MergingReport.Result.SUCCESS, validated);
}
public void testMultipleIntentFilterWithSameKeyValue()
throws ParserConfigurationException, SAXException, IOException {
MockLog mockLog = new MockLog();
String input = ""
+ "<manifest\n"
+ " xmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
+ " xmlns:tools=\"http://schemas.android.com/tools\"\n"
+ " package=\"com.example.lib3\">\n"
+ "\n"
+ " <application>\n"
+ " <activity android:name=\"com.foo.bar.DeepLinkRouterActivity\" android:theme=\"@android:style/Theme.NoDisplay\">\n"
+ " <intent-filter>\n"
+ " <action android:name=\"android.intent.action.VIEW\"/>\n"
+ " <category android:name=\"android.intent.category.DEFAULT\"/>\n"
+ " <category android:name=\"android.intent.category.BROWSABLE\"/>\n"
+ " <data android:scheme=\"myspecialdeeplinkscheme\"/>\n"
+ " <data android:host=\"home\"/>\n"
+ " </intent-filter>\n"
+ " <intent-filter>\n"
+ " <action android:name=\"android.intent.action.VIEW\"/>\n"
+ " <category android:name=\"android.intent.category.DEFAULT\"/>\n"
+ " <category android:name=\"android.intent.category.BROWSABLE\"/>\n"
+ " <data android:scheme=\"https\"/>\n"
+ " <data android:host=\"www.foo.com\"/>\n"
+ " </intent-filter>\n"
+ " </activity>\n"
+ " </application>"
+ "\n"
+ "</manifest>";
XmlDocument xmlDocument = TestUtils.xmlDocumentFromString(
TestUtils.sourceFile(getClass(), "testMultipleIntentFilterWithSameKeyValue"), input);
MergingReport.Builder mergingReport = new MergingReport.Builder(mockLog);
MergingReport.Result validated = PreValidator.validate(mergingReport, xmlDocument);
assertEquals(MergingReport.Result.SUCCESS, validated);
}
private static void assertStringPresenceInLogRecords(MergingReport.Builder mergingReport, String s) {
for (MergingReport.Record record : mergingReport.build().getLoggingRecords()) {
if (record.toString().contains(s)) {
return;
}
}
// failed, dump the records
for (MergingReport.Record record : mergingReport.build().getLoggingRecords()) {
Logger.getAnonymousLogger().info(record.toString());
}
fail("could not find " + s + " in logging records");
}
}