blob: ae593840dca9950eee6abb315be94cad36fcb74a [file] [log] [blame]
Javi Merino4ec4aee2016-01-05 15:01:56 +00001# Copyright 2015-2016 ARM Limited
Javi Merino034e7cc2015-04-22 18:39:21 +01002#
Javi Merinoaace7c02015-08-10 14:10:47 +01003# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14#
15
KP Singh7319a882014-12-24 18:18:01 +000016
17import unittest
18import matplotlib
John Pocock96602fc2016-01-15 14:29:11 +000019import numpy as np
KP Singh7319a882014-12-24 18:18:01 +000020import pandas as pd
Kapileshwar Singh5ebf1a32015-02-06 15:50:41 +000021import tempfile
22import os
Javi Merino7b860d52015-12-17 11:14:07 +000023import warnings
KP Singh7319a882014-12-24 18:18:01 +000024
25from test_thermal import BaseTestThermal
Javi Merino435457c2015-08-10 15:59:10 +010026import trappy
KP Singh7319a882014-12-24 18:18:01 +000027
28
29class TestPlotter(BaseTestThermal):
30
31 """No Bombing testcases for plotter"""
32
33 def __init__(self, *args, **kwargs):
34 super(TestPlotter, self).__init__(*args, **kwargs)
35
36 def test_plot_no_pivot(self):
37 """Tests LinePlot with no pivot"""
Javi Merinoc26a3232015-12-11 18:00:30 +000038 trace1 = trappy.FTrace(name="first")
39 l = trappy.LinePlot(trace1, trappy.thermal.Thermal, column="temp")
Kapileshwar Singha2040442015-02-23 12:19:18 +000040 l.view(test=True)
KP Singh7319a882014-12-24 18:18:01 +000041
Javi Merinoc26a3232015-12-11 18:00:30 +000042 def test_plot_multi_trace(self):
43 """Tests LinePlot with no Pivot multi traces"""
44 trace1 = trappy.FTrace(name="first")
45 trace2 = trappy.FTrace(name="second")
Javi Merino435457c2015-08-10 15:59:10 +010046 l = trappy.LinePlot(
Javi Merinoc26a3232015-12-11 18:00:30 +000047 [trace1, trace2], trappy.thermal.Thermal, column="temp")
Kapileshwar Singha2040442015-02-23 12:19:18 +000048 l.view(test=True)
KP Singh7319a882014-12-24 18:18:01 +000049
50 def test_plot_multi(self):
51 """Tests LinePlot with no Pivot multi attrs"""
Javi Merinoc26a3232015-12-11 18:00:30 +000052 trace1 = trappy.FTrace(name="first")
53 trace2 = trappy.FTrace(name="second")
54 l = trappy.LinePlot([trace1,
55 trace2],
Javi Merino435457c2015-08-10 15:59:10 +010056 [trappy.thermal.Thermal,
57 trappy.thermal.ThermalGovernor],
Kapileshwar Singh18820752015-02-11 12:01:08 +000058 column=["temp",
59 "power_range"])
Kapileshwar Singha2040442015-02-23 12:19:18 +000060 l.view(test=True)
KP Singh7319a882014-12-24 18:18:01 +000061
62 def test_plot_filter(self):
63 """Tests LinePlot with no Pivot with filters"""
Javi Merinoc26a3232015-12-11 18:00:30 +000064 trace1 = trappy.FTrace(name="first")
65 trace2 = trappy.FTrace(name="second")
66 l = trappy.LinePlot([trace1,
67 trace2],
Javi Merino435457c2015-08-10 15:59:10 +010068 [trappy.cpu_power.CpuOutPower],
Kapileshwar Singh18820752015-02-11 12:01:08 +000069 column=["power"],
70 filters={"cdev_state": [1]})
Kapileshwar Singha2040442015-02-23 12:19:18 +000071 l.view(test=True)
KP Singh7319a882014-12-24 18:18:01 +000072
73 def test_plot_pivot(self):
74 """Tests LinePlot with Pivot"""
Javi Merinoc26a3232015-12-11 18:00:30 +000075 trace1 = trappy.FTrace(name="first")
Javi Merino435457c2015-08-10 15:59:10 +010076 l = trappy.LinePlot(
Javi Merinoc26a3232015-12-11 18:00:30 +000077 trace1,
Javi Merino435457c2015-08-10 15:59:10 +010078 trappy.thermal.Thermal,
KP Singh7319a882014-12-24 18:18:01 +000079 column="temp",
80 pivot="thermal_zone")
Kapileshwar Singha2040442015-02-23 12:19:18 +000081 l.view(test=True)
KP Singh7319a882014-12-24 18:18:01 +000082
Javi Merinoc26a3232015-12-11 18:00:30 +000083 def test_plot_multi_trace_pivot(self):
84 """Tests LinePlot with Pivot multi traces"""
85 trace1 = trappy.FTrace(name="first")
86 trace2 = trappy.FTrace(name="second")
Javi Merino435457c2015-08-10 15:59:10 +010087 l = trappy.LinePlot(
Javi Merinoc26a3232015-12-11 18:00:30 +000088 [trace1, trace2], trappy.cpu_power.CpuOutPower, column="power", pivot="cpus")
Kapileshwar Singha2040442015-02-23 12:19:18 +000089 l.view(test=True)
KP Singh7319a882014-12-24 18:18:01 +000090
91 def test_plot_multi_pivot(self):
92 """Tests LinePlot with Pivot with multi attrs"""
Javi Merinoc26a3232015-12-11 18:00:30 +000093 trace1 = trappy.FTrace(name="first")
94 trace2 = trappy.FTrace(name="second")
95 l = trappy.LinePlot([trace1,
96 trace2],
Javi Merino435457c2015-08-10 15:59:10 +010097 [trappy.cpu_power.CpuInPower,
98 trappy.cpu_power.CpuOutPower],
Kapileshwar Singh18820752015-02-11 12:01:08 +000099 column=["dynamic_power",
100 "power"],
101 pivot="cpus")
Kapileshwar Singha2040442015-02-23 12:19:18 +0000102 l.view(test=True)
KP Singh7319a882014-12-24 18:18:01 +0000103
104 def test_plot_multi_pivot_filter(self):
105 """Tests LinePlot with Pivot and filters"""
Javi Merinoc26a3232015-12-11 18:00:30 +0000106 trace1 = trappy.FTrace(name="first")
107 trace2 = trappy.FTrace(name="second")
Javi Merino435457c2015-08-10 15:59:10 +0100108 l = trappy.LinePlot(
Javi Merinoc26a3232015-12-11 18:00:30 +0000109 trace1,
Javi Merino435457c2015-08-10 15:59:10 +0100110 trappy.cpu_power.CpuInPower,
KP Singh7319a882014-12-24 18:18:01 +0000111 column=[
Kapileshwar Singh18820752015-02-11 12:01:08 +0000112 "dynamic_power",
KP Singh7319a882014-12-24 18:18:01 +0000113 "load1"],
114 filters={
115 "cdev_state": [
116 1,
117 0]},
118 pivot="cpus")
Kapileshwar Singha2040442015-02-23 12:19:18 +0000119 l.view(test=True)
Kapileshwar Singh5ebf1a32015-02-06 15:50:41 +0000120
121 def test_plot_savefig(self):
122 """Tests plotter: savefig"""
Javi Merinoc26a3232015-12-11 18:00:30 +0000123 trace1 = trappy.FTrace(name="first")
124 trace2 = trappy.FTrace(name="second")
Javi Merino435457c2015-08-10 15:59:10 +0100125 l = trappy.LinePlot(
Javi Merinoc26a3232015-12-11 18:00:30 +0000126 trace1,
Javi Merino435457c2015-08-10 15:59:10 +0100127 trappy.cpu_power.CpuInPower,
Kapileshwar Singh5ebf1a32015-02-06 15:50:41 +0000128 column=[
129 "dynamic_power",
130 "load1"],
131 filters={
132 "cdev_state": [
133 1,
134 0]},
135 pivot="cpus")
136 png_file = tempfile.mktemp(dir="/tmp", suffix=".png")
137 l.savefig(png_file)
138 self.assertTrue(os.path.isfile(png_file))
139 os.remove(png_file)
Kapileshwar Singh14d1d672015-11-27 15:48:52 +0000140
141
142 def test_signals(self):
143 """Test signals input for LinePlot"""
144
Javi Merinoc26a3232015-12-11 18:00:30 +0000145 trace1 = trappy.FTrace(name="first")
146 trace2 = trappy.FTrace(name="second")
Kapileshwar Singh14d1d672015-11-27 15:48:52 +0000147
Javi Merinoc26a3232015-12-11 18:00:30 +0000148 l = trappy.LinePlot([trace1,
149 trace2],
Kapileshwar Singh14d1d672015-11-27 15:48:52 +0000150 signals=["cpu_in_power:dynamic_power",
151 "cpu_out_power:power"],
152 pivot="cpus")
153
154 l.view(test=True)
155
156
157 def test_signals_exceptions(self):
158 """Test incorrect input combinations: signals"""
159
Javi Merinoc26a3232015-12-11 18:00:30 +0000160 trace1 = trappy.FTrace(name="first")
161 trace2 = trappy.FTrace(name="second")
Kapileshwar Singh14d1d672015-11-27 15:48:52 +0000162
163 with self.assertRaises(ValueError):
Javi Merinoc26a3232015-12-11 18:00:30 +0000164 l = trappy.LinePlot([trace1, trace2],
Kapileshwar Singh14d1d672015-11-27 15:48:52 +0000165 column=[
166 "dynamic_power",
167 "load1"],
168 signals=["cpu_in_power:dynamic_power",
169 "cpu_out_power:power"],
170 pivot="cpus")
171
172 with self.assertRaises(ValueError):
Javi Merinoc26a3232015-12-11 18:00:30 +0000173 l = trappy.LinePlot([trace1, trace2],
Kapileshwar Singh14d1d672015-11-27 15:48:52 +0000174 trappy.cpu_power.CpuInPower,
175 signals=["cpu_in_power:dynamic_power",
176 "cpu_out_power:power"],
177 pivot="cpus")
178
179 with self.assertRaises(ValueError):
Javi Merinoc26a3232015-12-11 18:00:30 +0000180 l = trappy.LinePlot([trace1, trace2],
Kapileshwar Singh14d1d672015-11-27 15:48:52 +0000181 trappy.cpu_power.CpuInPower,
182 column=[
183 "dynamic_power",
184 "load1"],
185 signals=["cpu_in_power:dynamic_power",
186 "cpu_out_power:power"],
187 pivot="cpus")
Javi Merino7b860d52015-12-17 11:14:07 +0000188
John Pocock96602fc2016-01-15 14:29:11 +0000189 def test_lineplot_dataframe(self):
190 """LinePlot plots DataFrames without exploding"""
191 data = np.random.randn(4, 2)
192 dfr = pd.DataFrame(data, columns=["tick", "tock"]).cumsum()
193 trappy.LinePlot(dfr, column=["tick"]).view(test=True)
194
Javi Merino7b860d52015-12-17 11:14:07 +0000195 def test_get_trace_event_data_corrupted_trace(self):
196 """get_trace_event_data() works with a corrupted trace"""
197 from trappy.plotter.Utils import get_trace_event_data
198
Javi Merinoc26a3232015-12-11 18:00:30 +0000199 trace = trappy.FTrace()
Javi Merino7b860d52015-12-17 11:14:07 +0000200
201 # We create this trace:
202 #
203 # 1 15414 -> 15411
204 # 2 15411 -> 15414
205 # 3 15414 -> 15411 (corrupted, should be dropped)
206 # 4 15413 -> 15411
207 # 5 15411 -> 15413
208 #
209 # Which should plot like:
210 #
211 # CPU
212 # +-------+-------+
213 # 0 | 15411 | 15414 |
214 # +-------+-------+ +-------+
215 # 1 | 15411 |
216 # +-------+
217 # +-------+-------+-------+-------+
218 # 0.1 0.2 0.3 0.4 0.5
219
220 broken_trace = pd.DataFrame({
221 '__comm': ["task2", "task1", "task2", "task3", "task1"],
222 '__cpu': [0, 0, 0, 1, 1],
223 '__pid': [15414, 15411, 15414, 15413, 15411],
224 'next_comm': ["task1", "task2", "task1", "task1", "task3"],
225 'next_pid': [15411, 15414, 15411, 15411, 15413],
226 'prev_comm': ["task2", "task1", "task2", "task3", "task1"],
227 'prev_pid': [15414, 15411, 15414, 15413, 15411],
228 'prev_state': ["S", "R", "S", "S", "S"]},
229 index=pd.Series(range(1, 6), name="Time"))
230
Javi Merinoc26a3232015-12-11 18:00:30 +0000231 trace.sched_switch.data_frame = broken_trace
Javi Merino7b860d52015-12-17 11:14:07 +0000232
233 with warnings.catch_warnings(record=True) as warn:
Javi Merinoc26a3232015-12-11 18:00:30 +0000234 data, procs, window = get_trace_event_data(trace)
Javi Merino7b860d52015-12-17 11:14:07 +0000235 self.assertEquals(len(warn), 1)
236
237 warn_str = str(warn[-1])
238 self.assertTrue("15411" in warn_str)
239 self.assertTrue("4" in warn_str)
240
241 zipped_comms = zip(broken_trace["next_comm"], broken_trace["next_pid"])
242 expected_procs = set("-".join([comm, str(pid)]) for comm, pid in zipped_comms)
243
244 self.assertTrue([1, 2, 0] in data["task1-15411"])
245 self.assertTrue([2, 3, 0] in data["task2-15414"])
246 self.assertTrue([4, 5, 1] in data["task1-15411"])
247 self.assertEquals(procs, expected_procs)
248 self.assertEquals(window, [1, 5])
Javi Merino3ffa9e22016-01-29 10:19:24 +0100249
250class TestBarPlot(unittest.TestCase):
251 def setUp(self):
252 self.dfr = pd.DataFrame({"foo": [1, 2, 3],
253 "bar": [2, 3, 1],
254 "baz": [3, 2, 1]})
255
256 def test_barplot_dfr(self):
257 """BarPlot plots dataframes without exploding"""
258 trappy.BarPlot(self.dfr, column=["foo", "bar"]).view(test=True)
259
260 def test_barplot_trace(self):
261 """BarPlot plots traces without exploding"""
262 trace = trappy.BareTrace()
263 trace.add_parsed_event("event", self.dfr)
264
265 trappy.BarPlot(trace, signals=["event:foo", "event:bar"]).view(test=True)