blob: eae307e3442ec8052ad55b655147ca2b9f0e0c0c [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 static com.android.manifmerger.XmlNode.NodeKey;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import com.android.xml.AndroidManifest;
import com.google.common.collect.ImmutableList;
import junit.framework.TestCase;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.xml.sax.SAXException;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
/**
* Tests for the {@link com.android.manifmerger.ManifestModel} class.
*/
public class ManifestModelTest extends TestCase {
public void testNameResolution()
throws ParserConfigurationException, SAXException, IOException {
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"
+ " <uses-feature android:name=\"camera\"/>\n"
+ "\n"
+ "</manifest>";
XmlDocument xmlDocument = TestUtils.xmlDocumentFromString(
TestUtils.sourceFile(getClass(), "testNoUseFeaturesDeclaration"), input);
XmlElement xmlElement = xmlDocument.getRootNode().getMergeableElements().get(0);
assertEquals("uses-feature",xmlElement.getXml().getNodeName());
assertEquals("camera", xmlElement.getKey());
}
public void testGlEsKeyResolution()
throws ParserConfigurationException, SAXException, IOException {
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"
+ " <uses-feature android:glEsVersion=\"0x00030000\"/>\n"
+ "\n"
+ "</manifest>";
XmlDocument xmlDocument = TestUtils.xmlDocumentFromString(
TestUtils.sourceFile(getClass(), "testNoUseFeaturesDeclaration"), input);
XmlElement xmlElement = xmlDocument.getRootNode().getMergeableElements().get(0);
assertEquals("uses-feature",xmlElement.getXml().getNodeName());
assertEquals("0x00030000", xmlElement.getKey());
}
public void testInvalidGlEsVersion()
throws ParserConfigurationException, SAXException, IOException {
AttributeModel.Hexadecimal32Bits validator =
new AttributeModel.Hexadecimal32Bits();
XmlAttribute xmlAttribute = Mockito.mock(XmlAttribute.class);
MergingReport.Builder mergingReport = Mockito.mock(MergingReport.Builder.class);
when(xmlAttribute.getId()).thenReturn(new NodeKey(AndroidManifest.ATTRIBUTE_GLESVERSION));
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
Mockito.doNothing().when(xmlAttribute).addMessage(
Mockito.any(MergingReport.Builder.class),
eq(MergingReport.Record.Severity.ERROR),
argumentCaptor.capture());
when(xmlAttribute.printPosition()).thenReturn("unknown");
assertFalse(validator.validates(mergingReport, xmlAttribute, "0xFFFFFFFFFFFF"));
assertEquals("Attribute glEsVersion at unknown is not a valid hexadecimal "
+ "32 bit value, found 0xFFFFFFFFFFFF",
argumentCaptor.getValue());
}
public void testTooLowGlEsVersion()
throws ParserConfigurationException, SAXException, IOException {
AttributeModel.Hexadecimal32BitsWithMinimumValue validator =
new AttributeModel.Hexadecimal32BitsWithMinimumValue(0x00010000);
XmlAttribute xmlAttribute = Mockito.mock(XmlAttribute.class);
MergingReport.Builder mergingReport = Mockito.mock(MergingReport.Builder.class);
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
Mockito.doNothing().when(xmlAttribute).addMessage(
Mockito.any(MergingReport.Builder.class),
eq(MergingReport.Record.Severity.ERROR),
argumentCaptor.capture());
when(xmlAttribute.getId()).thenReturn(new NodeKey(AndroidManifest.ATTRIBUTE_GLESVERSION));
when(xmlAttribute.printPosition()).thenReturn("unknown");
assertFalse(validator.validates(mergingReport, xmlAttribute, "0xFFF"));
assertEquals("Attribute glEsVersion at unknown is not a valid hexadecimal value, "
+ "minimum is 0x00010000, maximum is 0x7FFFFFFF, found 0xFFF",
argumentCaptor.getValue());
}
public void testOkGlEsVersion()
throws ParserConfigurationException, SAXException, IOException {
AttributeModel.Hexadecimal32BitsWithMinimumValue validator =
new AttributeModel.Hexadecimal32BitsWithMinimumValue(0x00010000);
XmlAttribute xmlAttribute = Mockito.mock(XmlAttribute.class);
MergingReport.Builder mergingReport = Mockito.mock(MergingReport.Builder.class);
when(xmlAttribute.getId()).thenReturn(new NodeKey(AndroidManifest.ATTRIBUTE_GLESVERSION));
when(xmlAttribute.printPosition()).thenReturn("unknown");
assertTrue(validator.validates(mergingReport, xmlAttribute, "0x00020001"));
verifyNoMoreInteractions(xmlAttribute);
}
public void testTooBigGlEsVersion()
throws ParserConfigurationException, SAXException, IOException {
AttributeModel.Hexadecimal32BitsWithMinimumValue validator =
new AttributeModel.Hexadecimal32BitsWithMinimumValue(0x00010000);
XmlAttribute xmlAttribute = Mockito.mock(XmlAttribute.class);
MergingReport.Builder mergingReport = Mockito.mock(MergingReport.Builder.class);
ArgumentCaptor<String> argumentCaptor = ArgumentCaptor.forClass(String.class);
Mockito.doNothing().when(xmlAttribute).addMessage(
Mockito.any(MergingReport.Builder.class),
eq(MergingReport.Record.Severity.ERROR),
argumentCaptor.capture());
when(xmlAttribute.getId()).thenReturn(new NodeKey(AndroidManifest.ATTRIBUTE_GLESVERSION));
when(xmlAttribute.printPosition()).thenReturn("unknown");
assertFalse(validator.validates(mergingReport, xmlAttribute, "0xFFFFFFFF"));
assertEquals("Attribute glEsVersion at unknown is not a valid hexadecimal value,"
+ " minimum is 0x00010000, maximum is 0x7FFFFFFF, found 0xFFFFFFFF",
argumentCaptor.getValue());
}
public void testNoKeyResolution()
throws ParserConfigurationException, SAXException, IOException {
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"
+ " <uses-feature android:required=\"false\"/>\n"
+ "\n"
+ "</manifest>";
XmlDocument xmlDocument = TestUtils.xmlDocumentFromString(
TestUtils.sourceFile(getClass(), "testNoUseFeaturesDeclaration"), input);
XmlElement xmlElement = xmlDocument.getRootNode().getMergeableElements().get(0);
assertEquals("uses-feature",xmlElement.getXml().getNodeName());
assertNull(xmlElement.getKey());
}
public void testTwoAttributesKeyResolution()
throws ParserConfigurationException, SAXException, IOException {
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"
+ " <screen/>\n"
+ " <screen android:screenDensity=\"mdpi\"/>\n"
+ " <screen android:screenSize=\"normal\"/>\n"
+ " <screen android:screenSize=\"normal\" android:screenDensity=\"mdpi\"/>\n"
+ " </compatible-screens>\n"
+ "\n"
+ "</manifest>";
XmlDocument xmlDocument = TestUtils.xmlDocumentFromString(
TestUtils.sourceFile(getClass(), "testNoUseFeaturesDeclaration"), input);
XmlElement xmlElement = xmlDocument.getRootNode().getMergeableElements().get(0);
ImmutableList<XmlElement> screenDefinitions = xmlElement.getMergeableElements();
assertNull(screenDefinitions.get(0).getKey());
assertEquals("mdpi", screenDefinitions.get(1).getKey());
assertEquals("normal", screenDefinitions.get(2).getKey());
assertEquals("normal+mdpi", screenDefinitions.get(3).getKey());
}
}