PerformanceCollectorTest.java revision 075997f12e2fb2b646172a92926be0f26f739099
1ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang/*
2ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang * Copyright (C) 2009 The Android Open Source Project
3ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang *
4ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang * Licensed under the Apache License, Version 2.0 (the "License");
5ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang * you may not use this file except in compliance with the License.
6ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang * You may obtain a copy of the License at
7ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang *
8ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang *      http://www.apache.org/licenses/LICENSE-2.0
9ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang *
10ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang * Unless required by applicable law or agreed to in writing, software
11ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang * distributed under the License is distributed on an "AS IS" BASIS,
12ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang * See the License for the specific language governing permissions and
14ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang * limitations under the License.
15ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang */
16ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
17ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangpackage com.android.unit_tests.os;
18ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
19ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport android.os.Bundle;
20ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport android.os.Parcelable;
21ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport android.os.PerformanceCollector;
22075997f12e2fb2b646172a92926be0f26f739099Jack Wangimport android.os.Process;
23ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport android.os.PerformanceCollector.PerformanceResultsWriter;
24075997f12e2fb2b646172a92926be0f26f739099Jack Wangimport android.test.suitebuilder.annotation.SmallTest;
25ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
26ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport java.lang.reflect.Field;
27ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport java.util.ArrayList;
28ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport java.util.Random;
29ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
30ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport junit.framework.TestCase;
31ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
32ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangpublic class PerformanceCollectorTest extends TestCase {
33ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
34ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private PerformanceCollector mPerfCollector;
35ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
36ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    @Override
37ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    protected void setUp() throws Exception {
38ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        super.setUp();
39ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector = new PerformanceCollector();
40ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
41ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
42ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    @Override
43ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    protected void tearDown() throws Exception {
44ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        super.tearDown();
45ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector = null;
46ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
47ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
48075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
49ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testBeginSnapshotNoWriter() throws Exception {
50ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testBeginSnapshotNoWriter");
51ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
52ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mSnapshotCpuTime", mPerfCollector) > 0);
53ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mSnapshotExecTime", mPerfCollector) > 0);
54ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot = (Bundle)readPrivateField("mPerfSnapshot", mPerfCollector);
55ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertNotNull(snapshot);
56ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals(2, snapshot.size());
57ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
58ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
59075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
60ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testEndSnapshotNoWriter() throws Exception {
61ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testEndSnapshotNoWriter");
62075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
63ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot = mPerfCollector.endSnapshot();
64ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
65ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifySnapshotBundle(snapshot);
66ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
67ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
68075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
69ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testStartTimingNoWriter() throws Exception {
70ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testStartTimingNoWriter");
71ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
72ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mCpuTime", mPerfCollector) > 0);
73ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mExecTime", mPerfCollector) > 0);
74ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle measurement = (Bundle)readPrivateField("mPerfMeasurement", mPerfCollector);
75ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertNotNull(measurement);
76ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(measurement, new ArrayList<String>());
77ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
78ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
79075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
80ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testAddIterationNoWriter() throws Exception {
81ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testAddIterationNoWriter");
82075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
83ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle iteration = mPerfCollector.addIteration("timing1");
84ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
85ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyIterationBundle(iteration, "timing1");
86ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
87ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
88075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
89ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testStopTimingNoWriter() throws Exception {
90ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testStopTimingNoWriter");
91075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
92ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("timing2");
93075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
94ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("timing3");
95075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
96ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing = mPerfCollector.stopTiming("timing4");
97ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
98ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels = new ArrayList<String>();
99ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing2");
100ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing3");
101ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing4");
102ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing, labels);
103ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
104ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
105075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
106ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testBeginSnapshot() throws Exception {
107ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
108ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
109ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testBeginSnapshot");
110ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
111ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals("testBeginSnapshot", writer.snapshotLabel);
112ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mSnapshotCpuTime", mPerfCollector) > 0);
113ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mSnapshotExecTime", mPerfCollector) > 0);
114ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot = (Bundle)readPrivateField("mPerfSnapshot", mPerfCollector);
115ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertNotNull(snapshot);
116ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals(2, snapshot.size());
117ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
118ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
119075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
120ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testEndSnapshot() throws Exception {
121ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
122ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
123ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testEndSnapshot");
124075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
125ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot1 = mPerfCollector.endSnapshot();
126ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot2 = writer.snapshotResults;
127ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
128075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEqualsBundle(snapshot1, snapshot2);
129ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifySnapshotBundle(snapshot1);
130ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
131ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
132075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
133ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testStartTiming() throws Exception {
134ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
135ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
136ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testStartTiming");
137ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
138ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals("testStartTiming", writer.timingLabel);
139ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mCpuTime", mPerfCollector) > 0);
140ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mExecTime", mPerfCollector) > 0);
141ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle measurement = (Bundle)readPrivateField("mPerfMeasurement", mPerfCollector);
142ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertNotNull(measurement);
143ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(measurement, new ArrayList<String>());
144ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
145ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
146075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
147ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testAddIteration() throws Exception {
148ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testAddIteration");
149075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
150ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle iteration = mPerfCollector.addIteration("timing5");
151ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
152ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyIterationBundle(iteration, "timing5");
153ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
154ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
155075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
156ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testStopTiming() throws Exception {
157ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testStopTiming");
158075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
159ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("timing6");
160075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
161ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("timing7");
162075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
163ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing = mPerfCollector.stopTiming("timing8");
164ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
165ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels = new ArrayList<String>();
166ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing6");
167ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing7");
168ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing8");
169ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing, labels);
170ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
171ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
172075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
173075997f12e2fb2b646172a92926be0f26f739099Jack Wang    public void testAddMeasurementLong() throws Exception {
174075997f12e2fb2b646172a92926be0f26f739099Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
175075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
176075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.startTiming("testAddMeasurementLong");
177075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementLongZero", 0);
178075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementLongPos", 348573);
179075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementLongNeg", -19354);
180075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.stopTiming("");
181075997f12e2fb2b646172a92926be0f26f739099Jack Wang
182075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals("testAddMeasurementLong", writer.timingLabel);
183075997f12e2fb2b646172a92926be0f26f739099Jack Wang        Bundle results = writer.timingResults;
184075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(4, results.size());
185075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementLongZero"));
186075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(0, results.getLong("testAddMeasurementLongZero"));
187075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementLongPos"));
188075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(348573, results.getLong("testAddMeasurementLongPos"));
189075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementLongNeg"));
190075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(-19354, results.getLong("testAddMeasurementLongNeg"));
191075997f12e2fb2b646172a92926be0f26f739099Jack Wang    }
192075997f12e2fb2b646172a92926be0f26f739099Jack Wang
193075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
194075997f12e2fb2b646172a92926be0f26f739099Jack Wang    public void testAddMeasurementFloat() throws Exception {
195075997f12e2fb2b646172a92926be0f26f739099Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
196075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
197075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.startTiming("testAddMeasurementFloat");
198075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementFloatZero", 0.0f);
199075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementFloatPos", 348573.345f);
200075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementFloatNeg", -19354.093f);
201075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.stopTiming("");
202075997f12e2fb2b646172a92926be0f26f739099Jack Wang
203075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals("testAddMeasurementFloat", writer.timingLabel);
204075997f12e2fb2b646172a92926be0f26f739099Jack Wang        Bundle results = writer.timingResults;
205075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(4, results.size());
206075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementFloatZero"));
207075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(0.0f, results.getFloat("testAddMeasurementFloatZero"));
208075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementFloatPos"));
209075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(348573.345f, results.getFloat("testAddMeasurementFloatPos"));
210075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementFloatNeg"));
211075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(-19354.093f, results.getFloat("testAddMeasurementFloatNeg"));
212075997f12e2fb2b646172a92926be0f26f739099Jack Wang    }
213075997f12e2fb2b646172a92926be0f26f739099Jack Wang
214075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
215075997f12e2fb2b646172a92926be0f26f739099Jack Wang    public void testAddMeasurementString() throws Exception {
216075997f12e2fb2b646172a92926be0f26f739099Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
217075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
218075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.startTiming("testAddMeasurementString");
219075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementStringNull", null);
220075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementStringEmpty", "");
221075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementStringNonEmpty", "Hello World");
222075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.stopTiming("");
223075997f12e2fb2b646172a92926be0f26f739099Jack Wang
224075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals("testAddMeasurementString", writer.timingLabel);
225075997f12e2fb2b646172a92926be0f26f739099Jack Wang        Bundle results = writer.timingResults;
226075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(4, results.size());
227075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementStringNull"));
228075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertNull(results.getString("testAddMeasurementStringNull"));
229075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementStringEmpty"));
230075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals("", results.getString("testAddMeasurementStringEmpty"));
231075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementStringNonEmpty"));
232075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals("Hello World", results.getString("testAddMeasurementStringNonEmpty"));
233075997f12e2fb2b646172a92926be0f26f739099Jack Wang    }
234075997f12e2fb2b646172a92926be0f26f739099Jack Wang
235075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
236ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testSimpleSequence() throws Exception {
237ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
238ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
239ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testSimpleSequence");
240ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testSimpleSequenceTiming");
241075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
242ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration1");
243075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
244ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration2");
245075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
246ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration3");
247075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
248ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration4");
249075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
250ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing = mPerfCollector.stopTiming("iteration5");
251075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
252ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot1 = mPerfCollector.endSnapshot();
253ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot2 = writer.snapshotResults;
254ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
255075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEqualsBundle(snapshot1, snapshot2);
256ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifySnapshotBundle(snapshot1);
257ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
258ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels = new ArrayList<String>();
259ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("iteration1");
260ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("iteration2");
261ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("iteration3");
262ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("iteration4");
263ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("iteration5");
264ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing, labels);
265ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
266ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
267075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
268ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testLongSequence() throws Exception {
269ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
270ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
271ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testLongSequence");
272ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testLongSequenceTiming1");
273075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
274ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration1");
275075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
276ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration2");
277075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
278ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing1 = mPerfCollector.stopTiming("iteration3");
279075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
280ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
281ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testLongSequenceTiming2");
282075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
283ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration4");
284075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
285ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration5");
286075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
287ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing2 = mPerfCollector.stopTiming("iteration6");
288075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
289ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
290ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testLongSequenceTiming3");
291075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
292ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration7");
293075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
294ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration8");
295075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
296ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing3 = mPerfCollector.stopTiming("iteration9");
297075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
298ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
299ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testLongSequenceTiming4");
300075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
301ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration10");
302075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
303ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration11");
304075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
305ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing4 = mPerfCollector.stopTiming("iteration12");
306075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
307ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
308ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testLongSequenceTiming5");
309075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
310ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration13");
311075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
312ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration14");
313075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
314ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing5 = mPerfCollector.stopTiming("iteration15");
315075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
316ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot1 = mPerfCollector.endSnapshot();
317ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot2 = writer.snapshotResults;
318ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
319075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEqualsBundle(snapshot1, snapshot2);
320ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifySnapshotBundle(snapshot1);
321ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
322ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels1 = new ArrayList<String>();
323ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels1.add("iteration1");
324ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels1.add("iteration2");
325ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels1.add("iteration3");
326ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing1, labels1);
327ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels2 = new ArrayList<String>();
328ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels2.add("iteration4");
329ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels2.add("iteration5");
330ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels2.add("iteration6");
331ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing2, labels2);
332ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels3 = new ArrayList<String>();
333ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels3.add("iteration7");
334ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels3.add("iteration8");
335ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels3.add("iteration9");
336ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing3, labels3);
337ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels4 = new ArrayList<String>();
338ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels4.add("iteration10");
339ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels4.add("iteration11");
340ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels4.add("iteration12");
341ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing4, labels4);
342ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels5 = new ArrayList<String>();
343ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels5.add("iteration13");
344ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels5.add("iteration14");
345ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels5.add("iteration15");
346ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing5, labels5);
347ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
348ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
349ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    /*
350ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang     * Verify that snapshotting and timing do not interfere w/ each other,
351ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang     * by staggering calls to snapshot and timing functions.
352ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang     */
353075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
354ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testOutOfOrderSequence() {
355ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
356ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
357ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testOutOfOrderSequenceTiming");
358075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
359ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testOutOfOrderSequenceSnapshot");
360075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
361ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing1 = mPerfCollector.stopTiming("timing1");
362075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
363ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot1 = mPerfCollector.endSnapshot();
364ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
365ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing2 = writer.timingResults;
366ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot2 = writer.snapshotResults;
367ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
368075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEqualsBundle(snapshot1, snapshot2);
369ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifySnapshotBundle(snapshot1);
370ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
371075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEqualsBundle(timing1, timing2);
372ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels = new ArrayList<String>();
373ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing1");
374ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing1, labels);
375ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
376ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
377075997f12e2fb2b646172a92926be0f26f739099Jack Wang    private void workForRandomPeriod(int minDuration, int maxDuration) {
378ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Random random = new Random();
379ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        int period = minDuration + random.nextInt(maxDuration - minDuration);
380075997f12e2fb2b646172a92926be0f26f739099Jack Wang        long start = Process.getElapsedCpuTime();
381075997f12e2fb2b646172a92926be0f26f739099Jack Wang        // Generate positive amount of work, so cpu time is measurable in
382ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        // milliseconds
383075997f12e2fb2b646172a92926be0f26f739099Jack Wang        while (Process.getElapsedCpuTime() - start < period) {
384075997f12e2fb2b646172a92926be0f26f739099Jack Wang            for (int i = 0, temp = 0; i < 50; i++ ) {
385075997f12e2fb2b646172a92926be0f26f739099Jack Wang                temp += i;
386ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang            }
387ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        }
388ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
389ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
390075997f12e2fb2b646172a92926be0f26f739099Jack Wang    private void workForRandomTinyPeriod() {
391075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomPeriod(2, 5);
392ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
393ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
394075997f12e2fb2b646172a92926be0f26f739099Jack Wang    private void workForRandomShortPeriod() {
395075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomPeriod(10, 25);
396ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
397ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
398075997f12e2fb2b646172a92926be0f26f739099Jack Wang    private void workForRandomLongPeriod() {
399075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomPeriod(50, 100);
400ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
401ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
402ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private void verifySnapshotBundle(Bundle snapshot) {
403ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue("At least 26 metrics collected", 26 <= snapshot.size());
404ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
405ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_CPU_TIME));
406ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_CPU_TIME) > 0);
407ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_EXECUTION_TIME));
408ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_EXECUTION_TIME) > 0);
409ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
410ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(
411ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang                PerformanceCollector.METRIC_KEY_PRE_RECEIVED_TRANSACTIONS));
412ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_PRE_SENT_TRANSACTIONS));
413ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_RECEIVED_TRANSACTIONS));
414ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_SENT_TRANSACTIONS));
415ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GC_INVOCATION_COUNT));
416ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
417ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_ALLOCATED));
418ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_ALLOCATED) > 0);
419ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_FREE));
420ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_FREE) > 0);
421ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_PRIVATE_DIRTY));
422ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_PRIVATE_DIRTY) > 0);
423ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_PSS));
424ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_PSS) > 0);
425ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_SHARED_DIRTY));
426ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_SHARED_DIRTY) > 0);
427ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_SIZE));
428ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_SIZE) > 0);
429ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_ALLOCATED));
430ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_ALLOCATED) > 0);
431ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_FREE));
432ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_FREE) > 0);
433ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_PRIVATE_DIRTY));
434ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_PRIVATE_DIRTY) > 0);
435ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_PSS));
436ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_PSS) > 0);
437ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_SHARED_DIRTY));
438ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_SHARED_DIRTY) > 0);
439ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_SIZE));
440ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_SIZE) > 0);
441ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GLOBAL_ALLOC_COUNT));
442ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_GLOBAL_ALLOC_COUNT) > 0);
443ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GLOBAL_ALLOC_SIZE));
444ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_GLOBAL_ALLOC_SIZE) > 0);
445ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GLOBAL_FREED_COUNT));
446ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_GLOBAL_FREED_COUNT) > 0);
447ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GLOBAL_FREED_SIZE));
448ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_GLOBAL_FREED_SIZE) > 0);
449ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_OTHER_PRIVATE_DIRTY));
450ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_OTHER_PRIVATE_DIRTY) > 0);
451ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_OTHER_PSS));
452ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_OTHER_PSS) > 0);
453ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_OTHER_SHARED_DIRTY));
454ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_OTHER_SHARED_DIRTY) > 0);
455ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
456ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
457ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private void verifyIterationBundle(Bundle iteration, String label) {
458ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals(3, iteration.size());
459ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(iteration.containsKey(PerformanceCollector.METRIC_KEY_LABEL));
460ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals(label, iteration.getString(PerformanceCollector.METRIC_KEY_LABEL));
461ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(iteration.containsKey(PerformanceCollector.METRIC_KEY_CPU_TIME));
462ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(iteration.getLong(PerformanceCollector.METRIC_KEY_CPU_TIME) > 0);
463ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(iteration.containsKey(PerformanceCollector.METRIC_KEY_EXECUTION_TIME));
464ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(iteration.getLong(PerformanceCollector.METRIC_KEY_EXECUTION_TIME) > 0);
465ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
466ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
467ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private void verifyTimingBundle(Bundle timing, ArrayList<String> labels) {
468ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals(1, timing.size());
469ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(timing.containsKey(PerformanceCollector.METRIC_KEY_ITERATIONS));
470ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<Parcelable> iterations = timing.getParcelableArrayList(
471ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang                PerformanceCollector.METRIC_KEY_ITERATIONS);
472ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertNotNull(iterations);
473ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals(labels.size(), iterations.size());
474ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        for (int i = 0; i < labels.size(); i ++) {
475ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang            Bundle iteration = (Bundle)iterations.get(i);
476ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang            verifyIterationBundle(iteration, labels.get(i));
477ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        }
478ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
479ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
480075997f12e2fb2b646172a92926be0f26f739099Jack Wang    private void assertEqualsBundle(Bundle b1, Bundle b2) {
481075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(b1.keySet(), b2.keySet());
482075997f12e2fb2b646172a92926be0f26f739099Jack Wang        for (String key : b1.keySet()) {
483075997f12e2fb2b646172a92926be0f26f739099Jack Wang            assertEquals(b1.get(key), b2.get(key));
484075997f12e2fb2b646172a92926be0f26f739099Jack Wang        }
485075997f12e2fb2b646172a92926be0f26f739099Jack Wang    }
486075997f12e2fb2b646172a92926be0f26f739099Jack Wang
487ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private Object readPrivateField(String fieldName, Object object) throws Exception {
488ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Field f = object.getClass().getDeclaredField(fieldName);
489ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        f.setAccessible(true);
490ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        return f.get(object);
491ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
492ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
493ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private class MockPerformanceResultsWriter implements PerformanceResultsWriter {
494ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
495ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public String snapshotLabel;
496ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public Bundle snapshotResults = new Bundle();
497ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public String timingLabel;
498ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public Bundle timingResults = new Bundle();
499ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
500ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public void writeBeginSnapshot(String label) {
501ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang            snapshotLabel = label;
502ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        }
503ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
504ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public void writeEndSnapshot(Bundle results) {
505075997f12e2fb2b646172a92926be0f26f739099Jack Wang            snapshotResults.putAll(results);
506ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        }
507ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
508ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public void writeStartTiming(String label) {
509ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang            timingLabel = label;
510ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        }
511ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
512ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public void writeStopTiming(Bundle results) {
513075997f12e2fb2b646172a92926be0f26f739099Jack Wang            timingResults.putAll(results);
514075997f12e2fb2b646172a92926be0f26f739099Jack Wang        }
515075997f12e2fb2b646172a92926be0f26f739099Jack Wang
516075997f12e2fb2b646172a92926be0f26f739099Jack Wang        public void writeMeasurement(String label, long value) {
517075997f12e2fb2b646172a92926be0f26f739099Jack Wang            timingResults.putLong(label, value);
518075997f12e2fb2b646172a92926be0f26f739099Jack Wang        }
519075997f12e2fb2b646172a92926be0f26f739099Jack Wang
520075997f12e2fb2b646172a92926be0f26f739099Jack Wang        public void writeMeasurement(String label, float value) {
521075997f12e2fb2b646172a92926be0f26f739099Jack Wang            timingResults.putFloat(label, value);
522075997f12e2fb2b646172a92926be0f26f739099Jack Wang        }
523075997f12e2fb2b646172a92926be0f26f739099Jack Wang
524075997f12e2fb2b646172a92926be0f26f739099Jack Wang        public void writeMeasurement(String label, String value) {
525075997f12e2fb2b646172a92926be0f26f739099Jack Wang            timingResults.putString(label, value);
526ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        }
527ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
528ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang}
529