blob: 29ed79a9b9468e9979bbb3fc7a47bfafea55f419 [file] [log] [blame]
Brendan Jackmane81fdcb2017-01-04 17:10:29 +00001# Copyright 2015-2017 ARM Limited
Javi Merinoe4d10d72015-06-22 16:43:04 +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
Javi Merinoe4d10d72015-06-22 16:43:04 +010016
17import pandas as pd
18import unittest
19
Javi Merino435457c2015-08-10 15:59:10 +010020from trappy.plotter import AttrConf
Brendan Jackman085a0262016-11-02 14:30:18 +000021from trappy.plotter.Constraint import Constraint, ConstraintManager
Javi Merinoe4d10d72015-06-22 16:43:04 +010022
23class TestConstraintManager(unittest.TestCase):
Javi Merino435457c2015-08-10 15:59:10 +010024 """Test trappy.plotter.ConstraintManager"""
Javi Merinoe4d10d72015-06-22 16:43:04 +010025
26 def __init__(self, *args, **kwargs):
27 """Init some common data for the tests"""
28
29 self.dfrs = [pd.DataFrame({"load": [1, 2, 2, 3],
30 "freq": [2, 3, 3, 4],
31 "cpu": [0, 1, 0, 1]}),
32 pd.DataFrame({"load": [2, 3, 2, 1],
33 "freq": [1, 2, 2, 1],
34 "cpu": [1, 0, 1, 0]})]
Javi Merino9a08e4c2015-06-22 17:59:45 +010035 self.cols = ["load", "freq"]
Javi Merinoe4d10d72015-06-22 16:43:04 +010036 super(TestConstraintManager, self).__init__(*args, **kwargs)
37
38 def test_one_constraint(self):
39 """Test that the constraint manager works with one constraint"""
40
41 dfr = self.dfrs[0]
42
43 c_mgr = ConstraintManager(dfr, "load", None, AttrConf.PIVOT, {})
44
Javi Merinob23658c2015-06-22 17:04:02 +010045 self.assertEquals(len(c_mgr), 1)
Javi Merinoe4d10d72015-06-22 16:43:04 +010046
Javi Merinob23658c2015-06-22 17:04:02 +010047 constraint = iter(c_mgr).next()
48 series = constraint.result[AttrConf.PIVOT_VAL]
Javi Merinoe4d10d72015-06-22 16:43:04 +010049 self.assertEquals(series.to_dict().values(),
50 dfr["load"].to_dict().values())
51
Javi Merinoc26a3232015-12-11 18:00:30 +000052 def test_no_pivot_multiple_traces(self):
53 """Test that the constraint manager works with multiple traces and no pivots"""
Javi Merinoe4d10d72015-06-22 16:43:04 +010054
55 c_mgr = ConstraintManager(self.dfrs, "load", None, AttrConf.PIVOT, {})
56
Javi Merinob23658c2015-06-22 17:04:02 +010057 self.assertEquals(len(c_mgr), 2)
Javi Merinoe4d10d72015-06-22 16:43:04 +010058
Javi Merinob23658c2015-06-22 17:04:02 +010059 for constraint, orig_dfr in zip(c_mgr, self.dfrs):
Javi Merinoe4d10d72015-06-22 16:43:04 +010060 series = constraint.result[AttrConf.PIVOT_VAL]
61 self.assertEquals(series.to_dict().values(),
62 orig_dfr["load"].to_dict().values())
63
Javi Merinoc26a3232015-12-11 18:00:30 +000064 def test_no_pivot_zipped_columns_and_traces(self):
65 """Test the constraint manager with multiple columns and traces zipped"""
Javi Merinoe4d10d72015-06-22 16:43:04 +010066
Javi Merino9a08e4c2015-06-22 17:59:45 +010067 c_mgr = ConstraintManager(self.dfrs, self.cols, None, AttrConf.PIVOT, {})
Javi Merinoe4d10d72015-06-22 16:43:04 +010068
Javi Merinob23658c2015-06-22 17:04:02 +010069 self.assertEquals(len(c_mgr), 2)
Javi Merinoe4d10d72015-06-22 16:43:04 +010070
Javi Merino9a08e4c2015-06-22 17:59:45 +010071 for constraint, orig_dfr, col in zip(c_mgr, self.dfrs, self.cols):
Javi Merinoe4d10d72015-06-22 16:43:04 +010072 series = constraint.result[AttrConf.PIVOT_VAL]
73 self.assertEquals(series.to_dict().values(),
74 orig_dfr[col].to_dict().values())
75
Javi Merinoc26a3232015-12-11 18:00:30 +000076 def test_no_pivot_multicolumns_multitraces(self):
77 """Test the constraint manager with multiple traces that can have each multiple columns"""
Javi Merino9a08e4c2015-06-22 17:59:45 +010078
79 c_mgr = ConstraintManager(self.dfrs, self.cols, None, AttrConf.PIVOT,
80 {}, zip_constraints=False)
81
82 self.assertEquals(len(c_mgr), 4)
83
84 expected_series = [dfr[col] for dfr in self.dfrs for col in self.cols]
85 for constraint, orig_series in zip(c_mgr, expected_series):
86 series = constraint.result[AttrConf.PIVOT_VAL]
87 self.assertEquals(series.to_dict(), orig_series.to_dict())
88
Javi Merinoe4d10d72015-06-22 16:43:04 +010089 def test_no_pivot_filters(self):
90 """Test the constraint manager with filters"""
91
92 simple_filter = {"freq": [2]}
93
94 c_mgr = ConstraintManager(self.dfrs, "load", None, AttrConf.PIVOT,
95 simple_filter)
96
Javi Merinob23658c2015-06-22 17:04:02 +010097 num_constraints = len(c_mgr)
Javi Merinoe4d10d72015-06-22 16:43:04 +010098 self.assertEquals(num_constraints, 2)
99
Javi Merinob23658c2015-06-22 17:04:02 +0100100 constraint_iter = iter(c_mgr)
101 constraint = constraint_iter.next()
102 self.assertEquals(len(constraint.result), 1)
Javi Merinoe4d10d72015-06-22 16:43:04 +0100103
Javi Merinob23658c2015-06-22 17:04:02 +0100104 constraint = constraint_iter.next()
105 series_second_frame = constraint.result[AttrConf.PIVOT_VAL]
Javi Merinoe4d10d72015-06-22 16:43:04 +0100106 self.assertEquals(series_second_frame.to_dict().values(), [3, 2])
107
108 def test_pivoted_data(self):
Javi Merinoc26a3232015-12-11 18:00:30 +0000109 """Test the constraint manager with a pivot and one trace"""
Javi Merinoe4d10d72015-06-22 16:43:04 +0100110
111 c_mgr = ConstraintManager(self.dfrs[0], "load", None, "cpu", {})
112
Javi Merinob23658c2015-06-22 17:04:02 +0100113 self.assertEquals(len(c_mgr), 1)
Javi Merinoe4d10d72015-06-22 16:43:04 +0100114
Javi Merinob23658c2015-06-22 17:04:02 +0100115 constraint = iter(c_mgr).next()
Javi Merinoe4d10d72015-06-22 16:43:04 +0100116 results = dict([(k, v.to_dict().values()) for k, v in constraint.result.items()])
117 expected_results = {0: [1, 2], 1: [2, 3]}
118
119 self.assertEquals(results, expected_results)
120
Javi Merinoc26a3232015-12-11 18:00:30 +0000121 def test_pivoted_multitrace(self):
122 """Test the constraint manager with a pivot and multiple traces"""
Javi Merinoe4d10d72015-06-22 16:43:04 +0100123
124 c_mgr = ConstraintManager(self.dfrs, "load", None, "cpu", {})
125
Javi Merinob23658c2015-06-22 17:04:02 +0100126 self.assertEquals(len(c_mgr), 2)
Javi Merinoe4d10d72015-06-22 16:43:04 +0100127
Javi Merinob23658c2015-06-22 17:04:02 +0100128 constraint_iter = iter(c_mgr)
129 constraint = constraint_iter.next()
Javi Merinoe4d10d72015-06-22 16:43:04 +0100130 self.assertEquals(constraint.result[0].to_dict().values(), [1, 2])
131
Javi Merinob23658c2015-06-22 17:04:02 +0100132 constraint = constraint_iter.next()
Javi Merinoe4d10d72015-06-22 16:43:04 +0100133 self.assertEquals(constraint.result[1].to_dict().values(), [2, 2])
134
Javi Merinoc26a3232015-12-11 18:00:30 +0000135 def test_pivoted_multitraces_multicolumns(self):
136 """Test the constraint manager with multiple traces and columns"""
Javi Merinoe4d10d72015-06-22 16:43:04 +0100137
138 c_mgr = ConstraintManager(self.dfrs, ["load", "freq"], None, "cpu", {})
Javi Merinob23658c2015-06-22 17:04:02 +0100139 self.assertEquals(len(c_mgr), 2)
Javi Merinoe4d10d72015-06-22 16:43:04 +0100140
Javi Merinob23658c2015-06-22 17:04:02 +0100141 constraint_iter = iter(c_mgr)
142 constraint = constraint_iter.next()
Javi Merinoe4d10d72015-06-22 16:43:04 +0100143 self.assertEquals(constraint.result[1].to_dict().values(), [2, 3])
144
Javi Merinob23658c2015-06-22 17:04:02 +0100145 constraint = constraint_iter.next()
Javi Merinoe4d10d72015-06-22 16:43:04 +0100146 self.assertEquals(constraint.result[0].to_dict().values(), [2, 1])
147
148 def test_pivoted_with_filters(self):
149 """Test the constraint manager with pivoted data and filters"""
150
151 simple_filter = {"load": [2]}
152 c_mgr = ConstraintManager(self.dfrs[0], "freq", None, "cpu",
153 simple_filter)
154
Javi Merinob23658c2015-06-22 17:04:02 +0100155 self.assertEquals(len(c_mgr), 1)
Javi Merinoe4d10d72015-06-22 16:43:04 +0100156
Javi Merinob23658c2015-06-22 17:04:02 +0100157 constraint = iter(c_mgr).next()
Javi Merinoe4d10d72015-06-22 16:43:04 +0100158 result = constraint.result
159
160 self.assertEquals(result[0].iloc[0], 3)
161 self.assertEquals(result[1].iloc[0], 3)
Javi Merinoe6274bd2016-07-04 18:46:52 +0100162
163 def test_constraint_with_window(self):
164 """Test that the constraint manager can constraint to a window of time"""
165 c_mgr = ConstraintManager(self.dfrs[0], "freq", None, AttrConf.PIVOT, {},
166 window=(1, 3))
167
168 constraint = iter(c_mgr).next()
169 series = constraint.result[AttrConf.PIVOT_VAL]
170 self.assertEquals(len(series), 3)
171
172 # For the graph to plot a value at 0.75, the resulting series
173 # must contain the value before 0.75. Same for the upper limit.
174 c_mgr = ConstraintManager(self.dfrs[0], "freq", None, AttrConf.PIVOT, {},
175 window=(0.75, 1.5))
176
177 constraint = iter(c_mgr).next()
178 series = constraint.result[AttrConf.PIVOT_VAL]
179 self.assertEquals(series.index.tolist(), [0, 1, 2])
180
181 c_mgr = ConstraintManager(self.dfrs[0], "freq", None, AttrConf.PIVOT, {},
182 window=(0, 2))
183
184 constraint = iter(c_mgr).next()
185 series = constraint.result[AttrConf.PIVOT_VAL]
186 self.assertEquals(len(series), 3)
Brendan Jackman085a0262016-11-02 14:30:18 +0000187
188class TestConstraint(unittest.TestCase):
189 def test_str_constraint(self):
190 """str(constraint) doesn't fail when the column is not a string"""
191 dfr = pd.DataFrame({12: [1, 2, 3], 13: [3, 4, 5]})
192
193 constraint = Constraint(dfr, AttrConf.PIVOT, 12, template=None,
194 trace_index=0, filters={}, window=None)
195
196 self.assertEqual(str(constraint), "DataFrame 0:12")