// Copyright 2012 Georg-August-Universität Göttingen, Germany // // 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 de.ugoe.cs.autoquest.httpmonitor; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.StringWriter; import java.util.Collection; import java.util.Iterator; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import org.apache.http.HttpEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.junit.Test; import de.ugoe.cs.autoquest.eventcore.Event; import de.ugoe.cs.autoquest.http.HTTPTestUtils; import de.ugoe.cs.autoquest.httpmonitor.exchange.HttpExchange; import de.ugoe.cs.autoquest.httpmonitor.exchange.ObjectFactory; import de.ugoe.cs.autoquest.httpmonitor.exchange.Session; import de.ugoe.cs.autoquest.httpmonitor.proxy.HttpMonitoringProxy; import de.ugoe.cs.autoquest.plugin.http.HTTPLogParser; import de.ugoe.cs.autoquest.plugin.http.HTTPUtils; import de.ugoe.cs.autoquest.plugin.http.eventcore.HTTPEventType; import de.ugoe.cs.autoquest.plugin.http.eventcore.HTTPTarget; /** * @author Patrick Harms */ public class HttpMonitorTest extends AbstractTC { /** * */ private HttpMonitoringProxy proxy; /** * */ private HttpMonitor monitor; /* (non-Javadoc) * @see de.ugoe.cs.autoquest.httpmonitor.AbstractTC#setUpHook() */ @Override protected void setUpHook() throws Exception { // nothing to do } /** * */ public void tearDownHook() throws Exception { if (proxy != null) { try { proxy.stop(); } finally { proxy = null; } } if (monitor != null) { try { monitor.stop(); } finally { monitor = null; } } } @Test public void test_SimulatedSession_MonitorOnly() throws Exception { monitor = new HttpMonitor(new String[] { LOG_FILE_DIR, PORT +"" }); monitor.init(); monitor.start(); Session simulatedSession = HTTPTestUtils.createRandomSession(50); sendExchanges(simulatedSession.getHttpExchange()); monitor.stop(); monitor = null; File logFile = new File(LOG_FILE_DIR + File.separator + "httpmonitor_000.log"); assertTrue(logFile.exists()); HTTPLogParser parser = new HTTPLogParser(); parser.parseFile(logFile); // check the sequences Collection> sequences = parser.getSequences(); assertNotNull(sequences); Iterator> iterator = sequences.iterator(); assertTrue(iterator.hasNext()); List sequence = iterator.next(); assertFalse(iterator.hasNext()); assertNotNull(sequence); assertEquals(simulatedSession.getHttpExchange().size(), sequence.size()); System.out.println("{"); System.out.println(" {"); for (int j = 0; j < sequence.size(); j++) { System.out.print(" "); System.out.print(sequence.get(j)); System.out.println(","); assertNotNull(sequence.get(j)); assertNotNull(sequence.get(j).getType()); assertTrue(sequence.get(j).getType() instanceof HTTPEventType); assertNotNull(sequence.get(j).getTarget()); assertTrue(sequence.get(j).getTarget() instanceof HTTPTarget); HTTPTestUtils.assertExchangeEquals (simulatedSession.getHttpExchange().get(j), ((HTTPEventType) sequence.get(j).getType()).getExchange()); assertEquals(HTTPUtils.toString(simulatedSession.getHttpExchange().get(j).getReceiver()), ((HTTPTarget) sequence.get(j).getTarget()).getStringIdentifier()); } System.out.println(" }"); System.out.println("}"); System.out.println("\n\n"); } @Test public void test_SimpleText_ProxyAndMonitor() throws Exception { monitor = new HttpMonitor(new String[] { LOG_FILE_DIR, (PORT + 2) + "" }); monitor.init(); monitor.start(); proxy = new HttpMonitoringProxy (new String[] { LOG_FILE_DIR, PORT +"", "localhost:" + (PORT + 1), "localhost:" + (PORT + 2) }); proxy.init(); proxy.start(); String message = "dummy message"; String expectedResponse = "response content"; String response = sendDummyMessage("POST", message, expectedResponse); assertEquals(expectedResponse, response); // the monitor needs some time to receive the exchange --> give it Thread.sleep(1000); monitor.stop(); monitor = null; File logFile = new File(LOG_FILE_DIR + File.separator + "httpmonitor_000.log"); assertTrue(logFile.exists()); HTTPLogParser parser = new HTTPLogParser(); parser.parseFile(logFile); // check the sequences Collection> sequences = parser.getSequences(); assertNotNull(sequences); Iterator> iterator = sequences.iterator(); assertTrue(iterator.hasNext()); List sequence = iterator.next(); assertFalse(iterator.hasNext()); assertNotNull(sequence); assertEquals(1, sequence.size()); assertNotNull(sequence.get(0)); assertNotNull(sequence.get(0).getType()); assertTrue(sequence.get(0).getType() instanceof HTTPEventType); assertNotNull(sequence.get(0).getTarget()); assertTrue(sequence.get(0).getTarget() instanceof HTTPTarget); HttpExchange exchange = ((HTTPEventType) sequence.get(0).getType()).getExchange(); assertEquals(message, exchange.getRequest().getContent().getData()); assertEquals(response, exchange.getResponse().getContent().getData()); } @Test public void test_XMLMessage_ProxyAndMonitor() throws Exception { monitor = new HttpMonitor(new String[] { LOG_FILE_DIR, (PORT + 2) + "" }); monitor.init(); monitor.start(); proxy = new HttpMonitoringProxy (new String[] { LOG_FILE_DIR, PORT +"", "localhost:" + (PORT + 1), "localhost:" + (PORT + 2) }); proxy.init(); proxy.start(); String message = "" + "" + " " + ""; String expectedResponse = "" + "" + " 127.0.0.1127.0.0.142688" + " 127.0.0.1127.0.0.119098" + " " + " " + "
" + "
" + "
" + "
" + "
" + " " + " " + " dummy message" + " " + " " + " " + " " + "
" + "
" + " " + " " + " response content" + " " + " " + ""; String response = sendDummyMessage("POST", message, expectedResponse); assertEquals(expectedResponse, response); // the monitor needs some time to receive the exchange --> give it Thread.sleep(1000); monitor.stop(); monitor = null; File logFile = new File(LOG_FILE_DIR + File.separator + "httpmonitor_000.log"); assertTrue(logFile.exists()); HTTPLogParser parser = new HTTPLogParser(); parser.parseFile(logFile); // check the sequences Collection> sequences = parser.getSequences(); assertNotNull(sequences); Iterator> iterator = sequences.iterator(); assertTrue(iterator.hasNext()); List sequence = iterator.next(); assertFalse(iterator.hasNext()); assertNotNull(sequence); assertEquals(1, sequence.size()); assertNotNull(sequence.get(0)); assertNotNull(sequence.get(0).getType()); assertTrue(sequence.get(0).getType() instanceof HTTPEventType); assertNotNull(sequence.get(0).getTarget()); assertTrue(sequence.get(0).getTarget() instanceof HTTPTarget); HttpExchange exchange = ((HTTPEventType) sequence.get(0).getType()).getExchange(); assertEquals(message, exchange.getRequest().getContent().getData()); assertEquals(response, exchange.getResponse().getContent().getData()); } /** * */ private void sendExchanges(List exchanges) throws Exception { DefaultHttpClient httpclient = new DefaultHttpClient(); for (HttpExchange exchange : exchanges) { HttpPost httpRequest = new HttpPost("http://localhost:" + PORT + "/"); JAXBContext jaxbContext = JAXBContext.newInstance(HttpExchange.class.getPackage().getName()); Marshaller marshaller = jaxbContext.createMarshaller(); StringWriter out = new StringWriter(); marshaller.marshal(new ObjectFactory().createHttpExchange(exchange), out); HttpEntity entity = new StringEntity (out.toString(), ContentType.create("text/plain", "UTF-8")); ((HttpPost) httpRequest).setEntity(entity); try { httpclient.execute(httpRequest); } finally { httpRequest.releaseConnection(); out.close(); } } } }