| OLD | NEW |
| (Empty) |
| 1 # Copyright 2013 The Chromium Authors. All rights reserved. | |
| 2 # Use of this source code is governed by a BSD-style license that can be | |
| 3 # found in the LICENSE file. | |
| 4 | |
| 5 import unittest | |
| 6 | |
| 7 from telemetry import decorators | |
| 8 from telemetry.internal.platform import android_device | |
| 9 from telemetry.internal.platform import android_platform_backend | |
| 10 from telemetry.testing import options_for_unittests | |
| 11 from telemetry.testing import system_stub | |
| 12 import mock | |
| 13 | |
| 14 from devil.android import battery_utils | |
| 15 from devil.android import device_errors | |
| 16 from devil.android import device_utils | |
| 17 | |
| 18 class AndroidPlatformBackendTest(unittest.TestCase): | |
| 19 def setUp(self): | |
| 20 self._options = options_for_unittests.GetCopy() | |
| 21 self._stubs = system_stub.Override( | |
| 22 android_platform_backend, | |
| 23 ['perf_control', 'thermal_throttle', 'certutils', 'adb_install_cert', | |
| 24 'platformsettings']) | |
| 25 | |
| 26 # Skip _FixPossibleAdbInstability by setting psutil to None. | |
| 27 self._actual_ps_util = android_platform_backend.psutil | |
| 28 android_platform_backend.psutil = None | |
| 29 self.battery_patcher = mock.patch.object(battery_utils, 'BatteryUtils') | |
| 30 self.battery_patcher.start() | |
| 31 | |
| 32 def get_prop(name, cache=None): | |
| 33 del cache # unused | |
| 34 return {'ro.product.cpu.abi': 'armeabi-v7a'}.get(name) | |
| 35 | |
| 36 self.device_patcher = mock.patch.multiple( | |
| 37 device_utils.DeviceUtils, | |
| 38 HasRoot=mock.MagicMock(return_value=True), | |
| 39 GetProp=mock.MagicMock(side_effect=get_prop)) | |
| 40 self.device_patcher.start() | |
| 41 | |
| 42 def tearDown(self): | |
| 43 self._stubs.Restore() | |
| 44 android_platform_backend.psutil = self._actual_ps_util | |
| 45 self.battery_patcher.stop() | |
| 46 self.device_patcher.stop() | |
| 47 | |
| 48 @decorators.Disabled('chromeos') | |
| 49 def testIsSvelte(self): | |
| 50 with mock.patch('devil.android.device_utils.DeviceUtils.RunShellCommand', | |
| 51 return_value=0): | |
| 52 backend = android_platform_backend.AndroidPlatformBackend( | |
| 53 android_device.AndroidDevice('12345'), self._options) | |
| 54 self.assertTrue(backend.IsSvelte()) | |
| 55 | |
| 56 @decorators.Disabled('chromeos') | |
| 57 def testIsNotSvelte(self): | |
| 58 with mock.patch('devil.android.device_utils.DeviceUtils.RunShellCommand', | |
| 59 side_effect=device_errors.AdbCommandFailedError('m', 'n')): | |
| 60 backend = android_platform_backend.AndroidPlatformBackend( | |
| 61 android_device.AndroidDevice('12345'), self._options) | |
| 62 self.assertFalse(backend.IsSvelte()) | |
| 63 | |
| 64 @decorators.Disabled('chromeos') | |
| 65 def testGetCpuStats(self): | |
| 66 proc_stat_content = ( | |
| 67 '7702 (.android.chrome) S 167 167 0 0 -1 1077936448 ' | |
| 68 '3247 0 0 0 4 1 0 0 20 0 9 0 5603962 337379328 5867 ' | |
| 69 '4294967295 1074458624 1074463824 3197495984 3197494152 ' | |
| 70 '1074767676 0 4612 0 38136 4294967295 0 0 17 0 0 0 0 0 0 ' | |
| 71 '1074470376 1074470912 1102155776\n') | |
| 72 with mock.patch('devil.android.device_utils.DeviceUtils.ReadFile', | |
| 73 return_value=proc_stat_content): | |
| 74 backend = android_platform_backend.AndroidPlatformBackend( | |
| 75 android_device.AndroidDevice('12345'), self._options) | |
| 76 cpu_stats = backend.GetCpuStats('7702') | |
| 77 self.assertEquals(cpu_stats, {'CpuProcessTime': 0.05}) | |
| 78 | |
| 79 @decorators.Disabled('chromeos') | |
| 80 def testGetCpuStatsInvalidPID(self): | |
| 81 # Mock an empty /proc/pid/stat. | |
| 82 with mock.patch('devil.android.device_utils.DeviceUtils.ReadFile', | |
| 83 return_value=''): | |
| 84 backend = android_platform_backend.AndroidPlatformBackend( | |
| 85 android_device.AndroidDevice('1234'), self._options) | |
| 86 cpu_stats = backend.GetCpuStats('7702') | |
| 87 self.assertEquals(cpu_stats, {}) | |
| 88 | |
| 89 def testAndroidParseCpuStates(self): | |
| 90 cstate = { | |
| 91 'cpu0': 'C0\nC1\n103203424\n5342040\n300\n500\n1403232500', | |
| 92 'cpu1': 'C0\n124361858\n300\n1403232500' | |
| 93 } | |
| 94 expected_cstate = { | |
| 95 'cpu0': { | |
| 96 'WFI': 103203424, | |
| 97 'C0': 1403232391454536, | |
| 98 'C1': 5342040 | |
| 99 }, | |
| 100 'cpu1': { | |
| 101 'WFI': 124361858, | |
| 102 'C0': 1403232375638142 | |
| 103 } | |
| 104 } | |
| 105 # Use mock start and end times to allow for the test to calculate C0. | |
| 106 result = android_platform_backend.AndroidPlatformBackend.ParseCStateSample( | |
| 107 cstate) | |
| 108 for cpu in result: | |
| 109 for state in result[cpu]: | |
| 110 self.assertAlmostEqual(result[cpu][state], expected_cstate[cpu][state]) | |
| 111 | |
| 112 def testInstallTestCaFailure(self): | |
| 113 backend = android_platform_backend.AndroidPlatformBackend( | |
| 114 android_device.AndroidDevice('failure'), self._options) | |
| 115 backend.InstallTestCa() | |
| 116 self.assertFalse(backend.is_test_ca_installed) | |
| 117 | |
| 118 def testInstallTestCaSuccess(self): | |
| 119 backend = android_platform_backend.AndroidPlatformBackend( | |
| 120 android_device.AndroidDevice('success'), self._options) | |
| 121 backend.InstallTestCa() | |
| 122 self.assertTrue(backend.is_test_ca_installed) | |
| 123 | |
| 124 def testIsScreenLockedTrue(self): | |
| 125 test_input = ['a=b', 'mHasBeenInactive=true'] | |
| 126 backend = android_platform_backend.AndroidPlatformBackend( | |
| 127 android_device.AndroidDevice('success'), self._options) | |
| 128 self.assertTrue(backend._IsScreenLocked(test_input)) | |
| 129 | |
| 130 def testIsScreenLockedFalse(self): | |
| 131 test_input = ['a=b', 'mHasBeenInactive=false'] | |
| 132 backend = android_platform_backend.AndroidPlatformBackend( | |
| 133 android_device.AndroidDevice('success'), self._options) | |
| 134 self.assertFalse(backend._IsScreenLocked(test_input)) | |
| 135 | |
| 136 | |
| 137 class AndroidPlatformBackendPsutilTest(unittest.TestCase): | |
| 138 | |
| 139 class psutil_1_0(object): | |
| 140 version_info = (1, 0) | |
| 141 def __init__(self): | |
| 142 self.set_cpu_affinity_args = [] | |
| 143 class Process(object): | |
| 144 def __init__(self, parent): | |
| 145 self._parent = parent | |
| 146 self.name = 'adb' | |
| 147 def set_cpu_affinity(self, cpus): | |
| 148 self._parent.set_cpu_affinity_args.append(cpus) | |
| 149 def process_iter(self): | |
| 150 return [self.Process(self)] | |
| 151 | |
| 152 class psutil_2_0(object): | |
| 153 version_info = (2, 0) | |
| 154 def __init__(self): | |
| 155 self.set_cpu_affinity_args = [] | |
| 156 class Process(object): | |
| 157 def __init__(self, parent): | |
| 158 self._parent = parent | |
| 159 self.set_cpu_affinity_args = [] | |
| 160 def name(self): | |
| 161 return 'adb' | |
| 162 def cpu_affinity(self, cpus=None): | |
| 163 self._parent.set_cpu_affinity_args.append(cpus) | |
| 164 def process_iter(self): | |
| 165 return [self.Process(self)] | |
| 166 | |
| 167 def setUp(self): | |
| 168 self._options = options_for_unittests.GetCopy() | |
| 169 self._stubs = system_stub.Override( | |
| 170 android_platform_backend, | |
| 171 ['perf_control']) | |
| 172 self.battery_patcher = mock.patch.object(battery_utils, 'BatteryUtils') | |
| 173 self.battery_patcher.start() | |
| 174 self._actual_ps_util = android_platform_backend.psutil | |
| 175 | |
| 176 def get_prop(name, cache=None): | |
| 177 del cache # unused | |
| 178 return {'ro.product.cpu.abi': 'armeabi-v7a'}.get(name) | |
| 179 | |
| 180 self.device_patcher = mock.patch.multiple( | |
| 181 device_utils.DeviceUtils, | |
| 182 FileExists=mock.MagicMock(return_value=False), | |
| 183 GetProp=mock.MagicMock(side_effect=get_prop), | |
| 184 HasRoot=mock.MagicMock(return_value=True)) | |
| 185 self.device_patcher.start() | |
| 186 | |
| 187 def tearDown(self): | |
| 188 self._stubs.Restore() | |
| 189 android_platform_backend.psutil = self._actual_ps_util | |
| 190 self.battery_patcher.stop() | |
| 191 self.device_patcher.stop() | |
| 192 | |
| 193 @decorators.Disabled('chromeos') | |
| 194 def testPsutil1(self): | |
| 195 psutil = self.psutil_1_0() | |
| 196 android_platform_backend.psutil = psutil | |
| 197 | |
| 198 # Mock an empty /proc/pid/stat. | |
| 199 with mock.patch('devil.android.device_utils.DeviceUtils.ReadFile', | |
| 200 return_value=''): | |
| 201 backend = android_platform_backend.AndroidPlatformBackend( | |
| 202 android_device.AndroidDevice('1234'), self._options) | |
| 203 cpu_stats = backend.GetCpuStats('7702') | |
| 204 self.assertEquals({}, cpu_stats) | |
| 205 self.assertEquals([[0]], psutil.set_cpu_affinity_args) | |
| 206 | |
| 207 @decorators.Disabled('chromeos') | |
| 208 def testPsutil2(self): | |
| 209 psutil = self.psutil_2_0() | |
| 210 android_platform_backend.psutil = psutil | |
| 211 | |
| 212 # Mock an empty /proc/pid/stat. | |
| 213 with mock.patch('devil.android.device_utils.DeviceUtils.ReadFile', | |
| 214 return_value=''): | |
| 215 backend = android_platform_backend.AndroidPlatformBackend( | |
| 216 android_device.AndroidDevice('1234'), self._options) | |
| 217 cpu_stats = backend.GetCpuStats('7702') | |
| 218 self.assertEquals({}, cpu_stats) | |
| 219 self.assertEquals([[0]], psutil.set_cpu_affinity_args) | |
| OLD | NEW |