/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2013, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
package ch.qos.logback.access.db;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import ch.qos.logback.access.spi.IAccessEvent;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import ch.qos.logback.access.dummy.DummyRequest;
import ch.qos.logback.access.dummy.DummyResponse;
import ch.qos.logback.access.dummy.DummyServerAdapter;
import ch.qos.logback.access.spi.AccessContext;
import ch.qos.logback.access.spi.AccessEvent;
import ch.qos.logback.core.db.DriverManagerConnectionSource;
import ch.qos.logback.core.util.StatusPrinter;
public class DBAppenderHSQLTest {
static DBAppenderHSQLTestFixture DB_APPENDER_HSQL_TEST_FIXTURE;
AccessContext context;
DBAppender appender;
DriverManagerConnectionSource connectionSource;
int existingEventTableRowCount;
Statement stmt;
@BeforeClass
static public void fixtureSetUp() throws SQLException {
DB_APPENDER_HSQL_TEST_FIXTURE = new DBAppenderHSQLTestFixture();
DB_APPENDER_HSQL_TEST_FIXTURE.setUp();
}
@AfterClass
static public void fixtureTearDown() throws SQLException {
DB_APPENDER_HSQL_TEST_FIXTURE.tearDown();
}
@Before
public void setUp() throws SQLException {
context = new AccessContext();
context.setName("default");
appender = new DBAppender();
appender.setName("DB");
appender.setContext(context);
connectionSource = new DriverManagerConnectionSource();
connectionSource.setContext(context);
connectionSource.setDriverClass(DBAppenderHSQLTestFixture.DRIVER_CLASS);
connectionSource.setUrl(DB_APPENDER_HSQL_TEST_FIXTURE.url);
connectionSource.setUser(DB_APPENDER_HSQL_TEST_FIXTURE.user);
connectionSource.setPassword(DB_APPENDER_HSQL_TEST_FIXTURE.password);
connectionSource.start();
appender.setConnectionSource(connectionSource);
stmt = connectionSource.getConnection().createStatement();
existingEventTableRowCount = existingEventTableRowCount(stmt);
}
@After
public void tearDown() throws SQLException {
context = null;
appender = null;
connectionSource = null;
stmt.close();
}
int existingEventTableRowCount(Statement stmt) throws SQLException {
ResultSet rs = stmt.executeQuery("SELECT count(*) FROM access_event");
int result = -1;
if (rs.next()) {
result = rs.getInt(1);
}
rs.close();
return result;
}
private void setInsertHeadersAndStart(boolean insert) {
appender.setInsertHeaders(insert);
appender.start();
}
@Test
public void testAppendAccessEvent() throws SQLException {
setInsertHeadersAndStart(false);
IAccessEvent event = createAccessEvent();
appender.append(event);
Statement stmt = connectionSource.getConnection().createStatement();
ResultSet rs = null;
rs = stmt.executeQuery("SELECT * FROM access_event where EVENT_ID = " + existingEventTableRowCount);
if (rs.next()) {
assertEquals(event.getTimeStamp(), rs.getLong(1));
assertEquals(event.getRequestURI(), rs.getString(2));
assertEquals(event.getRequestURL(), rs.getString(3));
assertEquals(event.getRemoteHost(), rs.getString(4));
assertEquals(event.getRemoteUser(), rs.getString(5));
assertEquals(event.getRemoteAddr(), rs.getString(6));
assertEquals(event.getProtocol(), rs.getString(7));
assertEquals(event.getMethod(), rs.getString(8));
assertEquals(event.getServerName(), rs.getString(9));
assertEquals(event.getRequestContent(), rs.getString(10));
} else {
fail("No row was inserted in the database");
}
rs.close();
stmt.close();
}
@Test
public void testCheckNoHeadersAreInserted() throws Exception {
setInsertHeadersAndStart(false);
IAccessEvent event = createAccessEvent();
appender.append(event);
StatusPrinter.print(context.getStatusManager());
//Check that no headers were inserted
Statement stmt = connectionSource.getConnection().createStatement();
ResultSet rs = null;
rs = stmt.executeQuery("SELECT * FROM access_event_header where EVENT_ID = " + existingEventTableRowCount);
assertFalse(rs.next());
rs.close();
stmt.close();
}
@Test
public void testAppendHeaders() throws SQLException {
setInsertHeadersAndStart(true);
IAccessEvent event = createAccessEvent();
appender.append(event);
Statement stmt = connectionSource.getConnection().createStatement();
ResultSet rs = null;
rs = stmt.executeQuery("SELECT * FROM access_event_header");
String key;
String value;
if (!rs.next()) {
fail("There should be results to this query");
} else {
key = rs.getString(2);
value = rs.getString(3);
assertNotNull(key);
assertNotNull(value);
assertEquals(event.getRequestHeader(key), value);
rs.next();
key = rs.getString(2);
value = rs.getString(3);
assertNotNull(key);
assertNotNull(value);
assertEquals(event.getRequestHeader(key), value);
}
if (rs.next()) {
fail("There should be no more rows available");
}
rs.close();
stmt.close();
}
@Test
public void testAppendMultipleEvents() throws SQLException {
setInsertHeadersAndStart(false);
String uri = "testAppendMultipleEvents";
for (int i = 0; i < 10; i++) {
IAccessEvent event = createAccessEvent(uri);
appender.append(event);
}
StatusPrinter.print(context);
Statement stmt = connectionSource.getConnection().createStatement();
ResultSet rs = null;
rs = stmt.executeQuery("SELECT * FROM access_event where requestURI='" + uri + "'");
int count = 0;
while (rs.next()) {
count++;
}
assertEquals(10, count);
rs.close();
stmt.close();
}
private IAccessEvent createAccessEvent() {
return createAccessEvent("");
}
private IAccessEvent createAccessEvent(String uri) {
DummyRequest request = new DummyRequest();
request.setRequestUri(uri);
DummyResponse response = new DummyResponse();
DummyServerAdapter adapter = new DummyServerAdapter(request, response);
return new AccessEvent(request, response, adapter);
}
}