package betsy.tools;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import betsy.common.tasks.FileTasks;
import betsy.common.timeouts.CSV;
import betsy.common.timeouts.calibration.CalibrationTimeout;
import betsy.common.timeouts.timeout.TimeoutRepository;
import org.apache.log4j.AppenderSkeleton;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* @author Christoph Broeker
* @version 1.0
*/
public class TimeoutCalibratorTest {
private TestAppender testAppender;
private static final Logger LOGGER = Logger.getLogger(TimeoutCalibrator.class);
@BeforeClass
public static void setUpClass() {
String transitionFolder = "transition_folder";
FileTasks.mkdirs(Paths.get(transitionFolder));
Path csv = Paths.get("calibration_timeouts.csv");
if (csv.toFile().exists()) {
FileTasks.copyFileIntoFolder(csv, Paths.get(transitionFolder));
FileTasks.deleteFile(csv);
}
}
@AfterClass
public static void tearDownClass() {
Path csv = Paths.get("calibration_timeouts.csv");
FileTasks.deleteFile(csv);
String transitionFolder = "transition_folder";
Path currentRelativePath = Paths.get("");
FileTasks.copyFilesInFolderIntoOtherFolder(Paths.get(transitionFolder), currentRelativePath);
FileTasks.deleteDirectory(Paths.get(transitionFolder));
}
@Before
public void setUp() throws Exception {
testAppender = new TestAppender();
LOGGER.addAppender(testAppender);
}
@After
public void tearDown() throws Exception {
LOGGER.removeAllAppenders();
testAppender = null;
}
@Test
public void testDetermineTimeouts() throws Exception {
Path csv = Paths.get("calibration_timeouts.csv");
List<CalibrationTimeout> timeouts = new ArrayList<>();
CalibrationTimeout timeoutFirst = new CalibrationTimeout("openesb_v", "deploymentTimeout", 30_000, 500);
timeoutFirst.setMeasuredTime(10_000);
timeouts.add(timeoutFirst);
CalibrationTimeout timeoutSecond = new CalibrationTimeout("openesb_v", "deploymentTimeout", 30_000, 500);
timeoutSecond.setMeasuredTime(40_000);
timeouts.add(timeoutSecond);
CalibrationTimeout timeoutThird = new CalibrationTimeout("openesb_v", "deploymentTimeout", 30_000, 500);
timeoutThird.setMeasuredTime(50_000);
timeouts.add(timeoutThird);
CalibrationTimeout timeoutFourth = new CalibrationTimeout("openesb_v", "deploymentTimeout", 30_000, 500);
timeoutFourth.setMeasuredTime(20_000);
timeouts.add(timeoutFourth);
CSV.write(csv, timeouts);
CalibrationTimeout timeout = new CalibrationTimeout("openesb_v", "deploymentTimeout", 30_000, 500);
HashMap<String, CalibrationTimeout> hashMap = new HashMap<>();
hashMap.put("openesb_v.deploymentTimeout", timeout);
TimeoutCalibrator.determineTimeouts(hashMap, csv);
assertEquals("The value is the sum of the 2-fold standardDeviation and the expectation.", 61610, hashMap.get("openesb_v.deploymentTimeout").getTimeoutInMs());
}
@Test
public void testDetermineTimeoutsTimeoutsSmallerNull() throws Exception {
HashMap<String, CalibrationTimeout> hashMap = new HashMap<>();
TimeoutCalibrator.determineTimeouts(hashMap, Paths.get("calibration_timeouts.csv"));
assertEquals("The number of the timeouts has to be greater than null to determine the timeouts.", testAppender.messages.get(0));
}
@Test
public void testAddChangedTestFolderToArgs() throws Exception {
String[] args = {"calibrate", "bpel", "ode", "sequence"};
int i = 0;
String[] result = TimeoutCalibrator.addChangedTestFolderToArgs(args, i);
assertEquals(args[0], result[0]);
assertEquals("-ftest/test" + i, result[1]);
assertEquals("The args should be equal.", args[1], result[2]);
assertEquals("The args should be equal.", args[2], result[3]);
assertEquals("The args should be equal.", args[3], result[4]);
}
@Test
public void testAddChangedTestFolderToArgsToShortArgs() throws Exception {
String[] args = new String[0];
int i = 0;
TimeoutCalibrator.addChangedTestFolderToArgs(args, i);
assertEquals("Can't add test folder to args, because the args aren't greater than null.", testAppender.messages.get(0));
}
@Test
public void testCalculateExpectation() throws Exception {
List<CalibrationTimeout> timeouts = new ArrayList<>();
timeouts.add(new CalibrationTimeout(TimeoutRepository.getTimeout("Bpelg.deploy"), 20000));
timeouts.add(new CalibrationTimeout(TimeoutRepository.getTimeout("Bpelg.deploy"), 40000));
assertEquals("The value should be the expectation of the given timeouts.", 30000, TimeoutCalibrator.calculateExpectation(timeouts));
}
@Test
public void testCalculateExpectationTooLittleTimeouts() throws Exception {
TimeoutCalibrator.calculateExpectation(new ArrayList<>());
assertEquals("The number of the timeouts has to be greater than null to calculate the expectation.", testAppender.messages.get(0));
}
@Test
public void testCalculateVariance() throws Exception {
List<CalibrationTimeout> timeouts = new ArrayList<>();
timeouts.add(new CalibrationTimeout(TimeoutRepository.getTimeout("Bpelg.deploy"), 20000));
timeouts.add(new CalibrationTimeout(TimeoutRepository.getTimeout("Bpelg.deploy"), 40000));
assertEquals("The value should be the variance of the given timeouts.", 1.0E8, TimeoutCalibrator.calculateVariance(timeouts, TimeoutCalibrator.calculateExpectation(timeouts)), 0);
}
@Test
public void testCalculateVarianceTooLittleTimeouts() throws Exception {
TimeoutCalibrator.calculateVariance(new ArrayList<>() , 5);
assertEquals("The number of the timeouts has to be greater than null to calculate the variance.", testAppender.messages.get(0));
}
@Test
public void testStandardDeviation() throws Exception {
List<CalibrationTimeout> timeouts = new ArrayList<>();
timeouts.add(new CalibrationTimeout(TimeoutRepository.getTimeout("Bpelg.deploy"), 20000));
timeouts.add(new CalibrationTimeout(TimeoutRepository.getTimeout("Bpelg.deploy"), 40000));
assertEquals("The value should be the deviation of the given timeouts.", 10000.0, TimeoutCalibrator.standardDeviation(timeouts, TimeoutCalibrator.calculateExpectation(timeouts)), 0);
}
@Test
public void testStandardDeviationToLittleTimeouts() throws Exception {
TimeoutCalibrator.standardDeviation(new ArrayList<>(), 5);
assertEquals("The number of the timeouts has to be greater than null to calculate the standardDeviation.", testAppender.messages.get(0));
}
@Test
public void testCalculatedTimeout() throws Exception {
Path csv = Paths.get("calibration_timeouts.csv");
List<CalibrationTimeout> timeouts = new ArrayList<>();
CalibrationTimeout timeoutFirst = new CalibrationTimeout("openesb_v", "deploymentTimeout", 30_000, 500);
timeoutFirst.setMeasuredTime(10_000);
timeouts.add(timeoutFirst);
CalibrationTimeout timeoutSecond = new CalibrationTimeout("openesb_v", "deploymentTimeout", 30_000, 500);
timeoutSecond.setMeasuredTime(40_000);
timeouts.add(timeoutSecond);
CalibrationTimeout timeoutThird = new CalibrationTimeout("openesb_v", "deploymentTimeout", 30_000, 500);
timeoutThird.setMeasuredTime(50_000);
timeouts.add(timeoutThird);
CalibrationTimeout timeoutFourth = new CalibrationTimeout("openesb_v", "deploymentTimeout", 30_000, 500);
timeoutFourth.setMeasuredTime(20_000);
timeouts.add(timeoutFourth);
CSV.write(csv, timeouts);
CalibrationTimeout timeout = new CalibrationTimeout("openesb_v", "deploymentTimeout", 30_000, 500);
assertEquals("The value is the sum of the 2-fold standardDeviation and the expectation.", 61610, TimeoutCalibrator.calculateTimeout(timeout, 2, csv));
}
private class TestAppender extends AppenderSkeleton {
private List<String> messages = new ArrayList<>();
@Override
protected void append(LoggingEvent event) {
messages.add(event.getMessage().toString());
}
@Override
public void close() {
messages = null;
}
@Override
public boolean requiresLayout() {
return false;
}
}
}