org.stjs.testing.driver.DriverConfiguration.java Source code

Java tutorial

Introduction

Here is the source code for org.stjs.testing.driver.DriverConfiguration.java

Source

/**
 *  Copyright 2011 Alexandru Craciun, Eyal Kaspi
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.stjs.testing.driver;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;

import org.stjs.generator.ClassResolver;
import org.stjs.generator.DefaultClassResolver;
import org.stjs.generator.DependencyCollector;
import org.stjs.testing.driver.browser.Browser;
import org.stjs.testing.driver.browser.ChromeBrowser;
import org.stjs.testing.driver.browser.DesktopDefaultBrowser;
import org.stjs.testing.driver.browser.FirefoxBrowser;
import org.stjs.testing.driver.browser.HeadlessChromeBrowser;
import org.stjs.testing.driver.browser.HeadlessFirefoxBrowser;
import org.stjs.testing.driver.browser.PhantomjsBrowser;
import org.stjs.testing.driver.browser.RemoteBrowser;
import org.stjs.testing.driver.browser.RhinoBrowser;

import com.google.common.io.Closeables;

/**
 * this is a wrapper around the configuration files stjs-test.properties.
 * 
 * @author acraciun
 */
public class DriverConfiguration {
    private static final String FILE_NAME = "/stjs-test.properties";

    private static final String PROP_CONFIG = "stjs.test.config";
    private static final String PROP_PORT = "stjs.test.port";
    private static final String PROP_WAIT_FOR_BROWSER = "stjs.test.wait";
    private static final String PROP_SKIP_IF_NO_BROWSER = "stjs.test.skipIfNoBrowser";
    private static final String PROP_START_BROWSER = "stjs.test.startBrowser";
    private static final String PROP_BROWSER_COUNT = "stjs.test.browserCount";
    private static final String PROP_BROWSERS = "stjs.test.browsers";
    private static final String PROP_TEST_TIMEOUT = "stjs.test.testTimeout";
    private static final String PROP_DEBUG = "stjs.test.debug";

    private int port = 8055;
    private int waitForBrowser = 10;
    private boolean skipIfNoBrowser = false;
    private boolean startBrowser = true;
    private int testTimeout = 2;
    private boolean debugEnabled = false;
    private List<Browser> browsers;

    private final ClassLoader classLoader;
    private final ClassResolver stjsClassResolver;
    private final TestResourceResolver resourceResolver;
    private final DependencyCollector dependencyCollector;

    private Properties props;

    public DriverConfiguration(Class<?> klass) {

        InputStream in = null;
        props = new Properties();
        try {
            in = klass.getResourceAsStream(getConfigFileLocation());
            if (in != null) {
                props.load(in);
            }
        } catch (IOException e) {
            // silent
        } finally {
            Closeables.closeQuietly(in);
        }

        // system properties take precedence
        props.putAll(System.getProperties());
        if (props.get(PROP_PORT) != null) {
            port = Integer.parseInt(props.getProperty(PROP_PORT));
        }
        if (props.get(PROP_WAIT_FOR_BROWSER) != null) {
            waitForBrowser = Integer.parseInt(props.getProperty(PROP_WAIT_FOR_BROWSER));
        }
        if (props.get(PROP_SKIP_IF_NO_BROWSER) != null) {
            skipIfNoBrowser = Boolean.parseBoolean(props.getProperty(PROP_SKIP_IF_NO_BROWSER));
        }
        if (props.get(PROP_START_BROWSER) != null) {
            startBrowser = Boolean.parseBoolean(props.getProperty(PROP_START_BROWSER));
        }
        if (props.get(PROP_TEST_TIMEOUT) != null) {
            testTimeout = Integer.parseInt(props.getProperty(PROP_TEST_TIMEOUT));
        }
        if (props.get(PROP_BROWSER_COUNT) != null) {
            System.out.println("Configuration property " + PROP_BROWSER_COUNT + " is now ignored, use "
                    + PROP_BROWSERS + " instead");
        }
        if (props.get(PROP_DEBUG) != null) {
            debugEnabled = Boolean.parseBoolean(props.getProperty(PROP_DEBUG));
        }
        classLoader = new WebAppClassLoader(new URL[] {}, klass.getClassLoader(), debugEnabled);
        stjsClassResolver = new DefaultClassResolver(classLoader);
        resourceResolver = new TestResourceResolver(classLoader);
        dependencyCollector = new DependencyCollector();

        // load browsers last
        browsers = instantiateBrowsers();
    }

