1e81fdcb135d0325e3bc22fae0583555d20aae280Brendan Jackman#    Copyright 2015-2017 ARM Limited
208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#
308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino# Licensed under the Apache License, Version 2.0 (the "License");
408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino# you may not use this file except in compliance with the License.
508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino# You may obtain a copy of the License at
608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#
708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#     http://www.apache.org/licenses/LICENSE-2.0
808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#
908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino# Unless required by applicable law or agreed to in writing, software
1008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino# distributed under the License is distributed on an "AS IS" BASIS,
1108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino# See the License for the specific language governing permissions and
1308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino# limitations under the License.
1408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino#
1508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
1608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinoimport pandas as pd
1708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinoimport trappy
1808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinoimport unittest
1908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
2008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merinoclass TestBareTrace(unittest.TestCase):
2108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    def __init__(self, *args, **kwargs):
2208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        super(TestBareTrace, self).__init__(*args, **kwargs)
2308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        dfr0 = pd.DataFrame({"l1_misses": [24, 535,  41],
2408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                             "l2_misses": [155, 11, 200],
2508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                             "cpu":       [ 0,   1,   0]},
2608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                            index=pd.Series([1.020, 1.342, 1.451], name="Time"))
2708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
2808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        dfr1 = pd.DataFrame({"load": [ 35,  16,  21,  28],
2908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                             "util": [279, 831, 554, 843]},
3008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino                            index=pd.Series([1.279, 1.718, 2.243, 2.465], name="Time"))
3108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
3208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        self.dfr = [dfr0, dfr1]
3308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
3408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    def test_bare_trace_accepts_name(self):
3508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        """The BareTrace() accepts a name parameter"""
3608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
3708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        trace = trappy.BareTrace(name="foo")
3808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
3908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        self.assertEquals(trace.name, "foo")
4008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
4108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    def test_bare_trace_can_add_parsed_event(self):
4208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        """The BareTrace() class can add parsed events to its collection of trace events"""
4308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        trace = trappy.BareTrace()
4408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        trace.add_parsed_event("pmu_counters", self.dfr[0])
4508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
4608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        self.assertEquals(len(trace.pmu_counters.data_frame), 3)
4708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        self.assertEquals(trace.pmu_counters.data_frame["l1_misses"].iloc[0], 24)
4808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
4908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        trace.add_parsed_event("pivoted_counters", self.dfr[0], pivot="cpu")
5008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        self.assertEquals(trace.pivoted_counters.pivot, "cpu")
5108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
5208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    def test_bare_trace_get_duration(self):
5308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        """BareTrace.get_duration() works for a simple case"""
5408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
5508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        trace = trappy.BareTrace()
5608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        trace.add_parsed_event("pmu_counter", self.dfr[0])
5708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        trace.add_parsed_event("load_event", self.dfr[1])
5808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
59211eeb5b8c238f6a2934b92b5bc4200b549f0780Valentin Schneider        self.assertEquals(trace.get_duration(), self.dfr[1].index[-1] - self.dfr[0].index[0])
6008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
6108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    def test_bare_trace_get_duration_normalized(self):
6208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        """BareTrace.get_duration() works if the trace has been normalized"""
6308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
6408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        trace = trappy.BareTrace()
6508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        trace.add_parsed_event("pmu_counter", self.dfr[0].copy())
6608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        trace.add_parsed_event("load_event", self.dfr[1].copy())
6708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
6808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        basetime = self.dfr[0].index[0]
69b01c848f3928dfcdf2f3d7dae1343bbe677847efChris Redpath        trace._normalize_time(basetime)
7008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
7108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        expected_duration = self.dfr[1].index[-1] - basetime
7208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        self.assertEquals(trace.get_duration(), expected_duration)
7308f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
7408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino    def test_bare_trace_normalize_time_accepts_basetime(self):
7508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        """BareTrace().normalize_time() accepts an arbitrary basetime"""
7608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
7708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        trace = trappy.BareTrace()
7808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        trace.add_parsed_event("pmu_counter", self.dfr[0].copy())
7908f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
8008f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        prev_first_time = trace.pmu_counter.data_frame.index[0]
8108f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        basetime = 3
8208f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
83b01c848f3928dfcdf2f3d7dae1343bbe677847efChris Redpath        trace._normalize_time(basetime)
8408f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
8508f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        self.assertEquals(trace.basetime, basetime)
8608f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino
8708f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        exp_first_time = prev_first_time - basetime
8808f3c34d0a24e7ffeff543e302efc911306e7beaJavi Merino        self.assertEquals(round(trace.pmu_counter.data_frame.index[0] - exp_first_time, 7), 0)
89