blob: a841a0e231627acad8fdfb95aa255a5c321c747f [file] [log] [blame]
# Copyright 2018 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 devil import devil_env
from devil.android import device_utils
from devil.android.perf import perf_control
from devil.android.sdk import adb_wrapper
with devil_env.SysPath(devil_env.PYMOCK_PATH):
import mock
# pylint: disable=unused-argument
def _ShellCommandHandler(cmd,
shell=False,
check_return=False,
cwd=None,
env=None,
run_as=None,
as_root=False,
single_line=False,
large_output=False,
raw_output=False,
timeout=None,
retries=None):
if cmd.startswith('for CPU in '):
if 'scaling_available_governors' in cmd:
contents = 'interactive ondemand userspace powersave performance'
return [contents + '\n%~%0%~%'] * 4
if 'cat "$CPU/online"' in cmd:
return ['1\n%~%0%~%'] * 4
assert False, 'Should not be called with cmd: {}'.format(cmd)
class PerfControlTest(unittest.TestCase):
@staticmethod
def _MockOutLowLevelPerfControlMethods(perf_control_object):
# pylint: disable=protected-access
perf_control_object.SetScalingGovernor = mock.Mock()
perf_control_object._ForceAllCpusOnline = mock.Mock()
perf_control_object._SetScalingMaxFreqForCpus = mock.Mock()
perf_control_object._SetMaxGpuClock = mock.Mock()
# pylint: disable=no-self-use
def testNexus5HighPerfMode(self):
# Mock out the device state for PerfControl.
cpu_list = ['cpu%d' % cpu for cpu in range(4)]
mock_device = mock.Mock(spec=device_utils.DeviceUtils)
mock_device.product_model = 'Nexus 5'
mock_device.adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
mock_device.ListDirectory.return_value = cpu_list + ['cpufreq']
mock_device.FileExists.return_value = True
mock_device.RunShellCommand = mock.Mock(side_effect=_ShellCommandHandler)
pc = perf_control.PerfControl(mock_device)
self._MockOutLowLevelPerfControlMethods(pc)
# Verify.
# pylint: disable=protected-access
# pylint: disable=no-member
pc.SetHighPerfMode()
mock_device.EnableRoot.assert_called_once_with()
pc._ForceAllCpusOnline.assert_called_once_with(True)
pc.SetScalingGovernor.assert_called_once_with('performance')
pc._SetScalingMaxFreqForCpus.assert_called_once_with(
1190400, ' '.join(cpu_list))
pc._SetMaxGpuClock.assert_called_once_with(200000000)
def testNexus5XHighPerfMode(self):
# Mock out the device state for PerfControl.
cpu_list = ['cpu%d' % cpu for cpu in range(6)]
mock_device = mock.Mock(spec=device_utils.DeviceUtils)
mock_device.product_model = 'Nexus 5X'
mock_device.adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
mock_device.ListDirectory.return_value = cpu_list + ['cpufreq']
mock_device.FileExists.return_value = True
mock_device.RunShellCommand = mock.Mock(side_effect=_ShellCommandHandler)
pc = perf_control.PerfControl(mock_device)
self._MockOutLowLevelPerfControlMethods(pc)
# Verify.
# pylint: disable=protected-access
# pylint: disable=no-member
pc.SetHighPerfMode()
mock_device.EnableRoot.assert_called_once_with()
pc._ForceAllCpusOnline.assert_called_once_with(True)
pc.SetScalingGovernor.assert_called_once_with('performance')
pc._SetScalingMaxFreqForCpus.assert_called_once_with(
1248000, ' '.join(cpu_list))
pc._SetMaxGpuClock.assert_called_once_with(300000000)
def testNexus5XDefaultPerfMode(self):
# Mock out the device state for PerfControl.
cpu_list = ['cpu%d' % cpu for cpu in range(6)]
mock_device = mock.Mock(spec=device_utils.DeviceUtils)
mock_device.product_model = 'Nexus 5X'
mock_device.adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
mock_device.ListDirectory.return_value = cpu_list + ['cpufreq']
mock_device.FileExists.return_value = True
mock_device.RunShellCommand = mock.Mock(side_effect=_ShellCommandHandler)
pc = perf_control.PerfControl(mock_device)
self._MockOutLowLevelPerfControlMethods(pc)
# Verify.
# pylint: disable=protected-access
# pylint: disable=no-member
pc.SetDefaultPerfMode()
pc.SetScalingGovernor.assert_called_once_with('ondemand')
pc._SetScalingMaxFreqForCpus.assert_any_call(1440000, 'cpu0 cpu1 cpu2 cpu3')
pc._SetScalingMaxFreqForCpus.assert_any_call(1824000, 'cpu4 cpu5')
pc._SetMaxGpuClock.assert_called_once_with(600000000)
pc._ForceAllCpusOnline.assert_called_once_with(False)