Merge change I92cdc5ed into eclair
* changes: PerformanceCollector: Collect & report perf measurements in key/value form
This commit is contained in:
@@ -107,6 +107,36 @@ public class PerformanceCollector {
|
|||||||
* @see PerformanceCollector#stopTiming(String)
|
* @see PerformanceCollector#stopTiming(String)
|
||||||
*/
|
*/
|
||||||
public void writeStopTiming(Bundle results);
|
public void writeStopTiming(Bundle results);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback invoked as last action in
|
||||||
|
* {@link PerformanceCollector#addMeasurement(String, long)} for
|
||||||
|
* reporting an integer type measurement.
|
||||||
|
*
|
||||||
|
* @param label short description of the metric that was measured
|
||||||
|
* @param value long value of the measurement
|
||||||
|
*/
|
||||||
|
public void writeMeasurement(String label, long value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback invoked as last action in
|
||||||
|
* {@link PerformanceCollector#addMeasurement(String, float)} for
|
||||||
|
* reporting a float type measurement.
|
||||||
|
*
|
||||||
|
* @param label short description of the metric that was measured
|
||||||
|
* @param value float value of the measurement
|
||||||
|
*/
|
||||||
|
public void writeMeasurement(String label, float value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback invoked as last action in
|
||||||
|
* {@link PerformanceCollector#addMeasurement(String, String)} for
|
||||||
|
* reporting a string field.
|
||||||
|
*
|
||||||
|
* @param label short description of the metric that was measured
|
||||||
|
* @param value string summary of the measurement
|
||||||
|
*/
|
||||||
|
public void writeMeasurement(String label, String value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -385,6 +415,39 @@ public class PerformanceCollector {
|
|||||||
return mPerfMeasurement;
|
return mPerfMeasurement;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an integer type measurement to the collector.
|
||||||
|
*
|
||||||
|
* @param label short description of the metric that was measured
|
||||||
|
* @param value long value of the measurement
|
||||||
|
*/
|
||||||
|
public void addMeasurement(String label, long value) {
|
||||||
|
if (mPerfWriter != null)
|
||||||
|
mPerfWriter.writeMeasurement(label, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a float type measurement to the collector.
|
||||||
|
*
|
||||||
|
* @param label short description of the metric that was measured
|
||||||
|
* @param value float value of the measurement
|
||||||
|
*/
|
||||||
|
public void addMeasurement(String label, float value) {
|
||||||
|
if (mPerfWriter != null)
|
||||||
|
mPerfWriter.writeMeasurement(label, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a string field to the collector.
|
||||||
|
*
|
||||||
|
* @param label short description of the metric that was measured
|
||||||
|
* @param value string summary of the measurement
|
||||||
|
*/
|
||||||
|
public void addMeasurement(String label, String value) {
|
||||||
|
if (mPerfWriter != null)
|
||||||
|
mPerfWriter.writeMeasurement(label, value);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Starts tracking memory usage, binder transactions, and real & cpu timing.
|
* Starts tracking memory usage, binder transactions, and real & cpu timing.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -226,18 +226,23 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu
|
|||||||
* identifies the path to the generated code coverage file.
|
* identifies the path to the generated code coverage file.
|
||||||
*/
|
*/
|
||||||
private static final String REPORT_KEY_COVERAGE_PATH = "coverageFilePath";
|
private static final String REPORT_KEY_COVERAGE_PATH = "coverageFilePath";
|
||||||
|
/**
|
||||||
|
* If included at the start of reporting keys, this prefix marks the key as a performance
|
||||||
|
* metric.
|
||||||
|
*/
|
||||||
|
private static final String REPORT_KEY_PREFIX = "performance.";
|
||||||
/**
|
/**
|
||||||
* If included in the status or final bundle sent to an IInstrumentationWatcher, this key
|
* If included in the status or final bundle sent to an IInstrumentationWatcher, this key
|
||||||
* reports the cpu time in milliseconds of the current test.
|
* reports the cpu time in milliseconds of the current test.
|
||||||
*/
|
*/
|
||||||
private static final String REPORT_KEY_PERF_CPU_TIME =
|
private static final String REPORT_KEY_PERF_CPU_TIME =
|
||||||
"performance." + PerformanceCollector.METRIC_KEY_CPU_TIME;
|
REPORT_KEY_PREFIX + PerformanceCollector.METRIC_KEY_CPU_TIME;
|
||||||
/**
|
/**
|
||||||
* If included in the status or final bundle sent to an IInstrumentationWatcher, this key
|
* If included in the status or final bundle sent to an IInstrumentationWatcher, this key
|
||||||
* reports the run time in milliseconds of the current test.
|
* reports the run time in milliseconds of the current test.
|
||||||
*/
|
*/
|
||||||
private static final String REPORT_KEY_PERF_EXECUTION_TIME =
|
private static final String REPORT_KEY_PERF_EXECUTION_TIME =
|
||||||
"performance." + PerformanceCollector.METRIC_KEY_EXECUTION_TIME;
|
REPORT_KEY_PREFIX + PerformanceCollector.METRIC_KEY_EXECUTION_TIME;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The test is starting.
|
* The test is starting.
|
||||||
@@ -739,11 +744,9 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void writeEndSnapshot(Bundle results) {
|
public void writeEndSnapshot(Bundle results) {
|
||||||
// Copy all snapshot data fields as type long into mResults, which
|
// Copy all snapshot data fields into mResults, which is outputted
|
||||||
// is outputted via Instrumentation.finish
|
// via Instrumentation.finish
|
||||||
for (String key : results.keySet()) {
|
mResults.putAll(results);
|
||||||
mResults.putLong(key, results.getLong(key));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeStartTiming(String label) {
|
public void writeStartTiming(String label) {
|
||||||
@@ -768,6 +771,18 @@ public class InstrumentationTestRunner extends Instrumentation implements TestSu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void writeMeasurement(String label, long value) {
|
||||||
|
mTestResult.putLong(REPORT_KEY_PREFIX + label, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeMeasurement(String label, float value) {
|
||||||
|
mTestResult.putFloat(REPORT_KEY_PREFIX + label, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeMeasurement(String label, String value) {
|
||||||
|
mTestResult.putString(REPORT_KEY_PREFIX + label, value);
|
||||||
|
}
|
||||||
|
|
||||||
// TODO report the end of the cycle
|
// TODO report the end of the cycle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,8 +19,9 @@ package com.android.unit_tests.os;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.os.PerformanceCollector;
|
import android.os.PerformanceCollector;
|
||||||
|
import android.os.Process;
|
||||||
import android.os.PerformanceCollector.PerformanceResultsWriter;
|
import android.os.PerformanceCollector.PerformanceResultsWriter;
|
||||||
import android.test.suitebuilder.annotation.LargeTest;
|
import android.test.suitebuilder.annotation.SmallTest;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -44,6 +45,7 @@ public class PerformanceCollectorTest extends TestCase {
|
|||||||
mPerfCollector = null;
|
mPerfCollector = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
public void testBeginSnapshotNoWriter() throws Exception {
|
public void testBeginSnapshotNoWriter() throws Exception {
|
||||||
mPerfCollector.beginSnapshot("testBeginSnapshotNoWriter");
|
mPerfCollector.beginSnapshot("testBeginSnapshotNoWriter");
|
||||||
|
|
||||||
@@ -54,15 +56,16 @@ public class PerformanceCollectorTest extends TestCase {
|
|||||||
assertEquals(2, snapshot.size());
|
assertEquals(2, snapshot.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@LargeTest
|
@SmallTest
|
||||||
public void testEndSnapshotNoWriter() throws Exception {
|
public void testEndSnapshotNoWriter() throws Exception {
|
||||||
mPerfCollector.beginSnapshot("testEndSnapshotNoWriter");
|
mPerfCollector.beginSnapshot("testEndSnapshotNoWriter");
|
||||||
sleepForRandomLongPeriod();
|
workForRandomLongPeriod();
|
||||||
Bundle snapshot = mPerfCollector.endSnapshot();
|
Bundle snapshot = mPerfCollector.endSnapshot();
|
||||||
|
|
||||||
verifySnapshotBundle(snapshot);
|
verifySnapshotBundle(snapshot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
public void testStartTimingNoWriter() throws Exception {
|
public void testStartTimingNoWriter() throws Exception {
|
||||||
mPerfCollector.startTiming("testStartTimingNoWriter");
|
mPerfCollector.startTiming("testStartTimingNoWriter");
|
||||||
|
|
||||||
@@ -73,21 +76,23 @@ public class PerformanceCollectorTest extends TestCase {
|
|||||||
verifyTimingBundle(measurement, new ArrayList<String>());
|
verifyTimingBundle(measurement, new ArrayList<String>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
public void testAddIterationNoWriter() throws Exception {
|
public void testAddIterationNoWriter() throws Exception {
|
||||||
mPerfCollector.startTiming("testAddIterationNoWriter");
|
mPerfCollector.startTiming("testAddIterationNoWriter");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
Bundle iteration = mPerfCollector.addIteration("timing1");
|
Bundle iteration = mPerfCollector.addIteration("timing1");
|
||||||
|
|
||||||
verifyIterationBundle(iteration, "timing1");
|
verifyIterationBundle(iteration, "timing1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
public void testStopTimingNoWriter() throws Exception {
|
public void testStopTimingNoWriter() throws Exception {
|
||||||
mPerfCollector.startTiming("testStopTimingNoWriter");
|
mPerfCollector.startTiming("testStopTimingNoWriter");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("timing2");
|
mPerfCollector.addIteration("timing2");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("timing3");
|
mPerfCollector.addIteration("timing3");
|
||||||
sleepForRandomShortPeriod();
|
workForRandomShortPeriod();
|
||||||
Bundle timing = mPerfCollector.stopTiming("timing4");
|
Bundle timing = mPerfCollector.stopTiming("timing4");
|
||||||
|
|
||||||
ArrayList<String> labels = new ArrayList<String>();
|
ArrayList<String> labels = new ArrayList<String>();
|
||||||
@@ -97,6 +102,7 @@ public class PerformanceCollectorTest extends TestCase {
|
|||||||
verifyTimingBundle(timing, labels);
|
verifyTimingBundle(timing, labels);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
public void testBeginSnapshot() throws Exception {
|
public void testBeginSnapshot() throws Exception {
|
||||||
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
||||||
mPerfCollector.setPerformanceResultsWriter(writer);
|
mPerfCollector.setPerformanceResultsWriter(writer);
|
||||||
@@ -110,19 +116,20 @@ public class PerformanceCollectorTest extends TestCase {
|
|||||||
assertEquals(2, snapshot.size());
|
assertEquals(2, snapshot.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@LargeTest
|
@SmallTest
|
||||||
public void testEndSnapshot() throws Exception {
|
public void testEndSnapshot() throws Exception {
|
||||||
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
||||||
mPerfCollector.setPerformanceResultsWriter(writer);
|
mPerfCollector.setPerformanceResultsWriter(writer);
|
||||||
mPerfCollector.beginSnapshot("testEndSnapshot");
|
mPerfCollector.beginSnapshot("testEndSnapshot");
|
||||||
sleepForRandomLongPeriod();
|
workForRandomLongPeriod();
|
||||||
Bundle snapshot1 = mPerfCollector.endSnapshot();
|
Bundle snapshot1 = mPerfCollector.endSnapshot();
|
||||||
Bundle snapshot2 = writer.snapshotResults;
|
Bundle snapshot2 = writer.snapshotResults;
|
||||||
|
|
||||||
assertTrue(snapshot1.equals(snapshot2));
|
assertEqualsBundle(snapshot1, snapshot2);
|
||||||
verifySnapshotBundle(snapshot1);
|
verifySnapshotBundle(snapshot1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
public void testStartTiming() throws Exception {
|
public void testStartTiming() throws Exception {
|
||||||
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
||||||
mPerfCollector.setPerformanceResultsWriter(writer);
|
mPerfCollector.setPerformanceResultsWriter(writer);
|
||||||
@@ -136,21 +143,23 @@ public class PerformanceCollectorTest extends TestCase {
|
|||||||
verifyTimingBundle(measurement, new ArrayList<String>());
|
verifyTimingBundle(measurement, new ArrayList<String>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
public void testAddIteration() throws Exception {
|
public void testAddIteration() throws Exception {
|
||||||
mPerfCollector.startTiming("testAddIteration");
|
mPerfCollector.startTiming("testAddIteration");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
Bundle iteration = mPerfCollector.addIteration("timing5");
|
Bundle iteration = mPerfCollector.addIteration("timing5");
|
||||||
|
|
||||||
verifyIterationBundle(iteration, "timing5");
|
verifyIterationBundle(iteration, "timing5");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
public void testStopTiming() throws Exception {
|
public void testStopTiming() throws Exception {
|
||||||
mPerfCollector.startTiming("testStopTiming");
|
mPerfCollector.startTiming("testStopTiming");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("timing6");
|
mPerfCollector.addIteration("timing6");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("timing7");
|
mPerfCollector.addIteration("timing7");
|
||||||
sleepForRandomShortPeriod();
|
workForRandomShortPeriod();
|
||||||
Bundle timing = mPerfCollector.stopTiming("timing8");
|
Bundle timing = mPerfCollector.stopTiming("timing8");
|
||||||
|
|
||||||
ArrayList<String> labels = new ArrayList<String>();
|
ArrayList<String> labels = new ArrayList<String>();
|
||||||
@@ -160,28 +169,90 @@ public class PerformanceCollectorTest extends TestCase {
|
|||||||
verifyTimingBundle(timing, labels);
|
verifyTimingBundle(timing, labels);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: flaky test
|
@SmallTest
|
||||||
// @LargeTest
|
public void testAddMeasurementLong() throws Exception {
|
||||||
|
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
||||||
|
mPerfCollector.setPerformanceResultsWriter(writer);
|
||||||
|
mPerfCollector.startTiming("testAddMeasurementLong");
|
||||||
|
mPerfCollector.addMeasurement("testAddMeasurementLongZero", 0);
|
||||||
|
mPerfCollector.addMeasurement("testAddMeasurementLongPos", 348573);
|
||||||
|
mPerfCollector.addMeasurement("testAddMeasurementLongNeg", -19354);
|
||||||
|
mPerfCollector.stopTiming("");
|
||||||
|
|
||||||
|
assertEquals("testAddMeasurementLong", writer.timingLabel);
|
||||||
|
Bundle results = writer.timingResults;
|
||||||
|
assertEquals(4, results.size());
|
||||||
|
assertTrue(results.containsKey("testAddMeasurementLongZero"));
|
||||||
|
assertEquals(0, results.getLong("testAddMeasurementLongZero"));
|
||||||
|
assertTrue(results.containsKey("testAddMeasurementLongPos"));
|
||||||
|
assertEquals(348573, results.getLong("testAddMeasurementLongPos"));
|
||||||
|
assertTrue(results.containsKey("testAddMeasurementLongNeg"));
|
||||||
|
assertEquals(-19354, results.getLong("testAddMeasurementLongNeg"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
|
public void testAddMeasurementFloat() throws Exception {
|
||||||
|
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
||||||
|
mPerfCollector.setPerformanceResultsWriter(writer);
|
||||||
|
mPerfCollector.startTiming("testAddMeasurementFloat");
|
||||||
|
mPerfCollector.addMeasurement("testAddMeasurementFloatZero", 0.0f);
|
||||||
|
mPerfCollector.addMeasurement("testAddMeasurementFloatPos", 348573.345f);
|
||||||
|
mPerfCollector.addMeasurement("testAddMeasurementFloatNeg", -19354.093f);
|
||||||
|
mPerfCollector.stopTiming("");
|
||||||
|
|
||||||
|
assertEquals("testAddMeasurementFloat", writer.timingLabel);
|
||||||
|
Bundle results = writer.timingResults;
|
||||||
|
assertEquals(4, results.size());
|
||||||
|
assertTrue(results.containsKey("testAddMeasurementFloatZero"));
|
||||||
|
assertEquals(0.0f, results.getFloat("testAddMeasurementFloatZero"));
|
||||||
|
assertTrue(results.containsKey("testAddMeasurementFloatPos"));
|
||||||
|
assertEquals(348573.345f, results.getFloat("testAddMeasurementFloatPos"));
|
||||||
|
assertTrue(results.containsKey("testAddMeasurementFloatNeg"));
|
||||||
|
assertEquals(-19354.093f, results.getFloat("testAddMeasurementFloatNeg"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
|
public void testAddMeasurementString() throws Exception {
|
||||||
|
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
||||||
|
mPerfCollector.setPerformanceResultsWriter(writer);
|
||||||
|
mPerfCollector.startTiming("testAddMeasurementString");
|
||||||
|
mPerfCollector.addMeasurement("testAddMeasurementStringNull", null);
|
||||||
|
mPerfCollector.addMeasurement("testAddMeasurementStringEmpty", "");
|
||||||
|
mPerfCollector.addMeasurement("testAddMeasurementStringNonEmpty", "Hello World");
|
||||||
|
mPerfCollector.stopTiming("");
|
||||||
|
|
||||||
|
assertEquals("testAddMeasurementString", writer.timingLabel);
|
||||||
|
Bundle results = writer.timingResults;
|
||||||
|
assertEquals(4, results.size());
|
||||||
|
assertTrue(results.containsKey("testAddMeasurementStringNull"));
|
||||||
|
assertNull(results.getString("testAddMeasurementStringNull"));
|
||||||
|
assertTrue(results.containsKey("testAddMeasurementStringEmpty"));
|
||||||
|
assertEquals("", results.getString("testAddMeasurementStringEmpty"));
|
||||||
|
assertTrue(results.containsKey("testAddMeasurementStringNonEmpty"));
|
||||||
|
assertEquals("Hello World", results.getString("testAddMeasurementStringNonEmpty"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
public void testSimpleSequence() throws Exception {
|
public void testSimpleSequence() throws Exception {
|
||||||
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
||||||
mPerfCollector.setPerformanceResultsWriter(writer);
|
mPerfCollector.setPerformanceResultsWriter(writer);
|
||||||
mPerfCollector.beginSnapshot("testSimpleSequence");
|
mPerfCollector.beginSnapshot("testSimpleSequence");
|
||||||
mPerfCollector.startTiming("testSimpleSequenceTiming");
|
mPerfCollector.startTiming("testSimpleSequenceTiming");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration1");
|
mPerfCollector.addIteration("iteration1");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration2");
|
mPerfCollector.addIteration("iteration2");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration3");
|
mPerfCollector.addIteration("iteration3");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration4");
|
mPerfCollector.addIteration("iteration4");
|
||||||
sleepForRandomShortPeriod();
|
workForRandomShortPeriod();
|
||||||
Bundle timing = mPerfCollector.stopTiming("iteration5");
|
Bundle timing = mPerfCollector.stopTiming("iteration5");
|
||||||
sleepForRandomLongPeriod();
|
workForRandomLongPeriod();
|
||||||
Bundle snapshot1 = mPerfCollector.endSnapshot();
|
Bundle snapshot1 = mPerfCollector.endSnapshot();
|
||||||
Bundle snapshot2 = writer.snapshotResults;
|
Bundle snapshot2 = writer.snapshotResults;
|
||||||
|
|
||||||
assertTrue(snapshot1.equals(snapshot2));
|
assertEqualsBundle(snapshot1, snapshot2);
|
||||||
verifySnapshotBundle(snapshot1);
|
verifySnapshotBundle(snapshot1);
|
||||||
|
|
||||||
ArrayList<String> labels = new ArrayList<String>();
|
ArrayList<String> labels = new ArrayList<String>();
|
||||||
@@ -193,60 +264,59 @@ public class PerformanceCollectorTest extends TestCase {
|
|||||||
verifyTimingBundle(timing, labels);
|
verifyTimingBundle(timing, labels);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: flaky test
|
@SmallTest
|
||||||
// @LargeTest
|
|
||||||
public void testLongSequence() throws Exception {
|
public void testLongSequence() throws Exception {
|
||||||
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
||||||
mPerfCollector.setPerformanceResultsWriter(writer);
|
mPerfCollector.setPerformanceResultsWriter(writer);
|
||||||
mPerfCollector.beginSnapshot("testLongSequence");
|
mPerfCollector.beginSnapshot("testLongSequence");
|
||||||
mPerfCollector.startTiming("testLongSequenceTiming1");
|
mPerfCollector.startTiming("testLongSequenceTiming1");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration1");
|
mPerfCollector.addIteration("iteration1");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration2");
|
mPerfCollector.addIteration("iteration2");
|
||||||
sleepForRandomShortPeriod();
|
workForRandomShortPeriod();
|
||||||
Bundle timing1 = mPerfCollector.stopTiming("iteration3");
|
Bundle timing1 = mPerfCollector.stopTiming("iteration3");
|
||||||
sleepForRandomLongPeriod();
|
workForRandomLongPeriod();
|
||||||
|
|
||||||
mPerfCollector.startTiming("testLongSequenceTiming2");
|
mPerfCollector.startTiming("testLongSequenceTiming2");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration4");
|
mPerfCollector.addIteration("iteration4");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration5");
|
mPerfCollector.addIteration("iteration5");
|
||||||
sleepForRandomShortPeriod();
|
workForRandomShortPeriod();
|
||||||
Bundle timing2 = mPerfCollector.stopTiming("iteration6");
|
Bundle timing2 = mPerfCollector.stopTiming("iteration6");
|
||||||
sleepForRandomLongPeriod();
|
workForRandomLongPeriod();
|
||||||
|
|
||||||
mPerfCollector.startTiming("testLongSequenceTiming3");
|
mPerfCollector.startTiming("testLongSequenceTiming3");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration7");
|
mPerfCollector.addIteration("iteration7");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration8");
|
mPerfCollector.addIteration("iteration8");
|
||||||
sleepForRandomShortPeriod();
|
workForRandomShortPeriod();
|
||||||
Bundle timing3 = mPerfCollector.stopTiming("iteration9");
|
Bundle timing3 = mPerfCollector.stopTiming("iteration9");
|
||||||
sleepForRandomLongPeriod();
|
workForRandomLongPeriod();
|
||||||
|
|
||||||
mPerfCollector.startTiming("testLongSequenceTiming4");
|
mPerfCollector.startTiming("testLongSequenceTiming4");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration10");
|
mPerfCollector.addIteration("iteration10");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration11");
|
mPerfCollector.addIteration("iteration11");
|
||||||
sleepForRandomShortPeriod();
|
workForRandomShortPeriod();
|
||||||
Bundle timing4 = mPerfCollector.stopTiming("iteration12");
|
Bundle timing4 = mPerfCollector.stopTiming("iteration12");
|
||||||
sleepForRandomLongPeriod();
|
workForRandomLongPeriod();
|
||||||
|
|
||||||
mPerfCollector.startTiming("testLongSequenceTiming5");
|
mPerfCollector.startTiming("testLongSequenceTiming5");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration13");
|
mPerfCollector.addIteration("iteration13");
|
||||||
sleepForRandomTinyPeriod();
|
workForRandomTinyPeriod();
|
||||||
mPerfCollector.addIteration("iteration14");
|
mPerfCollector.addIteration("iteration14");
|
||||||
sleepForRandomShortPeriod();
|
workForRandomShortPeriod();
|
||||||
Bundle timing5 = mPerfCollector.stopTiming("iteration15");
|
Bundle timing5 = mPerfCollector.stopTiming("iteration15");
|
||||||
sleepForRandomLongPeriod();
|
workForRandomLongPeriod();
|
||||||
Bundle snapshot1 = mPerfCollector.endSnapshot();
|
Bundle snapshot1 = mPerfCollector.endSnapshot();
|
||||||
Bundle snapshot2 = writer.snapshotResults;
|
Bundle snapshot2 = writer.snapshotResults;
|
||||||
|
|
||||||
assertTrue(snapshot1.equals(snapshot2));
|
assertEqualsBundle(snapshot1, snapshot2);
|
||||||
verifySnapshotBundle(snapshot1);
|
verifySnapshotBundle(snapshot1);
|
||||||
|
|
||||||
ArrayList<String> labels1 = new ArrayList<String>();
|
ArrayList<String> labels1 = new ArrayList<String>();
|
||||||
@@ -280,57 +350,53 @@ public class PerformanceCollectorTest extends TestCase {
|
|||||||
* Verify that snapshotting and timing do not interfere w/ each other,
|
* Verify that snapshotting and timing do not interfere w/ each other,
|
||||||
* by staggering calls to snapshot and timing functions.
|
* by staggering calls to snapshot and timing functions.
|
||||||
*/
|
*/
|
||||||
@LargeTest
|
@SmallTest
|
||||||
public void testOutOfOrderSequence() {
|
public void testOutOfOrderSequence() {
|
||||||
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
|
||||||
mPerfCollector.setPerformanceResultsWriter(writer);
|
mPerfCollector.setPerformanceResultsWriter(writer);
|
||||||
mPerfCollector.startTiming("testOutOfOrderSequenceTiming");
|
mPerfCollector.startTiming("testOutOfOrderSequenceTiming");
|
||||||
sleepForRandomShortPeriod();
|
workForRandomShortPeriod();
|
||||||
mPerfCollector.beginSnapshot("testOutOfOrderSequenceSnapshot");
|
mPerfCollector.beginSnapshot("testOutOfOrderSequenceSnapshot");
|
||||||
sleepForRandomShortPeriod();
|
workForRandomShortPeriod();
|
||||||
Bundle timing1 = mPerfCollector.stopTiming("timing1");
|
Bundle timing1 = mPerfCollector.stopTiming("timing1");
|
||||||
sleepForRandomShortPeriod();
|
workForRandomShortPeriod();
|
||||||
Bundle snapshot1 = mPerfCollector.endSnapshot();
|
Bundle snapshot1 = mPerfCollector.endSnapshot();
|
||||||
|
|
||||||
Bundle timing2 = writer.timingResults;
|
Bundle timing2 = writer.timingResults;
|
||||||
Bundle snapshot2 = writer.snapshotResults;
|
Bundle snapshot2 = writer.snapshotResults;
|
||||||
|
|
||||||
assertTrue(snapshot1.equals(snapshot2));
|
assertEqualsBundle(snapshot1, snapshot2);
|
||||||
verifySnapshotBundle(snapshot1);
|
verifySnapshotBundle(snapshot1);
|
||||||
|
|
||||||
assertTrue(timing1.equals(timing2));
|
assertEqualsBundle(timing1, timing2);
|
||||||
ArrayList<String> labels = new ArrayList<String>();
|
ArrayList<String> labels = new ArrayList<String>();
|
||||||
labels.add("timing1");
|
labels.add("timing1");
|
||||||
verifyTimingBundle(timing1, labels);
|
verifyTimingBundle(timing1, labels);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sleepForRandomPeriod(int minDuration, int maxDuration) {
|
private void workForRandomPeriod(int minDuration, int maxDuration) {
|
||||||
Random random = new Random();
|
Random random = new Random();
|
||||||
int period = minDuration + random.nextInt(maxDuration - minDuration);
|
int period = minDuration + random.nextInt(maxDuration - minDuration);
|
||||||
int slept = 0;
|
long start = Process.getElapsedCpuTime();
|
||||||
// Generate random positive amount of work, so cpu time is measurable in
|
// Generate positive amount of work, so cpu time is measurable in
|
||||||
// milliseconds
|
// milliseconds
|
||||||
while (slept < period) {
|
while (Process.getElapsedCpuTime() - start < period) {
|
||||||
int step = random.nextInt(minDuration/5);
|
for (int i = 0, temp = 0; i < 50; i++ ) {
|
||||||
try {
|
temp += i;
|
||||||
Thread.sleep(step);
|
|
||||||
} catch (InterruptedException e ) {
|
|
||||||
// eat the exception
|
|
||||||
}
|
}
|
||||||
slept += step;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sleepForRandomTinyPeriod() {
|
private void workForRandomTinyPeriod() {
|
||||||
sleepForRandomPeriod(25, 50);
|
workForRandomPeriod(2, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sleepForRandomShortPeriod() {
|
private void workForRandomShortPeriod() {
|
||||||
sleepForRandomPeriod(100, 250);
|
workForRandomPeriod(10, 25);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sleepForRandomLongPeriod() {
|
private void workForRandomLongPeriod() {
|
||||||
sleepForRandomPeriod(500, 1000);
|
workForRandomPeriod(50, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void verifySnapshotBundle(Bundle snapshot) {
|
private void verifySnapshotBundle(Bundle snapshot) {
|
||||||
@@ -411,6 +477,13 @@ public class PerformanceCollectorTest extends TestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void assertEqualsBundle(Bundle b1, Bundle b2) {
|
||||||
|
assertEquals(b1.keySet(), b2.keySet());
|
||||||
|
for (String key : b1.keySet()) {
|
||||||
|
assertEquals(b1.get(key), b2.get(key));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Object readPrivateField(String fieldName, Object object) throws Exception {
|
private Object readPrivateField(String fieldName, Object object) throws Exception {
|
||||||
Field f = object.getClass().getDeclaredField(fieldName);
|
Field f = object.getClass().getDeclaredField(fieldName);
|
||||||
f.setAccessible(true);
|
f.setAccessible(true);
|
||||||
@@ -429,7 +502,7 @@ public class PerformanceCollectorTest extends TestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void writeEndSnapshot(Bundle results) {
|
public void writeEndSnapshot(Bundle results) {
|
||||||
snapshotResults = results;
|
snapshotResults.putAll(results);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeStartTiming(String label) {
|
public void writeStartTiming(String label) {
|
||||||
@@ -437,7 +510,19 @@ public class PerformanceCollectorTest extends TestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void writeStopTiming(Bundle results) {
|
public void writeStopTiming(Bundle results) {
|
||||||
timingResults = results;
|
timingResults.putAll(results);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeMeasurement(String label, long value) {
|
||||||
|
timingResults.putLong(label, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeMeasurement(String label, float value) {
|
||||||
|
timingResults.putFloat(label, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeMeasurement(String label, String value) {
|
||||||
|
timingResults.putString(label, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user