/**
* Copyright (C) 2008 Progress Software, Inc. All rights reserved.
* http://fusesource.com
*
* The software in this package is published under the terms of the AGPL license
* a copy of which has been included with this distribution in the license.txt file.
*/
package org.fusesource.cloudmix.agent.webapp;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.ws.wsaddressing.W3CEndpointReference;
import junit.framework.TestCase;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.fusesource.cloudmix.agent.common.EndpointRefBuilder;
import org.fusesource.cloudmix.common.jetty.WebServer;
/**
* Test the webapp agent in a deployed state.
*/
public class WebappTest extends TestCase {
private static final transient Log LOG = LogFactory.getLog(WebappTest.class);
private static final String BASE_URN = "urn:%7Bhttp:%2F%2Fcxf.apache.org%7D";
private static final String[] EXPECTED_STATUS_REGEXP =
{"^<html><head>$",
"^<link href=\"css/main.css\" rel=\"stylesheet\" type=\"text/css\">$",
"^<title>Grid Agent</title>$",
"^</head>$",
"^<body><img src=\"images/logo.gif\"/>$",
"^<h1>Grid Agent</h1>$",
"^<h2>Properties</h2>$",
"^<table>$",
"^<tr><td><b>Agent Profile</b></td><td><i>$",
"^default</i></td></tr>$",
"^<tr><td><b>Agent Host</b></td><td><i>$",
"^.*</i></td></tr>$",
"^<tr><td><b>Agent OS</b></td><td><i>$",
"^(Linux|Windows.*|Mac OS.*|Solaris|SunOS|HP-UX|AIX)</i></td></tr>$",
"^<tr><td><b>Agent PID</b></td><td><i>$",
"^[0-9]+</i></td></tr>$",
"^<tr><td><b>Agent Link</b></td><td><i>$",
"^null</i></td></tr>$",
"^<tr><td><b>Agent Container</b></td><td><i>$",
"^tomcat6</i></td></tr>$",
"^<tr><td><b>Package types</b></td><td><i>$",
"^war </i></td></tr>$",
"^<tr><td><b>Install Directory</b></td><td><i>./webapps</i></td></tr>$",
"^<tr><td><b>Temp Suffix</b></td><td><i>.tmp</i></td></tr>$",
"^<tr><td><b>Max Features</b></td><td><i>25</i></td></tr>$",
"^<tr><td><b>Repository URI</b></td><td><i>http://localhost:9091/controller/</i></td></tr>$",
"^<tr><td><b>Polling Period</b></td><td><i>1000</i></td></tr>$",
"^<tr><td><b>Initial Polling Delay</b></td><td><i>1000</i></td></tr>$",
"^</table>$",
"^<h2>Features</h2><i>No features installed</i>$",
"^<hr noshade><i>jetty-6.[0-9].[0-9]</i></hr>$",
"^</body>$",
"^</html>$"};
protected WebServer webServer = new WebServer("org.fusesource.cloudmix.agent.webapp");
protected String baseURL = "http://localhost:9091/service-grid/agent";
@Override
protected void setUp() throws Exception {
System.setProperty("catalina.home", ".");
super.setUp();
webServer.setWebAppContext("/service-grid");
webServer.start();
baseURL = webServer.getRootUrl() + "service-grid/agent";
}
@Override
protected void tearDown() throws Exception {
webServer.stop();
}
public void testGetStatus() throws Exception {
String uri = baseURL + "/status";
HttpURLConnection httpConnection = getHttpConnection(uri);
httpConnection.connect();
verifyResponseCode(200, httpConnection);
assertEquals("text/html", httpConnection.getContentType());
assertEquals("OK", httpConnection.getResponseMessage());
InputStream in = httpConnection.getInputStream();
assertNotNull(in);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = null;
int i = 0;
while ((line = reader.readLine()) != null) {
Pattern pattern = Pattern.compile(EXPECTED_STATUS_REGEXP[i]);
Matcher matcher = pattern.matcher(line);
assertTrue(line + " doesn't match: " + EXPECTED_STATUS_REGEXP[i],
matcher.matches());
i++;
}
}
public void testAddEndpoint() throws Exception {
doTestAddEndpoint(BASE_URN + "SoapPort", "http://tempuri.org/foo/bar");
doTestAddEndpoint(BASE_URN + "SoapPort", "http://tempuri.org/sna/fu");
doTestAddEndpoint("urn:Bank::Account%2F12345",
"corbaname:rir/NameService#account_12345");
doTestAddEndpoint(BASE_URN + "SamePort", "http://tempuri.org/sna/fu");
doTestAddEndpoint(BASE_URN + "SamePort", "http://tempuri.org/sna/fu");
}
public void doTestAddEndpoint(String encodedId, String address)
throws Exception {
String uri = baseURL + "/endpoint/" + encodedId;
HttpURLConnection httpConnection = getHttpConnection(uri, true);
httpConnection.setRequestMethod("PUT");
httpConnection.setRequestProperty("Content-Type", "application/xml");
httpConnection.connect();
OutputStream os = httpConnection.getOutputStream();
W3CEndpointReference ref =
EndpointRefBuilder.create(address);
EndpointRefBuilder.marshal(ref, os);
os.close();
verifyResponseCode(201, httpConnection);
assertEquals("Created", httpConnection.getResponseMessage());
}
public void testRemoveEndpoint() throws Exception {
String encodedId = BASE_URN + "SoapPort";
// add endpoint first before removing it
doTestAddEndpoint(encodedId + "A", "http://tempuri.org/foo/bar");
doTestAddEndpoint(encodedId + "B", "http://tempuri.org/sna/fu");
// TODO is this right?
//doTestRemoveEndpoint(encodedId + "A", 204, "No Content");
doTestRemoveEndpoint(encodedId + "A", 200, "OK");
doTestRemoveEndpoint(encodedId + "A", 404, "Not Found");
// TODO is this right?
//doTestRemoveEndpoint(encodedId + "B", 204, "No Content");
doTestRemoveEndpoint(encodedId + "B", 200, "OK");
}
public void doTestRemoveEndpoint(String encodedId,
int expectedCode,
String expectedMessage) throws Exception {
String uri = baseURL + "/endpoint/" + encodedId;
HttpURLConnection httpConnection = getHttpConnection(uri);
httpConnection.setRequestMethod("DELETE");
httpConnection.connect();
verifyResponseCode(expectedCode, httpConnection);
assertEquals(expectedMessage, httpConnection.getResponseMessage());
}
protected HttpURLConnection getHttpConnection(String target)
throws Exception {
LOG.debug("About to connect to (" + target + ")");
return getHttpConnection(target, false);
}
protected HttpURLConnection getHttpConnection(String target,
boolean doOutput)
throws Exception {
URL url = new URL(target);
URLConnection connection = url.openConnection();
connection.setDoOutput(doOutput);
assertTrue(connection instanceof HttpURLConnection);
return (HttpURLConnection)connection;
}
protected void verifyResponseCode(int expectedCode,
HttpURLConnection httpConnection)
throws Exception {
int responseCode = httpConnection.getResponseCode();
if (responseCode != expectedCode) {
try {
if (responseCode == 500) {
System.out.println("\nError response:");
InputStream err = httpConnection.getErrorStream();
if (err != null) {
int c = 0;
while ((c = err.read()) != -1) {
System.out.print((char)c);
}
System.out.println();
}
}
} catch (Throwable t) {
t.printStackTrace();
} finally {
assertEquals(expectedCode, responseCode);
}
}
}
}