diff --git a/pom.xml b/pom.xml index 5a78efc..1393d53 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.quantum quantum-support - 1.14 + 1.15-alpha UTF-8 diff --git a/resources/cacerts b/resources/cacerts new file mode 100644 index 0000000..7b86e7d Binary files /dev/null and b/resources/cacerts differ diff --git a/src/main/java/com/quantum/listeners/PerfectoDriverListener.java b/src/main/java/com/quantum/listeners/PerfectoDriverListener.java index ba4e917..b57d04d 100644 --- a/src/main/java/com/quantum/listeners/PerfectoDriverListener.java +++ b/src/main/java/com/quantum/listeners/PerfectoDriverListener.java @@ -33,11 +33,18 @@ import java.util.concurrent.TimeUnit; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + import org.openqa.selenium.Capabilities; import org.openqa.selenium.MutableCapabilities; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.DriverCommand; +import org.testng.Assert; +import org.testng.TestNGException; +import com.google.common.base.Strings; +import com.qmetry.qaf.automation.core.AutomationError; import com.qmetry.qaf.automation.core.ConfigurationManager; import com.qmetry.qaf.automation.ui.webdriver.CommandTracker; import com.qmetry.qaf.automation.ui.webdriver.QAFExtendedWebDriver; @@ -48,6 +55,15 @@ import com.quantum.utils.ConsoleUtils; import com.quantum.utils.DeviceUtils; import com.quantum.utils.ReportUtils; +import com.quantum.utils.RestAPIUtils; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.xml.sax.InputSource; + +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathFactory; +import java.io.StringReader; public class PerfectoDriverListener extends QAFWebDriverCommandAdapter { @Override @@ -103,6 +119,33 @@ public void beforeInitialize(Capabilities desiredCapabilities) { if (tags != null) { ((DesiredCapabilities) desiredCapabilities).setCapability("report.tags", tags); } + + if(null != ConfigurationManager.getBundle().getString("driver_availability_check") && + ConfigurationManager.getBundle().getString("driver_availability_check").toLowerCase().equals("yes") && + !Strings.isNullOrEmpty(((DesiredCapabilities)desiredCapabilities).getCapability("deviceName").toString())) + { + try { + RestAPIUtils.loadMyCert(); + String res=RestAPIUtils.retrieveDeviceInfo(((DesiredCapabilities) desiredCapabilities).getCapability("deviceName").toString()); + DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); + + DocumentBuilder builder = domFactory.newDocumentBuilder(); + Document dDoc = builder.parse(new InputSource((new StringReader(res)))); + + XPath xPath = XPathFactory.newInstance().newXPath(); + Node ndInuse = (Node) xPath.evaluate("handset/inUse", dDoc, XPathConstants.NODE); + Node ndavailable = (Node) xPath.evaluate("handset/available", dDoc, XPathConstants.NODE); + Node ndStatus = (Node) xPath.evaluate("handset/status", dDoc, XPathConstants.NODE); + if (!Boolean.valueOf(ndavailable.getTextContent()) || Boolean.valueOf(ndInuse.getTextContent()) + || !ndStatus.getTextContent().toLowerCase().trim().equals("connected")) +// throw new AutomationError("Device is unavailable or having error..."); + Assert.fail("Device is unavailable or having error..."); + } + catch(Exception e) + { + //ignore other exceptions + } + } } diff --git a/src/main/java/com/quantum/utils/RestAPIUtils.java b/src/main/java/com/quantum/utils/RestAPIUtils.java new file mode 100644 index 0000000..a6a69e7 --- /dev/null +++ b/src/main/java/com/quantum/utils/RestAPIUtils.java @@ -0,0 +1,159 @@ +package com.quantum.utils; + + +import com.qmetry.qaf.automation.core.ConfigurationManager; +import com.qmetry.qaf.automation.ui.webdriver.QAFExtendedWebDriver; +import com.quantum.utils.ConsoleUtils; +import com.quantum.utils.DriverUtils; + +import org.apache.commons.lang3.StringUtils; +import org.testng.Assert; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.Authenticator; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.PasswordAuthentication; +import java.net.Proxy; +import java.net.URL; +import java.net.URLEncoder; +import java.security.KeyStore; +import java.util.HashMap; +import java.util.Map; + +public class RestAPIUtils { + + public static void exeRestCmd(String cmd,String subcmd,Map params) throws Exception { + QAFExtendedWebDriver d=DriverUtils.getDriver(); + Map actions=new HashMap(); + + actions.put("command", cmd); + actions.put("subcommand", subcmd); + + params.put("deviceId",d.getCapabilities().getCapability("deviceName").toString()); + String svcStr="executions/"+d.getCapabilities().getCapability("executionId").toString(); + String res=exeRestOps("command",svcStr,actions,params); + ConsoleUtils.logWarningBlocks("Step result:" +res); + Assert.assertTrue(res.toLowerCase().contains("success"),res); + + } + + public static String retrieveDeviceInfo(String deviceId) throws Exception { +// QAFExtendedWebDriver d=DriverUtils.getDriver(); + Map actions=new HashMap(); + Map params=new HashMap(); + + String svcStr="handsets/"+deviceId; + + return exeRestOps("info",svcStr,actions,params); + + } + public static String exeRestOps(String Ops,String serviceStr,Map actions,Map params) throws Exception { + + + String cloudServer = + new URL(ConfigurationManager.getBundle().getString("remote.server")).getHost(); + String securityToken = ConfigurationManager.getBundle().getString("perfecto.capabilities.securityToken") ; + String user = ConfigurationManager.getBundle().getString("perfecto.capabilities.user") ; + String password = ConfigurationManager.getBundle().getString("perfecto.capabilities.password") ; + String authStr; + String actionStr; + String paramStr; + + + if ( null ==securityToken || securityToken.trim().isEmpty()) + authStr="&user=" + user + + "&password=" + password; + else + authStr="&securityToken=" + securityToken; + + actionStr=""; + for (Map.Entry et:actions.entrySet()) + { + actionStr=actionStr+"&"+et.getKey()+"="+et.getValue(); + + } + + + paramStr=""; + for (Map.Entry et:params.entrySet()) + { + paramStr=paramStr+"¶m." + et.getKey()+"="+URLEncoder.encode(et.getValue(), "UTF-8"); + + } + + String url = "https://" + + cloudServer + + "/services/" + + serviceStr + + "?operation=" +Ops + + authStr + + actionStr + + paramStr; + + + URL obj = new URL(url); + Proxy proxy=getProxy(); + HttpURLConnection con=null; + + con = proxy!=null? + (HttpURLConnection) obj.openConnection(proxy): + (HttpURLConnection) obj.openConnection(); + + con.setRequestMethod("GET"); + + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); + String inputLine; + StringBuffer response = new StringBuffer(); + + while ((inputLine = in.readLine()) != null) { + response.append(inputLine); + } + in.close(); + + return response.toString(); + } + + private static Proxy getProxy() { + Proxy proxy = null; + + if (ConfigurationManager.getBundle().getString("proxyHost") != null + && !ConfigurationManager.getBundle().getString("proxyHost").toString().equals("")) { + + String authUser= + (ConfigurationManager.getBundle().getString("proxyDomain")+"").trim()!=""? + ConfigurationManager.getBundle().getString("proxyUser")+"": + ConfigurationManager.getBundle().getString("proxyDomain")+"" + +"\\"+ ConfigurationManager.getBundle().getString("proxyUser")+""; + String authPass= + ConfigurationManager.getBundle().getString("proxyPassword")+""; + + Authenticator authenticator = new Authenticator() { + protected PasswordAuthentication getPasswordAuthentication() { + return (new PasswordAuthentication(authUser,authPass.toCharArray())); + } + }; + + Authenticator.setDefault(authenticator); + + proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ConfigurationManager.getBundle().getString("proxyHost").toString(), + Integer.parseInt( + ConfigurationManager.getBundle().getString("proxyPort").toString()) + )); + + } + return proxy; + } + + + + public static void loadMyCert() throws Exception { + KeyStore keyStore = KeyStore.getInstance("JKS"); + + System.setProperty("javax.net.ssl.trustStore", "resources/cacerts"); + } + +} + +