blob: 4f2e5a995a755bcb3812fa5f2f9d771c3c356fd6 [file] [log] [blame]
/*
* Copyright 2011 Selenium committers
* Copyright 2011 Software Freedom Conservancy
*
* 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.openqa.grid.internal;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicHttpEntityEnclosingRequest;
import org.apache.http.message.BasicHttpRequest;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.grid.common.RegistrationRequest;
import org.openqa.grid.internal.mock.GridHelper;
import org.openqa.grid.internal.utils.GridHubConfiguration;
import org.openqa.grid.web.Hub;
import org.openqa.grid.web.servlet.handler.RequestHandler;
import org.openqa.selenium.net.PortProber;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.internal.HttpClientFactory;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class StatusServletTests {
private static Hub hub;
private static RemoteProxy p1;
private static HttpClientFactory httpClientFactory;
private static URL proxyApi;
private static URL hubApi;
private static URL testSessionApi;
private static HttpHost host;
private static TestSession session;
@BeforeClass
public static void setup() throws Exception {
GridHubConfiguration c = new GridHubConfiguration();
c.getAllParams().put(RegistrationRequest.TIME_OUT, 12345);
c.setPort(PortProber.findFreePort());
c.setHost("localhost");
hub = new Hub(c);
Registry registry = hub.getRegistry();
httpClientFactory = new HttpClientFactory();
hubApi = new URL("http://" + hub.getHost() + ":" + hub.getPort() + "/grid/api/hub");
proxyApi = new URL("http://" + hub.getHost() + ":" + hub.getPort() + "/grid/api/proxy");
testSessionApi =
new URL("http://" + hub.getHost() + ":" + hub.getPort() + "/grid/api/testsession");
host = new HttpHost(hub.getHost(), hub.getPort());
hub.start();
p1 = RemoteProxyFactory.getNewBasicRemoteProxy("app1", "http://machine1:4444", registry);
RemoteProxy p2 =
RemoteProxyFactory.getNewBasicRemoteProxy("app1", "http://machine2:4444", registry);
RemoteProxy p3 =
RemoteProxyFactory.getNewBasicRemoteProxy("app1", "http://machine3:4444", registry);
RemoteProxy p4 =
RemoteProxyFactory.getNewBasicRemoteProxy("app1", "http://machine4:4444", registry);
RegistrationRequest req = new RegistrationRequest();
Map<String, Object> capability = new HashMap<String, Object>();
capability.put(CapabilityType.BROWSER_NAME, "custom app");
req.addDesiredCapability(capability);
Map<String, Object> config = new HashMap<String, Object>();
config.put(RegistrationRequest.REMOTE_HOST, "http://machine5:4444");
req.setConfiguration(config);
RemoteProxy customProxy = new MyCustomProxy(req, registry);
registry.add(p1);
registry.add(p2);
registry.add(p3);
registry.add(p4);
registry.add(customProxy);
Map<String, Object> cap = new HashMap<String, Object>();
cap.put(CapabilityType.BROWSER_NAME, "app1");
RequestHandler newSessionRequest = GridHelper.createNewSessionHandler(registry, cap);
newSessionRequest.process();
session = newSessionRequest.getSession();
session.setExternalKey(ExternalSessionKey.fromString("ext. key"));
}
@Test
public void testget() throws IOException, JSONException {
String id = "http://machine1:4444";
HttpClient client = httpClientFactory.getHttpClient();
BasicHttpRequest r = new BasicHttpRequest("GET", proxyApi.toExternalForm() + "?id=" + id);
HttpResponse response = client.execute(host, r);
assertEquals(200, response.getStatusLine().getStatusCode());
JSONObject o = extractObject(response);
assertEquals(id, o.get("id"));
}
@Test
public void testGetNegative() throws IOException, JSONException {
String id = "http://wrongOne:4444";
HttpClient client = httpClientFactory.getHttpClient();
BasicHttpRequest r = new BasicHttpRequest("GET", proxyApi.toExternalForm() + "?id=" + id);
HttpResponse response = client.execute(host, r);
assertEquals(200, response.getStatusLine().getStatusCode());
JSONObject o = extractObject(response);
assertEquals(false, o.get("success"));
// System.out.println(o.get("msg"));
}
@Test
public void testpost() throws IOException, JSONException {
String id = "http://machine1:4444";
HttpClient client = httpClientFactory.getHttpClient();
JSONObject o = new JSONObject();
o.put("id", id);
BasicHttpEntityEnclosingRequest r =
new BasicHttpEntityEnclosingRequest("POST", proxyApi.toExternalForm());
r.setEntity(new StringEntity(o.toString()));
HttpResponse response = client.execute(host, r);
assertEquals(200, response.getStatusLine().getStatusCode());
JSONObject res = extractObject(response);
assertEquals(id, res.get("id"));
}
@Test
public void testpostReflection() throws IOException, JSONException {
String id = "http://machine5:4444";
HttpClient client = httpClientFactory.getHttpClient();
JSONObject o = new JSONObject();
o.put("id", id);
o.put("getURL", "");
o.put("getBoolean", "");
o.put("getString", "");
BasicHttpEntityEnclosingRequest r =
new BasicHttpEntityEnclosingRequest("POST", proxyApi.toExternalForm());
r.setEntity(new StringEntity(o.toString()));
HttpResponse response = client.execute(host, r);
assertEquals(200, response.getStatusLine().getStatusCode());
JSONObject res = extractObject(response);
assertEquals(MyCustomProxy.MY_BOOLEAN, res.get("getBoolean"));
assertEquals(MyCustomProxy.MY_STRING, res.get("getString"));
// url converted to string
assertEquals(MyCustomProxy.MY_URL.toString(), res.get("getURL"));
}
@Test
public void testSessionApi() throws IOException, JSONException {
ExternalSessionKey s = session.getExternalKey();
HttpClient client = httpClientFactory.getHttpClient();
JSONObject o = new JSONObject();
o.put("session", s);
BasicHttpEntityEnclosingRequest r =
new BasicHttpEntityEnclosingRequest("POST", testSessionApi.toExternalForm());
r.setEntity(new StringEntity(o.toString()));
HttpResponse response = client.execute(host, r);
assertEquals(200, response.getStatusLine().getStatusCode());
JSONObject res = extractObject(response);
assertTrue(res.getBoolean("success"));
assertNotNull(res.get("internalKey"));
assertEquals(s, ExternalSessionKey.fromJSON((String) res.get("session")));
assertNotNull(res.get("inactivityTime"));
assertEquals(p1.getId(), res.get("proxyId"));
}
@Test
public void testSessionget() throws IOException, JSONException {
ExternalSessionKey s = session.getExternalKey();
HttpClient client = httpClientFactory.getHttpClient();
String url =
testSessionApi.toExternalForm() + "?session=" + URLEncoder.encode(s.getKey(), "UTF-8");
BasicHttpRequest r = new BasicHttpRequest("GET", url);
HttpResponse response = client.execute(host, r);
assertEquals(200, response.getStatusLine().getStatusCode());
JSONObject o = extractObject(response);
assertTrue(o.getBoolean("success"));
assertNotNull(o.get("internalKey"));
assertEquals(s, ExternalSessionKey.fromJSON((String) o.get("session")));
assertNotNull(o.get("inactivityTime"));
assertEquals(p1.getId(), o.get("proxyId"));
}
/**
* if a certain set of parameters are requested to the hub, only those params are returned.
* @throws IOException
* @throws JSONException
*/
@Test
public void testHubgetSpecifiedConfig() throws IOException, JSONException {
HttpClient client = httpClientFactory.getHttpClient();
String url = hubApi.toExternalForm();
BasicHttpEntityEnclosingRequest r = new BasicHttpEntityEnclosingRequest("GET", url);
JSONObject j = new JSONObject();
JSONArray keys = new JSONArray();
keys.put(RegistrationRequest.TIME_OUT);
keys.put("I'm not a valid key");
keys.put(RegistrationRequest.SERVLETS);
j.put("configuration", keys);
r.setEntity(new StringEntity(j.toString()));
HttpResponse response = client.execute(host, r);
assertEquals(200, response.getStatusLine().getStatusCode());
JSONObject o = extractObject(response);
assertTrue(o.getBoolean("success"));
assertEquals(12345, o.getInt(RegistrationRequest.TIME_OUT));
assertEquals(JSONObject.NULL, o.get("I'm not a valid key"));
assertEquals(0, o.getJSONArray(RegistrationRequest.SERVLETS).length());
assertFalse(o.has("capabilityMatcher"));
}
/**
* when no param is specified, a call to the hub API returns all the config params the hub
* currently uses.
*/
@Test
public void testHubgetAllConfig() throws IOException, JSONException {
HttpClient client = httpClientFactory.getHttpClient();
String url = hubApi.toExternalForm();
BasicHttpEntityEnclosingRequest r = new BasicHttpEntityEnclosingRequest("GET", url);
JSONObject j = new JSONObject();
JSONArray keys = new JSONArray();
j.put("configuration", keys);
r.setEntity(new StringEntity(j.toString()));
HttpResponse response = client.execute(host, r);
assertEquals(200, response.getStatusLine().getStatusCode());
JSONObject o = extractObject(response);
assertTrue(o.getBoolean("success"));
assertEquals("org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
o.getString("capabilityMatcher"));
assertEquals(JSONObject.NULL, o.opt("prioritizer"));
}
@Test
public void testHubgetAllConfigNoParamsWhenNoPostBody() throws IOException, JSONException {
HttpClient client = httpClientFactory.getHttpClient();
String url = hubApi.toExternalForm();
BasicHttpRequest r = new BasicHttpRequest("GET", url);
HttpResponse response = client.execute(host, r);
assertEquals(200, response.getStatusLine().getStatusCode());
JSONObject o = extractObject(response);
assertTrue(o.getBoolean("success"));
assertEquals("org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
o.getString("capabilityMatcher"));
assertEquals(JSONObject.NULL, o.opt("prioritizer"));
}
@Test
public void testSessionApiNeg() throws IOException, JSONException {
String s = "non-existing session";
HttpClient client = httpClientFactory.getHttpClient();
JSONObject o = new JSONObject();
o.put("session", s);
BasicHttpEntityEnclosingRequest r =
new BasicHttpEntityEnclosingRequest("POST", testSessionApi.toExternalForm());
r.setEntity(new StringEntity(o.toString()));
HttpResponse response = client.execute(host, r);
assertEquals(200, response.getStatusLine().getStatusCode());
JSONObject res = extractObject(response);
assertFalse(res.getBoolean("success"));
}
@AfterClass
public static void teardown() throws Exception {
hub.stop();
httpClientFactory.close();
}
private JSONObject extractObject(HttpResponse resp) throws IOException, JSONException {
BufferedReader rd = new BufferedReader(new InputStreamReader(resp.getEntity().getContent()));
StringBuilder s = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
s.append(line);
}
rd.close();
return new JSONObject(s.toString());
}
}