package jhydra.core.testcase; import jhydra.core.config.IRuntimeConfig; import jhydra.core.logging.ILog; import jhydra.core.testcase.result.FatalExitTestCaseResult; import jhydra.core.testcase.result.ITestCaseResult; import jhydra.core.testcase.result.TestResultCategory; import org.joda.time.DateTime; import java.util.ArrayList; import java.util.List; /** * Author: jantic * Date: 3/9/13 */ public class RobustTestCase implements ITestCase{ private final ITestCase testCase; private final IRuntimeConfig config; private final ILog log; public RobustTestCase(ITestCase testCase, IRuntimeConfig config, ILog log){ this.testCase = testCase; this.config = config; this.log = log; } @Override public ITestCaseResult execute(){ final Integer maxNumberOfTries = config.getTestCaseMaxNumTries(); final Integer waitSecondsBetweenAttempts = config.getTestCaseWaitSecondsBetweenAttempts(); Integer numberOfTries = 1; while (numberOfTries <= maxNumberOfTries) { final ITestCaseResult testCaseResult = testCase.execute(); if(testCaseResult.getResultCategory() != TestResultCategory.NON_FATAL_EXIT){return testCaseResult;} numberOfTries++; if (numberOfTries <= maxNumberOfTries) { final String message = "Attempt on test case failed. Attempt number " + numberOfTries.toString() + " coming up, after a " + waitSecondsBetweenAttempts.toString() + " second pause."; log.warn(message); pauseBetweenAttempts(waitSecondsBetweenAttempts); } else{ final String message = "Attempt on test case failed, and max number of attempts were made. Returning failure result."; log.warn(message); return testCaseResult; } } final String message = "Error- max number of tries configured for test cases is less than 1! Number configured: " + maxNumberOfTries.toString() + ". Test will be skipped."; log.error(message); final List<String> errorMessages = new ArrayList<>(); errorMessages.add(message); return new FatalExitTestCaseResult(DateTime.now(), DateTime.now(), errorMessages); } private void pauseBetweenAttempts(Integer pauseSeconds){ try{ Thread.sleep(pauseSeconds * 1000); } catch(InterruptedException e){ final String message = "Warning- testing pause failed: " + e.getMessage(); log.warn(message); } } @Override public String getName() { return testCase.getName(); } @Override public String getDescription() { return testCase.getDescription(); } @Override public Integer getTestNumber() { return testCase.getTestNumber(); } }