Index: tools/telemetry/telemetry/internal/platform/profiler/android_profiling_helper_unittest.py |
diff --git a/tools/telemetry/telemetry/internal/platform/profiler/android_profiling_helper_unittest.py b/tools/telemetry/telemetry/internal/platform/profiler/android_profiling_helper_unittest.py |
deleted file mode 100644 |
index d178aac690f8142ca7d82304a05c2f0429b32b39..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/telemetry/internal/platform/profiler/android_profiling_helper_unittest.py |
+++ /dev/null |
@@ -1,211 +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. |
- |
-import os |
-import pickle |
-import re |
-import shutil |
-import tempfile |
-import time |
-import unittest |
- |
-from telemetry.core import util |
-from telemetry import decorators |
-from telemetry.internal.platform.profiler import android_profiling_helper |
-from telemetry.testing import simple_mock |
-from telemetry.testing import tab_test_case |
- |
- |
-def _GetLibrariesMappedIntoProcesses(device, pids): |
- libs = set() |
- for pid in pids: |
- maps_file = '/proc/%d/maps' % pid |
- maps = device.ReadFile(maps_file, as_root=True).splitlines() |
- for map_line in maps: |
- lib = re.match(r'.*\s(/.*[.]so)$', map_line) |
- if lib: |
- libs.add(lib.group(1)) |
- return libs |
- |
- |
-class TestFileMetadataMatches(unittest.TestCase): |
- def setUp(self): |
- self.tempdir = tempfile.mkdtemp() |
- self.filename_a = os.path.join(self.tempdir, 'filea') |
- self.filename_b = os.path.join(self.tempdir, 'fileb') |
- |
- with open(self.filename_a, 'w') as f: |
- f.write('testing') |
- |
- def tearDown(self): |
- shutil.rmtree(self.tempdir) |
- |
- def testDoesntMatchNonExistant(self): |
- self.assertFalse( |
- android_profiling_helper._FileMetadataMatches( |
- self.filename_a, self.filename_b)) |
- |
- def testDoesntMatchJustExistence(self): |
- with open(self.filename_b, 'w') as f: |
- f.write('blah') |
- |
- self.assertFalse( |
- android_profiling_helper._FileMetadataMatches( |
- self.filename_a, self.filename_b)) |
- |
- def testDoesntMatchCopy(self): |
- # This test can run so fast that the file system doesn't have enough |
- # accuracy to differentiate between the copy and initial file times. |
- # Hence we need to guarantee a delay here. |
- time.sleep(3) |
- shutil.copy(self.filename_a, self.filename_b) |
- self.assertFalse( |
- android_profiling_helper._FileMetadataMatches( |
- self.filename_a, self.filename_b)) |
- |
- def testMatchesAfterCopy2(self): |
- shutil.copy2(self.filename_a, self.filename_b) |
- self.assertTrue( |
- android_profiling_helper._FileMetadataMatches( |
- self.filename_a, self.filename_b)) |
- |
- def testDoesntMatchAfterCopy2ThenModify(self): |
- shutil.copy2(self.filename_a, self.filename_b) |
- |
- filea = open(self.filename_a, 'w') |
- filea.write('moar testing!') |
- filea.close() |
- |
- self.assertFalse( |
- android_profiling_helper._FileMetadataMatches( |
- self.filename_a, self.filename_b)) |
- |
- def testDoesntMatchAfterCopy2ThenModifyStats(self): |
- shutil.copy2(self.filename_a, self.filename_b) |
- os.utime(self.filename_a, (20, 20)) |
- self.assertFalse( |
- android_profiling_helper._FileMetadataMatches( |
- self.filename_a, self.filename_b)) |
- |
- def testMatchesAfterCopyStatWithDifferentContent(self): |
- fileb = open(self.filename_b, 'w') |
- fileb.write('blahing') |
- fileb.close() |
- |
- shutil.copystat(self.filename_a, self.filename_b) |
- |
- self.assertTrue( |
- android_profiling_helper._FileMetadataMatches( |
- self.filename_a, self.filename_b)) |
- |
- |
-class TestAndroidProfilingHelper(unittest.TestCase): |
- |
- @decorators.Enabled('linux') |
- def testGetRequiredLibrariesForPerfProfile(self): |
- perf_output = os.path.join( |
- util.GetUnittestDataDir(), 'sample_perf_report_output.txt') |
- with open(perf_output) as f: |
- perf_output = f.read() |
- |
- mock_popen = simple_mock.MockObject() |
- mock_popen.ExpectCall('communicate').WillReturn([None, perf_output]) |
- |
- mock_subprocess = simple_mock.MockObject() |
- mock_subprocess.ExpectCall( |
- 'Popen').WithArgs(simple_mock.DONT_CARE).WillReturn(mock_popen) |
- mock_subprocess.SetAttribute('PIPE', simple_mock.MockObject()) |
- |
- real_subprocess = android_profiling_helper.subprocess |
- android_profiling_helper.subprocess = mock_subprocess |
- try: |
- libs = android_profiling_helper.GetRequiredLibrariesForPerfProfile('foo') |
- self.assertEqual(libs, set([ |
- '/data/app-lib/com.google.android.apps.chrome-2/libchrome.2016.0.so', |
- '/system/lib/libart.so', |
- '/system/lib/libc.so', |
- '/system/lib/libm.so'])) |
- finally: |
- android_profiling_helper.subprocess = real_subprocess |
- |
- @decorators.Enabled('android') |
- def testGetRequiredLibrariesForVTuneProfile(self): |
- vtune_db_output = os.path.join( |
- util.GetUnittestDataDir(), 'sample_vtune_db_output') |
- with open(vtune_db_output, 'rb') as f: |
- vtune_db_output = pickle.load(f) |
- |
- mock_cursor = simple_mock.MockObject() |
- mock_cursor.ExpectCall( |
- 'execute').WithArgs(simple_mock.DONT_CARE).WillReturn(vtune_db_output) |
- |
- mock_conn = simple_mock.MockObject() |
- mock_conn.ExpectCall('cursor').WillReturn(mock_cursor) |
- mock_conn.ExpectCall('close') |
- |
- mock_sqlite3 = simple_mock.MockObject() |
- mock_sqlite3.ExpectCall( |
- 'connect').WithArgs(simple_mock.DONT_CARE).WillReturn(mock_conn) |
- |
- real_sqlite3 = android_profiling_helper.sqlite3 |
- android_profiling_helper.sqlite3 = mock_sqlite3 |
- try: |
- libs = android_profiling_helper.GetRequiredLibrariesForVTuneProfile('foo') |
- self.assertEqual(libs, set([ |
- '/data/app-lib/com.google.android.apps.chrome-1/libchrome.2019.0.so', |
- '/system/lib/libdvm.so', |
- '/system/lib/libc.so', |
- '/system/lib/libm.so'])) |
- finally: |
- android_profiling_helper.sqlite3 = real_sqlite3 |
- |
- |
-class TestAndroidProfilingHelperTabTestCase(tab_test_case.TabTestCase): |
- |
- def setUp(self): |
- super(TestAndroidProfilingHelperTabTestCase, self).setUp() |
- # pylint: disable=protected-access |
- browser_backend = self._browser._browser_backend |
- self._device = browser_backend.device() |
- |
- @decorators.Enabled('android') |
- def testCreateSymFs(self): |
- # pylint: disable=protected-access |
- browser_pid = self._browser._browser_backend.pid |
- pids = ([browser_pid] + |
- self._browser._platform_backend.GetChildPids(browser_pid)) |
- libs = _GetLibrariesMappedIntoProcesses(self._device, pids) |
- assert libs |
- |
- symfs_dir = tempfile.mkdtemp() |
- try: |
- kallsyms = android_profiling_helper.CreateSymFs(self._device, symfs_dir, |
- libs) |
- |
- # Check that we have kernel symbols. |
- assert os.path.exists(kallsyms) |
- |
- is_unstripped = re.compile(r'^/data/app(-lib)?/.*\.so$') |
- has_unstripped = False |
- |
- # Check that all requested libraries are present. |
- for lib in libs: |
- has_unstripped = has_unstripped or is_unstripped.match(lib) |
- assert os.path.exists(os.path.join(symfs_dir, lib[1:])), \ |
- '%s not found in symfs' % lib |
- |
- # Make sure we found at least one unstripped library. |
- assert has_unstripped |
- finally: |
- shutil.rmtree(symfs_dir) |
- |
- # Test fails: crbug.com/437081 |
- # @decorators.Enabled('android') |
- @decorators.Disabled('all') |
- def testGetToolchainBinaryPath(self): |
- with tempfile.NamedTemporaryFile() as libc: |
- self._device.PullFile('/system/lib/libc.so', libc.name) |
- path = android_profiling_helper.GetToolchainBinaryPath(libc.name, |
- 'objdump') |
- assert path and os.path.exists(path) |