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      //StatusPrinter.print(lc.getStatusManager());
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       //System.out.println("value: " + map.get(key));
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 }