// 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.components;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import util.RegexTestCase;
import util.TimeMeasurement;
import fitnesse.responders.run.SocketDealer;
import fitnesse.responders.run.TestSummary;
import fitnesse.responders.run.TestSystemListener;
import fitnesse.testutil.FitSocketReceiver;
import fitnesse.testutil.MockSocket;
import fitnesse.testutil.SimpleSocketDoner;
public class FitClientTest extends RegexTestCase implements TestSystemListener {
private List<String> outputs = new ArrayList<String>();
private List<TestSummary> counts = new ArrayList<TestSummary>();
private CommandRunningFitClient client;
private boolean exceptionOccurred = false;
private int port = 9080;
private FitSocketReceiver receiver;
private SimpleSocketDoner doner;
public void setUp() throws Exception {
CommandRunningFitClient.TIMEOUT = 5000;
client = new CommandRunningFitClient(this, "java -cp classes fit.FitServer -v", port, new SocketDealer());
receiver = new CustomFitSocketReceiver(port);
}
private class CustomFitSocketReceiver extends FitSocketReceiver {
public CustomFitSocketReceiver(int port) {
super(port, null);
}
protected void dealSocket(int ticket) throws Exception {
doner = new SimpleSocketDoner(socket);
client.acceptSocketFrom(doner);
}
}
public void tearDown() throws Exception {
receiver.close();
}
public void acceptOutputFirst(String output) {
outputs.add(output);
}
public void testComplete(TestSummary testSummary) {
this.counts.add(testSummary);
}
public void exceptionOccurred(Throwable e) {
exceptionOccurred = true;
try {
client.kill();
}
catch (Exception e1) {
e1.printStackTrace();
}
}
public void testOneRunUsage() throws Exception {
doSimpleRun();
assertFalse(exceptionOccurred);
assertEquals(1, outputs.size());
assertEquals(1, counts.size());
assertSubString("class", (String) outputs.get(0));
assertEquals(1, counts.get(0).getRight());
}
private void doSimpleRun() throws Exception {
receiver.receiveSocket();
client.start();
Thread.sleep(100);
client.send("<html><table><tr><td>fitnesse.testutil.PassFixture</td></tr></table></html>");
client.done();
client.join();
}
public void testStandardError() throws Exception {
client = new CommandRunningFitClient(this, "java blah", port, new SocketDealer());
client.start();
Thread.sleep(100);
client.join();
assertTrue(exceptionOccurred);
assertSubString("Exception", client.commandRunner.getError());
}
public void testDoesntwaitForTimeoutOnBadCommand() throws Exception {
CommandRunningFitClient.TIMEOUT = 5000;
TimeMeasurement measurement = new TimeMeasurement().start();
client = new CommandRunningFitClient(this, "java blah", port, new SocketDealer());
client.start();
Thread.sleep(50);
client.join();
assertTrue(exceptionOccurred);
assertTrue(measurement.elapsed() < CommandRunningFitClient.TIMEOUT);
}
public void testOneRunWithManyTables() throws Exception {
receiver.receiveSocket();
client.start();
client.send("<html><table><tr><td>fitnesse.testutil.PassFixture</td></tr></table>" +
"<table><tr><td>fitnesse.testutil.FailFixture</td></tr></table>" +
"<table><tr><td>fitnesse.testutil.ErrorFixture</td></tr></table></html>");
client.done();
client.join();
assertFalse(exceptionOccurred);
assertEquals(3, outputs.size());
assertEquals(1, counts.size());
TestSummary count = counts.get(0);
assertEquals(1, count.getRight());
assertEquals(1, count.getWrong());
assertEquals(1, count.getExceptions());
}
public void testManyRuns() throws Exception {
receiver.receiveSocket();
client.start();
client.send("<html><table><tr><td>fitnesse.testutil.PassFixture</td></tr></table></html>");
client.send("<html><table><tr><td>fitnesse.testutil.FailFixture</td></tr></table></html>");
client.send("<html><table><tr><td>fitnesse.testutil.ErrorFixture</td></tr></table></html>");
client.done();
client.join();
assertFalse(exceptionOccurred);
assertEquals(3, outputs.size());
assertEquals(3, counts.size());
assertEquals(1, (counts.get(0)).getRight());
assertEquals(1, (counts.get(1)).getWrong());
assertEquals(1, (counts.get(2)).getExceptions());
}
public void testDonerIsNotifiedWhenFinished_success() throws Exception {
doSimpleRun();
assertTrue(doner.finished);
}
public void testReadyForSending() throws Exception {
CommandRunningFitClient.TIMEOUT = 5000;
Thread startThread = new Thread() {
public void run() {
try {
client.start();
}
catch (Exception e) {
e.printStackTrace();
}
}
};
startThread.start();
Thread.sleep(100);
assertFalse(client.isSuccessfullyStarted());
client.acceptSocketFrom(new SimpleSocketDoner(new MockSocket("")));
Thread.sleep(100);
assertTrue(client.isSuccessfullyStarted());
startThread.interrupt();
}
public void testUnicodeCharacters() throws Exception {
receiver.receiveSocket();
client.start();
client.send("<html><table><tr><td>fitnesse.testutil.EchoFixture</td><td>\uba80\uba81\uba82\uba83</td></tr></table></html>");
client.done();
client.join();
assertFalse(exceptionOccurred);
StringBuffer buffer = new StringBuffer();
for (Iterator<String> iterator = outputs.iterator(); iterator.hasNext();)
buffer.append(iterator.next());
assertSubString("\uba80\uba81\uba82\uba83", buffer.toString());
}
}