/**
* JBoss, Home of Professional Open Source
* Copyright 2016, Red Hat Middleware LLC, and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
* <p>
* 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.arquillian.drone.saucelabs.extension.webdriver;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Logger;
import org.arquillian.drone.saucelabs.extension.connect.SauceConnectRunner;
import org.arquillian.drone.saucelabs.extension.utils.Utils;
import org.jboss.arquillian.config.descriptor.api.ArquillianDescriptor;
import org.jboss.arquillian.core.api.Instance;
import org.jboss.arquillian.core.api.annotation.Inject;
import org.jboss.arquillian.drone.spi.Configurator;
import org.jboss.arquillian.drone.spi.Destructor;
import org.jboss.arquillian.drone.spi.DronePoint;
import org.jboss.arquillian.drone.spi.Instantiator;
import org.jboss.arquillian.drone.webdriver.configuration.WebDriverConfiguration;
import org.jboss.arquillian.drone.webdriver.spi.BrowserCapabilities;
import org.jboss.arquillian.drone.webdriver.spi.BrowserCapabilitiesRegistry;
import org.openqa.selenium.Capabilities;
import static org.arquillian.drone.saucelabs.extension.webdriver.SauceLabsCapabilities.ACCESS_KEY;
import static org.arquillian.drone.saucelabs.extension.webdriver.SauceLabsCapabilities.READABLE_NAME;
import static org.arquillian.drone.saucelabs.extension.webdriver.SauceLabsCapabilities.SAUCE_CONNECT_ARGS;
import static org.arquillian.drone.saucelabs.extension.webdriver.SauceLabsCapabilities.SAUCE_CONNECT_BINARY;
import static org.arquillian.drone.saucelabs.extension.webdriver.SauceLabsCapabilities.SAUCE_CONNECT_MANAGED;
import static org.arquillian.drone.saucelabs.extension.webdriver.SauceLabsCapabilities.URL;
import static org.arquillian.drone.saucelabs.extension.webdriver.SauceLabsCapabilities.USERNAME;
/**
* Factory which combines {@link org.jboss.arquillian.drone.spi.Configurator},
* {@link org.jboss.arquillian.drone.spi.Instantiator} and {@link org.jboss.arquillian.drone.spi.Destructor} for
* {@link SauceLabsDriver}.
*/
public class SauceLabsDriverFactory implements
Configurator<SauceLabsDriver, WebDriverConfiguration>,
Instantiator<SauceLabsDriver, WebDriverConfiguration>,
Destructor<SauceLabsDriver> {
private static final Logger log = Logger.getLogger(SauceLabsDriverFactory.class.getName());
@Inject
private Instance<BrowserCapabilitiesRegistry> registryInstance;
@Override
public WebDriverConfiguration createConfiguration(ArquillianDescriptor arquillianDescriptor,
DronePoint<SauceLabsDriver> dronePoint) {
BrowserCapabilitiesRegistry registry = registryInstance.get();
BrowserCapabilities browser = registry.getEntryFor(READABLE_NAME);
WebDriverConfiguration configuration = new WebDriverConfiguration(browser).configure(arquillianDescriptor,
dronePoint.getQualifier());
return configuration;
}
@Override
public void destroyInstance(SauceLabsDriver sauceLabsDriver) {
sauceLabsDriver.quit();
}
@Override
public SauceLabsDriver createInstance(WebDriverConfiguration configuration) {
Capabilities capabilities = configuration.getCapabilities();
String url = (String) capabilities.getCapability(URL);
String username = null;
String accessKey = null;
if (Utils.isNullOrEmpty(url)) {
username = (String) capabilities.getCapability(USERNAME);
accessKey = (String) capabilities.getCapability(ACCESS_KEY);
if (accessKey == null) {
accessKey = (String) capabilities.getCapability("automate.key");
}
if (Utils.isNullOrEmpty(username) || Utils.isNullOrEmpty(accessKey)) {
throw new IllegalArgumentException(
"You have to specify either an username and an access.key or the whole url in your arquillian descriptor");
} else {
url = "http://" + username + ":" + accessKey + "@ondemand.saucelabs.com:80/wd/hub";
}
}
try {
URL sauceConnectUrl = new URL(url);
boolean isSetSauceConnectManaged = capabilities.is(SAUCE_CONNECT_MANAGED);
if (isSetSauceConnectManaged) {
if (Utils.isNullOrEmpty(accessKey)) {
username = url.substring(url.lastIndexOf("://") + 3, url.indexOf(":"));
accessKey = url.substring(url.lastIndexOf(":") + 1, url.indexOf("@"));
}
String additionalArgs = (String) capabilities.getCapability(SAUCE_CONNECT_ARGS);
String localBinary = (String) capabilities.getCapability(SAUCE_CONNECT_BINARY);
SauceConnectRunner.getSauceConnectRunnerInstance().runSauceConnect(username,
accessKey,
additionalArgs,
localBinary);
}
return new SauceLabsDriver(sauceConnectUrl, capabilities, isSetSauceConnectManaged);
} catch (MalformedURLException e) {
throw new IllegalArgumentException(
"The BrowserStack url: " + url + " has been detected as a malformed URL. ", e);
}
}
@Override
public int getPrecedence() {
return 0;
}
}