    private String getConfigFileLocation() {
        String location = System.getProperties().getProperty(PROP_CONFIG);
        if (location == null) {
            location = FILE_NAME;
        }
        return location;
    }

    private List<Browser> instantiateBrowsers() {
        if (props.getProperty(PROP_BROWSERS) == null) {
            return Arrays.asList(new Browser[] { new DesktopDefaultBrowser(this) });
        }
        String[] browserNames = props.getProperty(PROP_BROWSERS).split(",");
        browsers = new ArrayList<Browser>(browserNames.length);
        for (String browserName : browserNames) {
            Browser browser = BrowserBuilder.build(browserName.trim(), this);
            if (browser != null) {
                browsers.add(browser);
            }
        }
        return browsers;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public int getWaitForBrowser() {
        return waitForBrowser;
    }

    public void setWaitForBrowser(int waitForBrowser) {
        this.waitForBrowser = waitForBrowser;
    }

    public boolean isSkipIfNoBrowser() {
        return skipIfNoBrowser;
    }

    public void setSkipIfNoBrowser(boolean skipIfNoBrowser) {
        this.skipIfNoBrowser = skipIfNoBrowser;
    }

    public boolean isStartBrowser() {
        return startBrowser;
    }

    public void setStartBrowser(boolean startBrowser) {
        this.startBrowser = startBrowser;
    }

    public int getTestTimeout() {
        return testTimeout;
    }

    public void setTestTimeout(int testTimeout) {
        this.testTimeout = testTimeout;
    }

    public int getBrowserCount() {
        return browsers.size();
    }

    public List<Browser> getBrowsers() {
        return browsers;
    }

    public boolean isDebugEnabled() {
        return debugEnabled;
    }

    public void setDebugEnabled(boolean debugEnabled) {
        this.debugEnabled = debugEnabled;
    }

    public ClassLoader getClassLoader() {
        return classLoader;
    }

    public ClassResolver getStjsClassResolver() {
        return this.stjsClassResolver;
    }

    public String getProperty(String name) {
        return this.props.getProperty(name);
    }

    public String getProperty(String name, String defaultValue) {
        return this.props.getProperty(name, defaultValue);
    }

    public DependencyCollector getDependencyCollector() {
        return dependencyCollector;
    }

    public TestResource getResource(String httpUrl) throws URISyntaxException {
        return resourceResolver.resolveResource(httpUrl);
    }

    public URL getServerURL() {
        try {
            return new URL("http", "localhost", port, "/");
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
    }

    private static enum BrowserBuilder {
        PHANTOMJS("phantomjs", PhantomjsBrowser.class), //
        DESKTOP_DEFAULT("desktopDefault", DesktopDefaultBrowser.class), //
        FIREFOX("firefox", FirefoxBrowser.class), //
        CHROME("chrome", ChromeBrowser.class), //
        HEADLESS_FIREFOX("headlessFirefox", HeadlessFirefoxBrowser.class), //
        HEADLESS_CHROME("headlessChrome", HeadlessChromeBrowser.class), //
        REMOTE("remote", RemoteBrowser.class), //
        RHINO("rhino", RhinoBrowser.class);

        String name;
        Class<? extends Browser> clazz;

        BrowserBuilder(String name, Class<? extends Browser> clazz) {
            this.name = name;
            this.clazz = clazz;
        }

        static Browser build(String browserName, DriverConfiguration config) {
            BrowserBuilder builder = forName(browserName);
            if (builder == null) {
                System.out.println("Unable to create browser \"" + browserName + "\": Unknown browser name");
                return null;
            }
            try {
                Constructor<? extends Browser> cons = builder.clazz.getConstructor(DriverConfiguration.class);
                return cons.newInstance(config);
            } catch (Exception e) {
                System.out.println("Unable to create browser \"" + browserName + "\": " + e.getMessage());
            }
            return null;
        }

        static BrowserBuilder forName(String name) {
            for (BrowserBuilder builder : BrowserBuilder.values()) {
                if (builder.name.equals(name)) {
                    return builder;
                }
            }
            return null;
        }
    };
}