Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Unified Diff: tools/telemetry/telemetry/core/platform/power_monitor/cros_power_monitor_unittest.py

Issue 352583007: Added frequency stats and c-state residency to CrOS power monitor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Moved the unittests to be with CrosSysfsPlatform after moving files. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/telemetry/telemetry/core/platform/power_monitor/cros_power_monitor_unittest.py
diff --git a/tools/telemetry/telemetry/core/platform/power_monitor/cros_power_monitor_unittest.py b/tools/telemetry/telemetry/core/platform/power_monitor/cros_power_monitor_unittest.py
index 8c714f515430432696fe122c2fec3a6c541629e6..48d86a9ec427da40aeea2f5ce7d88cecb83a9df5 100644
--- a/tools/telemetry/telemetry/core/platform/power_monitor/cros_power_monitor_unittest.py
+++ b/tools/telemetry/telemetry/core/platform/power_monitor/cros_power_monitor_unittest.py
@@ -8,7 +8,7 @@ from telemetry.core.platform.power_monitor import cros_power_monitor
class CrosPowerMonitorMonitorTest(unittest.TestCase):
- initial = ('''Device: Line Power
+ initial_power = ('''Device: Line Power
path: /sys/class/power_supply/AC
online: no
type: Mains
@@ -32,7 +32,7 @@ Device: Battery
percentage: 70.1985
display percentage: 73.9874
technology: Li-ion''')
- final = ('''Device: Line Power
+ final_power = ('''Device: Line Power
path: /sys/class/power_supply/AC
online: yes
type: Mains
@@ -56,25 +56,186 @@ Device: Battery
percentage: 70.1985
display percentage: 73.9874
technology: Li-ion''')
- def testEnergyConsumption(self):
- results = cros_power_monitor.CrosPowerMonitor.ParseSamplingOutput(
- self.initial, self.final, .2)
- self.assertAlmostEqual(results['energy_consumption_mwh'], 2558.42)
- self.assertAlmostEqual(results['power_samples_mw'][0], 12792.1)
- whole_package = results['component_utilization']['whole_package']
- self.assertEqual(whole_package['charge_full'], 4.03)
- self.assertEqual(whole_package['charge_full_design'], 4.03)
- self.assertEqual(whole_package['charge_now'], 2.827)
- self.assertEqual(whole_package['energy'], 31.8262)
- self.assertEqual(whole_package['energy_rate'], 12.7993)
- self.assertEqual(whole_package['voltage_now'], 12.238)
+ expected_parsing_power = {
+ 'Line Power': {
+ 'path': '/sys/class/power_supply/AC',
+ 'online': 'no',
+ 'type': 'Mains',
+ 'enum type': 'Disconnected',
+ 'voltage': '0',
+ 'current': '0'
+ },
+ 'Battery': {
+ 'path': '/sys/class/power_supply/BAT0',
+ 'vendor': 'SANYO',
+ 'model name': 'AP13J3K',
+ 'serial number': '0061',
+ 'state': 'Discharging',
+ 'voltage': '11.816',
+ 'energy': '31.8262',
+ 'energy rate': '12.7849',
+ 'current': '1.082',
+ 'charge': '2.829',
+ 'full charge': '4.03',
+ 'full charge design': '4.03',
+ 'percentage': '70.1985',
+ 'display percentage': '73.9874',
+ 'technology': 'Li-ion'
+ }
+ }
+ expected_power = {
+ 'energy_consumption_mwh': 2558.42,
+ 'power_samples_mw': [12784.9, 12799.3],
+ 'component_utilization': {
+ 'battery': {
+ 'charge_full': 4.03,
+ 'charge_full_design': 4.03,
+ 'charge_now': 2.827,
+ 'current_now': 1.082,
+ 'energy': 31.8262,
+ 'energy_rate': 12.7993,
+ 'voltage_now': 12.238
+ }
+ }
+ }
+ expected_cpu = {
+ 'whole_package': {
+ 'frequency_percent': {
+ 1700000000: 3.29254111574526,
+ 1600000000: 0.0,
+ 1500000000: 0.0,
+ 1400000000: 0.15926805099535601,
+ 1300000000: 0.47124116307273645,
+ 1200000000: 0.818756100807525,
+ 1100000000: 1.099381692400982,
+ 1000000000: 2.5942528544384302,
+ 900000000: 5.68661122326737,
+ 800000000: 3.850545467654628,
+ 700000000: 2.409691872245393,
+ 600000000: 1.4693702487650486,
+ 500000000: 2.4623575553879373,
+ 400000000: 2.672038150383057,
+ 300000000: 3.415770495015825,
+ 200000000: 69.59817400982045
+ },
+ 'cstate_residency_percent': {
+ 'C0': 83.67623835616438535,
+ 'C1': 0.2698609589041096,
+ 'C2': 0.2780191780821918,
+ 'C3': 15.77588150684931505
+ }
+ },
+ 'cpu0': {
+ 'frequency_percent': {
+ 1700000000: 4.113700564971752,
+ 1600000000: 0.0,
+ 1500000000: 0.0,
+ 1400000000: 0.1765536723163842,
+ 1300000000: 0.4943502824858757,
+ 1200000000: 0.7944915254237288,
+ 1100000000: 1.2226341807909604,
+ 1000000000: 3.0632062146892656,
+ 900000000: 5.680614406779661,
+ 800000000: 3.6679025423728815,
+ 700000000: 2.379060734463277,
+ 600000000: 1.4124293785310735,
+ 500000000: 2.599752824858757,
+ 400000000: 3.0102401129943503,
+ 300000000: 3.650247175141243,
+ 200000000: 67.73481638418079
+ },
+ 'cstate_residency_percent': {
+ 'C0': 76.76226164383562,
+ 'C1': 0.3189164383561644,
+ 'C2': 0.4544301369863014,
+ 'C3': 22.4643917808219178
+ }
+ },
+ 'cpu1': {
+ 'frequency_percent': {
+ 1700000000: 2.4713816665187682,
+ 1600000000: 0.0,
+ 1500000000: 0.0,
+ 1400000000: 0.1419824296743278,
+ 1300000000: 0.44813204365959713,
+ 1200000000: 0.8430206761913214,
+ 1100000000: 0.9761292040110037,
+ 1000000000: 2.1252994941875945,
+ 900000000: 5.69260803975508,
+ 800000000: 4.033188392936374,
+ 700000000: 2.4403230100275093,
+ 600000000: 1.526311118999024,
+ 500000000: 2.3249622859171177,
+ 400000000: 2.3338361877717633,
+ 300000000: 3.1812938148904073,
+ 200000000: 71.46153163546012
+ },
+ 'cstate_residency_percent': {
+ 'C0': 90.5902150684931507,
+ 'C1': 0.2208054794520548,
+ 'C2': 0.1016082191780822,
+ 'C3': 9.0873712328767123
+ }
+ }
+ }
+ def testParsePowerSupplyInfo(self):
+ result = cros_power_monitor.CrosPowerMonitor.ParsePowerSupplyInfo(
+ self.initial_power)
+ self.assertDictEqual(result, self.expected_parsing_power)
+
+ def testParsePower(self):
+ results = cros_power_monitor.CrosPowerMonitor.ParsePower(
+ self.initial_power, self.final_power, 0.2)
+ for value in results['component_utilization']['battery']:
+ self.assertAlmostEqual(
+ results['component_utilization']['battery'][value],
+ self.expected_power['component_utilization']['battery'][value])
+ self.assertAlmostEqual(results['energy_consumption_mwh'],
+ self.expected_power['energy_consumption_mwh'])
+ self.assertAlmostEqual(results['power_samples_mw'][0],
+ self.expected_power['power_samples_mw'][0])
+ self.assertAlmostEqual(results['power_samples_mw'][1],
+ self.expected_power['power_samples_mw'][1])
+
+ def testCombineResults(self):
+ result = cros_power_monitor.CrosPowerMonitor.CombineResults(
+ self.expected_cpu, self.expected_power)
+ comp_util = result['component_utilization']
+ # Test power values.
+ self.assertEqual(result['energy_consumption_mwh'],
+ self.expected_power['energy_consumption_mwh'])
+ self.assertEqual(result['power_samples_mw'],
+ self.expected_power['power_samples_mw'])
+ self.assertEqual(comp_util['battery'],
+ self.expected_power['component_utilization']['battery'])
+ # Test frequency values.
+ self.assertDictEqual(
+ comp_util['whole_package']['frequency_percent'],
+ self.expected_cpu['whole_package']['frequency_percent'])
+ self.assertDictEqual(
+ comp_util['cpu0']['frequency_percent'],
+ self.expected_cpu['cpu0']['frequency_percent'])
+ self.assertDictEqual(
+ comp_util['cpu1']['frequency_percent'],
+ self.expected_cpu['cpu1']['frequency_percent'])
+ # Test c-state residency values.
+ self.assertDictEqual(
+ comp_util['whole_package']['cstate_residency_percent'],
+ self.expected_cpu['whole_package']['cstate_residency_percent'])
+ self.assertDictEqual(
+ comp_util['cpu0']['cstate_residency_percent'],
+ self.expected_cpu['cpu0']['cstate_residency_percent'])
+ self.assertDictEqual(
+ comp_util['cpu1']['cstate_residency_percent'],
+ self.expected_cpu['cpu1']['cstate_residency_percent'])
def testCanMonitorPower(self):
- status = cros_power_monitor.CrosPowerMonitor.ParsePowerSupplyInfo(
- self.initial)
- self.assertTrue(
- cros_power_monitor.CrosPowerMonitor.IsOnBatteryPower(status, 'peppy'))
- status = cros_power_monitor.CrosPowerMonitor.ParsePowerSupplyInfo(
- self.final)
+ # TODO(tmandel): Add a test here where the device cannot monitor power.
+ initial_status = cros_power_monitor.CrosPowerMonitor.ParsePowerSupplyInfo(
+ self.initial_power)
+ final_status = cros_power_monitor.CrosPowerMonitor.ParsePowerSupplyInfo(
+ self.final_power)
+ self.assertTrue(cros_power_monitor.CrosPowerMonitor.IsOnBatteryPower(
+ initial_status, 'peppy'))
self.assertTrue(cros_power_monitor.CrosPowerMonitor.IsOnBatteryPower(
- status, 'butterfly'))
+ final_status, 'butterfly'))

Powered by Google App Engine
This is Rietveld 408576698