package rocks.inspectit.agent.java.sensor.platform; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.when; import java.lang.management.RuntimeMXBean; import java.lang.reflect.Field; import org.mockito.Mock; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.sun.management.OperatingSystemMXBean; import rocks.inspectit.agent.java.sensor.platform.provider.OperatingSystemInfoProvider; import rocks.inspectit.agent.java.sensor.platform.provider.sun.SunOperatingSystemInfoProvider; import rocks.inspectit.shared.all.testbase.TestBase; @SuppressWarnings("PMD") public class CpuUsageCalculatorTest extends TestBase { @Mock private RuntimeMXBean runtimeBean; @Mock private OperatingSystemMXBean osBean; private OperatingSystemInfoProvider wrapper; @BeforeMethod public void initTestClass() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { wrapper = new SunOperatingSystemInfoProvider(); Field field = wrapper.getClass().getDeclaredField("runtimeBean"); field.setAccessible(true); field.set(wrapper, runtimeBean); field = wrapper.getClass().getDeclaredField("osBean"); field.setAccessible(true); field.set(wrapper, osBean); } @Test public void calculateCpuUsage() { int availableProc = 1; // process cpu time is provided as nanoseconds long processCpuTime1 = 200L * 1000 * 1000; // ns representation of 200ms long processCpuTime2 = 500L * 1000 * 1000; // ns representation of 500ms // uptime is provided in milliseconds long uptime1 = 500L; // 500ms long uptime2 = 1100L; // 1100ms when(runtimeBean.getUptime()).thenReturn(uptime1).thenReturn(uptime2); when(osBean.getAvailableProcessors()).thenReturn(availableProc); when(osBean.getProcessCpuTime()).thenReturn(processCpuTime1).thenReturn(processCpuTime2); float cpuUsage1 = wrapper.retrieveCpuUsage(); assertThat((double) cpuUsage1, is(closeTo(0.0d, 0.01d))); float cpuUsage2 = wrapper.retrieveCpuUsage(); // CPU usage can only be deduced after the second call long process = (processCpuTime2 - processCpuTime1); long upAsNano = ((uptime2 - uptime1) * 1000 * 1000); float expectedUsage = ((float) process / upAsNano) * 100; assertThat((double) cpuUsage2, is(closeTo(expectedUsage, 0.01d))); } }