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.
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
):
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):
36 class FakeAndroidPlatformBackend(FakePlatformBackend
):
38 super(FakeAndroidPlatformBackend
, self
).__init
__()
39 self
.device
= 'fake_device'
45 class FakeDesktopPlatformBackend(FakePlatformBackend
):
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
72 self
._is
_shell
_running
= True
73 self
._start
_shell
_called
= True
75 def StartTracing(self
):
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):
85 self
._collect
_trace
_data
_called
= True
88 def RecordClockSyncMarker(self
, _
):
89 self
._record
_clock
_sync
_marker
_called
= True
92 class BattOrTracingAgentTest(unittest
.TestCase
):
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
))
114 battor_wrapper
.BattOrWrapper
= self
._battor
_wrapper
115 battery_utils
.BatteryUtils
= self
._battery
_utils
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
)
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
)
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
):
190 def callback_without_exception(a
, b
):
194 self
.android_agent
.RecordClockSyncMarker('123', callback_without_exception
)
195 with self
.assertRaises(Exception):
196 self
.android_agent
.RecordClockSyncMarker('abc', callback_with_exception
)