All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.paypal.selion.internal.platform.grid.browsercapabilities.AdditionalSauceCapabilitiesBuilder Maven / Gradle / Ivy

/*-------------------------------------------------------------------------------------------------------------------*\
|  Copyright (C) 2014-16 PayPal                                                                                       |
|                                                                                                                     |
|  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.paypal.selion.internal.platform.grid.browsercapabilities;

import java.util.Iterator;
import java.util.Map.Entry;

import org.apache.commons.lang.StringUtils;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.internal.BuildInfo;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.JsonToBeanConverter;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.paypal.selion.configuration.Config;
import com.paypal.selion.configuration.Config.ConfigProperty;
import com.paypal.selion.platform.grid.browsercapabilities.DefaultCapabilitiesBuilder;
import com.paypal.selion.platform.utilities.FileAssistant;

/**
 * This class is used to add the additional capabilities that can be specified while executing tests against saucelabs.
 */
public class AdditionalSauceCapabilitiesBuilder extends DefaultCapabilitiesBuilder {

    private static final String USER_NAME = "username";
    private static final String ACCESS_KEY = "accessKey";
    private static final String PARENT_TUNNEL = "parent-tunnel";
    private static final String TUNNEL_ID = "tunnelIdentifier";
    private static final String SELENIUM_VERSION = "seleniumVersion";

    @Override
    public DesiredCapabilities getCapabilities(DesiredCapabilities capabilities) {
        logger.entering(capabilities);

        if (isNonSauceLabsRun()) {
            return capabilities;
        }

        capabilities = appendSauceLabsCredentials(capabilities);
        capabilities = appendSauceLabsTunnel(capabilities);
        capabilities = appendSeleniumVersion(capabilities);
        capabilities = appendSauceLabsCapabilities(capabilities);

        logger.exiting(capabilities);
        return capabilities;
    }

    private DesiredCapabilities appendSauceLabsCapabilities(DesiredCapabilities capabilities) {
        logger.entering(capabilities);
        String sauceJSONFileName = Config.getConfigProperty(ConfigProperty.SELENIUM_SAUCELAB_GRID_CONFIG_FILE);
        if (StringUtils.isBlank(sauceJSONFileName)) {
            logger.exiting(capabilities);
            return capabilities;
        }
        try {
            JsonObject jsonObject = new JsonParser().parse(FileAssistant.readFile(sauceJSONFileName)).getAsJsonObject();
            Iterator> iterator = jsonObject.entrySet().iterator();
            while (iterator.hasNext()) {
                Entry entry = iterator.next();
                String capabilityName = entry.getKey();
                Object capabilityValue = new JsonToBeanConverter().convert(Object.class, entry.getValue());
                if ((capabilityValue instanceof String) && (capabilityValue.toString().startsWith("__string__"))) {
                    capabilityValue = capabilityValue.toString().replace("__string__", "");
                }
                capabilities.setCapability(capabilityName, capabilityValue);
            }
            logger.exiting(capabilities);
            return capabilities;
        } catch (Exception e) { // NOSONAR
            String errorMsg = "An error occured while working with the JSON file : " + sauceJSONFileName
                    + ". Root cause: ";
            throw new WebDriverException(errorMsg, e);
        }
    }

    private DesiredCapabilities appendSeleniumVersion(DesiredCapabilities caps) {
        logger.entering(caps);
        String seleniumVersion = new BuildInfo().getReleaseLabel();
        // allows the user to override this capability with their own version
        if (caps.getCapability(SELENIUM_VERSION) == null) {
            caps.setCapability(SELENIUM_VERSION, seleniumVersion);
        }
        logger.exiting(caps);
        return caps;
    }

    private DesiredCapabilities appendSauceLabsCredentials(DesiredCapabilities caps) {
        logger.entering(caps);
        String sauceUserName = Config.getConfigProperty(ConfigProperty.SAUCELAB_USER_NAME);
        String sauceApiKey = Config.getConfigProperty(ConfigProperty.SAUCELAB_API_KEY);

        if (StringUtils.isNotBlank(sauceUserName) && StringUtils.isNotBlank(sauceApiKey)) {
            caps.setCapability(USER_NAME, sauceUserName);
            caps.setCapability(ACCESS_KEY, sauceApiKey);
        }
        logger.exiting(caps);
        return caps;
    }

    private DesiredCapabilities appendSauceLabsTunnel(DesiredCapabilities caps) {
        logger.entering(caps);
        String tunnelUserId = Config.getConfigProperty(ConfigProperty.SAUCELAB_TUNNEL_USER_ID);
        String tunnelId = Config.getConfigProperty(ConfigProperty.SAUCELAB_TUNNEL_ID);

        if (StringUtils.isNotBlank(tunnelUserId)) {
            caps.setCapability(PARENT_TUNNEL, tunnelUserId);
        }
        if (StringUtils.isNotBlank(tunnelId)) {
            caps.setCapability(TUNNEL_ID, tunnelId);
        }
        logger.exiting(caps);
        return caps;
    }

    private boolean isNonSauceLabsRun() {
        logger.entering();
        boolean runLocally = isLocalRun();
        boolean isSauceRC = Config.getBoolConfigProperty(ConfigProperty.SELENIUM_USE_SAUCELAB_GRID);
        boolean returnValue = (!isSauceRC || runLocally);
        logger.exiting(returnValue);
        return returnValue;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy