/* * Copyright (C) 2012 The Android Open Source Project * * 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. */ package com.android.tradefed.device; import com.android.tradefed.device.CpuStatsCollector.CpuStats; import com.android.tradefed.device.CpuStatsCollector.TimeCategory; import com.android.tradefed.testtype.DeviceTestCase; import java.util.List; import java.util.Map; /** * Unit tests for {@link CpuStatsCollector}. */ public class CpuStatsCollectorTest extends DeviceTestCase { /** * Single output for cpustats tool where frequencies are aggregated in the total. */ private final static String[] SINGLE_OUTPUT = { "Total,2,3,5,7,11,13,17,350000,19,700000,23,920000,29,1200000,31", "cpu0,37,41,43,47,53,59,61,350000,67,700000,71,920000,73,1200000,79", "cpu1,83,89,97,101,103,107,109,350000,113,700000,127,920000,131,1200000,137", ""}; /** * Single output for cpustats tool where frequencies are not aggregated in the total. */ private final static String[] SINGLE_NON_AGGREGATE_OUTPUT = { "Total,2,3,5,7,11,13,17", "cpu0,37,41,43,47,53,59,61,350000,67,700000,71,920000,73,1200000,79", "cpu1,83,89,97,101,103,107,109,350000,113,700000,127,920000,131,1200000,137", ""}; /** * Multiline output for cpustats tool. */ private final static String[] MULTI_OUTPUT = { "Total,246,0,69,283,0,0,0,350000,140,700000,22,920000,122,1200000,318", "cpu0,68,0,10,221,0,0,0,350000,70,700000,11,920000,61,1200000,159", "cpu1,177,0,60,63,0,0,0,350000,70,700000,11,920000,61,1200000,159", "", "Total,238,0,75,287,0,0,0,350000,124,700000,12,920000,68,1200000,396", "cpu0,53,0,9,238,0,0,0,350000,62,700000,6,920000,34,1200000,198", "cpu1,186,0,65,49,0,0,0,350000,62,700000,6,920000,34,1200000,198", "", "Total,230,0,71,299,0,0,0,350000,0,700000,0,920000,230,1200000,370", "cpu0,2,0,3,295,0,0,0,350000,0,700000,0,920000,115,1200000,185", "cpu1,228,0,69,3,0,0,0,350000,0,700000,0,920000,115,1200000,185", "", "Total,248,0,59,293,0,0,0,350000,50,700000,4,920000,330,1200000,216", "cpu0,28,0,2,270,0,0,0,350000,25,700000,2,920000,165,1200000,108", "cpu1,219,0,56,24,0,0,0,350000,25,700000,2,920000,165,1200000,108", "", "Total,250,0,63,288,0,0,0,350000,184,700000,22,920000,164,1200000,230", "cpu0,79,0,21,201,0,0,0,350000,92,700000,11,920000,82,1200000,115", "cpu1,171,0,43,86,0,0,0,350000,92,700000,11,920000,82,1200000,115", "", "Total,231,0,80,289,0,0,0,350000,96,700000,4,920000,176,1200000,322", "cpu0,51,0,7,243,0,0,0,350000,48,700000,2,920000,88,1200000,161", "cpu1,181,0,73,47,0,0,0,350000,48,700000,2,920000,88,1200000,161", "", "Total,248,0,69,283,0,0,0,350000,404,700000,22,920000,26,1200000,150", "cpu0,161,0,13,125,0,0,0,350000,202,700000,11,920000,13,1200000,75", "cpu1,86,0,55,158,0,0,0,350000,202,700000,11,920000,13,1200000,75", "", "Total,269,0,97,233,0,0,0,350000,214,700000,18,920000,18,1200000,350", "cpu0,40,0,42,218,0,0,0,350000,107,700000,9,920000,9,1200000,175", "cpu1,230,0,55,15,0,0,0,350000,107,700000,9,920000,9,1200000,175", "", "Total,260,0,100,235,0,0,0,350000,152,700000,10,920000,438,1200000,0", "cpu0,207,0,72,20,0,0,0,350000,76,700000,5,920000,219,1200000,0", "cpu1,53,0,29,214,0,0,0,350000,76,700000,5,920000,219,1200000,0", "", "Total,248,0,65,287,0,0,0,350000,50,700000,30,920000,336,1200000,184", "cpu0,26,0,14,259,0,0,0,350000,25,700000,15,920000,168,1200000,92", "cpu1,221,0,51,28,0,0,0,350000,25,700000,15,920000,168,1200000,92", ""}; /** * Multiline output for cpustats tool where frequencies are not aggregated in the total. */ private final static String[] MULTI_NON_AGGREGATE_OUTPUT = { "Total,246,0,69,283,0,0,0", "cpu0,68,0,10,221,0,0,0,350000,70,700000,11,920000,61,1200000,159", "cpu1,177,0,60,63,0,0,0,350000,70,700000,11,920000,61,1200000,159", "", "Total,238,0,75,287,0,0,0", "cpu0,53,0,9,238,0,0,0,350000,62,700000,6,920000,34,1200000,198", "cpu1,186,0,65,49,0,0,0,350000,62,700000,6,920000,34,1200000,198", "", "Total,230,0,71,299,0,0,0", "cpu0,2,0,3,295,0,0,0,350000,0,700000,0,920000,115,1200000,185", "cpu1,228,0,69,3,0,0,0,350000,0,700000,0,920000,115,1200000,185", "", "Total,248,0,59,293,0,0,0", "cpu0,28,0,2,270,0,0,0,350000,25,700000,2,920000,165,1200000,108", "cpu1,219,0,56,24,0,0,0,350000,25,700000,2,920000,165,1200000,108", "", "Total,250,0,63,288,0,0,0", "cpu0,79,0,21,201,0,0,0,350000,92,700000,11,920000,82,1200000,115", "cpu1,171,0,43,86,0,0,0,350000,92,700000,11,920000,82,1200000,115", "", "Total,231,0,80,289,0,0,0", "cpu0,51,0,7,243,0,0,0,350000,48,700000,2,920000,88,1200000,161", "cpu1,181,0,73,47,0,0,0,350000,48,700000,2,920000,88,1200000,161", "", "Total,248,0,69,283,0,0,0", "cpu0,161,0,13,125,0,0,0,350000,202,700000,11,920000,13,1200000,75", "cpu1,86,0,55,158,0,0,0,350000,202,700000,11,920000,13,1200000,75", "", "Total,269,0,97,233,0,0,0", "cpu0,40,0,42,218,0,0,0,350000,107,700000,9,920000,9,1200000,175", "cpu1,230,0,55,15,0,0,0,350000,107,700000,9,920000,9,1200000,175", "", "Total,260,0,100,235,0,0,0", "cpu0,207,0,72,20,0,0,0,350000,76,700000,5,920000,219,1200000,0", "cpu1,53,0,29,214,0,0,0,350000,76,700000,5,920000,219,1200000,0", "", "Total,248,0,65,287,0,0,0", "cpu0,26,0,14,259,0,0,0,350000,25,700000,15,920000,168,1200000,92", "cpu1,221,0,51,28,0,0,0,350000,25,700000,15,920000,168,1200000,92", ""}; private CpuStatsCollector mCollector; /** * {@inheritDoc} */ @Override protected void setUp() throws Exception { super.setUp(); mCollector = new CpuStatsCollector(null, 1); } /** * Test that a single output from {@code cpustats} is parsed correctly and that {@link CpuStats} * contains the correct data and calculates the correct data. */ public void testCpuStatsParser_single() { mCollector.getReceiver().processNewLines(SINGLE_OUTPUT); Map<String, List<CpuStats>> cpuStats = mCollector.getCpuStats(); assertEquals(3, cpuStats.size()); assertTrue(cpuStats.containsKey("Total")); assertTrue(cpuStats.containsKey("cpu0")); assertTrue(cpuStats.containsKey("cpu1")); assertEquals(1, cpuStats.get("Total").size()); CpuStats stats = cpuStats.get("Total").get(0); // Time info assertEquals(2, stats.mTimeStats.get(TimeCategory.USER).intValue()); assertEquals(3, stats.mTimeStats.get(TimeCategory.NICE).intValue()); assertEquals(5, stats.mTimeStats.get(TimeCategory.SYS).intValue()); assertEquals(7, stats.mTimeStats.get(TimeCategory.IDLE).intValue()); assertEquals(11, stats.mTimeStats.get(TimeCategory.IOW).intValue()); assertEquals(13, stats.mTimeStats.get(TimeCategory.IRQ).intValue()); assertEquals(17, stats.mTimeStats.get(TimeCategory.SIRQ).intValue()); // Percent info assertEquals(100.0 * 2 / 58, stats.getPercentage(TimeCategory.USER), 0.01); assertEquals(100.0 * 3 / 58, stats.getPercentage(TimeCategory.NICE), 0.01); assertEquals(100.0 * 5 / 58, stats.getPercentage(TimeCategory.SYS), 0.01); assertEquals(100.0 * 7 / 58, stats.getPercentage(TimeCategory.IDLE), 0.01); assertEquals(100.0 * 11 / 58, stats.getPercentage(TimeCategory.IOW), 0.01); assertEquals(100.0 * 13 / 58, stats.getPercentage(TimeCategory.IRQ), 0.01); assertEquals(100.0 * 17 / 58, stats.getPercentage(TimeCategory.SIRQ), 0.01); // Freq info assertEquals(4, stats.mFreqStats.size()); assertEquals(19, stats.mFreqStats.get(350000).intValue()); assertEquals(23, stats.mFreqStats.get(700000).intValue()); assertEquals(29, stats.mFreqStats.get(920000).intValue()); assertEquals(31, stats.mFreqStats.get(1200000).intValue()); assertEquals((51 / 58.0) * (86630.0 / 102), stats.getEstimatedMhz(), 0.01); assertEquals(100.0 * 86630.0 / (102 * 1200), stats.getUsedMhzPercentage(), 0.01); // cpu0 raw stats assertEquals(1, cpuStats.get("cpu0").size()); stats = cpuStats.get("cpu0").get(0); assertEquals(37, stats.mTimeStats.get(TimeCategory.USER).intValue()); assertEquals(41, stats.mTimeStats.get(TimeCategory.NICE).intValue()); assertEquals(43, stats.mTimeStats.get(TimeCategory.SYS).intValue()); assertEquals(47, stats.mTimeStats.get(TimeCategory.IDLE).intValue()); assertEquals(53, stats.mTimeStats.get(TimeCategory.IOW).intValue()); assertEquals(59, stats.mTimeStats.get(TimeCategory.IRQ).intValue()); assertEquals(61, stats.mTimeStats.get(TimeCategory.SIRQ).intValue()); assertEquals(4, stats.mFreqStats.size()); assertEquals(67, stats.mFreqStats.get(350000).intValue()); assertEquals(71, stats.mFreqStats.get(700000).intValue()); assertEquals(73, stats.mFreqStats.get(920000).intValue()); assertEquals(79, stats.mFreqStats.get(1200000).intValue()); // cpu1 raw stats assertEquals(1, cpuStats.get("cpu1").size()); stats = cpuStats.get("cpu1").get(0); assertEquals(83, stats.mTimeStats.get(TimeCategory.USER).intValue()); assertEquals(89, stats.mTimeStats.get(TimeCategory.NICE).intValue()); assertEquals(97, stats.mTimeStats.get(TimeCategory.SYS).intValue()); assertEquals(101, stats.mTimeStats.get(TimeCategory.IDLE).intValue()); assertEquals(103, stats.mTimeStats.get(TimeCategory.IOW).intValue()); assertEquals(107, stats.mTimeStats.get(TimeCategory.IRQ).intValue()); assertEquals(109, stats.mTimeStats.get(TimeCategory.SIRQ).intValue()); assertEquals(4, stats.mFreqStats.size()); assertEquals(113, stats.mFreqStats.get(350000).intValue()); assertEquals(127, stats.mFreqStats.get(700000).intValue()); assertEquals(131, stats.mFreqStats.get(920000).intValue()); assertEquals(137, stats.mFreqStats.get(1200000).intValue()); } /** * Test that a single output from {@code cpustats} is parsed correctly when frequencies are not * aggregated and that {@link CpuStats} contains the correct data and calculates the correct * data. */ public void testCpuStatsParser_single_non_aggregate() { mCollector.getReceiver().processNewLines(SINGLE_NON_AGGREGATE_OUTPUT); Map<String, List<CpuStats>> cpuStats = mCollector.getCpuStats(); assertEquals(3, cpuStats.size()); assertTrue(cpuStats.containsKey("Total")); assertTrue(cpuStats.containsKey("cpu0")); assertTrue(cpuStats.containsKey("cpu1")); assertEquals(1, cpuStats.get("Total").size()); CpuStats stats = cpuStats.get("Total").get(0); // Time info assertEquals(2, stats.mTimeStats.get(TimeCategory.USER).intValue()); assertEquals(3, stats.mTimeStats.get(TimeCategory.NICE).intValue()); assertEquals(5, stats.mTimeStats.get(TimeCategory.SYS).intValue()); assertEquals(7, stats.mTimeStats.get(TimeCategory.IDLE).intValue()); assertEquals(11, stats.mTimeStats.get(TimeCategory.IOW).intValue()); assertEquals(13, stats.mTimeStats.get(TimeCategory.IRQ).intValue()); assertEquals(17, stats.mTimeStats.get(TimeCategory.SIRQ).intValue()); // Percent info assertEquals(100.0 * 2 / 58, stats.getPercentage(TimeCategory.USER), 0.01); assertEquals(100.0 * 3 / 58, stats.getPercentage(TimeCategory.NICE), 0.01); assertEquals(100.0 * 5 / 58, stats.getPercentage(TimeCategory.SYS), 0.01); assertEquals(100.0 * 7 / 58, stats.getPercentage(TimeCategory.IDLE), 0.01); assertEquals(100.0 * 11 / 58, stats.getPercentage(TimeCategory.IOW), 0.01); assertEquals(100.0 * 13 / 58, stats.getPercentage(TimeCategory.IRQ), 0.01); assertEquals(100.0 * 17 / 58, stats.getPercentage(TimeCategory.SIRQ), 0.01); // Freq info assertEquals(0, stats.mFreqStats.size()); assertNull(stats.getEstimatedMhz()); assertNull(stats.getUsedMhzPercentage()); } /** * Tests that multiple lines of {@code cpustats} output are parsed correctly and that * {@link CpuStatsCollector} calculates the correct means from the output. */ public void testCpuStatsParser_multi() { mCollector.getReceiver().processNewLines(MULTI_OUTPUT); Map<String, List<CpuStats>> stats = mCollector.getCpuStats(); assertEquals(3, stats.size()); assertTrue(stats.containsKey("Total")); assertTrue(stats.containsKey("cpu0")); assertTrue(stats.containsKey("cpu1")); assertEquals(10, stats.get("Total").size()); assertEquals(10, stats.get("cpu0").size()); assertEquals(10, stats.get("cpu1").size()); assertEquals(53.67, CpuStatsCollector.getTotalPercentageMean(stats.get("Total")), 0.01); assertEquals(41.18, CpuStatsCollector.getUserPercentageMean(stats.get("Total")), 0.01); assertEquals(12.49, CpuStatsCollector.getSystemPercentageMean(stats.get("Total")), 0.01); assertEquals(0.0, CpuStatsCollector.getIowPercentageMean(stats.get("Total")), 0.01); assertEquals(0.0, CpuStatsCollector.getIrqPercentageMean(stats.get("Total")), 0.01); assertEquals(480.46, CpuStatsCollector.getEstimatedMhzMean(stats.get("Total")), 0.01); assertEquals(74.91, CpuStatsCollector.getUsedMhzPercentageMean(stats.get("Total")), 0.01); assertEquals(30.31, CpuStatsCollector.getTotalPercentageMean(stats.get("cpu0")), 0.01); assertEquals(23.87, CpuStatsCollector.getUserPercentageMean(stats.get("cpu0")), 0.01); assertEquals(6.44, CpuStatsCollector.getSystemPercentageMean(stats.get("cpu0")), 0.01); assertEquals(0.0, CpuStatsCollector.getIowPercentageMean(stats.get("cpu0")), 0.01); assertEquals(0.0, CpuStatsCollector.getIrqPercentageMean(stats.get("cpu0")), 0.01); assertEquals(246.38, CpuStatsCollector.getEstimatedMhzMean(stats.get("cpu0")), 0.01); assertEquals(74.91, CpuStatsCollector.getUsedMhzPercentageMean(stats.get("cpu0")), 0.01); assertEquals(76.99, CpuStatsCollector.getTotalPercentageMean(stats.get("cpu1")), 0.01); assertEquals(58.44, CpuStatsCollector.getUserPercentageMean(stats.get("cpu1")), 0.01); assertEquals(18.55, CpuStatsCollector.getSystemPercentageMean(stats.get("cpu1")), 0.01); assertEquals(0.0, CpuStatsCollector.getIowPercentageMean(stats.get("cpu1")), 0.01); assertEquals(0.0, CpuStatsCollector.getIrqPercentageMean(stats.get("cpu1")), 0.01); assertEquals(714.29, CpuStatsCollector.getEstimatedMhzMean(stats.get("cpu1")), 0.01); assertEquals(74.91, CpuStatsCollector.getUsedMhzPercentageMean(stats.get("cpu1")), 0.01); } /** * Tests that multiple lines of {@code cpustats} output are parsed correctly when frequencies * are not aggregated and that {@link CpuStatsCollector} calculates the correct means from the * output. */ public void testCpuStatsParser_multi_non_aggregate() { mCollector.getReceiver().processNewLines(MULTI_NON_AGGREGATE_OUTPUT); Map<String, List<CpuStats>> stats = mCollector.getCpuStats(); assertEquals(3, stats.size()); assertTrue(stats.containsKey("Total")); assertTrue(stats.containsKey("cpu0")); assertTrue(stats.containsKey("cpu1")); assertEquals(10, stats.get("Total").size()); assertEquals(10, stats.get("cpu0").size()); assertEquals(10, stats.get("cpu1").size()); assertEquals(53.67, CpuStatsCollector.getTotalPercentageMean(stats.get("Total")), 0.01); assertEquals(41.18, CpuStatsCollector.getUserPercentageMean(stats.get("Total")), 0.01); assertEquals(12.49, CpuStatsCollector.getSystemPercentageMean(stats.get("Total")), 0.01); assertEquals(0.0, CpuStatsCollector.getIowPercentageMean(stats.get("Total")), 0.01); assertEquals(0.0, CpuStatsCollector.getIrqPercentageMean(stats.get("Total")), 0.01); assertNull(CpuStatsCollector.getEstimatedMhzMean(stats.get("Total"))); assertNull(CpuStatsCollector.getUsedMhzPercentageMean(stats.get("Total"))); } }