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     //Check that no headers were inserted
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 }