| # Copyright 2015-2016 ARM Limited |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| """ |
| An example file for usage of Analyzer for thermal assertions |
| """ |
| from bart.common.Analyzer import Analyzer |
| from trappy.stats.Topology import Topology |
| import unittest |
| import trappy |
| |
| |
| class TestThermal(unittest.TestCase): |
| |
| @classmethod |
| def setUpClass(cls): |
| # We can run a workload invocation script here |
| # Which then copies the required traces for analysis to |
| # the host. |
| trace_file = "update_a_trace_path_here" |
| ftrace = trappy.FTrace(trace_file, "test_run") |
| |
| # Define the parameters that you intend to use in the grammar |
| config = {} |
| config["THERMAL"] = trappy.thermal.Thermal |
| config["OUT"] = trappy.cpu_power.CpuOutPower |
| config["IN"] = trappy.cpu_power.CpuInPower |
| config["PID"] = trappy.pid_controller.PIDController |
| config["GOVERNOR"] = trappy.thermal.ThermalGovernor |
| config["CONTROL_TEMP"] = 77000 |
| config["SUSTAINABLE_POWER"] = 2500 |
| config["EXPECTED_TEMP_QRT"] = 95 |
| config["EXPECTED_STD_PCT"] = 5 |
| |
| # Define a Topology |
| cls.BIG = '000000f0' |
| cls.LITTLE = '0000000f' |
| cls.tz = 0 |
| cls.analyzer = Analyzer(ftrace, config) |
| |
| def test_temperature_quartile(self): |
| """Assert Temperature quartile""" |
| |
| self.assertTrue(self.analyzer.assertStatement( |
| "numpy.percentile(THERMAL:temp, EXPECTED_TEMP_QRT) < (CONTROL_TEMP + 5000)")) |
| |
| def test_average_temperature(self): |
| """Assert Average temperature""" |
| |
| self.assertTrue(self.analyzer.assertStatement( |
| "numpy.mean(THERMAL:temp) < CONTROL_TEMP", select=self.tz)) |
| |
| def test_temp_stdev(self): |
| """Assert StdDev(temp) as % of mean""" |
| |
| self.assertTrue(self.analyzer.assertStatement( |
| "(numpy.std(THERMAL:temp) * 100.0) / numpy.mean(THERMAL:temp)\ |
| < EXPECTED_STD_PCT", select=self.tz)) |
| |
| def test_zero_load_input_power(self): |
| """Test power demand when load is zero""" |
| |
| zero_load_power_big = self.analyzer.getStatement("((IN:load0 + IN:load1 + IN:load2 + IN:load3) == 0) \ |
| & (IN:dynamic_power > 0)", reference=True, select=self.BIG) |
| self.assertEquals(len(zero_load_power_big), 0) |
| |
| zero_load_power_little = self.analyzer.getStatement("((IN:load0 + IN:load1 + IN:load2 + IN:load3) == 0) \ |
| & (IN:dynamic_power > 0)", reference=True, select=self.LITTLE) |
| self.assertEquals(len(zero_load_power_little), 0) |
| |
| def test_sustainable_power(self): |
| """temp > control_temp, allocated_power < sustainable_power""" |
| |
| self.analyzer.getStatement("(GOVERNOR:current_temperature > CONTROL_TEMP) &\ |
| (PID:output > SUSTAINABLE_POWER)", reference=True, select=0) |