Change the interface of XmlWriter so it can be used in other places.
Test: atest compat-changeid-annotation-processor-test,
m FrameworksServicesTests after I've introduced a dependency on
the XmlWriter.
Change-Id: I6613029643e4f8b4933283c8bafba59d127aa421
diff --git a/annotation/processors/changeid/Android.bp b/annotation/processors/changeid/Android.bp
index 717738a..a29e564 100644
--- a/annotation/processors/changeid/Android.bp
+++ b/annotation/processors/changeid/Android.bp
@@ -10,6 +10,19 @@
],
}
+java_library {
+ name: "xml-writer-device-lib",
+
+ srcs: [
+ "src/java/com/android/compat/annotation/XmlWriter.java",
+ "src/java/com/android/compat/annotation/Change.java",
+ ],
+
+ static_libs: [
+ "guava",
+ ],
+}
+
java_plugin {
name: "compat-changeid-annotation-processor",
processor_class: "com.android.compat.annotation.ChangeIdProcessor",
diff --git a/annotation/processors/changeid/src/java/com/android/compat/annotation/Change.java b/annotation/processors/changeid/src/java/com/android/compat/annotation/Change.java
index c65e7b0..428fa8e 100644
--- a/annotation/processors/changeid/src/java/com/android/compat/annotation/Change.java
+++ b/annotation/processors/changeid/src/java/com/android/compat/annotation/Change.java
@@ -16,15 +16,19 @@
package com.android.compat.annotation;
+import com.google.common.annotations.VisibleForTesting;
+
/**
* Simple data class that represents a change, built from the code annotations.
*/
+@VisibleForTesting
public class Change {
final Long id;
final String name;
final boolean disabled;
final Integer enabledAfter;
+ @VisibleForTesting
public Change(Long id, String name, boolean disabled, Integer enabledAfter) {
this.id = id;
this.name = name;
diff --git a/annotation/processors/changeid/src/java/com/android/compat/annotation/ChangeIdProcessor.java b/annotation/processors/changeid/src/java/com/android/compat/annotation/ChangeIdProcessor.java
index 4ba284a..52e48e8 100644
--- a/annotation/processors/changeid/src/java/com/android/compat/annotation/ChangeIdProcessor.java
+++ b/annotation/processors/changeid/src/java/com/android/compat/annotation/ChangeIdProcessor.java
@@ -17,9 +17,13 @@
package com.android.compat.annotation;
import static javax.tools.Diagnostic.Kind.ERROR;
+import static javax.tools.StandardLocation.CLASS_OUTPUT;
+
import com.google.common.collect.ImmutableSet;
+import java.io.IOException;
+import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.util.Set;
import java.util.Map;
@@ -91,7 +95,16 @@
writer.addChange(change);
}
- writer.write(PACKAGE, CONFIG_XML, processingEnv.getFiler());
+ try (OutputStream output = processingEnv.getFiler().createResource(
+ CLASS_OUTPUT,
+ PACKAGE,
+ CONFIG_XML)
+ .openOutputStream()) {
+ writer.write(output);
+ } catch (IOException e) {
+ throw new RuntimeException("Failed to write output", e);
+ }
+
return true;
}
diff --git a/annotation/processors/changeid/src/java/com/android/compat/annotation/XmlWriter.java b/annotation/processors/changeid/src/java/com/android/compat/annotation/XmlWriter.java
index eb8856c..71a4d0f 100644
--- a/annotation/processors/changeid/src/java/com/android/compat/annotation/XmlWriter.java
+++ b/annotation/processors/changeid/src/java/com/android/compat/annotation/XmlWriter.java
@@ -16,12 +16,11 @@
package com.android.compat.annotation;
-import static javax.tools.StandardLocation.CLASS_OUTPUT;
+import com.google.common.annotations.VisibleForTesting;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-import java.io.IOException;
import java.io.OutputStream;
import javax.xml.parsers.DocumentBuilder;
@@ -32,7 +31,6 @@
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
-import javax.annotation.processing.Filer;
/**
* <p>Writes an XML config file containing provided changes.</p>
@@ -49,7 +47,8 @@
* </pre>
*
*/
-final class XmlWriter {
+@VisibleForTesting
+public final class XmlWriter {
//XML tags
private static final String XML_ROOT = "config";
private static final String XML_CHANGE_ELEMENT = "compat-change";
@@ -58,17 +57,19 @@
private static final String XML_DISABLED_ATTR = "disabled";
private static final String XML_ENABLED_AFTER_ATTR = "enableAfterTargetSdk";
- private Document document;
- private Element root;
+ private Document mDocument;
+ private Element mRoot;
- XmlWriter() {
- document = createDocument();
- root = document.createElement(XML_ROOT);
- document.appendChild(root);
+ @VisibleForTesting
+ public XmlWriter() {
+ mDocument = createDocument();
+ mRoot = mDocument.createElement(XML_ROOT);
+ mDocument.appendChild(mRoot);
}
- void addChange(Change change) {
- Element newElement = document.createElement(XML_CHANGE_ELEMENT);
+ @VisibleForTesting
+ public void addChange(Change change) {
+ Element newElement = mDocument.createElement(XML_CHANGE_ELEMENT);
newElement.setAttribute(XML_NAME_ATTR, change.name);
newElement.setAttribute(XML_ID_ATTR, change.id.toString());
if (change.disabled) {
@@ -77,23 +78,20 @@
if (change.enabledAfter != null) {
newElement.setAttribute(XML_ENABLED_AFTER_ATTR, change.enabledAfter.toString());
}
- root.appendChild(newElement);
+ mRoot.appendChild(newElement);
}
- void write(String packageName, String fileName, Filer filer) {
- try (OutputStream output = filer.createResource(
- CLASS_OUTPUT,
- packageName,
- fileName)
- .openOutputStream()) {
+ @VisibleForTesting
+ public void write(OutputStream output) {
+ try {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
- DOMSource domSource = new DOMSource(document);
+ DOMSource domSource = new DOMSource(mDocument);
StreamResult result = new StreamResult(output);
transformer.transform(domSource, result);
- } catch (IOException | TransformerException e) {
+ } catch (TransformerException e) {
throw new RuntimeException("Failed to write output", e);
}
}
@@ -102,8 +100,7 @@
try {
DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
- Document document = documentBuilder.newDocument();
- return document;
+ return documentBuilder.newDocument();
} catch (ParserConfigurationException e) {
throw new RuntimeException("Failed to create a new document", e);
}
diff --git a/annotation/processors/changeid/test/src/com/android/compat/annotation/XmlWriterTest.java b/annotation/processors/changeid/test/src/com/android/compat/annotation/XmlWriterTest.java
index 3bc8e2b..eefac25 100644
--- a/annotation/processors/changeid/test/src/com/android/compat/annotation/XmlWriterTest.java
+++ b/annotation/processors/changeid/test/src/com/android/compat/annotation/XmlWriterTest.java
@@ -16,70 +16,49 @@
package com.android.compat.annotation;
-import static org.mockito.Mockito.when;
-import static org.junit.Assert.assertThat;
import static org.hamcrest.core.StringStartsWith.startsWith;
+import static org.junit.Assert.assertThat;
import org.junit.Test;
-import org.mockito.Mock;
-
-import javax.annotation.processing.Filer;
-import javax.tools.FileObject;
-import javax.tools.StandardLocation;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
-import org.junit.Before;
-import org.junit.Rule;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
public class XmlWriterTest {
private static final String HEADER =
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>";
- @Mock private Filer filer;
- @Mock private FileObject fileObject;
- private OutputStream outputStream = new ByteArrayOutputStream();
-
- @Rule public MockitoRule rule = MockitoJUnit.rule();
-
- @Before
- public void setUp() throws Exception {
- when(filer.createResource(StandardLocation.CLASS_OUTPUT, "package", "name")).thenReturn(
- fileObject);
- when(fileObject.openOutputStream()).thenReturn(outputStream);
- }
+ private OutputStream mOutputStream = new ByteArrayOutputStream();
@Test
- public void testNoChanges() throws Exception {
+ public void testNoChanges() {
XmlWriter writer = new XmlWriter();
- writer.write("package", "name", filer);
+ writer.write(mOutputStream);
String expected = HEADER + "<config/>";
- assertThat(outputStream.toString(), startsWith(expected));
+ assertThat(mOutputStream.toString(), startsWith(expected));
}
@Test
- public void testOneChange() throws Exception {
+ public void testOneChange() {
XmlWriter writer = new XmlWriter();
Change c = new Change(123456789L, "change-name", false, null);
writer.addChange(c);
- writer.write("package", "name", filer);
+ writer.write(mOutputStream);
String expected = HEADER + "<config>"
+ "<compat-change id=\"123456789\" name=\"change-name\"/>"
+ "</config>";
- assertThat(outputStream.toString(), startsWith(expected));
+ assertThat(mOutputStream.toString(), startsWith(expected));
}
@Test
- public void testSomeChanges() throws Exception {
+ public void testSomeChanges() {
XmlWriter writer = new XmlWriter();
Change c = new Change(111L, "change-name1", false, null);
Change disabled = new Change(222L, "change-name2", true, null);
@@ -90,7 +69,7 @@
writer.addChange(disabled);
writer.addChange(sdkRestricted);
writer.addChange(both);
- writer.write("package", "name", filer);
+ writer.write(mOutputStream);
String expected = HEADER + "<config>"
+ "<compat-change id=\"111\" name=\"change-name1\"/>"
@@ -100,6 +79,6 @@
+ "name=\"change-name4\"/>"
+ "</config>";
- assertThat(outputStream.toString(), startsWith(expected));
+ assertThat(mOutputStream.toString(), startsWith(expected));
}
}