/* * Copyright 2012-2014 eBay Software Foundation and selendroid 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 io.selendroid.server; import io.netty.handler.codec.http.HttpMethod; import io.selendroid.server.ServerInstrumentation; import io.selendroid.server.common.exceptions.SelendroidException; import io.selendroid.server.handlers.SessionAndIdExtractionTestHandler; import io.selendroid.server.handlers.SessionAndPayloadExtractionTestHandler; import io.selendroid.server.internal.Capabilities; import org.apache.commons.io.IOUtils; import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicHttpEntityEnclosingRequest; import org.json.JSONException; import org.json.JSONObject; import org.junit.After; import org.junit.Before; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class BaseTest { public static final int port = 38055; public static final String host = "127.0.0.1"; protected AndroidServer server; public static final String ANY_STRING = "ANY-STRING"; @Before public void setup() throws Exception { ServerInstrumentation instrumentation = mock(ServerInstrumentation.class); when(instrumentation.getServerVersion()).thenReturn("0.2"); server = new AndroidServer(instrumentation, port); server.start(); } public Capabilities getCapabilities() { return Capabilities.android(ANY_STRING, ANY_STRING, ANY_STRING); } public HttpClient getHttpClient() { return new DefaultHttpClient(); } public HttpResponse executeRequestWithPayload(String url, HttpMethod method, String payload) throws Exception { BasicHttpEntityEnclosingRequest request = new BasicHttpEntityEnclosingRequest(method.name(), url); request.setEntity(new StringEntity(payload, "UTF-8")); return executeRequest((HttpRequest) request); } private HttpResponse executeRequest(HttpRequest request) throws Exception { try { return getHttpClient().execute(new HttpHost(host, port), request); } catch (Throwable t) { Thread.sleep(1000); } return getHttpClient().execute(new HttpHost(host, port), request); } public JSONObject parseJsonResponse(HttpResponse response) throws Exception { return new JSONObject(IOUtils.toString(response.getEntity().getContent())); } public HttpResponse executeRequest(String url, HttpMethod method) throws Exception { HttpRequestBase request; if (HttpMethod.GET.equals(method)) { request = new HttpGet(url); } else if (HttpMethod.POST.equals(method)) { request = new HttpPost(url); } else if (HttpMethod.DELETE.equals(method)) { request = new HttpDelete(url); } else { throw new RuntimeException("Provided HttpMethod not supported"); } return executeRequest(request); } @After public void tearDown() { if (server != null) { server.stop(); } } /** Configuring AndroidServlet to use special test handler. */ public class AndroidTestServlet extends AndroidServlet { public AndroidTestServlet() { super(null, null); } @Override protected void init() { register(getHandler, new SessionAndPayloadExtractionTestHandler( "/wd/hub/session/:sessionId/element")); register(postHandler, new SessionAndIdExtractionTestHandler( "/wd/hub/session/:sessionId/element/:id/click")); } } protected HttpResponse executeCreateSessionRequest() throws Exception { String url = "http://" + host + ":" + port + "/wd/hub/session"; return executeRequestWithPayload(url, HttpMethod.POST, getCapabilityPayload().toString()); } protected JSONObject getCapabilityPayload() { Capabilities desiredCapabilities = getCapabilities(); JSONObject payload = new JSONObject(); try { payload.put("desiredCapabilities", new JSONObject(desiredCapabilities.asMap())); } catch (JSONException e) { throw new SelendroidException(e); } return payload; } }