package net.thucydides.core.webdriver.capabilities;
import net.thucydides.core.ThucydidesSystemProperty;
import net.thucydides.core.util.EnvironmentVariables;
import net.thucydides.core.util.NameConverter;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.Platform;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.lang.reflect.Method;
import static org.apache.commons.lang3.StringUtils.isNotEmpty;
/**
* Provide Sauce Labs specific capabilities
*
* @author Imran Khan
*/
public class SauceRemoteDriverCapabilities implements RemoteDriverCapabilities {
private final EnvironmentVariables environmentVariables;
public SauceRemoteDriverCapabilities(EnvironmentVariables environmentVariables){
this.environmentVariables = environmentVariables;
}
@Override
public String getUrl() {
return ThucydidesSystemProperty.SAUCELABS_URL.from(environmentVariables);
}
@Override
public DesiredCapabilities getCapabilities(DesiredCapabilities capabilities) {
configureBrowserVersion(capabilities);
configureTargetPlatform(capabilities);
configureTestName(capabilities);
capabilities.setJavascriptEnabled(true);
return capabilities;
}
private void configureBrowserVersion(DesiredCapabilities capabilities) {
String driverVersion = ThucydidesSystemProperty.SAUCELABS_DRIVER_VERSION.from(environmentVariables);
if (isNotEmpty(driverVersion)) {
capabilities.setCapability("version", driverVersion);
}
}
private void configureTargetPlatform(DesiredCapabilities capabilities) {
String platformValue = ThucydidesSystemProperty.SAUCELABS_TARGET_PLATFORM.from(environmentVariables);
if (isNotEmpty(platformValue)) {
capabilities.setCapability("platform", platformFrom(platformValue));
}
if (capabilities.getBrowserName().equals("safari"))
{
setAppropriateSaucelabsPlatformVersionForSafari(capabilities);
}
}
private void setAppropriateSaucelabsPlatformVersionForSafari(DesiredCapabilities capabilities)
{
if (ThucydidesSystemProperty.SAUCELABS_DRIVER_VERSION.from(environmentVariables).equalsIgnoreCase("mac"))
{
String browserVersion = ThucydidesSystemProperty.SAUCELABS_DRIVER_VERSION.from(environmentVariables);
if (browserVersion.equals("5"))
{
capabilities.setCapability("platform", "OS X 10.6");
}
else if (browserVersion.equals("6"))
{
capabilities.setCapability("platform", "OS X 10.8");
}
else if (browserVersion.equals("7"))
{
capabilities.setCapability("platform", "OS X 10.9");
}
}
}
private void configureTestName(DesiredCapabilities capabilities) {
String testName = ThucydidesSystemProperty.SAUCELABS_TEST_NAME.from(environmentVariables);
if (isNotEmpty(testName)) {
capabilities.setCapability("name", testName);
} else {
String guessedTestName = bestGuessOfTestName();
if (guessedTestName != null) {
capabilities.setCapability("name", bestGuessOfTestName());
}
}
}
private String bestGuessOfTestName() {
for (StackTraceElement elt : Thread.currentThread().getStackTrace()) {
try {
Class callingClass = Class.forName(elt.getClassName());
Method callingMethod = callingClass.getMethod(elt.getMethodName());
if (isATestMethod(callingMethod)) {
return NameConverter.humanize(elt.getMethodName());
} else if (isASetupMethod(callingMethod)) {
return NameConverter.humanize(callingClass.getSimpleName());
}
} catch (ClassNotFoundException e) {
} catch (NoSuchMethodException e) {
}
}
return null;
}
private boolean isATestMethod(Method callingMethod) {
return callingMethod.getAnnotation(Test.class) != null;
}
private boolean isASetupMethod(Method callingMethod) {
return (callingMethod.getAnnotation(Before.class) != null)
|| (callingMethod.getAnnotation(BeforeClass.class) != null);
}
private Platform platformFrom(String platformValue) {
return Platform.valueOf(platformValue.toUpperCase());
}
}