MetricsXmlSerializer
package com.android.compatibility.common.util;
import org.xmlpull.v1.XmlSerializer;
import java.io.IOException;
import java.util.List;
/**
* Serialize Metric data from {@link ReportLog} into compatibility report friendly XML
*/
public final class MetricsXmlSerializer {
private final XmlSerializer mXmlSerializer;
public MetricsXmlSerializer(XmlSerializer xmlSerializer) {
this.mXmlSerializer = xmlSerializer;
}
public void serialize(ReportLog reportLog) throws IOException {
if (reportLog == null) {
return;
}
ReportLog.Result summary = reportLog.getSummary();
List<ReportLog.Result> detailedMetrics = reportLog.getDetailedMetrics();
// <Summary message="Average" scoreType="lower_better" unit="ms">195.2</Summary>
if (summary != null) {
mXmlSerializer.startTag(null, "Summary");
mXmlSerializer.attribute(null, "message", summary.getMessage());
mXmlSerializer.attribute(null, "scoreType", summary.getType().getXmlString());
mXmlSerializer.attribute(null, "unit", summary.getUnit().getXmlString());
mXmlSerializer.text(Double.toString(summary.getValues()[0]));
mXmlSerializer.endTag(null, "Summary");
}
if (!detailedMetrics.isEmpty()) {
mXmlSerializer.startTag(null, "Details");
for (ReportLog.Result result : detailedMetrics) {
mXmlSerializer.startTag(null, "ValueArray");
mXmlSerializer.attribute(null, "source", result.getLocation());
mXmlSerializer.attribute(null, "message", result.getMessage());
mXmlSerializer.attribute(null, "scoreType", result.getType().getXmlString());
mXmlSerializer.attribute(null, "unit", result.getUnit().getXmlString());
for (double value : result.getValues()) {
mXmlSerializer.startTag(null, "Value");
mXmlSerializer.text(Double.toString(value));
mXmlSerializer.endTag(null, "Value");
}
mXmlSerializer.endTag(null, "ValueArray");
}
mXmlSerializer.endTag(null, "Details");
}
}
}
测试代码
package com.android.compatibility.common.util;
import junit.framework.TestCase;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
/**
* Unit tests for {@link MetricsXmlSerializer}
*/
public class MetricsXmlSerializerTest extends TestCase {
static class LocalReportLog extends ReportLog {}
private static final double[] VALUES = new double[] {1, 11, 21, 1211, 111221};
private static final String HEADER = "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>";
private static final String EXPECTED_XML =
HEADER
+ "<Summary message=\"Sample\" scoreType=\"higher_better\" unit=\"byte\">1.0</Summary>"
+ "<Details>"
+ "<ValueArray source=\"sun.reflect.NativeMethodAccessorImpl#invoke0:-2\""
+ " message=\"Details\" scoreType=\"neutral\" unit=\"fps\">"
+ "<Value>1.0</Value>"
+ "<Value>11.0</Value>"
+ "<Value>21.0</Value>"
+ "<Value>1211.0</Value>"
+ "<Value>111221.0</Value>"
+ "</ValueArray>"
+ "</Details>";
private LocalReportLog mLocalReportLog;
private MetricsXmlSerializer mMetricsXmlSerializer;
private ByteArrayOutputStream mByteArrayOutputStream;
private XmlSerializer xmlSerializer;
@Override
public void setUp() throws Exception {
mLocalReportLog = new LocalReportLog();
mByteArrayOutputStream = new ByteArrayOutputStream();
XmlPullParserFactory factory = XmlPullParserFactory.newInstance(null, null);
xmlSerializer = factory.newSerializer();
xmlSerializer.setOutput(mByteArrayOutputStream, "utf-8");
this.mMetricsXmlSerializer = new MetricsXmlSerializer(xmlSerializer);
}
public void testSerialize_null() throws IOException {
xmlSerializer.startDocument("utf-8", true);
mMetricsXmlSerializer.serialize(null);
xmlSerializer.endDocument();
assertEquals(HEADER.length(), mByteArrayOutputStream.toByteArray().length);
}
public void testSerialize_noData() throws IOException {
xmlSerializer.startDocument("utf-8", true);
mMetricsXmlSerializer.serialize(mLocalReportLog);
xmlSerializer.endDocument();
assertEquals(HEADER.length(), mByteArrayOutputStream.toByteArray().length);
}
public void testSerialize() throws IOException {
mLocalReportLog.setSummary("Sample", 1.0, ResultType.HIGHER_BETTER, ResultUnit.BYTE);
mLocalReportLog.addValues("Details", VALUES, ResultType.NEUTRAL, ResultUnit.FPS);
xmlSerializer.startDocument("utf-8", true);
mMetricsXmlSerializer.serialize(mLocalReportLog);
xmlSerializer.endDocument();
assertEquals(EXPECTED_XML, mByteArrayOutputStream.toString("utf-8"));
}
}