Index: tools/telemetry/telemetry/timeline/memory_dump_event_unittest.py |
diff --git a/tools/telemetry/telemetry/timeline/memory_dump_event_unittest.py b/tools/telemetry/telemetry/timeline/memory_dump_event_unittest.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5ad9de10dfa64a736b3b759820e89b7d5b0c9267 |
--- /dev/null |
+++ b/tools/telemetry/telemetry/timeline/memory_dump_event_unittest.py |
@@ -0,0 +1,96 @@ |
+# Copyright 2015 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+import unittest |
+ |
+from telemetry.timeline import memory_dump_event |
+ |
+ |
+def TestDumpEvent(dump_id='123456ABCDEF', pid=1234, start=0, mmaps=None): |
+ def hexify(byte_stats): |
+ return {k: hex(v) for k, v in byte_stats.iteritems()} |
+ |
+ event = {'ph': 'v', 'id': dump_id, 'pid': pid, 'ts': start * 1000} |
+ if mmaps: |
+ vm_regions = [{'mf': mapped_file, 'bs': hexify(byte_stats)} |
+ for mapped_file, byte_stats in mmaps.iteritems()] |
+ event['args'] = {'dumps': {'process_mmaps': {'vm_regions': vm_regions}}} |
+ return event |
+ |
+ |
+class ProcessMemoryDumpUnitTest(unittest.TestCase): |
+ def testProcessMemoryDump_categories(self): |
+ ALL = [2 ** x for x in range(8)] |
+ (JAVA_SPACES, JAVA_CACHE, ASHMEM, NATIVE_1, NATIVE_2, |
+ STACK, FILES_APK, DEVICE_GPU) = ALL |
+ |
+ memory_dump = memory_dump_event.ProcessMemoryDump(TestDumpEvent(mmaps={ |
+ '/dev/ashmem/dalvik-space-foo': {'pss': JAVA_SPACES}, |
+ '/dev/ashmem/dalvik-jit-code-cache': {'pss': JAVA_CACHE}, |
+ '/dev/ashmem/other-random-stuff': {'pss': ASHMEM}, |
+ '[heap] bar': {'pss': NATIVE_1}, |
+ '': {'pss': NATIVE_2}, |
+ '[stack thingy]': {'pss': STACK}, |
+ 'my_little_app.apk': {'pss': FILES_APK}, |
+ '/dev/mali': {'pss': DEVICE_GPU}, |
+ })) |
+ |
+ EXPECTED = { |
+ '/': sum(ALL), |
+ '/Android/Java runtime': JAVA_SPACES + JAVA_CACHE, |
+ '/Android/Ashmem': ASHMEM, |
+ '/Android': JAVA_SPACES + JAVA_CACHE + ASHMEM, |
+ '/Native heap': NATIVE_1 + NATIVE_2, |
+ '/Stack': STACK, |
+ '/Files/apk': FILES_APK, |
+ '/Devices': DEVICE_GPU} |
+ |
+ self.assertTrue(memory_dump.has_mmaps) |
+ for path, value in EXPECTED.iteritems(): |
+ self.assertEquals(value, |
+ memory_dump.GetMemoryBucket(path).GetValue( |
+ 'proportional_resident')) |
+ |
+ |
+class MemoryDumpEventUnitTest(unittest.TestCase): |
+ def testMemoryDumpEvent_timing(self): |
+ memory_dump = memory_dump_event.MemoryDumpEvent([ |
+ TestDumpEvent(pid=3, start=8), |
+ TestDumpEvent(pid=1, start=4), |
+ TestDumpEvent(pid=2, start=13), |
+ TestDumpEvent(pid=4, start=7)]) |
+ |
+ self.assertFalse(memory_dump.has_mmaps) |
+ self.assertEquals(4, |
+ len(memory_dump.process_dumps)) |
+ self.assertAlmostEquals(4.0, |
+ memory_dump.start) |
+ self.assertAlmostEquals(13.0, |
+ memory_dump.end) |
+ self.assertAlmostEquals(9.0, |
+ memory_dump.duration) |
+ |
+ def testMemoryDumpEvent_GetStatsSummary(self): |
+ ALL = [2 ** x for x in range(7)] |
+ (JAVA_HEAP_1, JAVA_HEAP_2, ASHMEM_1, ASHMEM_2, NATIVE, |
+ DIRTY_1, DIRTY_2) = ALL |
+ |
+ memory_dump = memory_dump_event.MemoryDumpEvent([ |
+ TestDumpEvent(pid=1, mmaps={ |
+ '/dev/ashmem/dalvik-thing': {'pss': JAVA_HEAP_1}}), |
+ TestDumpEvent(pid=2, mmaps={ |
+ '/dev/ashmem/other-ashmem': {'pss': ASHMEM_1, 'pd': DIRTY_1}}), |
+ TestDumpEvent(pid=3, mmaps={ |
+ '[heap] native': {'pss': NATIVE, 'pd': DIRTY_2}, |
+ '/dev/ashmem/dalvik-thing': {'pss': JAVA_HEAP_2}}), |
+ TestDumpEvent(pid=4, mmaps={ |
+ '/dev/ashmem/other-ashmem': {'pss': ASHMEM_2}})]) |
+ |
+ self.assertTrue(memory_dump.has_mmaps) |
+ self.assertEquals({'overall_pss': sum(ALL[:5]), |
+ 'private_dirty': DIRTY_1 + DIRTY_2, |
+ 'java_heap': JAVA_HEAP_1 + JAVA_HEAP_2, |
+ 'ashmem': ASHMEM_1 + ASHMEM_2, |
+ 'native_heap': NATIVE}, |
+ memory_dump.GetStatsSummary()) |