1   /**
2    * Logback: the reliable, generic, 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.classic.net;
11  
12  import static org.junit.Assert.assertEquals;
13  import static org.junit.Assert.assertTrue;
14  
15  import org.junit.After;
16  import org.junit.Before;
17  import org.junit.Test;
18  import org.slf4j.LoggerFactory;
19  
20  import ch.qos.logback.classic.Logger;
21  import ch.qos.logback.classic.LoggerContext;
22  import ch.qos.logback.classic.TestConstants;
23  import ch.qos.logback.classic.joran.JoranConfigurator;
24  import ch.qos.logback.classic.net.mock.MockSyslogServer;
25  import ch.qos.logback.core.joran.spi.JoranException;
26  import ch.qos.logback.core.net.SyslogConstants;
27  import ch.qos.logback.core.testUtil.RandomUtil;
28  
29  public class SyslogAppenderTest {
30  
31    @Before
32    public void setUp() throws Exception {
33    }
34  
35    @After
36    public void tearDown() throws Exception {
37    }
38  
39    @Test
40    public void basic() throws InterruptedException {
41      int port = RandomUtil.getRandomServerPort();
42  
43      MockSyslogServer mockServer = new MockSyslogServer(1, port);
44      mockServer.start();
45      // give MockSyslogServer head start
46      Thread.sleep(100);
47  
48      LoggerContext lc = new LoggerContext();
49      lc.setName("test");
50      SyslogAppender sa = new SyslogAppender();
51      sa.setContext(lc);
52      sa.setSyslogHost("localhost");
53      sa.setFacility("MAIL");
54      sa.setPort(port);
55      sa.setSuffixPattern("[%thread] %logger %msg");
56      sa.start();
57      assertTrue(sa.isStarted());
58  
59      String loggerName = this.getClass().getName();
60      Logger logger = lc.getLogger(loggerName);
61      logger.addAppender(sa);
62      String logMsg = "hello";
63      logger.debug(logMsg);
64  
65      // wait max 2 seconds for mock server to finish. However, it should
66      // much sooner than that.
67      mockServer.join(8000);
68      assertTrue(mockServer.isFinished());
69      assertEquals(1, mockServer.getMessageList().size());
70      String msg = mockServer.getMessageList().get(0);
71  
72      String threadName = Thread.currentThread().getName();
73  
74      String expected = "<"
75          + (SyslogConstants.LOG_MAIL + SyslogConstants.DEBUG_SEVERITY) + ">";
76      assertTrue(msg.startsWith(expected));
77  
78      String first = "<\\d{2}>\\w{3} \\d{2} \\d{2}(:\\d{2}){2} [\\w.]* ";
79      assertTrue(msg.matches(first + "\\[" + threadName + "\\] " + loggerName
80          + " " + logMsg));
81  
82    }
83  
84    @Test
85    public void tException() throws InterruptedException {
86      int port = RandomUtil.getRandomServerPort();
87  
88      MockSyslogServer mockServer = new MockSyslogServer(21, port);
89      mockServer.start();
90      // give MockSyslogServer head start
91      Thread.sleep(100);
92  
93      LoggerContext lc = new LoggerContext();
94      lc.setName("test");
95      SyslogAppender sa = new SyslogAppender();
96      sa.setContext(lc);
97      sa.setSyslogHost("localhost");
98      sa.setFacility("MAIL");
99      sa.setPort(port);
100     sa.setSuffixPattern("[%thread] %logger %msg");
101     sa.start();
102     assertTrue(sa.isStarted());
103 
104     String loggerName = this.getClass().getName();
105     Logger logger = lc.getLogger(loggerName);
106     logger.addAppender(sa);
107     String logMsg = "hello";
108     String exMsg = "just testing";
109     Exception ex = new Exception(exMsg);
110     logger.debug(logMsg, ex);
111     // StatusPrinter.print(lc.getStatusManager());
112 
113     // wait max 2 seconds for mock server to finish. However, it should
114     // much sooner than that.
115     mockServer.join(8000);
116     assertTrue(mockServer.isFinished());
117 
118     // message + 20 lines of stacktrace
119     assertEquals(21, mockServer.getMessageList().size());
120     // int i = 0;
121     // for (String line: mockServer.msgList) {
122     // System.out.println(i++ + ": " + line);
123     // }
124 
125     String msg = mockServer.getMessageList().get(0);
126     String expected = "<"
127         + (SyslogConstants.LOG_MAIL + SyslogConstants.DEBUG_SEVERITY) + ">";
128     assertTrue(msg.startsWith(expected));
129 
130     String expectedPrefix = "<\\d{2}>\\w{3} \\d{2} \\d{2}(:\\d{2}){2} [\\w.]* ";
131     String threadName = Thread.currentThread().getName();
132     String expectedResult = expectedPrefix + "\\[" + threadName + "\\] "
133         + loggerName + " " + logMsg;
134     assertTrue(msg.matches(expectedResult));
135   }
136 
137   @Test
138   public void LBCLASSIC_50() throws JoranException {
139 
140     LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
141 
142     JoranConfigurator configurator = new JoranConfigurator();
143     configurator.setContext(lc);
144     lc.reset();
145     configurator.doConfigure(TestConstants.JORAN_ONPUT_PREFIX
146         + "/syslog_LBCLASSIC_50.xml");
147 
148     org.slf4j.Logger logger = LoggerFactory.getLogger(this.getClass());
149     logger.info("hello");
150   }
151 }