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
171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage android.os;
18ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
19ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport android.os.PerformanceCollector.PerformanceResultsWriter;
20f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.test.suitebuilder.annotation.MediumTest;
21075997f12e2fb2b646172a92926be0f26f739099Jack Wangimport android.test.suitebuilder.annotation.SmallTest;
22ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
23ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport java.lang.reflect.Field;
24ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport java.util.ArrayList;
25ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport java.util.Random;
26ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
27ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangimport junit.framework.TestCase;
28ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
29ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wangpublic class PerformanceCollectorTest extends TestCase {
30ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
31ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private PerformanceCollector mPerfCollector;
32ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
33ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    @Override
34ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    protected void setUp() throws Exception {
35ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        super.setUp();
36ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector = new PerformanceCollector();
37ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
38ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
39ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    @Override
40ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    protected void tearDown() throws Exception {
41ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        super.tearDown();
42ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector = null;
43ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
44ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
45075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
46ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testBeginSnapshotNoWriter() throws Exception {
47ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testBeginSnapshotNoWriter");
48ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
49ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mSnapshotCpuTime", mPerfCollector) > 0);
50ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mSnapshotExecTime", mPerfCollector) > 0);
51ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot = (Bundle)readPrivateField("mPerfSnapshot", mPerfCollector);
52ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertNotNull(snapshot);
53ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals(2, snapshot.size());
54ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
55ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
56f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @MediumTest
57ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testEndSnapshotNoWriter() throws Exception {
58ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testEndSnapshotNoWriter");
59075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
60ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot = mPerfCollector.endSnapshot();
61ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
62ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifySnapshotBundle(snapshot);
63ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
64ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
65075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
66ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testStartTimingNoWriter() throws Exception {
67ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testStartTimingNoWriter");
68ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
69ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mCpuTime", mPerfCollector) > 0);
70ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mExecTime", mPerfCollector) > 0);
71ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle measurement = (Bundle)readPrivateField("mPerfMeasurement", mPerfCollector);
72ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertNotNull(measurement);
73ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(measurement, new ArrayList<String>());
74ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
75ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
76075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
77ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testAddIterationNoWriter() throws Exception {
78ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testAddIterationNoWriter");
79075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
80ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle iteration = mPerfCollector.addIteration("timing1");
81ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
82ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyIterationBundle(iteration, "timing1");
83ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
84ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
85075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
86ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testStopTimingNoWriter() throws Exception {
87ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testStopTimingNoWriter");
88075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
89ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("timing2");
90075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
91ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("timing3");
92075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
93ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing = mPerfCollector.stopTiming("timing4");
94ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
95ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels = new ArrayList<String>();
96ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing2");
97ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing3");
98ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing4");
99ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing, labels);
100ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
101ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
102075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
103ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testBeginSnapshot() throws Exception {
104ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
105ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
106ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testBeginSnapshot");
107ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
108ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals("testBeginSnapshot", writer.snapshotLabel);
109ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mSnapshotCpuTime", mPerfCollector) > 0);
110ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mSnapshotExecTime", mPerfCollector) > 0);
111ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot = (Bundle)readPrivateField("mPerfSnapshot", mPerfCollector);
112ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertNotNull(snapshot);
113ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals(2, snapshot.size());
114ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
115ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
116f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @MediumTest
117ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testEndSnapshot() throws Exception {
118ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
119ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
120ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testEndSnapshot");
121075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
122ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot1 = mPerfCollector.endSnapshot();
123ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot2 = writer.snapshotResults;
124ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
125075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEqualsBundle(snapshot1, snapshot2);
126ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifySnapshotBundle(snapshot1);
127ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
128ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
129075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
130ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testStartTiming() throws Exception {
131ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
132ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
133ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testStartTiming");
134ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
135ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals("testStartTiming", writer.timingLabel);
136ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mCpuTime", mPerfCollector) > 0);
137ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue((Long)readPrivateField("mExecTime", mPerfCollector) > 0);
138ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle measurement = (Bundle)readPrivateField("mPerfMeasurement", mPerfCollector);
139ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertNotNull(measurement);
140ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(measurement, new ArrayList<String>());
141ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
142ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
143075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
144ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testAddIteration() throws Exception {
145ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testAddIteration");
146075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
147ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle iteration = mPerfCollector.addIteration("timing5");
148ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
149ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyIterationBundle(iteration, "timing5");
150ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
151ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
152075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
153ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testStopTiming() throws Exception {
154ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testStopTiming");
155075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
156ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("timing6");
157075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
158ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("timing7");
159075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
160ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing = mPerfCollector.stopTiming("timing8");
161ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
162ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels = new ArrayList<String>();
163ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing6");
164ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing7");
165ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing8");
166ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing, labels);
167ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
168ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
169075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
170075997f12e2fb2b646172a92926be0f26f739099Jack Wang    public void testAddMeasurementLong() throws Exception {
171075997f12e2fb2b646172a92926be0f26f739099Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
172075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
173075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.startTiming("testAddMeasurementLong");
174075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementLongZero", 0);
175075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementLongPos", 348573);
176075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementLongNeg", -19354);
177075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.stopTiming("");
178075997f12e2fb2b646172a92926be0f26f739099Jack Wang
179075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals("testAddMeasurementLong", writer.timingLabel);
180075997f12e2fb2b646172a92926be0f26f739099Jack Wang        Bundle results = writer.timingResults;
181075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(4, results.size());
182075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementLongZero"));
183075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(0, results.getLong("testAddMeasurementLongZero"));
184075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementLongPos"));
185075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(348573, results.getLong("testAddMeasurementLongPos"));
186075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementLongNeg"));
187075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(-19354, results.getLong("testAddMeasurementLongNeg"));
188075997f12e2fb2b646172a92926be0f26f739099Jack Wang    }
189075997f12e2fb2b646172a92926be0f26f739099Jack Wang
190075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
191075997f12e2fb2b646172a92926be0f26f739099Jack Wang    public void testAddMeasurementFloat() throws Exception {
192075997f12e2fb2b646172a92926be0f26f739099Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
193075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
194075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.startTiming("testAddMeasurementFloat");
195075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementFloatZero", 0.0f);
196075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementFloatPos", 348573.345f);
197075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementFloatNeg", -19354.093f);
198075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.stopTiming("");
199075997f12e2fb2b646172a92926be0f26f739099Jack Wang
200075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals("testAddMeasurementFloat", writer.timingLabel);
201075997f12e2fb2b646172a92926be0f26f739099Jack Wang        Bundle results = writer.timingResults;
202075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(4, results.size());
203075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementFloatZero"));
204075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(0.0f, results.getFloat("testAddMeasurementFloatZero"));
205075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementFloatPos"));
206075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(348573.345f, results.getFloat("testAddMeasurementFloatPos"));
207075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementFloatNeg"));
208075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(-19354.093f, results.getFloat("testAddMeasurementFloatNeg"));
209075997f12e2fb2b646172a92926be0f26f739099Jack Wang    }
210075997f12e2fb2b646172a92926be0f26f739099Jack Wang
211075997f12e2fb2b646172a92926be0f26f739099Jack Wang    @SmallTest
212075997f12e2fb2b646172a92926be0f26f739099Jack Wang    public void testAddMeasurementString() throws Exception {
213075997f12e2fb2b646172a92926be0f26f739099Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
214075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
215075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.startTiming("testAddMeasurementString");
216075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementStringNull", null);
217075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementStringEmpty", "");
218075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.addMeasurement("testAddMeasurementStringNonEmpty", "Hello World");
219075997f12e2fb2b646172a92926be0f26f739099Jack Wang        mPerfCollector.stopTiming("");
220075997f12e2fb2b646172a92926be0f26f739099Jack Wang
221075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals("testAddMeasurementString", writer.timingLabel);
222075997f12e2fb2b646172a92926be0f26f739099Jack Wang        Bundle results = writer.timingResults;
223075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(4, results.size());
224075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementStringNull"));
225075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertNull(results.getString("testAddMeasurementStringNull"));
226075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementStringEmpty"));
227075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals("", results.getString("testAddMeasurementStringEmpty"));
228075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertTrue(results.containsKey("testAddMeasurementStringNonEmpty"));
229075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals("Hello World", results.getString("testAddMeasurementStringNonEmpty"));
230075997f12e2fb2b646172a92926be0f26f739099Jack Wang    }
231075997f12e2fb2b646172a92926be0f26f739099Jack Wang
232f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @MediumTest
233ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testSimpleSequence() throws Exception {
234ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
235ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
236ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testSimpleSequence");
237ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testSimpleSequenceTiming");
238075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
239ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration1");
240075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
241ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration2");
242075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
243ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration3");
244075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
245ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration4");
246075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
247ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing = mPerfCollector.stopTiming("iteration5");
248075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
249ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot1 = mPerfCollector.endSnapshot();
250ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot2 = writer.snapshotResults;
251ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
252075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEqualsBundle(snapshot1, snapshot2);
253ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifySnapshotBundle(snapshot1);
254ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
255ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels = new ArrayList<String>();
256ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("iteration1");
257ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("iteration2");
258ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("iteration3");
259ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("iteration4");
260ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("iteration5");
261ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing, labels);
262ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
263ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
264f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @MediumTest
265ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testLongSequence() throws Exception {
266ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
267ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
268ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testLongSequence");
269ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testLongSequenceTiming1");
270075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
271ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration1");
272075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
273ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration2");
274075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
275ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing1 = mPerfCollector.stopTiming("iteration3");
276075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
277ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
278ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testLongSequenceTiming2");
279075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
280ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration4");
281075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
282ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration5");
283075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
284ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing2 = mPerfCollector.stopTiming("iteration6");
285075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
286ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
287ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testLongSequenceTiming3");
288075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
289ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration7");
290075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
291ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration8");
292075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
293ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing3 = mPerfCollector.stopTiming("iteration9");
294075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
295ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
296ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testLongSequenceTiming4");
297075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
298ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration10");
299075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
300ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration11");
301075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
302ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing4 = mPerfCollector.stopTiming("iteration12");
303075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
304ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
305ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testLongSequenceTiming5");
306075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
307ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration13");
308075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomTinyPeriod();
309ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.addIteration("iteration14");
310075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
311ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing5 = mPerfCollector.stopTiming("iteration15");
312075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomLongPeriod();
313ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot1 = mPerfCollector.endSnapshot();
314ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot2 = writer.snapshotResults;
315ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
316075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEqualsBundle(snapshot1, snapshot2);
317ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifySnapshotBundle(snapshot1);
318ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
319ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels1 = new ArrayList<String>();
320ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels1.add("iteration1");
321ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels1.add("iteration2");
322ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels1.add("iteration3");
323ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing1, labels1);
324ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels2 = new ArrayList<String>();
325ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels2.add("iteration4");
326ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels2.add("iteration5");
327ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels2.add("iteration6");
328ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing2, labels2);
329ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels3 = new ArrayList<String>();
330ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels3.add("iteration7");
331ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels3.add("iteration8");
332ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels3.add("iteration9");
333ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing3, labels3);
334ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels4 = new ArrayList<String>();
335ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels4.add("iteration10");
336ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels4.add("iteration11");
337ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels4.add("iteration12");
338ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing4, labels4);
339ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels5 = new ArrayList<String>();
340ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels5.add("iteration13");
341ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels5.add("iteration14");
342ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels5.add("iteration15");
343ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing5, labels5);
344ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
345ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
346ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    /*
347ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang     * Verify that snapshotting and timing do not interfere w/ each other,
348ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang     * by staggering calls to snapshot and timing functions.
349ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang     */
350f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot    @MediumTest
351ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    public void testOutOfOrderSequence() {
352ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter();
353ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.setPerformanceResultsWriter(writer);
354ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.startTiming("testOutOfOrderSequenceTiming");
355075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
356ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        mPerfCollector.beginSnapshot("testOutOfOrderSequenceSnapshot");
357075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
358ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing1 = mPerfCollector.stopTiming("timing1");
359075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomShortPeriod();
360ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot1 = mPerfCollector.endSnapshot();
361ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
362ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle timing2 = writer.timingResults;
363ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Bundle snapshot2 = writer.snapshotResults;
364ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
365075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEqualsBundle(snapshot1, snapshot2);
366ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifySnapshotBundle(snapshot1);
367ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
368075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEqualsBundle(timing1, timing2);
369ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<String> labels = new ArrayList<String>();
370ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        labels.add("timing1");
371ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        verifyTimingBundle(timing1, labels);
372ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
373ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
374075997f12e2fb2b646172a92926be0f26f739099Jack Wang    private void workForRandomPeriod(int minDuration, int maxDuration) {
375ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Random random = new Random();
376ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        int period = minDuration + random.nextInt(maxDuration - minDuration);
377075997f12e2fb2b646172a92926be0f26f739099Jack Wang        long start = Process.getElapsedCpuTime();
378075997f12e2fb2b646172a92926be0f26f739099Jack Wang        // Generate positive amount of work, so cpu time is measurable in
379ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        // milliseconds
380075997f12e2fb2b646172a92926be0f26f739099Jack Wang        while (Process.getElapsedCpuTime() - start < period) {
381075997f12e2fb2b646172a92926be0f26f739099Jack Wang            for (int i = 0, temp = 0; i < 50; i++ ) {
382075997f12e2fb2b646172a92926be0f26f739099Jack Wang                temp += i;
383ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang            }
384ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        }
385ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
386ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
387075997f12e2fb2b646172a92926be0f26f739099Jack Wang    private void workForRandomTinyPeriod() {
388075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomPeriod(2, 5);
389ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
390ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
391075997f12e2fb2b646172a92926be0f26f739099Jack Wang    private void workForRandomShortPeriod() {
392075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomPeriod(10, 25);
393ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
394ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
395075997f12e2fb2b646172a92926be0f26f739099Jack Wang    private void workForRandomLongPeriod() {
396075997f12e2fb2b646172a92926be0f26f739099Jack Wang        workForRandomPeriod(50, 100);
397ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
398ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
399ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private void verifySnapshotBundle(Bundle snapshot) {
400ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue("At least 26 metrics collected", 26 <= snapshot.size());
401ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
402ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_CPU_TIME));
403ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_CPU_TIME) > 0);
404ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_EXECUTION_TIME));
405ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_EXECUTION_TIME) > 0);
406ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
407ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(
408ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang                PerformanceCollector.METRIC_KEY_PRE_RECEIVED_TRANSACTIONS));
409ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_PRE_SENT_TRANSACTIONS));
410ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_RECEIVED_TRANSACTIONS));
411ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_SENT_TRANSACTIONS));
412ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GC_INVOCATION_COUNT));
413ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
414ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_ALLOCATED));
415ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_ALLOCATED) > 0);
416ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_FREE));
417ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_FREE) > 0);
418ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_PRIVATE_DIRTY));
419ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_PRIVATE_DIRTY) > 0);
420ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_PSS));
421ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_PSS) > 0);
422ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_SHARED_DIRTY));
423ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_SHARED_DIRTY) > 0);
424ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_SIZE));
425ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_SIZE) > 0);
426ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_ALLOCATED));
427ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_ALLOCATED) > 0);
428ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_FREE));
429ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_FREE) > 0);
430ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_PRIVATE_DIRTY));
431ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_PRIVATE_DIRTY) > 0);
432ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_PSS));
433ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_PSS) > 0);
434ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_SHARED_DIRTY));
435ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_SHARED_DIRTY) > 0);
436ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_SIZE));
437ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_SIZE) > 0);
438ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GLOBAL_ALLOC_COUNT));
439ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_GLOBAL_ALLOC_COUNT) > 0);
440ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GLOBAL_ALLOC_SIZE));
441ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_GLOBAL_ALLOC_SIZE) > 0);
442ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GLOBAL_FREED_COUNT));
443ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_GLOBAL_FREED_COUNT) > 0);
444ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GLOBAL_FREED_SIZE));
445ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_GLOBAL_FREED_SIZE) > 0);
446ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_OTHER_PRIVATE_DIRTY));
447ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_OTHER_PRIVATE_DIRTY) > 0);
448ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_OTHER_PSS));
449ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_OTHER_PSS) > 0);
450ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_OTHER_SHARED_DIRTY));
451ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_OTHER_SHARED_DIRTY) > 0);
452ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
453ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
454ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private void verifyIterationBundle(Bundle iteration, String label) {
455ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals(3, iteration.size());
456ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(iteration.containsKey(PerformanceCollector.METRIC_KEY_LABEL));
457ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals(label, iteration.getString(PerformanceCollector.METRIC_KEY_LABEL));
458ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(iteration.containsKey(PerformanceCollector.METRIC_KEY_CPU_TIME));
459ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(iteration.getLong(PerformanceCollector.METRIC_KEY_CPU_TIME) > 0);
460ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(iteration.containsKey(PerformanceCollector.METRIC_KEY_EXECUTION_TIME));
461ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(iteration.getLong(PerformanceCollector.METRIC_KEY_EXECUTION_TIME) > 0);
462ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
463ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
464ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private void verifyTimingBundle(Bundle timing, ArrayList<String> labels) {
465ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals(1, timing.size());
466ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertTrue(timing.containsKey(PerformanceCollector.METRIC_KEY_ITERATIONS));
467ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        ArrayList<Parcelable> iterations = timing.getParcelableArrayList(
468ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang                PerformanceCollector.METRIC_KEY_ITERATIONS);
469ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertNotNull(iterations);
470ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        assertEquals(labels.size(), iterations.size());
471ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        for (int i = 0; i < labels.size(); i ++) {
472ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang            Bundle iteration = (Bundle)iterations.get(i);
473ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang            verifyIterationBundle(iteration, labels.get(i));
474ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        }
475ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
476ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
477075997f12e2fb2b646172a92926be0f26f739099Jack Wang    private void assertEqualsBundle(Bundle b1, Bundle b2) {
478075997f12e2fb2b646172a92926be0f26f739099Jack Wang        assertEquals(b1.keySet(), b2.keySet());
479075997f12e2fb2b646172a92926be0f26f739099Jack Wang        for (String key : b1.keySet()) {
480075997f12e2fb2b646172a92926be0f26f739099Jack Wang            assertEquals(b1.get(key), b2.get(key));
481075997f12e2fb2b646172a92926be0f26f739099Jack Wang        }
482075997f12e2fb2b646172a92926be0f26f739099Jack Wang    }
483075997f12e2fb2b646172a92926be0f26f739099Jack Wang
484ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private Object readPrivateField(String fieldName, Object object) throws Exception {
485ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        Field f = object.getClass().getDeclaredField(fieldName);
486ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        f.setAccessible(true);
487ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        return f.get(object);
488ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
489ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
490ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    private class MockPerformanceResultsWriter implements PerformanceResultsWriter {
491ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
492ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public String snapshotLabel;
493ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public Bundle snapshotResults = new Bundle();
494ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public String timingLabel;
495ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public Bundle timingResults = new Bundle();
496ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
497ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public void writeBeginSnapshot(String label) {
498ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang            snapshotLabel = label;
499ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        }
500ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
501ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public void writeEndSnapshot(Bundle results) {
502075997f12e2fb2b646172a92926be0f26f739099Jack Wang            snapshotResults.putAll(results);
503ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        }
504ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
505ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public void writeStartTiming(String label) {
506ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang            timingLabel = label;
507ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        }
508ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang
509ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        public void writeStopTiming(Bundle results) {
510075997f12e2fb2b646172a92926be0f26f739099Jack Wang            timingResults.putAll(results);
511075997f12e2fb2b646172a92926be0f26f739099Jack Wang        }
512075997f12e2fb2b646172a92926be0f26f739099Jack Wang
513075997f12e2fb2b646172a92926be0f26f739099Jack Wang        public void writeMeasurement(String label, long value) {
514075997f12e2fb2b646172a92926be0f26f739099Jack Wang            timingResults.putLong(label, value);
515075997f12e2fb2b646172a92926be0f26f739099Jack Wang        }
516075997f12e2fb2b646172a92926be0f26f739099Jack Wang
517075997f12e2fb2b646172a92926be0f26f739099Jack Wang        public void writeMeasurement(String label, float value) {
518075997f12e2fb2b646172a92926be0f26f739099Jack Wang            timingResults.putFloat(label, value);
519075997f12e2fb2b646172a92926be0f26f739099Jack Wang        }
520075997f12e2fb2b646172a92926be0f26f739099Jack Wang
521075997f12e2fb2b646172a92926be0f26f739099Jack Wang        public void writeMeasurement(String label, String value) {
522075997f12e2fb2b646172a92926be0f26f739099Jack Wang            timingResults.putString(label, value);
523ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang        }
524ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang    }
525ff1df69dd4835c177c724e1b5f1ba02d1f674047Jack Wang}
526