/*
* This file is part of the OWASP Proxy, a free intercepting proxy library.
* Copyright (C) 2008-2010 Rogan Dawes <rogan@dawes.za.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to:
* The Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
package org.owasp.proxy.http.dao;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.net.InetSocketAddress;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.owasp.proxy.http.MutableBufferedRequest;
import org.owasp.proxy.http.MutableBufferedResponse;
import org.owasp.proxy.http.RequestHeader;
import org.owasp.proxy.http.ResponseHeader;
import org.owasp.proxy.http.dao.Conversation;
import org.owasp.proxy.http.dao.JdbcMessageDAO;
import org.owasp.proxy.util.AsciiString;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.jdbc.support.rowset.SqlRowSet;
import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
public class JdbcMessageDAOTest {
private static Logger logger = Logger.getAnonymousLogger();
private static JdbcMessageDAO dao = null;
private static DriverManagerDataSource dataSource = null;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
Logger dslogger = Logger.getLogger(DriverManagerDataSource.class
.getName());
dslogger.setLevel(Level.OFF);
dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:webscarab3;DB_CLOSE_DELAY=-1");
dataSource.setUsername("sa");
dataSource.setPassword("");
dao = new JdbcMessageDAO();
dao.setDataSource(dataSource);
}
@Before
public void setUp() {
dao.createTables();
}
@After
public void tearDown() {
}
private void dump() {
dump("SELECT * FROM contents");
dump("SELECT * FROM headers");
dump("SELECT * FROM requests");
dump("SELECT * FROM responses");
dump("SELECT * FROM conversations");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
dao.getJdbcTemplate().execute("SHUTDOWN");
}
@Test
public void testSaveMessageContent() {
MutableBufferedRequest request = new MutableBufferedRequest.Impl();
request.setTarget(InetSocketAddress.createUnresolved("localhost", 80));
request.setSsl(false);
request.setHeader(AsciiString
.getBytes("GET / HTTP/1.0\r\nHost: localhost\r\n\r\n"));
request.setTime(1);
MutableBufferedResponse response = new MutableBufferedResponse.Impl();
response.setHeader(AsciiString
.getBytes("HTTP/1.0 200 Ok\r\nContent-Type: text\r\n\r\n"));
byte[] cont = AsciiString.getBytes("Some content");
response.setContent(cont);
response.setHeaderTime(2);
response.setContentTime(4);
dao.saveRequest(request);
dao.saveResponse(response);
int id = dao.saveConversation(request.getId(), response.getId());
logger.fine("ADDED conversation");
dump();
logger.fine("##############################################");
Conversation c = dao.getConversation(id);
RequestHeader reqh = dao.loadRequestHeader(c.getRequestId());
ResponseHeader resph = dao.loadResponseHeader(c.getResponseId());
assertTrue(Arrays.equals(request.getHeader(), reqh.getHeader()));
assertEquals(request.getTarget(), reqh.getTarget());
assertEquals(request.isSsl(), reqh.isSsl());
assertEquals(request.getTime(), reqh.getTime());
assertTrue("Response headers differ", Arrays.equals(response
.getHeader(), resph.getHeader()));
assertEquals(response.getHeaderTime(), resph.getHeaderTime());
assertEquals(response.getContentTime(), resph.getContentTime());
byte[] content = dao.loadMessageContent(dao.getMessageContentId(c
.getRequestId()));
assertNull(content);
content = dao.loadMessageContent(dao.getMessageContentId(c
.getResponseId()));
assertTrue(Arrays.equals(cont, content));
assertTrue("Delete failed", dao.deleteConversation(id));
dump();
}
private static void dump(String sql) {
logger.fine("\n" + sql);
SqlRowSet rs = dao.getJdbcTemplate().queryForRowSet(sql);
try {
SqlRowSetMetaData rsmd = rs.getMetaData();
int c = rsmd.getColumnCount();
StringBuffer buff = new StringBuffer();
for (int i = 1; i <= c; i++) {
buff.append(rsmd.getColumnLabel(i));
buff.append(i == c ? "\n" : "\t");
}
logger.fine(buff.toString());
buff.delete(0, buff.length());
while (rs.next()) {
for (int i = 1; i <= c; i++) {
buff.append(rs.getObject(i));
buff.append(i == c ? "\n" : "\t");
}
logger.fine(buff.toString());
buff.delete(0, buff.length());
}
logger.fine("================\n\n");
} catch (Exception e) {
e.printStackTrace();
}
}
}