/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.monitoring.system.internal; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.easymock.EasyMock; import org.junit.Test; import de.rcenvironment.core.monitoring.system.api.OperatingSystemException; import de.rcenvironment.core.monitoring.system.api.SystemMonitoringConstants; import de.rcenvironment.core.monitoring.system.api.SystemMonitoringDataService; import de.rcenvironment.core.monitoring.system.api.model.SystemLoadInformation; import de.rcenvironment.toolkit.utils.common.MockTimeSource; /** * Unit test for {@link SystemLoadInformationCollector}. * * @author Robert Mischke */ public class SystemLoadInformationCollectorTest { private static final double DEFAULT_DOUBLE_TEST_EPSILON = 0.001; /** * Tests the behavior when no low-level data has been acquired yet. * * @throws OperatingSystemException on internal errors */ @Test public void defaultValuesForNoData() { final SystemMonitoringDataService dataSourceMock = EasyMock.createStrictMock(SystemMonitoringDataService.class); SystemLoadInformationCollector collector = new SystemLoadInformationCollector(dataSourceMock, 10, new MockTimeSource(), 0, Integer.MAX_VALUE); SystemLoadInformation systemLoadData; systemLoadData = collector.getSystemLoadInformation(5); assertTrue(Double.isNaN(SystemMonitoringConstants.CPU_LOAD_UNKNOWN_DEFAULT)); assertTrue(Double.isNaN(systemLoadData.getCpuLoad())); assertEquals(SystemMonitoringConstants.RAM_UNKNOWN_DEFAULT, systemLoadData.getAvailableRam()); assertEquals(0, systemLoadData.getCpuLoadAvg().getNumSamples()); assertEquals(0.0, systemLoadData.getCpuLoadAvg().getAverage(), DEFAULT_DOUBLE_TEST_EPSILON); // convention: 0.0 on zero elements } /** * Tests the aggregation of low-level data to higher-level information holders. * * @throws OperatingSystemException on internal errors */ @Test public void dataFetchingAndAggregation() throws OperatingSystemException { final int bufferCapacity = 3; final double val02 = 0.2; final double val04 = 0.4; final double val09 = 0.9; final double val05 = 0.5; final SystemMonitoringDataService dataSourceMock = EasyMock.createNiceMock(SystemMonitoringDataService.class); EasyMock.expect(dataSourceMock.getTotalCPUUsage()).andReturn(val02); EasyMock.expect(dataSourceMock.getTotalCPUUsage()).andReturn(val04); // avg = 0.3 EasyMock.expect(dataSourceMock.getTotalCPUUsage()).andReturn(val09); // avg = 0.5 EasyMock.expect(dataSourceMock.getTotalCPUUsage()).andReturn(val05); // avg of last 3 = 0.6 EasyMock.replay(dataSourceMock); final MockTimeSource mockTimeSource = new MockTimeSource(); SystemLoadInformationCollector collector = new SystemLoadInformationCollector(dataSourceMock, bufferCapacity, mockTimeSource, 0, Integer.MAX_VALUE); SystemLoadInformation systemLoadData; // note: the behavior before the first run() is tested separately collector.run(); systemLoadData = collector.getSystemLoadInformation(5); assertEquals(val02, systemLoadData.getCpuLoad(), DEFAULT_DOUBLE_TEST_EPSILON); assertEquals(1, systemLoadData.getCpuLoadAvg().getNumSamples()); assertEquals(val02, systemLoadData.getCpuLoadAvg().getAverage(), DEFAULT_DOUBLE_TEST_EPSILON); collector.run(); systemLoadData = collector.getSystemLoadInformation(5); assertEquals(val04, systemLoadData.getCpuLoad(), DEFAULT_DOUBLE_TEST_EPSILON); assertEquals(2, systemLoadData.getCpuLoadAvg().getNumSamples()); final double expected03 = 0.3; // CheckStyle is kind of silly for this case assertEquals(expected03, systemLoadData.getCpuLoadAvg().getAverage(), DEFAULT_DOUBLE_TEST_EPSILON); collector.run(); // capacity reached systemLoadData = collector.getSystemLoadInformation(5); assertEquals(val09, systemLoadData.getCpuLoad(), DEFAULT_DOUBLE_TEST_EPSILON); assertEquals(3, systemLoadData.getCpuLoadAvg().getNumSamples()); final double expected05 = 0.5; assertEquals(expected05, systemLoadData.getCpuLoadAvg().getAverage(), DEFAULT_DOUBLE_TEST_EPSILON); collector.run(); // capacity overflow; should replace first sample systemLoadData = collector.getSystemLoadInformation(5); assertEquals(val05, systemLoadData.getCpuLoad(), DEFAULT_DOUBLE_TEST_EPSILON); assertEquals(3, systemLoadData.getCpuLoadAvg().getNumSamples()); final double expected06 = 0.6; assertEquals(expected06, systemLoadData.getCpuLoadAvg().getAverage(), DEFAULT_DOUBLE_TEST_EPSILON); } /** * Tests the reaction to a sudden forward leap in system time, and to update requests that are fired significantly faster than the * average update time, both of which happen when the system running the software is put into a suspend state and then resumed. * * @throws OperatingSystemException on internal errors */ @Test public void behaviorOnTimingAnomalies() throws OperatingSystemException { final SystemMonitoringDataService dataSourceMock = EasyMock.createNiceMock(SystemMonitoringDataService.class); EasyMock.expect(dataSourceMock.getTotalCPUUsage()).andReturn(0.0); EasyMock.replay(dataSourceMock); final MockTimeSource mockTimeSource = new MockTimeSource(); final int intendedUpdateInterval = 1000; final int minimumTimeDelta = 800; final int maximumTimeDelta = 5000; SystemLoadInformationCollector collector = new SystemLoadInformationCollector(dataSourceMock, 10, mockTimeSource, minimumTimeDelta, maximumTimeDelta); // baseline checks assertNumberOfAvailableCpuSamples(collector, 0); collector.run(); // first update; should always run assertNumberOfAvailableCpuSamples(collector, 1); // time has not advanced; call should be ignored collector.run(); assertNumberOfAvailableCpuSamples(collector, 1); // still below minimum time; call should be ignored mockTimeSource.setCurrentMockTime(minimumTimeDelta - 1); collector.run(); assertNumberOfAvailableCpuSamples(collector, 1); mockTimeSource.setCurrentMockTime(minimumTimeDelta); collector.run(); assertNumberOfAvailableCpuSamples(collector, 2); mockTimeSource.setCurrentMockTime(intendedUpdateInterval); collector.run(); assertNumberOfAvailableCpuSamples(collector, 2); } private void assertNumberOfAvailableCpuSamples(SystemLoadInformationCollector collector, final int expected) { assertEquals(expected, collector.getSystemLoadInformation(Integer.MAX_VALUE).getCpuLoadAvg().getNumSamples()); } }