Index: tools/memory_inspector/memory_inspector/backends/android/android_backend_unittest.py |
diff --git a/tools/memory_inspector/memory_inspector/backends/android/android_backend_unittest.py b/tools/memory_inspector/memory_inspector/backends/android/android_backend_unittest.py |
deleted file mode 100644 |
index 29cfae33fa89e18176f68c3e70f21e21ea96ccc9..0000000000000000000000000000000000000000 |
--- a/tools/memory_inspector/memory_inspector/backends/android/android_backend_unittest.py |
+++ /dev/null |
@@ -1,177 +0,0 @@ |
-# Copyright 2014 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. |
- |
-"""Unittests for the backends.android modules.""" |
- |
-import os |
-import unittest |
- |
-from memory_inspector.backends import prebuilts_fetcher |
-from memory_inspector.backends.android import android_backend |
-from memory_inspector.unittest.mock_adb import mock_adb |
- |
- |
-_MOCK_ADB_PATH = os.path.dirname(mock_adb.__file__) |
- |
-_MOCK_DEVICES_OUT = """List of devices attached |
-0000000000000001\tdevice |
-0000000000000002\tdevice |
-""" |
- |
-_MOCK_MEMDUMP_OUT = ("""[ PID=1] |
-8000-33000 r-xp 0 private_unevictable=8192 private=8192 shared_app=[] """ |
- """shared_other_unevictable=147456 shared_other=147456 "/init" [v///fv0D] |
-33000-35000 r--p 2a000 private_unevictable=4096 private=4096 shared_app=[] """ |
- """shared_other_unevictable=4096 shared_other=4096 "/init" [Aw==] |
-35000-37000 rw-p 2c000 private_unevictable=8192 private=8192 shared_app=[] """ |
- """shared_other_unevictable=0 shared_other=0 "/init" [Aw==] |
-37000-6d000 rw-p 0 private_unevictable=221184 private=221184 shared_app=[] """ |
- """shared_other_unevictable=0 shared_other=0 "[heap]" [////////Pw==] |
-400c5000-400c7000 rw-p 0 private_unevictable=0 private=0 shared_app=[] """ |
- """shared_other_unevictable=0 shared_other=0 "" [AA==] |
-400f4000-400f5000 r--p 0 private_unevictable=4096 private=4096 shared_app=[] """ |
- """shared_other_unevictable=0 shared_other=0 "" [AQ==] |
-40127000-40147000 rw-s 0 private_unevictable=4096 private=4096 shared_app=[] """ |
- """shared_other_unevictable=32768 shared_other=32768 "/X" [/////w==] |
-be8b7000-be8d8000 rw-p 8 private_unevictable=8192 private=8192 shared_app=[] """ |
- """shared_other_unevictable=4096 shared_other=12288 "[stack]" [//8=] |
-ffff00ffff0000-ffff00ffff1000 r-xp 0 private_unevictable=0 private=0 """ |
- """shared_app=[] shared_other_unevictable=0 shared_other=0 "[vectors]" []""" |
-) |
- |
-_MOCK_HEAP_DUMP_OUT = """{ |
- "total_allocated": 8192, |
- "num_allocs": 2, |
- "num_stacks": 2, |
- "allocs": { |
- "a1000": {"l": 100, "f": 0, "s": "a"}, |
- "a2000": {"l": 100, "f": 0, "s": "a"}, |
- "b1000": {"l": 1000, "f": 0, "s": "b"}, |
- "b2000": {"l": 1000, "f": 0, "s": "b"}, |
- "b3000": {"l": 1000, "f": 0, "s": "b"}}, |
- "stacks": { |
- "a": {"l": 200, "f": [10, 20, 30, 40]}, |
- "b": {"l": 3000, "f": [50, 60, 70]}} |
- }""" |
- |
-_MOCK_PS_EXT_OUT = """ |
-{ |
- "time": { "ticks": 1000100, "rate": 100}, |
- "mem": { |
- "MemTotal:": 998092, "MemFree:": 34904, |
- "Buffers:": 24620, "Cached:": 498916 }, |
- "cpu": [{"usr": 32205, "sys": 49826, "idle": 7096196}], |
- "processes": { |
- "1": { |
- "name": "foo", "n_threads": 42, "start_time": 1000000, "user_time": 82, |
- "sys_time": 445, "min_faults": 0, "maj_faults": 0, "vm_rss": 528}, |
- "2": { |
- "name": "bar", "n_threads": 142, "start_time": 1, "user_time": 82, |
- "sys_time": 445, "min_faults": 0, "maj_faults": 0, "vm_rss": 528}} |
-} |
-""" |
- |
- |
-class AndroidBackendTest(unittest.TestCase): |
- def setUp(self): |
- prebuilts_fetcher.in_test_harness = True |
- self._mock_adb = mock_adb.MockAdb() |
- planned_adb_responses = { |
- 'devices': _MOCK_DEVICES_OUT, |
- 'shell getprop ro.product.model': 'Mock device', |
- 'shell getprop ro.build.type': 'userdebug', |
- 'shell getprop ro.build.id': 'ZZ007', |
- 'shell getprop ro.product.cpu.abi': 'armeabi', |
- 'root': 'adbd is already running as root', |
- 'shell /data/local/tmp/ps_ext': _MOCK_PS_EXT_OUT, |
- 'shell /data/local/tmp/memdump': _MOCK_MEMDUMP_OUT, |
- 'shell /data/local/tmp/heap_dump': _MOCK_HEAP_DUMP_OUT, |
- 'shell test -e "/data/local/tmp/heap': '0', |
- } |
- for (cmd, response) in planned_adb_responses.iteritems(): |
- self._mock_adb.PrepareResponse(cmd, response) |
- self._mock_adb.Start() |
- |
- def runTest(self): |
- ab = android_backend.AndroidBackend() |
- |
- # Test settings load/store logic and setup the mock adb path. |
- self.assertTrue('adb_path' in ab.settings.expected_keys) |
- ab.settings['adb_path'] = _MOCK_ADB_PATH |
- self.assertEqual(ab.settings['adb_path'], _MOCK_ADB_PATH) |
- |
- # Test device enumeration. |
- devices = list(ab.EnumerateDevices()) |
- self.assertEqual(len(devices), 2) |
- self.assertEqual(devices[0].name, 'Mock device ZZ007') |
- self.assertEqual(devices[0].id, '0000000000000001') |
- self.assertEqual(devices[1].name, 'Mock device ZZ007') |
- self.assertEqual(devices[1].id, '0000000000000002') |
- |
- # Initialize device (checks that sha1 are checked in). |
- device = devices[0] |
- device.Initialize() |
- |
- # Test process enumeration. |
- processes = list(device.ListProcesses()) |
- self.assertEqual(len(processes), 2) |
- self.assertEqual(processes[0].pid, 1) |
- self.assertEqual(processes[0].name, 'foo') |
- self.assertEqual(processes[1].pid, 2) |
- self.assertEqual(processes[1].name, 'bar') |
- |
- # Test process stats. |
- stats = processes[0].GetStats() |
- self.assertEqual(stats.threads, 42) |
- self.assertEqual(stats.cpu_usage, 0) |
- self.assertEqual(stats.run_time, 1) |
- self.assertEqual(stats.vm_rss, 528) |
- self.assertEqual(stats.page_faults, 0) |
- |
- # Test memdump parsing. |
- mmaps = processes[0].DumpMemoryMaps() |
- self.assertEqual(len(mmaps), 9) |
- self.assertIsNone(mmaps.Lookup(0)) |
- self.assertIsNone(mmaps.Lookup(7999)) |
- self.assertIsNotNone(mmaps.Lookup(0x8000)) |
- self.assertIsNotNone(mmaps.Lookup(0x32FFF)) |
- self.assertIsNotNone(mmaps.Lookup(0x33000)) |
- self.assertIsNone(mmaps.Lookup(0x6d000)) |
- self.assertIsNotNone(mmaps.Lookup(0xffff00ffff0000)) |
- self.assertIsNone(mmaps.Lookup(0xffff0000)) |
- |
- entry = mmaps.Lookup(0xbe8b7000) |
- self.assertIsNotNone(entry) |
- self.assertEqual(entry.start, 0xbe8b7000) |
- self.assertEqual(entry.end, 0xbe8d7fff) |
- self.assertEqual(entry.mapped_offset, 0x8) |
- self.assertEqual(entry.prot_flags, 'rw-p') |
- self.assertEqual(entry.priv_dirty_bytes, 8192) |
- self.assertEqual(entry.priv_clean_bytes, 0) |
- self.assertEqual(entry.shared_dirty_bytes, 4096) |
- self.assertEqual(entry.shared_clean_bytes, 8192) |
- for i in xrange(16): |
- self.assertTrue(entry.IsPageResident(i)) |
- for i in xrange(16, 33): |
- self.assertFalse(entry.IsPageResident(i)) |
- |
- # Test heap_dump parsing. |
- heap = processes[0].DumpNativeHeap() |
- self.assertEqual(len(heap.allocations), 5) |
- |
- for alloc in heap.allocations: |
- self.assertTrue(alloc.size == 100 or alloc.size == 1000) |
- if alloc.size == 100: |
- self.assertEqual(alloc.size, 100) |
- self.assertEqual(alloc.stack_trace.depth, 4) |
- self.assertEqual([x.address for x in alloc.stack_trace.frames], |
- [10, 20, 30, 40]) |
- elif alloc.size == 1000: |
- self.assertEqual(alloc.size, 1000) |
- self.assertEqual(alloc.stack_trace.depth, 3) |
- self.assertEqual([x.address for x in alloc.stack_trace.frames], |
- [50, 60, 70]) |
- |
- def tearDown(self): |
- self._mock_adb.Stop() |