org.uiautomation.ios.server.IOSDriver.java Source code

Java tutorial

Introduction

Here is the source code for org.uiautomation.ios.server.IOSDriver.java

Source

/*
 * Copyright 2012 ios-driver committers.
 * 
 * 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.uiautomation.ios.server;

import static org.uiautomation.ios.IOSCapabilities.MAGIC_PREFIX;

import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.LogManager;

import org.json.JSONException;
import org.openqa.selenium.SessionNotCreatedException;
import org.openqa.selenium.WebDriverException;
import org.uiautomation.ios.IOSCapabilities;
import org.uiautomation.ios.server.application.IOSApplication;
import org.uiautomation.ios.server.application.AppleLocale;
import org.uiautomation.ios.server.application.ResourceCache;
import org.uiautomation.ios.server.utils.BuildInfo;
import org.uiautomation.ios.server.utils.ClassicCommands;

public class IOSDriver {

    private final List<ServerSideSession> sessions = new ArrayList<ServerSideSession>();
    private final Set<IOSApplication> supportedApplications = new HashSet<IOSApplication>();
    private final HostInfo hostInfo;
    private final ResourceCache cache = new ResourceCache();

    public IOSDriver(int port) {
        try {
            LogManager.getLogManager()
                    .readConfiguration(IOSDriver.class.getResourceAsStream("/ios-logging.properties"));
        } catch (Exception e) {
            System.err.println("Cannot configure logger.");
        }
        this.hostInfo = new HostInfo(port);
    }

    public void addSupportedApplication(IOSApplication application) {
        boolean added = supportedApplications.add(application);
        if (!added) {
            throw new WebDriverException("app already present :" + application.getApplicationPath());
        }
        cache.cacheResource(application);
    }

    public HostInfo getHostInfo() {
        return hostInfo;
    }

    public ResourceCache getCache() {
        return cache;
    }

    public int getPort() {
        return hostInfo.getPort();
    }

    public ServerSideSession createSession(IOSCapabilities cap) {
        ServerSideSession session = new ServerSideSession(this, cap);
        sessions.add(session);
        return session;
    }

    public void stop(String opaqueKey) {
        ServerSideSession session = getSession(opaqueKey);
        session.stop();
        sessions.remove(session);
    }

    public IOSCapabilities getCapabilities(IOSApplication application) {
        // some cap are from the host. SDK version is not defined by the app itself.
        IOSCapabilities cap = new IOSCapabilities();
        cap.setSDKVersion(hostInfo.getSDK());
        cap.setSupportedLanguages(application.getSupportedLanguagesCodes());
        cap.setCapability("applicationPath", application.getApplicationPath().getAbsoluteFile());

        for (Iterator iterator = application.getMetadata().keys(); iterator.hasNext();) {
            String key = (String) iterator.next();

            try {
                Object value = application.getMetadata().get(key);
                cap.setCapability(key, value);
            } catch (JSONException e) {
                throw new WebDriverException("cannot get metadata", e);
            }
        }

        cap.setSupportedDevices(cap.getSupportedDevicesFromDeviceFamily());
        return cap;
    }

    public IOSApplication findMatchingApplication(IOSCapabilities desiredCapabilities) {
        for (IOSApplication app : supportedApplications) {
            IOSCapabilities appCapabilities = getCapabilities(app);
            if (IOSDriver.matches(appCapabilities, desiredCapabilities)) {
                return app;
            }
        }
        throw new SessionNotCreatedException(desiredCapabilities.getRawCapabilities() + "not found on server.");
    }

    public static boolean matches(Map<String, Object> appCapabilities, Map<String, Object> desiredCapabilities) {
        IOSCapabilities a = new IOSCapabilities(appCapabilities);
        IOSCapabilities d = new IOSCapabilities(desiredCapabilities);
        return matches(a, d);

    }

    private static boolean matches(IOSCapabilities applicationCapabilities, IOSCapabilities desiredCapabilities) {

        if (desiredCapabilities.getBundleName() == null) {
            throw new WebDriverException("you need to specify the bundle to test.");
        }
        String desired = desiredCapabilities.getBundleName();
        String appName = (String) (applicationCapabilities.getBundleName() != null
                ? applicationCapabilities.getBundleName()
                : applicationCapabilities.getCapability("CFBundleDisplayName"));

        if (!desired.equals(appName)) {
            return false;
        }
        if (desiredCapabilities.getBundleVersion() != null
                && !desiredCapabilities.getBundleVersion().equals(applicationCapabilities.getBundleVersion())) {
            return false;
        }
        if (desiredCapabilities.getDevice() == null) {
            throw new WebDriverException("you need to specify the device.");
        }
        if (!(applicationCapabilities.getSupportedDevices().contains(desiredCapabilities.getDevice()))) {
            return false;
        }
        // check any extra capability starting with plist_
        for (String key : desiredCapabilities.getRawCapabilities().keySet()) {
            if (key.startsWith(IOSCapabilities.MAGIC_PREFIX)) {
                String realKey = key.replace(MAGIC_PREFIX, "");
                if (!desiredCapabilities.getRawCapabilities().get(key)
                        .equals(applicationCapabilities.getRawCapabilities().get(realKey))) {
                    return false;
                }
            }
        }
        String l = desiredCapabilities.getLanguage();
        if (l != null && !applicationCapabilities.getSupportedLanguages().contains(l)) {
            throw new SessionNotCreatedException("Language requested, " + l + " ,isn't supported.Supported are : "
                    + applicationCapabilities.getSupportedLanguages());
        }

        String sdk = desiredCapabilities.getSDKVersion();
        // TODO freynaud validate for multi SDK
        /*
         * if (sdk != null && !sdk.equals(applicationCapabilities.getSDKVersion()))
         * { throw new IOSAutomationException("Cannot start sdk " + sdk +
         * ". Run on " + applicationCapabilities.getSDKVersion()); }
         */

        return true;
    }

    public List<ServerSideSession> getSessions() {
        return sessions;
    }

    public ServerSideSession getSession(String opaqueKey) {
        for (ServerSideSession session : sessions) {
            if (session.getSessionId().equals(opaqueKey)) {
                return session;
            }
        }
        throw new WebDriverException("Cannot find session " + opaqueKey + " on the sesver.");
    }

    class HostInfo {
        private final String osName;
        private final String osArch;
        private final String osVersion;

        private final String javaVersion;

        private final String simulatorVersion;
        private final List<String> installedSimulators;
        private final File xCodeInstall;

        private final BuildInfo info = new BuildInfo();
        private final int port;

        public HostInfo(int port) {
            osName = System.getProperty("os.name");
            osArch = System.getProperty("os.arch");
            osVersion = System.getProperty("os.version");

            javaVersion = System.getProperty("java.version");

            String sdk = ClassicCommands.getDefaultSDK();
            simulatorVersion = sdk;
            installedSimulators = ClassicCommands.getInstalledSDKs();
            this.port = port;
            xCodeInstall = ClassicCommands.getXCodeInstall();
        }

        public String getSDK() {
            return simulatorVersion;
        }

        public File getXCodeInstall() {
            return xCodeInstall;
        }

        public List<String> getInstalledSDKs() {
            return installedSimulators;
        }

        public int getPort() {
            return port;
        }
    }

    public Set<IOSApplication> getSupportedApplications() {
        return supportedApplications;
    }

}