fitnesse.testsystems.fit.FitTestSystem Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of fitnesse Show documentation
Show all versions of fitnesse Show documentation
The fully integrated standalone wiki, and acceptance testing framework.
// Copyright (C) 2003-2009 by Object Mentor, Inc. All rights reserved.
// Released under the terms of the CPL Common Public License version 1.0.
package fitnesse.testsystems.fit;
import java.io.IOException;
import java.util.Deque;
import java.util.LinkedList;
import fitnesse.testsystems.*;
public class FitTestSystem implements TestSystem, FitClientListener {
private static final String EMPTY_PAGE_CONTENT = "OH NO! This page is empty!";
private final CompositeTestSystemListener testSystemListener;
private final String testSystemName;
private final CommandRunningFitClient client;
private Deque processingQueue = new LinkedList<>();
private TestPage currentTestPage;
private boolean testSystemIsStopped;
public FitTestSystem(String testSystemName, CommandRunningFitClient fitClient) {
this.testSystemListener = new CompositeTestSystemListener();
this.testSystemName = testSystemName;
this.client = fitClient;
client.addFitClientListener(this);
}
@Override
public String getName() {
return testSystemName;
}
@Override
public void start() throws UnableToStartException {
try {
client.start();
} catch (IOException e) {
throw new UnableToStartException("Can not start Fit client", e);
}
testSystemStarted(this);
}
@Override
public void runTests(TestPage pageToTest) throws TestExecutionException {
processingQueue.addLast(pageToTest);
String html = pageToTest.getHtml();
try {
if (html.isEmpty())
client.send(EMPTY_PAGE_CONTENT);
else
client.send(html);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
exceptionOccurred(e);
throw new TestExecutionException("Testing has been interrupted", e);
} catch (IOException e) {
exceptionOccurred(e);
throw new TestExecutionException("Communication error during testing", e);
}
}
@Override
public void bye() throws UnableToStopException {
try {
client.done();
client.join();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new UnableToStopException("Unable to stop Fit client", e);
} catch (IOException e) {
throw new UnableToStopException("Unable to stop Fit client", e);
} finally {
testSystemStopped(null);
}
}
@Override
public void kill() {
client.kill();
}
@Override
public void addTestSystemListener(TestSystemListener listener) {
testSystemListener.addTestSystemListener(listener);
}
@Override
public void testOutputChunk(String output) {
if (currentTestPage == null) {
currentTestPage = processingQueue.removeFirst();
testSystemListener.testStarted(currentTestPage);
}
testSystemListener.testOutputChunk(output);
}
@Override
public void testComplete(TestSummary testSummary) {
assert currentTestPage != null;
try {
testSystemListener.testComplete(currentTestPage, testSummary);
} finally {
currentTestPage = null;
}
}
@Override
public void exceptionOccurred(Throwable t) {
try {
client.kill();
} finally {
testSystemStopped(t);
}
}
private void testSystemStarted(TestSystem testSystem) {
testSystemListener.testSystemStarted(testSystem);
}
private void testSystemStopped(Throwable throwable) {
if (testSystemIsStopped) return;
testSystemIsStopped = true;
testSystemListener.testSystemStopped(this, throwable);
}
// Remove from here and below: this has all to do with client creation.
@Override
public boolean isSuccessfullyStarted() {
return client.isSuccessfullyStarted();
}
}