1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.os; 18 19 import android.os.PerformanceCollector.PerformanceResultsWriter; 20 import android.test.suitebuilder.annotation.MediumTest; 21 import android.test.suitebuilder.annotation.SmallTest; 22 23 import java.lang.reflect.Field; 24 import java.util.ArrayList; 25 import java.util.Random; 26 27 import junit.framework.TestCase; 28 29 public class PerformanceCollectorTest extends TestCase { 30 31 private PerformanceCollector mPerfCollector; 32 33 @Override 34 protected void setUp() throws Exception { 35 super.setUp(); 36 mPerfCollector = new PerformanceCollector(); 37 } 38 39 @Override 40 protected void tearDown() throws Exception { 41 super.tearDown(); 42 mPerfCollector = null; 43 } 44 45 @SmallTest 46 public void testBeginSnapshotNoWriter() throws Exception { 47 mPerfCollector.beginSnapshot("testBeginSnapshotNoWriter"); 48 49 assertTrue((Long)readPrivateField("mSnapshotCpuTime", mPerfCollector) > 0); 50 assertTrue((Long)readPrivateField("mSnapshotExecTime", mPerfCollector) > 0); 51 Bundle snapshot = (Bundle)readPrivateField("mPerfSnapshot", mPerfCollector); 52 assertNotNull(snapshot); 53 assertEquals(2, snapshot.size()); 54 } 55 56 @MediumTest 57 public void testEndSnapshotNoWriter() throws Exception { 58 mPerfCollector.beginSnapshot("testEndSnapshotNoWriter"); 59 workForRandomLongPeriod(); 60 Bundle snapshot = mPerfCollector.endSnapshot(); 61 62 verifySnapshotBundle(snapshot); 63 } 64 65 @SmallTest 66 public void testStartTimingNoWriter() throws Exception { 67 mPerfCollector.startTiming("testStartTimingNoWriter"); 68 69 assertTrue((Long)readPrivateField("mCpuTime", mPerfCollector) > 0); 70 assertTrue((Long)readPrivateField("mExecTime", mPerfCollector) > 0); 71 Bundle measurement = (Bundle)readPrivateField("mPerfMeasurement", mPerfCollector); 72 assertNotNull(measurement); 73 verifyTimingBundle(measurement, new ArrayList<String>()); 74 } 75 76 @SmallTest 77 public void testAddIterationNoWriter() throws Exception { 78 mPerfCollector.startTiming("testAddIterationNoWriter"); 79 workForRandomTinyPeriod(); 80 Bundle iteration = mPerfCollector.addIteration("timing1"); 81 82 verifyIterationBundle(iteration, "timing1"); 83 } 84 85 @SmallTest 86 public void testStopTimingNoWriter() throws Exception { 87 mPerfCollector.startTiming("testStopTimingNoWriter"); 88 workForRandomTinyPeriod(); 89 mPerfCollector.addIteration("timing2"); 90 workForRandomTinyPeriod(); 91 mPerfCollector.addIteration("timing3"); 92 workForRandomShortPeriod(); 93 Bundle timing = mPerfCollector.stopTiming("timing4"); 94 95 ArrayList<String> labels = new ArrayList<String>(); 96 labels.add("timing2"); 97 labels.add("timing3"); 98 labels.add("timing4"); 99 verifyTimingBundle(timing, labels); 100 } 101 102 @SmallTest 103 public void testBeginSnapshot() throws Exception { 104 MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter(); 105 mPerfCollector.setPerformanceResultsWriter(writer); 106 mPerfCollector.beginSnapshot("testBeginSnapshot"); 107 108 assertEquals("testBeginSnapshot", writer.snapshotLabel); 109 assertTrue((Long)readPrivateField("mSnapshotCpuTime", mPerfCollector) > 0); 110 assertTrue((Long)readPrivateField("mSnapshotExecTime", mPerfCollector) > 0); 111 Bundle snapshot = (Bundle)readPrivateField("mPerfSnapshot", mPerfCollector); 112 assertNotNull(snapshot); 113 assertEquals(2, snapshot.size()); 114 } 115 116 @MediumTest 117 public void testEndSnapshot() throws Exception { 118 MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter(); 119 mPerfCollector.setPerformanceResultsWriter(writer); 120 mPerfCollector.beginSnapshot("testEndSnapshot"); 121 workForRandomLongPeriod(); 122 Bundle snapshot1 = mPerfCollector.endSnapshot(); 123 Bundle snapshot2 = writer.snapshotResults; 124 125 assertEqualsBundle(snapshot1, snapshot2); 126 verifySnapshotBundle(snapshot1); 127 } 128 129 @SmallTest 130 public void testStartTiming() throws Exception { 131 MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter(); 132 mPerfCollector.setPerformanceResultsWriter(writer); 133 mPerfCollector.startTiming("testStartTiming"); 134 135 assertEquals("testStartTiming", writer.timingLabel); 136 assertTrue((Long)readPrivateField("mCpuTime", mPerfCollector) > 0); 137 assertTrue((Long)readPrivateField("mExecTime", mPerfCollector) > 0); 138 Bundle measurement = (Bundle)readPrivateField("mPerfMeasurement", mPerfCollector); 139 assertNotNull(measurement); 140 verifyTimingBundle(measurement, new ArrayList<String>()); 141 } 142 143 @SmallTest 144 public void testAddIteration() throws Exception { 145 mPerfCollector.startTiming("testAddIteration"); 146 workForRandomTinyPeriod(); 147 Bundle iteration = mPerfCollector.addIteration("timing5"); 148 149 verifyIterationBundle(iteration, "timing5"); 150 } 151 152 @SmallTest 153 public void testStopTiming() throws Exception { 154 mPerfCollector.startTiming("testStopTiming"); 155 workForRandomTinyPeriod(); 156 mPerfCollector.addIteration("timing6"); 157 workForRandomTinyPeriod(); 158 mPerfCollector.addIteration("timing7"); 159 workForRandomShortPeriod(); 160 Bundle timing = mPerfCollector.stopTiming("timing8"); 161 162 ArrayList<String> labels = new ArrayList<String>(); 163 labels.add("timing6"); 164 labels.add("timing7"); 165 labels.add("timing8"); 166 verifyTimingBundle(timing, labels); 167 } 168 169 @SmallTest 170 public void testAddMeasurementLong() throws Exception { 171 MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter(); 172 mPerfCollector.setPerformanceResultsWriter(writer); 173 mPerfCollector.startTiming("testAddMeasurementLong"); 174 mPerfCollector.addMeasurement("testAddMeasurementLongZero", 0); 175 mPerfCollector.addMeasurement("testAddMeasurementLongPos", 348573); 176 mPerfCollector.addMeasurement("testAddMeasurementLongNeg", -19354); 177 mPerfCollector.stopTiming(""); 178 179 assertEquals("testAddMeasurementLong", writer.timingLabel); 180 Bundle results = writer.timingResults; 181 assertEquals(4, results.size()); 182 assertTrue(results.containsKey("testAddMeasurementLongZero")); 183 assertEquals(0, results.getLong("testAddMeasurementLongZero")); 184 assertTrue(results.containsKey("testAddMeasurementLongPos")); 185 assertEquals(348573, results.getLong("testAddMeasurementLongPos")); 186 assertTrue(results.containsKey("testAddMeasurementLongNeg")); 187 assertEquals(-19354, results.getLong("testAddMeasurementLongNeg")); 188 } 189 190 @SmallTest 191 public void testAddMeasurementFloat() throws Exception { 192 MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter(); 193 mPerfCollector.setPerformanceResultsWriter(writer); 194 mPerfCollector.startTiming("testAddMeasurementFloat"); 195 mPerfCollector.addMeasurement("testAddMeasurementFloatZero", 0.0f); 196 mPerfCollector.addMeasurement("testAddMeasurementFloatPos", 348573.345f); 197 mPerfCollector.addMeasurement("testAddMeasurementFloatNeg", -19354.093f); 198 mPerfCollector.stopTiming(""); 199 200 assertEquals("testAddMeasurementFloat", writer.timingLabel); 201 Bundle results = writer.timingResults; 202 assertEquals(4, results.size()); 203 assertTrue(results.containsKey("testAddMeasurementFloatZero")); 204 assertEquals(0.0f, results.getFloat("testAddMeasurementFloatZero")); 205 assertTrue(results.containsKey("testAddMeasurementFloatPos")); 206 assertEquals(348573.345f, results.getFloat("testAddMeasurementFloatPos")); 207 assertTrue(results.containsKey("testAddMeasurementFloatNeg")); 208 assertEquals(-19354.093f, results.getFloat("testAddMeasurementFloatNeg")); 209 } 210 211 @SmallTest 212 public void testAddMeasurementString() throws Exception { 213 MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter(); 214 mPerfCollector.setPerformanceResultsWriter(writer); 215 mPerfCollector.startTiming("testAddMeasurementString"); 216 mPerfCollector.addMeasurement("testAddMeasurementStringNull", null); 217 mPerfCollector.addMeasurement("testAddMeasurementStringEmpty", ""); 218 mPerfCollector.addMeasurement("testAddMeasurementStringNonEmpty", "Hello World"); 219 mPerfCollector.stopTiming(""); 220 221 assertEquals("testAddMeasurementString", writer.timingLabel); 222 Bundle results = writer.timingResults; 223 assertEquals(4, results.size()); 224 assertTrue(results.containsKey("testAddMeasurementStringNull")); 225 assertNull(results.getString("testAddMeasurementStringNull")); 226 assertTrue(results.containsKey("testAddMeasurementStringEmpty")); 227 assertEquals("", results.getString("testAddMeasurementStringEmpty")); 228 assertTrue(results.containsKey("testAddMeasurementStringNonEmpty")); 229 assertEquals("Hello World", results.getString("testAddMeasurementStringNonEmpty")); 230 } 231 232 @MediumTest 233 public void testSimpleSequence() throws Exception { 234 MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter(); 235 mPerfCollector.setPerformanceResultsWriter(writer); 236 mPerfCollector.beginSnapshot("testSimpleSequence"); 237 mPerfCollector.startTiming("testSimpleSequenceTiming"); 238 workForRandomTinyPeriod(); 239 mPerfCollector.addIteration("iteration1"); 240 workForRandomTinyPeriod(); 241 mPerfCollector.addIteration("iteration2"); 242 workForRandomTinyPeriod(); 243 mPerfCollector.addIteration("iteration3"); 244 workForRandomTinyPeriod(); 245 mPerfCollector.addIteration("iteration4"); 246 workForRandomShortPeriod(); 247 Bundle timing = mPerfCollector.stopTiming("iteration5"); 248 workForRandomLongPeriod(); 249 Bundle snapshot1 = mPerfCollector.endSnapshot(); 250 Bundle snapshot2 = writer.snapshotResults; 251 252 assertEqualsBundle(snapshot1, snapshot2); 253 verifySnapshotBundle(snapshot1); 254 255 ArrayList<String> labels = new ArrayList<String>(); 256 labels.add("iteration1"); 257 labels.add("iteration2"); 258 labels.add("iteration3"); 259 labels.add("iteration4"); 260 labels.add("iteration5"); 261 verifyTimingBundle(timing, labels); 262 } 263 264 @MediumTest 265 public void testLongSequence() throws Exception { 266 MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter(); 267 mPerfCollector.setPerformanceResultsWriter(writer); 268 mPerfCollector.beginSnapshot("testLongSequence"); 269 mPerfCollector.startTiming("testLongSequenceTiming1"); 270 workForRandomTinyPeriod(); 271 mPerfCollector.addIteration("iteration1"); 272 workForRandomTinyPeriod(); 273 mPerfCollector.addIteration("iteration2"); 274 workForRandomShortPeriod(); 275 Bundle timing1 = mPerfCollector.stopTiming("iteration3"); 276 workForRandomLongPeriod(); 277 278 mPerfCollector.startTiming("testLongSequenceTiming2"); 279 workForRandomTinyPeriod(); 280 mPerfCollector.addIteration("iteration4"); 281 workForRandomTinyPeriod(); 282 mPerfCollector.addIteration("iteration5"); 283 workForRandomShortPeriod(); 284 Bundle timing2 = mPerfCollector.stopTiming("iteration6"); 285 workForRandomLongPeriod(); 286 287 mPerfCollector.startTiming("testLongSequenceTiming3"); 288 workForRandomTinyPeriod(); 289 mPerfCollector.addIteration("iteration7"); 290 workForRandomTinyPeriod(); 291 mPerfCollector.addIteration("iteration8"); 292 workForRandomShortPeriod(); 293 Bundle timing3 = mPerfCollector.stopTiming("iteration9"); 294 workForRandomLongPeriod(); 295 296 mPerfCollector.startTiming("testLongSequenceTiming4"); 297 workForRandomTinyPeriod(); 298 mPerfCollector.addIteration("iteration10"); 299 workForRandomTinyPeriod(); 300 mPerfCollector.addIteration("iteration11"); 301 workForRandomShortPeriod(); 302 Bundle timing4 = mPerfCollector.stopTiming("iteration12"); 303 workForRandomLongPeriod(); 304 305 mPerfCollector.startTiming("testLongSequenceTiming5"); 306 workForRandomTinyPeriod(); 307 mPerfCollector.addIteration("iteration13"); 308 workForRandomTinyPeriod(); 309 mPerfCollector.addIteration("iteration14"); 310 workForRandomShortPeriod(); 311 Bundle timing5 = mPerfCollector.stopTiming("iteration15"); 312 workForRandomLongPeriod(); 313 Bundle snapshot1 = mPerfCollector.endSnapshot(); 314 Bundle snapshot2 = writer.snapshotResults; 315 316 assertEqualsBundle(snapshot1, snapshot2); 317 verifySnapshotBundle(snapshot1); 318 319 ArrayList<String> labels1 = new ArrayList<String>(); 320 labels1.add("iteration1"); 321 labels1.add("iteration2"); 322 labels1.add("iteration3"); 323 verifyTimingBundle(timing1, labels1); 324 ArrayList<String> labels2 = new ArrayList<String>(); 325 labels2.add("iteration4"); 326 labels2.add("iteration5"); 327 labels2.add("iteration6"); 328 verifyTimingBundle(timing2, labels2); 329 ArrayList<String> labels3 = new ArrayList<String>(); 330 labels3.add("iteration7"); 331 labels3.add("iteration8"); 332 labels3.add("iteration9"); 333 verifyTimingBundle(timing3, labels3); 334 ArrayList<String> labels4 = new ArrayList<String>(); 335 labels4.add("iteration10"); 336 labels4.add("iteration11"); 337 labels4.add("iteration12"); 338 verifyTimingBundle(timing4, labels4); 339 ArrayList<String> labels5 = new ArrayList<String>(); 340 labels5.add("iteration13"); 341 labels5.add("iteration14"); 342 labels5.add("iteration15"); 343 verifyTimingBundle(timing5, labels5); 344 } 345 346 /* 347 * Verify that snapshotting and timing do not interfere w/ each other, 348 * by staggering calls to snapshot and timing functions. 349 */ 350 @MediumTest 351 public void testOutOfOrderSequence() { 352 MockPerformanceResultsWriter writer = new MockPerformanceResultsWriter(); 353 mPerfCollector.setPerformanceResultsWriter(writer); 354 mPerfCollector.startTiming("testOutOfOrderSequenceTiming"); 355 workForRandomShortPeriod(); 356 mPerfCollector.beginSnapshot("testOutOfOrderSequenceSnapshot"); 357 workForRandomShortPeriod(); 358 Bundle timing1 = mPerfCollector.stopTiming("timing1"); 359 workForRandomShortPeriod(); 360 Bundle snapshot1 = mPerfCollector.endSnapshot(); 361 362 Bundle timing2 = writer.timingResults; 363 Bundle snapshot2 = writer.snapshotResults; 364 365 assertEqualsBundle(snapshot1, snapshot2); 366 verifySnapshotBundle(snapshot1); 367 368 assertEqualsBundle(timing1, timing2); 369 ArrayList<String> labels = new ArrayList<String>(); 370 labels.add("timing1"); 371 verifyTimingBundle(timing1, labels); 372 } 373 374 private void workForRandomPeriod(int minDuration, int maxDuration) { 375 Random random = new Random(); 376 int period = minDuration + random.nextInt(maxDuration - minDuration); 377 long start = Process.getElapsedCpuTime(); 378 // Generate positive amount of work, so cpu time is measurable in 379 // milliseconds 380 while (Process.getElapsedCpuTime() - start < period) { 381 for (int i = 0, temp = 0; i < 50; i++ ) { 382 temp += i; 383 } 384 } 385 } 386 387 private void workForRandomTinyPeriod() { 388 workForRandomPeriod(2, 5); 389 } 390 391 private void workForRandomShortPeriod() { 392 workForRandomPeriod(10, 25); 393 } 394 395 private void workForRandomLongPeriod() { 396 workForRandomPeriod(50, 100); 397 } 398 399 private void verifySnapshotBundle(Bundle snapshot) { 400 assertTrue("At least 26 metrics collected", 26 <= snapshot.size()); 401 402 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_CPU_TIME)); 403 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_CPU_TIME) > 0); 404 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_EXECUTION_TIME)); 405 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_EXECUTION_TIME) > 0); 406 407 assertTrue(snapshot.containsKey( 408 PerformanceCollector.METRIC_KEY_PRE_RECEIVED_TRANSACTIONS)); 409 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_PRE_SENT_TRANSACTIONS)); 410 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_RECEIVED_TRANSACTIONS)); 411 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_SENT_TRANSACTIONS)); 412 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GC_INVOCATION_COUNT)); 413 414 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_ALLOCATED)); 415 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_ALLOCATED) > 0); 416 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_FREE)); 417 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_FREE) > 0); 418 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_PRIVATE_DIRTY)); 419 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_PRIVATE_DIRTY) > 0); 420 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_PSS)); 421 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_PSS) > 0); 422 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_SHARED_DIRTY)); 423 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_SHARED_DIRTY) > 0); 424 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_JAVA_SIZE)); 425 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_JAVA_SIZE) > 0); 426 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_ALLOCATED)); 427 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_ALLOCATED) > 0); 428 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_FREE)); 429 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_FREE) > 0); 430 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_PRIVATE_DIRTY)); 431 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_PRIVATE_DIRTY) > 0); 432 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_PSS)); 433 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_PSS) > 0); 434 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_SHARED_DIRTY)); 435 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_SHARED_DIRTY) > 0); 436 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_NATIVE_SIZE)); 437 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_NATIVE_SIZE) > 0); 438 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GLOBAL_ALLOC_COUNT)); 439 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_GLOBAL_ALLOC_COUNT) > 0); 440 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GLOBAL_ALLOC_SIZE)); 441 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_GLOBAL_ALLOC_SIZE) > 0); 442 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GLOBAL_FREED_COUNT)); 443 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_GLOBAL_FREED_COUNT) > 0); 444 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_GLOBAL_FREED_SIZE)); 445 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_GLOBAL_FREED_SIZE) > 0); 446 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_OTHER_PRIVATE_DIRTY)); 447 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_OTHER_PRIVATE_DIRTY) > 0); 448 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_OTHER_PSS)); 449 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_OTHER_PSS) > 0); 450 assertTrue(snapshot.containsKey(PerformanceCollector.METRIC_KEY_OTHER_SHARED_DIRTY)); 451 assertTrue(snapshot.getLong(PerformanceCollector.METRIC_KEY_OTHER_SHARED_DIRTY) > 0); 452 } 453 454 private void verifyIterationBundle(Bundle iteration, String label) { 455 assertEquals(3, iteration.size()); 456 assertTrue(iteration.containsKey(PerformanceCollector.METRIC_KEY_LABEL)); 457 assertEquals(label, iteration.getString(PerformanceCollector.METRIC_KEY_LABEL)); 458 assertTrue(iteration.containsKey(PerformanceCollector.METRIC_KEY_CPU_TIME)); 459 assertTrue(iteration.getLong(PerformanceCollector.METRIC_KEY_CPU_TIME) > 0); 460 assertTrue(iteration.containsKey(PerformanceCollector.METRIC_KEY_EXECUTION_TIME)); 461 assertTrue(iteration.getLong(PerformanceCollector.METRIC_KEY_EXECUTION_TIME) > 0); 462 } 463 464 private void verifyTimingBundle(Bundle timing, ArrayList<String> labels) { 465 assertEquals(1, timing.size()); 466 assertTrue(timing.containsKey(PerformanceCollector.METRIC_KEY_ITERATIONS)); 467 ArrayList<Parcelable> iterations = timing.getParcelableArrayList( 468 PerformanceCollector.METRIC_KEY_ITERATIONS); 469 assertNotNull(iterations); 470 assertEquals(labels.size(), iterations.size()); 471 for (int i = 0; i < labels.size(); i ++) { 472 Bundle iteration = (Bundle)iterations.get(i); 473 verifyIterationBundle(iteration, labels.get(i)); 474 } 475 } 476 477 private void assertEqualsBundle(Bundle b1, Bundle b2) { 478 assertEquals(b1.keySet(), b2.keySet()); 479 for (String key : b1.keySet()) { 480 assertEquals(b1.get(key), b2.get(key)); 481 } 482 } 483 484 private Object readPrivateField(String fieldName, Object object) throws Exception { 485 Field f = object.getClass().getDeclaredField(fieldName); 486 f.setAccessible(true); 487 return f.get(object); 488 } 489 490 private class MockPerformanceResultsWriter implements PerformanceResultsWriter { 491 492 public String snapshotLabel; 493 public Bundle snapshotResults = new Bundle(); 494 public String timingLabel; 495 public Bundle timingResults = new Bundle(); 496 497 public void writeBeginSnapshot(String label) { 498 snapshotLabel = label; 499 } 500 501 public void writeEndSnapshot(Bundle results) { 502 snapshotResults.putAll(results); 503 } 504 505 public void writeStartTiming(String label) { 506 timingLabel = label; 507 } 508 509 public void writeStopTiming(Bundle results) { 510 timingResults.putAll(results); 511 } 512 513 public void writeMeasurement(String label, long value) { 514 timingResults.putLong(label, value); 515 } 516 517 public void writeMeasurement(String label, float value) { 518 timingResults.putFloat(label, value); 519 } 520 521 public void writeMeasurement(String label, String value) { 522 timingResults.putString(label, value); 523 } 524 } 525 } 526