1 package ch.qos.logback.access.db;
2
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertFalse;
5 import static org.junit.Assert.assertNotNull;
6 import static org.junit.Assert.fail;
7
8 import java.sql.ResultSet;
9 import java.sql.SQLException;
10 import java.sql.Statement;
11
12 import org.junit.After;
13 import org.junit.AfterClass;
14 import org.junit.Before;
15 import org.junit.BeforeClass;
16 import org.junit.Test;
17
18 import ch.qos.logback.access.dummy.DummyRequest;
19 import ch.qos.logback.access.dummy.DummyResponse;
20 import ch.qos.logback.access.dummy.DummyServerAdapter;
21 import ch.qos.logback.access.spi.AccessContext;
22 import ch.qos.logback.access.spi.AccessEvent;
23 import ch.qos.logback.core.db.DriverManagerConnectionSource;
24 import ch.qos.logback.core.util.StatusPrinter;
25
26 public class DBAppenderTest {
27
28 AccessContext context;
29 DBAppender appender;
30 DriverManagerConnectionSource connectionSource;
31
32 static DBAppenderTestFixture DB_APPENDER_TEST_FIXTURE;
33
34 @BeforeClass
35 static public void fixtureSetUp() throws SQLException {
36 DB_APPENDER_TEST_FIXTURE = new DBAppenderTestFixture();
37 DB_APPENDER_TEST_FIXTURE.setUp();
38 }
39
40 @AfterClass
41 static public void fixtureTearDown() throws SQLException {
42 DB_APPENDER_TEST_FIXTURE.tearDown();
43 }
44
45 @Before
46 public void setUp() throws SQLException {
47 context = new AccessContext();
48 context.setName("default");
49 appender = new DBAppender();
50 appender.setName("DB");
51 appender.setContext(context);
52 connectionSource = new DriverManagerConnectionSource();
53 connectionSource.setContext(context);
54 connectionSource.setDriverClass(DBAppenderTestFixture.DRIVER_CLASS);
55 connectionSource.setUrl(DB_APPENDER_TEST_FIXTURE.url);
56 connectionSource.setUser(DB_APPENDER_TEST_FIXTURE.user);
57 connectionSource.setPassword(DB_APPENDER_TEST_FIXTURE.password);
58 connectionSource.start();
59 appender.setConnectionSource(connectionSource);
60 }
61
62 private void setInsertHeadersAndStart(boolean insert) {
63 appender.setInsertHeaders(insert);
64 appender.start();
65 }
66
67 @After
68 public void tearDown() throws SQLException {
69 context = null;
70 appender = null;
71 connectionSource = null;
72 }
73
74 @Test
75 public void testAppendAccessEvent() throws SQLException {
76 setInsertHeadersAndStart(false);
77
78 AccessEvent event = createAccessEvent();
79 appender.append(event);
80
81 Statement stmt = connectionSource.getConnection().createStatement();
82 ResultSet rs = null;
83 rs = stmt.executeQuery("SELECT * FROM access_event");
84 if (rs.next()) {
85 assertEquals(event.getTimeStamp(), rs.getLong(1));
86 assertEquals(event.getRequestURI(), rs.getString(2));
87 assertEquals(event.getRequestURL(), rs.getString(3));
88 assertEquals(event.getRemoteHost(), rs.getString(4));
89 assertEquals(event.getRemoteUser(), rs.getString(5));
90 assertEquals(event.getRemoteAddr(), rs.getString(6));
91 assertEquals(event.getProtocol(), rs.getString(7));
92 assertEquals(event.getMethod(), rs.getString(8));
93 assertEquals(event.getServerName(), rs.getString(9));
94 assertEquals(event.getRequestContent(), rs.getString(10));
95 } else {
96 fail("No row was inserted in the database");
97 }
98
99 rs.close();
100 stmt.close();
101 }
102
103
104 @Test
105 public void testCheckNoHeadersAreInserted() throws Exception {
106 setInsertHeadersAndStart(false);
107
108 AccessEvent event = createAccessEvent();
109 appender.append(event);
110 StatusPrinter.print(context.getStatusManager());
111
112
113 Statement stmt = connectionSource.getConnection().createStatement();
114 ResultSet rs = null;
115 rs = stmt.executeQuery("SELECT * FROM access_event_header");
116
117 assertFalse(rs.next());
118 rs.close();
119 stmt.close();
120 }
121
122 @Test
123 public void testAppendHeaders() throws SQLException {
124 setInsertHeadersAndStart(true);
125
126 AccessEvent event = createAccessEvent();
127 appender.append(event);
128
129 Statement stmt = connectionSource.getConnection().createStatement();
130 ResultSet rs = null;
131 rs = stmt.executeQuery("SELECT * FROM access_event_header");
132 String key;
133 String value;
134 if (!rs.next()) {
135 fail("There should be results to this query");
136 } else {
137 key = rs.getString(2);
138 value = rs.getString(3);
139 assertNotNull(key);
140 assertNotNull(value);
141 assertEquals(event.getRequestHeader(key), value);
142 rs.next();
143 key = rs.getString(2);
144 value = rs.getString(3);
145 assertNotNull(key);
146 assertNotNull(value);
147 assertEquals(event.getRequestHeader(key), value);
148 }
149 if (rs.next()) {
150 fail("There should be no more rows available");
151 }
152
153 rs.close();
154 stmt.close();
155 }
156
157 @Test
158 public void testAppendMultipleEvents() throws SQLException {
159 String uri = "testAppendMultipleEvents";
160 for (int i = 0; i < 10; i++) {
161 AccessEvent event = createAccessEvent(uri);
162 appender.append(event);
163 }
164
165 Statement stmt = connectionSource.getConnection().createStatement();
166 ResultSet rs = null;
167 rs = stmt.executeQuery("SELECT * FROM access_event where requestURI='"+uri+"'");
168 int count = 0;
169 while (rs.next()) {
170 count++;
171 }
172 assertEquals(10, count);
173
174 rs.close();
175 stmt.close();
176 }
177
178 private AccessEvent createAccessEvent() {
179 return createAccessEvent("");
180 }
181
182 private AccessEvent createAccessEvent(String uri) {
183 DummyRequest request = new DummyRequest();
184 request.setRequestUri(uri);
185 DummyResponse response = new DummyResponse();
186 DummyServerAdapter adapter = new DummyServerAdapter(request, response);
187
188 AccessEvent ae = new AccessEvent(request, response, adapter);
189 return ae;
190 }
191 }