Update sdk/platform-tools to version 26.0.0.
[android_tools.git] / sdk / platform-tools / systrace / catapult / telemetry / telemetry / internal / platform / tracing_agent / battor_tracing_agent_unittest.py
blob1c6dc065f95f5fa39b3deff074b1e8f355747d99
1 # Copyright 2016 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.
5 import unittest
7 from battor import battor_error
8 from battor import battor_wrapper
9 from devil.android import battery_utils
10 from telemetry.internal.platform.tracing_agent import battor_tracing_agent
11 from telemetry.timeline import trace_data
12 from telemetry.timeline import tracing_config
13 from tracing.trace_data import trace_data
16 _BATTOR_RETURN = 'fake\nbattor\ndata'
19 class FakeBatteryUtils(object):
20 def __init__(self, device):
21 self._device = device
22 self._charging_state = True
24 def SetCharging(self, state):
25 self._charging_state = state
27 def GetCharging(self):
28 return self._charging_state
31 class FakePlatformBackend(object):
32 def GetOSName(self):
33 return ''
36 class FakeAndroidPlatformBackend(FakePlatformBackend):
37 def __init__(self):
38 super(FakeAndroidPlatformBackend, self).__init__()
39 self.device = 'fake_device'
41 def GetOSName(self):
42 return 'android'
45 class FakeDesktopPlatformBackend(FakePlatformBackend):
46 def __init__(self):
47 self.platform = 'win'
49 def GetOSName(self):
50 return self.platform
53 class FakeBattOr(object):
54 def __init__(self, test_platform, android_device=None, battor_path=None,
55 battor_map=None, serial_log_bucket=None):
56 self._is_shell_running = False
57 self._android_device = android_device
58 self._battor_path = battor_path
59 self._battor_map = battor_map
60 self._test_platform = test_platform
61 self._serial_log_bucket = serial_log_bucket
62 self._stop_tracing_called = False
63 self._start_shell_called = False
64 self._start_tracing_called = False
65 self._collect_trace_data_called = False
66 self._record_clock_sync_marker_called = False
68 def IsShellRunning(self):
69 return self._is_shell_running
71 def StartShell(self):
72 self._is_shell_running = True
73 self._start_shell_called = True
75 def StartTracing(self):
76 self.StartShell()
77 self._start_tracing_called = True
79 def StopTracing(self):
80 self._is_shell_running = False
81 self._stop_tracing_called = True
83 def CollectTraceData(self, timeout=None):
84 del timeout # unused
85 self._collect_trace_data_called = True
86 return _BATTOR_RETURN
88 def RecordClockSyncMarker(self, _):
89 self._record_clock_sync_marker_called = True
92 class BattOrTracingAgentTest(unittest.TestCase):
93 def setUp(self):
94 self._config = tracing_config.TracingConfig()
95 self._config.enable_battor_trace = True
97 # Monkey patch BattOrWrapper.
98 self._battor_wrapper = battor_wrapper.BattOrWrapper
99 battor_wrapper.BattOrWrapper = FakeBattOr
100 battor_wrapper.IsBattOrConnected = lambda x, android_device=None: True
102 self._battery_utils = battery_utils.BatteryUtils
103 battery_utils.BatteryUtils = FakeBatteryUtils
105 # Agents and backends.
106 self.android_backend = FakeAndroidPlatformBackend()
107 self.desktop_backend = FakeDesktopPlatformBackend()
108 self.android_agent = (
109 battor_tracing_agent.BattOrTracingAgent(self.android_backend))
110 self.desktop_agent = (
111 battor_tracing_agent.BattOrTracingAgent(self.desktop_backend))
113 def tearDown(self):
114 battor_wrapper.BattOrWrapper = self._battor_wrapper
115 battery_utils.BatteryUtils = self._battery_utils
117 def testInit(self):
118 self.assertTrue(isinstance(self.android_agent._platform_backend,
119 FakeAndroidPlatformBackend))
120 self.assertTrue(isinstance(self.desktop_agent._platform_backend,
121 FakeDesktopPlatformBackend))
123 def testIsSupportedAndroid(self):
124 self.assertTrue(battor_tracing_agent.BattOrTracingAgent.IsSupported(
125 self.android_backend))
126 battor_wrapper.IsBattOrConnected = lambda x, android_device=None: False
127 self.assertFalse(battor_tracing_agent.BattOrTracingAgent.IsSupported(
128 self.android_backend))
130 def testIsSupportedNonAndroid(self):
131 self.desktop_backend.platform = 'mac'
132 battor_wrapper.IsBattOrConnected = lambda *unused: True
133 self.assertTrue(battor_tracing_agent.BattOrTracingAgent.IsSupported(
134 self.desktop_backend))
135 battor_wrapper.IsBattOrConnected = lambda *unused: False
136 self.assertFalse(battor_tracing_agent.BattOrTracingAgent.IsSupported(
137 self.desktop_backend))
139 def testStartAgentTracingPass(self):
140 self.assertTrue(self.android_agent.StartAgentTracing(self._config, 0))
141 self.assertTrue(self.android_agent._battor._is_shell_running)
142 self.assertTrue(self.android_agent._battor._start_shell_called)
143 self.assertTrue(self.android_agent._battor._start_tracing_called)
144 self.assertFalse(self.android_agent._battor._stop_tracing_called)
145 self.assertFalse(
146 self.android_agent._battor._record_clock_sync_marker_called)
148 def testStartAgentTracingConfigSetToFalse(self):
149 self._config.enable_battor_trace = False
150 self.assertFalse(self.android_agent.StartAgentTracing(self._config, 0))
151 self.assertFalse(self.android_agent._battor._is_shell_running)
152 self.assertFalse(self.android_agent._battor._start_shell_called)
153 self.assertFalse(self.android_agent._battor._start_tracing_called)
154 self.assertFalse(self.android_agent._battor._stop_tracing_called)
155 self.assertFalse(
156 self.android_agent._battor._record_clock_sync_marker_called)
158 def testStartAgentTracingFail(self):
159 def throw_battor_error():
160 raise battor_error.BattOrError('Forced Exception')
161 self.android_agent._battor.StartTracing = throw_battor_error
162 with self.assertRaises(battor_error.BattOrError):
163 self.android_agent.StartAgentTracing(self._config, 0)
165 def testStopAgentTracing(self):
166 self.android_agent.StopAgentTracing()
167 self.assertTrue(self.android_agent._battor._stop_tracing_called)
169 def testCollectAgentTraceData(self):
170 builder = trace_data.TraceDataBuilder()
171 self.android_agent.CollectAgentTraceData(builder)
172 self.assertTrue(self.android_agent._battor._collect_trace_data_called)
173 builder = builder.AsData()
174 self.assertTrue(builder.HasTracesFor(trace_data.BATTOR_TRACE_PART))
175 data_from_builder = builder.GetTracesFor(trace_data.BATTOR_TRACE_PART)
176 self.assertEqual([_BATTOR_RETURN], data_from_builder)
178 def testAndroidCharging(self):
179 self.assertTrue(self.android_agent._battery.GetCharging())
180 self.assertTrue(self.android_agent.StartAgentTracing(self._config, 0))
181 self.assertFalse(self.android_agent._battery.GetCharging())
182 self.android_agent.StopAgentTracing()
183 self.assertTrue(self.android_agent._battery.GetCharging())
185 def testRecordClockSyncMarker(self):
186 def callback_with_exception(a, b):
187 del a # unused
188 del b # unused
189 raise Exception
190 def callback_without_exception(a, b):
191 del a # unused
192 del b # unused
194 self.android_agent.RecordClockSyncMarker('123', callback_without_exception)
195 with self.assertRaises(Exception):
196 self.android_agent.RecordClockSyncMarker('abc', callback_with_exception)