/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.management.stats;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import org.mule.tck.junit4.AbstractMuleTestCase;
import org.mule.tck.junit4.rule.SystemProperty;
import org.junit.Rule;
import org.junit.Test;
/**
* Validates some basic assumptions about the ComponentStatistics class behavior.
*/
public class ComponentStatisticsTestCase extends AbstractMuleTestCase {
@Rule
public SystemProperty statIntervalTime = new SystemProperty("statIntervalTime", null);
private static void assertValues(ComponentStatistics stats, long numEvents, long totalTime, long avgTime, long maxTime,
long minTime) {
assertThat("getExecutedEvents", stats.getExecutedEvents(), equalTo(numEvents));
assertThat("getTotalExecutionTime", stats.getTotalExecutionTime(), equalTo(totalTime));
assertThat("getAverageExecutionTime", stats.getAverageExecutionTime(), equalTo(avgTime));
assertThat("getMaxExecutionTime", stats.getMaxExecutionTime(), equalTo(maxTime));
assertThat("getMinExecutionTime", stats.getMinExecutionTime(), equalTo(minTime));
}
@Test
public void verifyStatDefaults() {
ComponentStatistics stats = new ComponentStatistics();
assertValues(stats, 0L, 0L, 0L, 0L, 0L);
assertThat(stats.isEnabled(), equalTo(false));
}
@Test
public void processSingleEvent() {
ComponentStatistics stats = new ComponentStatistics();
stats.addExecutionTime(100L);
assertValues(stats, 1L, 100L, 100L, 100L, 100L);
}
@Test
public void processSingleBranchEvent() {
ComponentStatistics stats = new ComponentStatistics();
stats.addExecutionBranchTime(true, 25L, 25L);
assertValues(stats, 1L, 25L, 25L, 25L, 0L);
stats.addExecutionBranchTime(false, 25L, 50L);
assertValues(stats, 1L, 50L, 50L, 50L, 0L);
stats.addCompleteExecutionTime(50L);
assertValues(stats, 1L, 50L, 50L, 50L, 50L);
}
@Test
public void clearStats() {
ComponentStatistics stats = new ComponentStatistics();
stats.addExecutionTime(100L);
stats.clear();
assertValues(stats, 0L, 0L, 0L, 0L, 0L);
}
/**
* New behavior under the fix to MULE-6417 - no longer throws a divide-by-zero error. Instead, the remainder of the fragmented
* event is ignored until a new event is started.
* <p/>
* Note that this is a partial solution - if multiple components are active at the same time, collection can be 're-enabled' for
* an already-started event. The established API does not allow for a solution, so for now this quirk must be accepted.
*/
@Test
public void clearDuringBranch() {
ComponentStatistics stats = new ComponentStatistics();
stats.addExecutionBranchTime(true, 25L, 25L);
stats.clear();
assertValues(stats, 0L, 0L, 0L, 0L, 0L);
stats.addExecutionBranchTime(false, 25L, 50L);
assertValues(stats, 0L, 0L, 0L, 0L, 0L);
}
@Test
public void verifyMaxMinAverage() {
ComponentStatistics stats = new ComponentStatistics();
stats.addExecutionTime(2L);
stats.addExecutionTime(3L);
assertValues(stats, 2L, 5L, 2L, 3L, 2L);
}
@Test
public void verifyBranchMaxMinAverage() {
ComponentStatistics stats = new ComponentStatistics();
stats.addExecutionBranchTime(true, 2L, 2L);
stats.addCompleteExecutionTime(2L);
stats.addExecutionBranchTime(true, 3L, 3L);
stats.addCompleteExecutionTime(3L);
assertValues(stats, 2L, 5L, 2L, 3L, 2L);
}
@Test
public void verifyMultiBranchMaxMinAverage() {
ComponentStatistics stats = new ComponentStatistics();
stats.addExecutionBranchTime(true, 1L, 1L);
stats.addExecutionBranchTime(false, 1L, 2L);
stats.addCompleteExecutionTime(2L);
stats.addExecutionBranchTime(true, 3L, 3L);
stats.addCompleteExecutionTime(3L);
assertValues(stats, 2L, 5L, 2L, 3L, 2L);
}
@Test
public void verifyShortStatIntervalReset() {
// configure to reset continuously
// this functionality is flawed in many ways, but we'll test the basics anyways
System.setProperty("statIntervalTime", "-1");
ComponentStatistics stats = new ComponentStatistics();
// single
// reset and then collect
stats.addExecutionTime(100L);
assertValues(stats, 1L, 100L, 100L, 100L, 100L);
// reset and then collect
stats.addExecutionTime(200L);
assertValues(stats, 1L, 200L, 200L, 200L, 200L);
// branch
// reset and then collect
stats.addExecutionBranchTime(true, 100L, 100L);
assertValues(stats, 1L, 100L, 100L, 100L, 0L);
// reset and then collect
stats.addExecutionBranchTime(true, 200L, 200L);
assertValues(stats, 1L, 200L, 200L, 200L, 0L);
// currently doesn't reset
stats.addCompleteExecutionTime(200L);
assertValues(stats, 1L, 200L, 200L, 200L, 200L);
}
@Test
public void verifyLongStatIntervalNoReset() {
// configure to reset far into the future
System.setProperty("statIntervalTime", "9999");
ComponentStatistics stats = new ComponentStatistics();
stats.addExecutionTime(100L);
assertValues(stats, 1L, 100L, 100L, 100L, 100L);
// no reset expected
stats.addExecutionBranchTime(true, 100L, 100L);
assertValues(stats, 2L, 200L, 100L, 100L, 100L);
}
}