summaryrefslogtreecommitdiff
path: root/systrace/catapult/systrace/systrace/tracing_agents/battor_trace_agent_unittest.py
blob: 63471611923e2bfe9644d2a371d76761a6328643 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#!/usr/bin/env python

# Copyright 2016 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.

from collections import namedtuple
import unittest
import logging

from systrace import decorators
from systrace.tracing_agents import battor_trace_agent
from battor import battor_wrapper
from devil.android import battery_utils
from devil.utils import battor_device_mapping
from devil.utils import find_usb_devices


mock_opts = namedtuple('mock_opts', ['target', 'device_serial_number',
                                     'battor_path', 'serial_map'])
OPTIONS = mock_opts('android', 'Phn2', None, __file__)
CATEGORIES = None
_DEFAULT_BATTOR_LIST = ['dev/ttyUSB0']

def raise_error(*args, **kwargs):
  del args
  del kwargs
  raise RuntimeError('Should not call this function in the test')

battor_device_mapping.GenerateSerialMapFile = raise_error

def setup_battor_test(StartShell_error, StartTracing_error,
                      StopTracing_error, CollectTraceData_error,
                      battor_paths=None):
  wrapper = MockBattOrWrapper(StartShell_error, StartTracing_error,
                              StopTracing_error, CollectTraceData_error)
  def wrapper_maker(*args, **kwargs):
    del args
    del kwargs
    return wrapper
  battor_wrapper.BattOrWrapper = wrapper_maker
  find_usb_devices.GetBusNumberToDeviceTreeMap = lambda: None
  if battor_paths is None:
    battor_paths = _DEFAULT_BATTOR_LIST
  battor_device_mapping.GetBattOrList = lambda x: battor_paths


class MockBattOrWrapper(object):
  def __init__(self, StartShell_error=False, StartTracing_error=False,
               StopTracing_error=False, CollectTraceData_error=False):
    self._StartShell_error = StartShell_error
    self._StartTracing_error = StartTracing_error
    self._StopTracing_error = StopTracing_error
    self._CollectTraceData_error = CollectTraceData_error
    self._running = False
    self._tracing = False
    self._output = False

  def IsShellRunning(self):
    return self._running

  def StartShell(self):
    assert not self._running
    if self._StartShell_error:
      raise RuntimeError('Simulated error in StartShell')
    self._running = True

  def StartTracing(self):
    assert self._running
    assert not self._tracing
    if self._StartTracing_error:
      raise RuntimeError('Simulated error in StartTracing')
    self._tracing = True

  def StopTracing(self):
    assert self._running
    assert self._tracing
    if self._StopTracing_error:
      raise RuntimeError('Simulated error in StopTracing')
    self._running = False
    self._tracing = False
    self._output = True

  def CollectTraceData(self):
    assert self._output
    if self._CollectTraceData_error:
      raise RuntimeError('Simulated error in CollectTraceData')
    return 'traceout1\ntraceout2'


class MockBatteryUtils(object):
  def __init__(self, _):
    self._is_charging = True

  def GetCharging(self):
    return self._is_charging

  def SetCharging(self, value):
    self._is_charging = value


battery_utils.BatteryUtils = MockBatteryUtils


class BattOrAgentTest(unittest.TestCase):

  @decorators.HostOnlyTest
  def test_trace_double_start(self):
    setup_battor_test(StartShell_error=False, StartTracing_error=False,
                      StopTracing_error=False, CollectTraceData_error=False)
    agent = battor_trace_agent.BattOrTraceAgent()
    agent.StartAgentTracing(OPTIONS, CATEGORIES)
    self.assertRaises(AssertionError,
                      lambda: agent.StartAgentTracing(OPTIONS, CATEGORIES))

  @decorators.HostOnlyTest
  def test_trace_error_start_shell(self):
    setup_battor_test(StartShell_error=True, StartTracing_error=False,
                      StopTracing_error=False, CollectTraceData_error=False)
    agent = battor_trace_agent.BattOrTraceAgent()
    self.assertRaises(RuntimeError,
                      lambda: agent.StartAgentTracing(OPTIONS, CATEGORIES))

  @decorators.HostOnlyTest
  def test_trace_error_start_tracing(self):
    setup_battor_test(StartShell_error=False, StartTracing_error=True,
                      StopTracing_error=False, CollectTraceData_error=False)
    agent = battor_trace_agent.BattOrTraceAgent()
    self.assertRaises(RuntimeError,
                      lambda: agent.StartAgentTracing(OPTIONS, CATEGORIES))

  @decorators.HostOnlyTest
  def test_trace_error_stop_tracing(self):
    setup_battor_test(StartShell_error=False, StartTracing_error=False,
                      StopTracing_error=True, CollectTraceData_error=False)
    agent = battor_trace_agent.BattOrTraceAgent()
    agent.StartAgentTracing(OPTIONS, CATEGORIES)
    self.assertRaises(RuntimeError, agent.StopAgentTracing)

  @decorators.HostOnlyTest
  def test_trace_error_get_results(self):
    setup_battor_test(StartShell_error=False, StartTracing_error=False,
                      StopTracing_error=False, CollectTraceData_error=True)
    agent = battor_trace_agent.BattOrTraceAgent()
    agent.StartAgentTracing(OPTIONS, CATEGORIES)
    agent.StopAgentTracing()
    self.assertRaises(RuntimeError, agent.GetResults)

  @decorators.HostOnlyTest
  def test_trace_complete(self):
    setup_battor_test(StartShell_error=False, StartTracing_error=False,
                      StopTracing_error=False, CollectTraceData_error=False)
    agent = battor_trace_agent.BattOrTraceAgent()
    agent.StartAgentTracing(OPTIONS, CATEGORIES)
    agent.StopAgentTracing()
    x = agent.GetResults()
    self.assertEqual(x.raw_data, 'traceout1\ntraceout2')

  @decorators.HostOnlyTest
  def test_trace_error_no_battor(self):
    setup_battor_test(StartShell_error=False, StartTracing_error=False,
                      StopTracing_error=False, CollectTraceData_error=False,
                      battor_paths=[])
    agent = battor_trace_agent.BattOrTraceAgent()
    options = mock_opts('android', 'Phn2', None, None)
    with self.assertRaises(AssertionError):
      agent.StartAgentTracing(options, CATEGORIES)

  @decorators.HostOnlyTest
  def test_trace_error_multiple_battors_no_battor_path(self):
    setup_battor_test(StartShell_error=False, StartTracing_error=False,
                      StopTracing_error=False, CollectTraceData_error=False,
                      battor_paths=['a', 'b'])
    agent = battor_trace_agent.BattOrTraceAgent()
    options = mock_opts('android', 'Phn2', None, None)
    with self.assertRaises(AssertionError):
      agent.StartAgentTracing(options, CATEGORIES)


if __name__ == "__main__":
  logging.getLogger().setLevel(logging.DEBUG)
  unittest.main(verbosity=2)