Package net.jsunit

Source Code of net.jsunit.DistributedTestSuiteBuilder

package net.jsunit;

import junit.framework.TestSuite;
import net.jsunit.configuration.ConfigurationSource;
import net.jsunit.configuration.DelegatingConfigurationSource;
import net.jsunit.configuration.RemoteConfiguration;
import net.jsunit.configuration.ServerConfiguration;
import net.jsunit.model.Browser;
import net.jsunit.utility.StringUtility;

import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class DistributedTestSuiteBuilder {
    private ConfigurationSource localeSource;
    private RemoteServerHitter hitter;
    private ServerConfiguration localConfiguration;
    private int browserCount;
    private Role role = Role.SERVER;

    public enum Role {
        CLIENT {
            public WebServerFactory getServerFactory() {
                return new WebServerFactory() {
                    public WebServer create(ServerConfiguration configuration) {
                        return new SimpleWebServer(configuration);
                    }
                };
            }},

        SERVER {
            public WebServerFactory getServerFactory() {
                return new WebServerFactory() {
                    public WebServer create(ServerConfiguration configuration) {
                        return new JsUnitServer(configuration);
                    }
                };
            }};

        public abstract WebServerFactory getServerFactory();
    }

    public DistributedTestSuiteBuilder(ConfigurationSource localSource) {
        this(localSource, new RemoteMachineServerHitter());
    }

    public DistributedTestSuiteBuilder(ConfigurationSource localSource, Role role) {
        this(localSource, new RemoteMachineServerHitter());
        this.role = role;
    }

    public DistributedTestSuiteBuilder(ConfigurationSource localSource, RemoteServerHitter hitter) {
        this.localeSource = localSource;
        this.hitter = hitter;
        this.localConfiguration = new ServerConfiguration(localeSource);
    }

    public void addTestsTo(TestSuite suite) {
        List<RemoteConfigurationFetcher> remoteConfigurationFetchers = new ArrayList<RemoteConfigurationFetcher>();
        for (final URL remoteMachineURL : localConfiguration.getRemoteMachineURLs()) {
            RemoteConfigurationFetcher fetcher = new RemoteConfigurationFetcher(hitter, remoteMachineURL);
            fetcher.start();
            remoteConfigurationFetchers.add(fetcher);
        }
        for (RemoteConfigurationFetcher fetcher : remoteConfigurationFetchers) {
            try {
                fetcher.join();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        Collections.sort(remoteConfigurationFetchers);
        for (RemoteConfigurationFetcher fetcher : remoteConfigurationFetchers)
            addTestsForRemoteConfigurationTo(fetcher.getRetrievedRemoteConfiguration(), fetcher.getRemoteMachineURL(), suite);

        suite.setName("JsUnit Tests (" + getRemoteMachineURLCount() + " machines, " + getBrowserCount() + " direct browsers)");
    }

    private void addTestsForRemoteConfigurationTo(RemoteConfiguration remoteConfiguration, URL remoteMachineURL, TestSuite suite) {
        String remoteMachineDisplayName = StringUtility.escapeForSuiteName(remoteMachineURL.getHost()) + ":" + remoteMachineURL.getPort();
        if (!StringUtility.isEmpty(remoteConfiguration.getDescription()))
            remoteMachineDisplayName += " (" + remoteConfiguration.getDescription() + ")";
        if (remoteConfiguration.isAggregate())
            addAggregateDistributedTestTo(remoteMachineURL, remoteMachineDisplayName, remoteConfiguration, suite);
        else
            addSuiteOfDistributedTestsTo(remoteMachineURL, remoteMachineDisplayName, remoteConfiguration, suite);
    }

    private void addSuiteOfDistributedTestsTo(URL remoteMachineURL, String remoteMachineDisplayName, ServerConfiguration remoteConfiguration, TestSuite suite) {
        List<Browser> browsers = remoteConfiguration.getBrowsers();
        TestSuite suiteForRemoteMachine = new TestSuite(remoteMachineDisplayName + " - server with " + browsers.size() + " browser(s)");
        for (Browser browser : browsers) {
            browserCount++;
            DistributedTest distributedTest = createDistributedTest(localeSource, remoteMachineURL);
            distributedTest.limitToBrowser(browser);
            suiteForRemoteMachine.addTest(distributedTest);
        }
        suite.addTest(suiteForRemoteMachine);
    }

    private void addAggregateDistributedTestTo(URL remoteMachineURL, String remoteMachineDisplayName, ServerConfiguration remoteConfiguration, TestSuite suite) {
        DistributedTest distributedTest = createDistributedTest(localeSource, remoteMachineURL);
        String name = remoteMachineDisplayName + " - aggregate server with " + remoteConfiguration.getRemoteMachineURLs().size() + " remote machine(s)";
        distributedTest.setName(name);
        suite.addTest(distributedTest);
    }

    private DistributedTest createDistributedTest(ConfigurationSource originalSource, final URL remoteMachineURL) {
        return new DistributedTest(
                new DelegatingConfigurationSource(originalSource) {
                    public String remoteMachineURLs() {
                        return remoteMachineURL.toString();
                    }
                },
                role.getServerFactory()
        );
    }

    public int getRemoteMachineURLCount() {
        return localConfiguration.getRemoteMachineURLs().size();
    }

    public int getBrowserCount() {
        return browserCount;
    }

}
TOP

Related Classes of net.jsunit.DistributedTestSuiteBuilder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.