/*
* Copyright 2009 Google Inc.
*
* 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 com.google.jstestdriver;
import com.google.common.collect.Sets;
import com.google.jstestdriver.browser.BrowserRunner;
import com.google.jstestdriver.browser.CommandLineBrowserRunner;
import com.google.jstestdriver.config.ConfigurationSource;
import com.google.jstestdriver.config.DefaultConfigurationSource;
import com.google.jstestdriver.config.ExecutionType;
import com.google.jstestdriver.config.UserConfigurationSource;
import com.google.jstestdriver.model.ConcretePathPrefix;
import com.google.jstestdriver.model.HandlerPathPrefix;
import com.google.jstestdriver.model.NullPathPrefix;
import com.google.jstestdriver.runner.RunnerMode;
import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.Option;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Executors;
/**
* FlagsParser for the JsTestDriver.
* @author jeremiele@google.com (Jeremie Lenfant-Engelmann)
*/
/**
* @author corysmith@google.com (Cory Smith)
*
*/
public class FlagsImpl implements Flags {
private Integer port = -1;
private Integer sslPort = -1;
private String server;
private String captureAddress;
private String testOutput = "";
private Set<BrowserRunner> browser = Sets.newHashSet();
private boolean reset;
private long browserTimeout = SlaveBrowser.TIMEOUT;
private ConfigurationSource config = new DefaultConfigurationSource();
private List<String> tests = new ArrayList<String>();
private boolean displayHelp = false;
private boolean verbose = false;
private boolean captureConsole = false;
private boolean preloadFiles = false;
private List<String> dryRunFor = new ArrayList<String>();
@Argument
private List<String> arguments = new ArrayList<String>();
private RunnerMode runnerMode = RunnerMode.QUIET;
private HashSet<String> requiredBrowsers;
private HandlerPathPrefix serverHandlerPrefix = new NullPathPrefix();
private boolean raiseOnFailure = false;
@Option(name="--port", usage="The port on which to start the JsTestDriver server")
public void setPort(Integer port) {
this.port = port;
}
@Override
public Integer getPort() {
return port;
}
@Option(name="--sslPort", usage="The SSL port on which to start the JsTestDriver server")
public void setSslPort(Integer sslPort) {
this.sslPort = sslPort;
}
@Override
public Integer getSslPort() {
return sslPort;
}
@Option(name="--server", usage="The server to which to send the command")
public void setServer(String server) {
this.server = server;
}
@Override
public String getServer() {
return server;
}
@Option(name="--captureAddress", usage="The address to capture the browser.")
public void setCaptureAddress(String captureAddress) {
this.captureAddress = captureAddress;
}
@Override
public String getCaptureAddress() {
return captureAddress;
}
@Override
public List<String> getArguments() {
return arguments;
}
@Option(name="--testOutput", usage="A directory to which serialize the results of the tests as" +
" XML")
public void setTestOutput(String testOutput) {
this.testOutput = testOutput;
}
@Override
public String getTestOutput() {
return testOutput;
}
@Option(name="--browser", usage="The path to the browser executable")
public void setBrowser(List<String> browsers) {
for (String browser : browsers) {
String[] splitBrowser = browser.split(";", 2);
String browserArgs = "";
if (splitBrowser.length == 2) {
browserArgs = splitBrowser[1].replace(";", " ");
}
this.browser.add(
new CommandLineBrowserRunner(splitBrowser[0],
browserArgs, new SimpleProcessFactory()));
}
}
@Override
public Set<BrowserRunner> getBrowser() {
return browser;
}
@Option(name="--reset", usage="Resets the runner")
public void setReset(boolean reset) {
this.reset = reset;
}
@Override
public boolean getReset() {
return reset;
}
@Option(name="--config", usage="Loads the configuration file")
public void setConfig(String config) {
this.config = new UserConfigurationSource(new File(config).getAbsoluteFile());
}
@Override
public ConfigurationSource getConfig() {
return config;
}
@Option(name="--tests",
usage="Run the tests specified in the form testCase.testName")
public void setTests(List<String> tests) {
this.tests = tests;
}
@Override
public List<String> getTests() {
return tests;
}
@Option(name="--help", usage="Help")
public void setDisplayHelp(boolean displayHelp) {
this.displayHelp = displayHelp;
}
@Override
public boolean getDisplayHelp() {
return displayHelp;
}
@Option(name="--verbose", usage="Displays more information during a run")
public void setVerbose(boolean verbose) {
this.verbose = verbose;
}
@Override
public boolean getVerbose() {
return verbose;
}
@Option(name="--captureConsole", usage="Capture the console (if possible) from the browser")
public void setCaptureConsole(boolean captureConsole) {
this.captureConsole = captureConsole;
}
@Override
public boolean getCaptureConsole() {
return captureConsole;
}
@Option(name="--preloadFiles", usage="Preload the js files")
public void setPreloadFiles(boolean preloadFiles) {
this.preloadFiles = preloadFiles;
}
@Override
public boolean getPreloadFiles() {
return preloadFiles;
}
@Option(name="--dryRunFor", usage="Outputs the number of tests that are going to be run as well" +
" as their names for a set of expressions or all to see all the tests")
public void setDryRunFor(List<String> dryRunFor) {
this.dryRunFor = dryRunFor;
}
@Override
public List<String> getDryRunFor() {
return dryRunFor;
}
public RunnerMode getRunnerMode() {
return runnerMode;
}
@Option(name="--browserTimeout", usage="The ms before a browser is declared dead.")
public void setBrowserTimeout(Long browserTimeout) {
this.browserTimeout = browserTimeout;
}
@Override
public long getBrowserTimeout() {
return browserTimeout;
}
@Option(name="--requiredBrowsers",
usage="Browsers that all actions must be run on.")
public void setRequiredBrowsers(List<String> requiredBrowsers) {
this.requiredBrowsers = Sets.newHashSet(requiredBrowsers);
}
@Override
public Set<String> getRequiredBrowsers() {
return requiredBrowsers;
}
@Option(name="--serverHandlerPrefix",
usage="Whether the handlers will be prefixed with jstd")
public void setServerHandlerPrefix(String serverHandlerPrefix) {
this.serverHandlerPrefix = new ConcretePathPrefix(serverHandlerPrefix.startsWith("/") ?
serverHandlerPrefix.substring(1) : serverHandlerPrefix);
}
@Override
public HandlerPathPrefix getServerHandlerPrefix() {
return serverHandlerPrefix;
}
@Override
public ExecutionType getExecutionType() {
return ExecutionType.INTERACTIVE;
}
@Option(name="--raiseOnFailure",
usage="Whether jstd will throw an exception when a test failure.")
public void setRaiseOnFailure(String raiseOnFailure) {
// args4j automatically assumes that booleans only trigger when present.
this.raiseOnFailure = Boolean.parseBoolean(raiseOnFailure);
}
@Override
public boolean getRaiseOnFailure() {
return raiseOnFailure;
}
@Override
public String toString() {
return "FlagsImpl [port=" + port + ",\n sslPort=" + sslPort + ",\n server=" + server
+ ",\n testOutput=" + testOutput + ",\n browser=" + browser + ",\n reset=" + reset
+ ",\n browserTimeout=" + browserTimeout + ",\n config=" + config + ",\n tests=" + tests
+ ",\n displayHelp=" + displayHelp + ",\n verbose=" + verbose + ",\n captureConsole="
+ captureConsole + ",\n preloadFiles=" + preloadFiles + ",\n dryRunFor=" + dryRunFor
+ ",\n arguments=" + arguments + ",\n runnerMode=" + runnerMode + ",\n requiredBrowsers="
+ requiredBrowsers + ",\n serverHandlerPrefix=" + serverHandlerPrefix + "\n raiseOnFailure=" + raiseOnFailure + "]";
}
}