1# Copyright 2014 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
5import unittest
6
7from telemetry.core.platform.power_monitor import android_temperature_monitor
8from telemetry.unittest import simple_mock
9
10_ = simple_mock.DONT_CARE
11
12
13class TemperatureMonitorForTesting(
14    android_temperature_monitor.AndroidTemperatureMonitor):
15  """Overrides interaction with ADB to test the rest."""
16
17  def __init__(self, power_monitor, expected_temperature):
18    super(TemperatureMonitorForTesting, self).__init__(power_monitor, None)
19    self._expected_temperature = expected_temperature
20
21  def _GetBoardTemperatureCelsius(self):
22    return self._expected_temperature
23
24  def PowerMeasurementsConsistent(self, power_measurements):
25    component_utilization = power_measurements.get('component_utilization', {})
26    whole_package = component_utilization.get('whole_package', {})
27    expected_temperature = whole_package.get('average_temperature_c')
28    return expected_temperature == self._expected_temperature
29
30
31class AndroidTemperatureMonitorTest(unittest.TestCase):
32  def testNoAttmptToMonitorIfIncapable(self):
33    mock_power_monitor = simple_mock.MockObject()
34    mock_power_monitor.ExpectCall('CanMonitorPower').WillReturn(False)
35
36    temperature_monitor = TemperatureMonitorForTesting(mock_power_monitor, 42.0)
37    self.assertTrue(temperature_monitor.CanMonitorPower())
38    temperature_monitor.StartMonitoringPower(None)
39    power_results = temperature_monitor.StopMonitoringPower()
40    self.assertTrue(
41        temperature_monitor.PowerMeasurementsConsistent(power_results))
42
43  def testPowerMonitoringResultsWereUpdated(self):
44    mock_power_monitor = simple_mock.MockObject()
45    mock_power_monitor.ExpectCall('CanMonitorPower').WillReturn(True)
46    fake_measurement = {'identifier' : '123'}
47    mock_power_monitor.ExpectCall('StartMonitoringPower', _)
48    mock_power_monitor.ExpectCall('StopMonitoringPower').WillReturn(
49        fake_measurement)
50
51    temperature_monitor = TemperatureMonitorForTesting(mock_power_monitor, 24.0)
52    self.assertTrue(temperature_monitor.CanMonitorPower())
53    temperature_monitor.StartMonitoringPower(None)
54    measurements = temperature_monitor.StopMonitoringPower()
55    self.assertTrue(
56        temperature_monitor.PowerMeasurementsConsistent(measurements))
57    self.assertEqual('123', measurements['identifier'])
58
59  def testSysfsReadFailed(self):
60    mock_power_monitor = simple_mock.MockObject()
61    mock_power_monitor.ExpectCall('CanMonitorPower').WillReturn(False)
62    mock_adb = simple_mock.MockObject()
63    mock_device_utils = simple_mock.MockObject()
64    mock_device_utils.ExpectCall('ReadFile', _).WillReturn([])
65    setattr(mock_device_utils, 'old_interface', mock_adb)
66
67    monitor = android_temperature_monitor.AndroidTemperatureMonitor(
68        mock_power_monitor, mock_device_utils)
69    self.assertTrue(monitor.CanMonitorPower())
70    monitor.StartMonitoringPower(None)
71    measurements = monitor.StopMonitoringPower()
72    self.assertTrue('identifier' in measurements)
73    self.assertTrue('component_utilization' not in measurements)
74