package detective.core.distribute.scenario;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import detective.core.Parameters;
import detective.core.Scenario;
import detective.core.Story;
import detective.core.StoryRunner;
import detective.core.distribute.JobRunResult;
import detective.core.distribute.JobToRun;
import detective.core.dsl.ParametersImpl;
import detective.core.filter.RunnerFilter;
import detective.core.filter.RunnerFilterChain;
import detective.core.runner.SimpleStoryRunner;
public class ScenarioRunnerFilter implements RunnerFilter<ScenarioRunContext>{
private static final Logger LOGGER = LoggerFactory.getLogger(ScenarioRunnerFilter.class);
@Override
public void doFilter(ScenarioRunContext context, RunnerFilterChain<ScenarioRunContext> chain) {
Story story = context.getJobStoryRunContext().getStory();
int scenarioIndex = story.getScenarios().indexOf(context.getScenario());
if (scenarioIndex < 0)
return; //Can't find? we don't continue
int expectedScenarioIndex = context.getJobStoryRunContext().getJob().getScenarioIndex();
if (expectedScenarioIndex != -1 && expectedScenarioIndex != scenarioIndex){
return;
}
try {
runScenario(context);
} catch (Throwable e) {
//We don't throw exception otherwise Spark will keep trying
LOGGER.error(e.getMessage(), e);
}
setupJobResult(context);
}
private void runScenario(ScenarioRunContext context) throws Throwable{
StoryRunner runner = new SimpleStoryRunner();
Parameters params = new ParametersImpl();
params.put("_scenarioContext", context);
runner.runScenario(context.getScenario(), params);
}
private void setupJobResult(ScenarioRunContext context){
Scenario scenario = context.getScenario();
JobToRun job = context.getJobStoryRunContext().getJob();
JobRunResult result = new JobRunResult();
result.setStoryName(scenario.getStory().getTitle());
result.setScenarioName(scenario.getTitle());
result.setSuccessed(scenario.getSuccessed());
result.setIgnored(scenario.getIgnored());
result.setError(scenario.getError());
result.getSteps().addAll(context.getSteps());
job.setJobResult(result);
}
}