Home | History | Annotate | Download | only in tests
      1 #    Copyright 2015-2017 ARM Limited
      2 #
      3 # 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 
     16 
     17 import matplotlib
     18 import pandas as pd
     19 
     20 from test_thermal import BaseTestThermal
     21 import trappy
     22 import cpu_power
     23 
     24 class TestCpuPower(BaseTestThermal):
     25     def __init__(self, *args, **kwargs):
     26         super(TestCpuPower, self).__init__(*args, **kwargs)
     27         self.map_label = {"00000000,00000039": "A53", "00000000,00000006": "A57"}
     28 
     29     def test_pivot_with_labels(self):
     30         """Test pivot_with_labels()"""
     31         map_label = {"000000f0": "A15", "0000000f": "A7"}
     32         dfr_in = pd.DataFrame({'cpus': ["000000f0", "0000000f", "000000f0", "0000000f"],
     33                                'freq': [1, 3, 2, 6]})
     34 
     35         dfr_out = cpu_power.pivot_with_labels(dfr_in, "freq", "cpus", map_label)
     36 
     37         self.assertEquals(dfr_out["A15"].iloc[0], 1)
     38         self.assertEquals(dfr_out["A15"].iloc[1], 1)
     39         self.assertEquals(dfr_out["A15"].iloc[2], 2)
     40         self.assertEquals(dfr_out["A7"].iloc[1], 3)
     41 
     42     def test_num_cpus_in_mask(self):
     43         """num_cpus_in_mask() works with the masks we usually use"""
     44         mask = "000000f0"
     45         self.assertEquals(cpu_power.num_cpus_in_mask(mask), 4)
     46 
     47         mask = sorted(self.map_label)[0]
     48         self.assertEquals(cpu_power.num_cpus_in_mask(mask), 2)
     49 
     50         mask = sorted(self.map_label)[1]
     51         self.assertEquals(cpu_power.num_cpus_in_mask(mask), 4)
     52 
     53     def test_cpuoutpower_dataframe(self):
     54         """Test that CpuOutPower() creates a proper data_frame"""
     55         outp = trappy.FTrace().cpu_out_power
     56 
     57         self.assertEquals(outp.data_frame["power"].iloc[0], 1344)
     58         self.assertTrue("cdev_state" in outp.data_frame.columns)
     59 
     60     def test_cpuoutpower_get_all_freqs(self):
     61         """Test CpuOutPower.get_all_freqs()"""
     62         dfr = trappy.FTrace().cpu_out_power.get_all_freqs(self.map_label)
     63 
     64         self.assertEquals(dfr["A57"].iloc[0], 1100)
     65         self.assertEquals(dfr["A53"].iloc[1], 850)
     66 
     67     def test_cpuinpower_get_dataframe(self):
     68         """Test that CpuInPower() creates a proper data_frame()"""
     69         inp = trappy.FTrace().cpu_in_power
     70 
     71         self.assertTrue("load0" in inp.data_frame.columns)
     72         self.assertEquals(inp.data_frame["load0"].iloc[0], 24)
     73 
     74     def test_cpuinpower_big_cpumask(self):
     75         """CpuInPower()'s data_frame is not confused by 64-bit cpumasks"""
     76         in_data = """     kworker/2:2-679   [002]   676.256284: thermal_power_cpu_get:  cpus=00000000,0000000f freq=261888 cdev_state=5 power=12
     77      kworker/2:2-679   [002]   676.276200: thermal_power_cpu_get:  cpus=00000000,00000030 freq=261888 cdev_state=5 power=0
     78      kworker/2:2-679   [002]   676.416202: thermal_power_cpu_get:  cpus=00000000,0000000f freq=261888 cdev_state=5 power=0
     79         """
     80         with open("trace.txt", "w") as fout:
     81             fout.write(in_data)
     82 
     83         inp = trappy.FTrace(normalize_time=False).cpu_in_power
     84         self.assertEquals(round(inp.data_frame.index[0], 6), 676.256284)
     85         self.assertEquals(inp.data_frame["cpus"].iloc[1], "00000000,00000030")
     86 
     87     def test_cpuinpower_data_frame_asymmetric_clusters(self):
     88         """Test that CpuInPower()'s data_frame can handle asymmetric clusters
     89 
     90         That is 2 cpus in one cluster and 4 in another, like Juno
     91         """
     92         in_data = """
     93      kworker/2:2-679   [002]   676.256261: thermal_power_cpu_get:   cpus=00000000,00000030 freq=1900000 raw_cpu_power=1259 load={74 49} power=451
     94      kworker/2:2-679   [002]   676.256271: thermal_power_cpu_get:   cpus=00000000,0000000f freq=450000 raw_cpu_power=36 load={1 2 1 3} power=9
     95 """
     96 
     97         with open("trace.txt", "w") as fout:
     98             fout.write(in_data)
     99 
    100         inp = trappy.FTrace(normalize_time=False).cpu_in_power
    101 
    102         self.assertEquals(inp.data_frame["load0"].iloc[0], 74)
    103         self.assertEquals(inp.data_frame["load1"].iloc[0], 49)
    104         self.assertEquals(inp.data_frame["load2"].iloc[0], 0)
    105         self.assertEquals(inp.data_frame["load3"].iloc[0], 0)
    106         self.assertEquals(inp.data_frame["load0"].iloc[1], 1)
    107         self.assertEquals(inp.data_frame["load1"].iloc[1], 2)
    108         self.assertEquals(inp.data_frame["load2"].iloc[1], 1)
    109         self.assertEquals(inp.data_frame["load3"].iloc[1], 3)
    110 
    111     def test_cpuinpower_get_all_freqs(self):
    112         """Test CpuInPower.get_all_freqs()"""
    113         dfr = trappy.FTrace().cpu_in_power.get_all_freqs(self.map_label)
    114 
    115         self.assertEquals(dfr["A57"].iloc[0], 1100)
    116         self.assertEquals(dfr["A53"].iloc[1], 850)
    117         self.assertEquals(dfr["A57"].iloc[5], 1100)
    118 
    119     def test_cpuinpower_get_load_data(self):
    120         """Test CpuInPower.get_load_data()"""
    121         trace = trappy.FTrace()
    122         first_load = trace.cpu_in_power.data_frame["load0"].iloc[0]
    123         load_data = trace.cpu_in_power.get_load_data(self.map_label)
    124 
    125         self.assertEquals(load_data["A57"].iloc[0], 24 + 19)
    126         self.assertEquals(load_data["A53"].iloc[3], 32 + 28 + 46 + 44)
    127         self.assertEquals(load_data["A57"].iloc[0], load_data["A57"].iloc[1])
    128 
    129         self.assertEquals(trace.cpu_in_power.data_frame["load0"].iloc[0],
    130                           first_load)
    131 
    132     def test_cpuinpower_get_normalized_load_data(self):
    133         """Test CpuInPower.get_normalized_load_data()"""
    134         trace = trappy.FTrace()
    135         first_load = trace.cpu_in_power.data_frame["load0"].iloc[0]
    136         load_data = trace.cpu_in_power.get_normalized_load_data(self.map_label)
    137 
    138         # Ideally the trace should have an event in which the cpus are
    139         # not running at maximum frequency
    140         self.assertEquals(load_data["A57"].iloc[0],
    141                           (24. + 19) * 1100000 / (1100000 * 2))
    142         self.assertEquals(load_data["A53"].iloc[1],
    143                           (36. + 49 + 48 + 7) * 850000 / (850000 * 4))
    144         self.assertEquals(trace.cpu_in_power.data_frame["load0"].iloc[0],
    145                           first_load)
    146