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