package net.jsunit;
import junit.framework.TestSuite;
import net.jsunit.configuration.Configuration;
import net.jsunit.configuration.ConfigurationSource;
import net.jsunit.configuration.DelegatingConfigurationSource;
import net.jsunit.model.Browser;
import java.net.URL;
import java.util.List;
public class DistributedTestSuiteBuilder {
private ConfigurationSource localeSource;
private RemoteServerHitter hitter;
private Configuration localConfiguration;
private int browserCount;
public DistributedTestSuiteBuilder(ConfigurationSource localSource) {
this(localSource, new RemoteMachineServerHitter());
}
public DistributedTestSuiteBuilder(ConfigurationSource localSource, RemoteServerHitter hitter) {
this.localeSource = localSource;
this.hitter = hitter;
this.localConfiguration = new Configuration(localeSource);
}
public void addTestsTo(TestSuite suite) {
for (final URL remoteMachineURL : localConfiguration.getRemoteMachineURLs()) {
ConfigurationSource remoteSource = new RemoteConfigurationSource(hitter, remoteMachineURL.toString());
Configuration remoteConfiguration = new Configuration(remoteSource);
addTestsForRemoteConfigurationTo(remoteConfiguration, remoteMachineURL, suite);
}
suite.setName("JsUnit Tests (" + getRemoteMachineURLCount() + " machines, " + getBrowserCount() + " direct browsers)");
}
private void addTestsForRemoteConfigurationTo(Configuration remoteConfiguration, URL remoteMachineURL, TestSuite suite) {
List<Browser> browsers = remoteConfiguration.getBrowsers();
if (browsers.isEmpty()) {
DistributedTest distributedTest = createDistributedTest(localeSource, remoteMachineURL);
suite.addTest(distributedTest);
} else {
TestSuite suiteForRemoteMachine = new TestSuite(remoteMachineURL.toString());
for (Browser browser : browsers) {
browserCount++;
DistributedTest distributedTest = createDistributedTest(localeSource, remoteMachineURL);
distributedTest.limitToBrowser(browser);
suiteForRemoteMachine.addTest(distributedTest);
}
suite.addTest(suiteForRemoteMachine);
}
}
private DistributedTest createDistributedTest(ConfigurationSource originalSource, final URL remoteMachineURL) {
return new DistributedTest(
originalSource,
new DelegatingConfigurationSource(originalSource) {
public String remoteMachineURLs() {
return remoteMachineURL.toString();
}
}
);
}
public int getRemoteMachineURLCount() {
return localConfiguration.getRemoteMachineURLs().size();
}
public int getBrowserCount() {
return browserCount;
}
}