1   /**
2    * Logback: the generic, reliable, fast and flexible logging framework.
3    * 
4    * Copyright (C) 1999-2006, QOS.ch
5    * 
6    * This library is free software, you can redistribute it and/or modify it under
7    * the terms of the GNU Lesser General Public License as published by the Free
8    * Software Foundation.
9    */
10  package ch.qos.logback.access.net;
11  
12  import static org.junit.Assert.assertEquals;
13  import static org.junit.Assert.assertTrue;
14  
15  import org.junit.Test;
16  
17  import ch.qos.logback.access.dummy.DummyRequest;
18  import ch.qos.logback.access.dummy.DummyResponse;
19  import ch.qos.logback.access.dummy.DummyServerAdapter;
20  import ch.qos.logback.access.spi.AccessContext;
21  import ch.qos.logback.access.spi.AccessEvent;
22  
23  
24  public class SocketAppenderTest {
25  
26    private AccessContext context;
27    private MockSocketServer mockSocketServer;
28  
29    @Test
30    public void testStartFailNoRemoteHost() {
31      context = new AccessContext();
32      SocketAppender appender = new SocketAppender();
33      appender.setContext(context);
34      appender.setPort(123);
35      appender.start();
36      assertEquals(1, context.getStatusManager().getCount());
37    }
38  
39    @Test
40    public void testRecieveMessage() throws InterruptedException {
41      startServer(1);
42      configureClient();
43      
44      context.callAppenders(buildNewAccessEvent());
45      // Wait max 2 seconds for mock server to finish. However, it should
46      // finish much sooner than that.
47      mockSocketServer.join(2000);
48      assertTrue(mockSocketServer.finished);
49      assertEquals(1, mockSocketServer.accessEventList.size());
50  
51      AccessEvent remoteEvent = mockSocketServer.accessEventList.get(0);
52      //check that the values are available although the request and response
53      //objects did not survive serialization
54      assertEquals("headerValue1", remoteEvent.getRequestHeader("headerName1"));
55      assertEquals("testHost", remoteEvent.getRemoteHost());
56    }
57  
58    private void startServer(int expectedEventNumber) throws InterruptedException {
59      mockSocketServer = new MockSocketServer(expectedEventNumber);
60      mockSocketServer.start();
61      // give MockSocketServer head start
62      Thread.sleep(100);
63    }
64  
65    private void configureClient() {
66      context = new AccessContext();
67      context.setName("test");
68      SocketAppender socketAppender = new SocketAppender();
69      socketAppender.setContext(context);
70      socketAppender.setName("socket");
71      socketAppender.setPort(MockSocketServer.PORT);
72      socketAppender.setRemoteHost("localhost");
73      context.addAppender(socketAppender);
74      socketAppender.start();
75    }
76    
77    private AccessEvent buildNewAccessEvent() {
78      DummyRequest request = new DummyRequest();
79      DummyResponse response = new DummyResponse();
80      DummyServerAdapter adapter = new DummyServerAdapter(request, response);
81      
82      AccessEvent ae = new AccessEvent(request, response, adapter);
83      return ae;
84    }
85  }