/****************************************************************************
* Copyright (C) 2012 ecsec GmbH.
* All rights reserved.
* Contact: ecsec GmbH (info@ecsec.de)
*
* This file is part of the Open eCard App.
*
* GNU General Public License Usage
* This file may be used under the terms of the GNU General Public
* License version 3.0 as published by the Free Software Foundation
* and appearing in the file LICENSE.GPL included in the packaging of
* this file. Please review the following information to ensure the
* GNU General Public License version 3.0 requirements will be met:
* http://www.gnu.org/copyleft/gpl.html.
*
* Other Usage
* Alternatively, this file may be used in accordance with the terms
* and conditions contained in a signed written agreement between
* you and ecsec GmbH.
*
***************************************************************************/
package org.openecard.control.binding.http;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.openecard.ws.marshal.WSMarshaller;
import org.openecard.ws.marshal.WSMarshallerFactory;
import org.openecard.ws.schema.Status;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
/**
* @author Moritz Horsch <horsch@cdc.informatik.tu-darmstadt.de>
* @author Dirk Petrautzki <petrautzki@hs-coburg.de>
*/
public final class HTTPBindingTest {
private static final Logger logger = LoggerFactory.getLogger(HTTPBindingTest.class);
private static WSMarshaller m;
/**
* Start up the TestClient.
*
* @throws Exception
*/
@BeforeClass
public static void setUpClass() throws Exception {
try {
TestClient tc = new TestClient();
m = WSMarshallerFactory.createInstance();
m.removeAllTypeClasses();
m.addXmlTypeClass(Status.class);
// Wait some seconds until the SAL comes up
Thread.sleep(2500);
} catch (Exception e) {
logger.debug(e.getMessage(), e);
Assert.fail();
}
}
/**
* Tests the HttpStatusChangeHandler by sending:
* 1. a get status to get the session identifier
* 2. a get status with session identifier to set up event queue
* 3. after 30 sec. a waitForChange
* 4. after 45 sec. a waitForChange to see if the event queue still exists
* 5. after 70 sec. a waitForChange to see if the event queue has correctly been removed due to timeout
* 6. a waitForChange as POST request
*/
@Test(enabled = !true)
public void testWaitForChange() {
try {
// Request a "get status" with GET and without optional session parameter
URL u = new URL("http", "127.0.0.1", 24727, "/getStatus");
String response = httpRequest(u, false);
Assert.assertNotNull(response);
logger.debug(response);
Status status = (Status) m.unmarshal(m.str2doc(response));
String session = status.getConnectionHandle().get(0).getChannelHandle().getSessionIdentifier();
// Request a "get status" with GET and with optional session parameter
u = new URL("http", "127.0.0.1", 24727, "/getStatus?session=" + session);
response = httpRequest(u, false);
Assert.assertNotNull(response);
logger.debug(response);
Thread.sleep(30 * 1000);
// Request a "waitForChange" with GET
u = new URL("http", "127.0.0.1", 24727, "/waitForChange?session=" + session);
response = httpRequest(u, false);
Assert.assertNotNull(response);
logger.debug(response);
Thread.sleep(45 * 1000);
// Request a "waitForChange" with GET
u = new URL("http", "127.0.0.1", 24727, "/waitForChange?session=" + session);
response = httpRequest(u, false);
Assert.assertNotNull(response);
logger.debug(response);
Thread.sleep(70 * 1000);
// Request a "waitForChange" with GET
u = new URL("http", "127.0.0.1", 24727, "/waitForChange?session=" + session);
response = httpRequest(u, false);
// we expect response code 400, therefore response must be null
Assert.assertNull(response);
// Request a "waitForChange" with POST
// response = httpRequest(u, true);
// we expect response code 405, therefore response must be null
// Assert.assertNull(response);
} catch (Exception e) {
logger.debug(e.getMessage(), e);
Assert.fail();
}
}
/**
* Tests the HttpStatusHandler by sending:
* 1. a GET request without optional session parameter
* 2. a GET request with optional session parameter
* 3. a POST request
* 4. a GET request with optional and malformed session parameter
*/
@Test(enabled = !true)
public void testGetStatus() {
try {
// Request a "get status" with GET and without optional session parameter
URL u = new URL("http", "127.0.0.1", 24727, "/getStatus");
String response = httpRequest(u, false);
Assert.assertNotNull(response);
logger.debug(response);
Status status = (Status) m.unmarshal(m.str2doc(response));
String session = status.getConnectionHandle().get(0).getChannelHandle().getSessionIdentifier();
// Request a "get status" with GET and with optional session parameter
u = new URL("http", "127.0.0.1", 24727, "/getStatus?session=" + session);
response = httpRequest(u, false);
Assert.assertNotNull(response);
logger.debug(response);
// Request a "get status" with POST
//response = httpRequest(u, true);
// we expect response code 405, therefore response must be null
//Assert.assertNull(response);
// Request a "get status" with GET and with optional malformed session parameter
u = new URL("http", "127.0.0.1", 24727, "/getStatus?session=");
response = httpRequest(u, false);
// we expect response code 400, therefore response must be null
Assert.assertNull(response);
} catch (Exception e) {
logger.debug(e.getMessage(), e);
Assert.fail();
}
}
@Test(enabled = !true)
public void testeIDClient() {
try {
// Request a "eID-Client"
URL u = new URL(
"http://localhost:24727/eID-Client?tcTokenURL=https%3A%2F%2Feservice.openecard.org%2FtcToken%3Fcard-type%3Dhttp%253A%252F%252Fbsi.bund.de%252Fcif%252Fnpa.xml%26with-html%3D");
String response = httpRequest(u, false);
Assert.assertNotNull(response);
} catch (Exception e) {
logger.debug(e.getMessage(), e);
Assert.fail();
}
}
/**
* Performs a HTTP Request (GET or POST) to the specified URL and returns the response as String.
*
* @param url URL to connect to
* @param doPOST true for POST, false for GET
* @return response as string
*/
private static String httpRequest(URL url, boolean doPOST) {
HttpURLConnection c = null;
try {
c = (HttpURLConnection) url.openConnection();
if (doPOST) {
c.setDoOutput(true);
c.getOutputStream();
}
BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder(4096);
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
return content.toString();
} catch (IOException e) {
if (c.getErrorStream() != null) {
try {
readErrorStream(c.getErrorStream());
} catch (IOException ioe) {
logger.error(e.getMessage(), e);
}
}
logger.error(e.getMessage(), e);
return null;
}
}
/**
* Reads the HTML Error Response from the Server.
*/
private static void readErrorStream(InputStream errorStream) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(errorStream));
StringBuilder stringBuilder = new StringBuilder(4096);
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
logger.error("HTML Error response from server:\n{}", stringBuilder.toString());
}
}