All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fitnesse.testsystems.fit.FitTestSystem Maven / Gradle / Ivy

There is a newer version: 20181217
Show newest version
// 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();
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy