1 package ch.qos.logback.classic.db;
2
3 import static org.junit.Assert.*;
4
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7 import java.sql.Statement;
8 import java.util.Map;
9
10 import org.junit.After;
11 import org.junit.AfterClass;
12 import org.junit.Before;
13 import org.junit.BeforeClass;
14 import org.junit.Test;
15
16 import ch.qos.logback.classic.Level;
17 import ch.qos.logback.classic.Logger;
18 import ch.qos.logback.classic.LoggerContext;
19 import ch.qos.logback.classic.spi.CallerData;
20 import ch.qos.logback.classic.spi.LoggingEvent;
21 import ch.qos.logback.core.db.DriverManagerConnectionSource;
22
23 public class DBAppenderTest {
24
25 LoggerContext lc;
26 Logger logger;
27 DBAppender appender;
28 DriverManagerConnectionSource connectionSource;
29
30 static DBAppenderTestFixture DB_APPENDER_TEST_FIXTURE;
31
32 @BeforeClass
33 public static void fixtureSetUp() throws SQLException {
34 DB_APPENDER_TEST_FIXTURE = new DBAppenderTestFixture();
35 DB_APPENDER_TEST_FIXTURE.setUp();
36 }
37
38 @AfterClass
39 public static void fixtureTearDown() throws SQLException {
40 DB_APPENDER_TEST_FIXTURE.tearDown();
41 }
42
43 @Before
44 public void setUp() throws SQLException {
45 lc = new LoggerContext();
46 lc.setName("default");
47 logger = lc.getLogger("root");
48 appender = new DBAppender();
49 appender.setName("DB");
50 appender.setContext(lc);
51 connectionSource = new DriverManagerConnectionSource();
52 connectionSource.setContext(lc);
53 connectionSource.setDriverClass(DBAppenderTestFixture.HSQLDB_DRIVER_CLASS);
54 connectionSource.setUrl(DB_APPENDER_TEST_FIXTURE.url);
55 connectionSource.setUser(DB_APPENDER_TEST_FIXTURE.user);
56 connectionSource.setPassword(DB_APPENDER_TEST_FIXTURE.password);
57 connectionSource.start();
58 appender.setConnectionSource(connectionSource);
59 appender.start();
60 }
61
62 @After
63 public void tearDown() throws SQLException {
64 logger = null;
65 lc = null;
66 appender = null;
67 connectionSource = null;
68 }
69
70 @Test
71 public void testAppendLoggingEvent() throws SQLException {
72 LoggingEvent event = createLoggingEvent();
73
74 appender.append(event);
75
76
77 Statement stmt = connectionSource.getConnection().createStatement();
78 ResultSet rs = null;
79 rs = stmt.executeQuery("SELECT * FROM logging_event");
80 if (rs.next()) {
81 assertEquals(event.getTimeStamp(), rs.getLong(1));
82 assertEquals(event.getFormattedMessage(), rs.getString(2));
83 assertEquals(event.getLoggerRemoteView().getName(), rs.getString(3));
84 assertEquals(event.getLevel().toString(), rs.getString(4));
85 assertEquals(event.getThreadName(), rs.getString(5));
86 assertEquals(DBHelper.computeReferenceMask(event), rs.getShort(6));
87 CallerData callerData = event.getCallerData()[0];
88 assertEquals(callerData.getFileName(), rs.getString(7));
89 assertEquals(callerData.getClassName(), rs.getString(8));
90 assertEquals(callerData.getMethodName(), rs.getString(9));
91 } else {
92 fail("No row was inserted in the database");
93 }
94
95 rs.close();
96 stmt.close();
97 }
98
99 public void testAppendThrowable() throws SQLException {
100 LoggingEvent event = createLoggingEvent();
101
102 appender.append(event);
103
104 Statement stmt = connectionSource.getConnection().createStatement();
105 ResultSet rs = null;
106 rs = stmt.executeQuery("SELECT * FROM logging_event_exception where event_id = 0");
107 int i = 0;
108 while (rs.next()) {
109 assertEquals(event.getThrowableProxy().getThrowableDataPointArray()[i].toString(), rs.getString(3));
110 i++;
111 }
112
113 rs.close();
114 stmt.close();
115 }
116
117 public void testContextInfo() throws SQLException {
118 LoggingEvent event = createLoggingEvent();
119 lc.putProperty("testKey1", "testValue1");
120
121 appender.append(event);
122
123 Statement stmt = connectionSource.getConnection().createStatement();
124 ResultSet rs = null;
125 rs = stmt.executeQuery("SELECT * FROM logging_event_property where event_id = 0");
126 Map<String, String> map = appender.mergePropertyMaps(event);
127 while (rs.next()) {
128 String key = rs.getString(2);
129 assertEquals(map.get(key), rs.getString(3));
130
131 }
132
133 rs.close();
134 stmt.close();
135 }
136
137 public void testAppendMultipleEvents() throws SQLException {
138 for (int i = 0; i < 10; i++) {
139 LoggingEvent event = createLoggingEvent();
140 appender.append(event);
141 }
142
143 Statement stmt = connectionSource.getConnection().createStatement();
144 ResultSet rs = null;
145 rs = stmt.executeQuery("SELECT * FROM logging_event");
146 int count = 0;
147 while (rs.next()) {
148 count++;
149 }
150 assertEquals(10, count);
151
152 rs.close();
153 stmt.close();
154 }
155
156
157 private LoggingEvent createLoggingEvent() {
158 LoggingEvent le = new LoggingEvent(this.getClass().getName(), logger,
159 Level.DEBUG, "test message", new Exception("test Ex"), null);
160 return le;
161 }
162 }