1   package ch.qos.logback.classic.net;
2   
3   import static org.junit.Assert.assertEquals;
4   import static org.junit.Assert.assertNotNull;
5   import static org.junit.Assert.assertTrue;
6   
7   import java.io.IOException;
8   
9   import javax.mail.MessagingException;
10  import javax.mail.internet.MimeMessage;
11  import javax.mail.internet.MimeMultipart;
12  
13  import org.dom4j.io.SAXReader;
14  import org.junit.After;
15  import org.junit.Before;
16  import org.junit.Test;
17  import org.slf4j.MDC;
18  
19  import ch.qos.logback.classic.Logger;
20  import ch.qos.logback.classic.LoggerContext;
21  import ch.qos.logback.classic.PatternLayout;
22  import ch.qos.logback.classic.html.HTMLLayout;
23  import ch.qos.logback.classic.html.XHTMLEntityResolver;
24  import ch.qos.logback.classic.joran.JoranConfigurator;
25  import ch.qos.logback.classic.spi.LoggingEvent;
26  import ch.qos.logback.classic.util.TeztConstants;
27  import ch.qos.logback.core.CoreConstants;
28  import ch.qos.logback.core.Layout;
29  import ch.qos.logback.core.joran.spi.JoranException;
30  import ch.qos.logback.core.testUtil.RandomUtil;
31  import ch.qos.logback.core.util.StatusPrinter;
32  
33  import com.icegreen.greenmail.util.GreenMail;
34  import com.icegreen.greenmail.util.GreenMailUtil;
35  import com.icegreen.greenmail.util.ServerSetup;
36  
37  public class SMTPAppender_GreenTest {
38  
39    int port = RandomUtil.getRandomServerPort();
40    GreenMail greenMail;
41    SMTPAppender smtpAppender;
42    LoggerContext lc = new LoggerContext();
43    Logger logger = lc.getLogger(this.getClass());
44    
45    static final String TEST_SUBJECT = "test subject";
46    static final String HEADER = "HEADER\n";
47    static final String FOOTER = "FOOTER\n";
48  
49    @Before
50    public void setUp() throws Exception {
51      MDC.clear();
52      ServerSetup serverSetup = new ServerSetup(port, "localhost",
53          ServerSetup.PROTOCOL_SMTP);
54      greenMail = new GreenMail(serverSetup);
55      greenMail.start();
56    }
57    
58    @After
59    public void tearDown() throws Exception {
60      greenMail.stop();
61    }
62    
63  
64    void buildSMTPAppender() throws Exception {
65      smtpAppender = new SMTPAppender();
66      smtpAppender.setContext(lc);
67      smtpAppender.setName("smtp");
68      smtpAppender.setFrom("user@host.dom");
69      smtpAppender.setSMTPHost("localhost");
70      smtpAppender.setSMTPPort(port);
71      smtpAppender.setSubject(TEST_SUBJECT);
72      smtpAppender.addTo("nospam@qos.ch");
73      // smtpAppender.start();
74    }
75  
76    private Layout<LoggingEvent> buildPatternLayout(LoggerContext lc) {
77      PatternLayout layout = new PatternLayout();
78      layout.setContext(lc);
79      layout.setFileHeader(HEADER);
80      layout.setPattern("%-4relative %mdc [%thread] %-5level %class - %msg%n");
81      layout.setFileFooter(FOOTER);
82      layout.start();
83      return layout;
84    }
85  
86    private Layout<LoggingEvent> buildHTMLLayout(LoggerContext lc) {
87      HTMLLayout layout = new HTMLLayout();
88      layout.setContext(lc);
89      // layout.setFileHeader(HEADER);
90      layout.setPattern("%level%class%msg");
91      // layout.setFileFooter(FOOTER);
92      layout.start();
93      return layout;
94    }
95  
96  
97  
98    private MimeMultipart verify(String subject) throws MessagingException, IOException {
99      MimeMessage[] mma = greenMail.getReceivedMessages();
100     assertNotNull(mma);
101     assertEquals(1, mma.length);
102     MimeMessage mm = mma[0];
103     // http://jira.qos.ch/browse/LBCLASSIC-67
104     assertEquals(subject, mm.getSubject());
105     return (MimeMultipart) mm.getContent();
106   }
107 
108   @Test
109   public void smoke() throws Exception {
110     buildSMTPAppender();
111     smtpAppender.setLayout(buildPatternLayout(lc));
112     smtpAppender.start();
113     logger.addAppender(smtpAppender);
114     logger.debug("hello");
115     logger.error("en error", new Exception("an exception"));
116     
117     StatusPrinter.print(lc);
118     MimeMultipart mp =  verify(TEST_SUBJECT);
119     String body = GreenMailUtil.getBody(mp.getBodyPart(0));
120     assertTrue(body.startsWith(HEADER.trim()));
121     assertTrue(body.endsWith(FOOTER.trim()));
122   }
123 
124   @Test
125   public void LBCLASSIC_104() throws Exception {
126     buildSMTPAppender();
127     smtpAppender.setLayout(buildPatternLayout(lc));
128     smtpAppender.start();
129     logger.addAppender(smtpAppender);
130     MDC.put("key", "val");
131     logger.debug("hello");
132     MDC.clear();
133     logger.error("en error", new Exception("an exception"));
134     
135     MimeMultipart mp =  verify(TEST_SUBJECT);
136     String body = GreenMailUtil.getBody(mp.getBodyPart(0));
137     assertTrue(body.startsWith(HEADER.trim()));
138     assertTrue(body.contains("key=val"));
139     assertTrue(body.endsWith(FOOTER.trim()));
140   }
141 
142   
143   @Test
144   public void html() throws Exception {
145     buildSMTPAppender();
146     smtpAppender.setLayout(buildHTMLLayout(lc));
147     smtpAppender.start();
148     logger.addAppender(smtpAppender);
149     logger.debug("hello");
150     logger.error("en error", new Exception("an exception"));
151     MimeMultipart mp =  verify(TEST_SUBJECT);
152     
153     // verify strict adherence to xhtml1-strict.dtd
154     SAXReader reader = new SAXReader();
155     reader.setValidation(true);
156     reader.setEntityResolver(new XHTMLEntityResolver());
157     reader.read(mp.getBodyPart(0).getInputStream());
158 
159   }
160 
161   @Test
162   /**
163    * Checks that even when many events are processed, the output is still
164    * conforms to xhtml-strict.dtd.
165    * 
166    * Note that SMTPAppender only keeps only 500 or so (=buffer size) events. So
167    * the generated output will be rather short.
168    */
169   public void htmlLong() throws Exception {
170     buildSMTPAppender();
171     smtpAppender.setLayout(buildHTMLLayout(lc));
172     smtpAppender.start();
173     logger.addAppender(smtpAppender);
174     for (int i = 0; i < CoreConstants.TABLE_ROW_LIMIT * 3; i++) {
175       logger.debug("hello " + i);
176     }
177     logger.error("en error", new Exception("an exception"));
178     
179     MimeMultipart mp =  verify(TEST_SUBJECT);
180     
181     // verify strict adherence to xhtml1-strict.dtd
182     SAXReader reader = new SAXReader();
183     reader.setValidation(true);
184     reader.setEntityResolver(new XHTMLEntityResolver());
185     reader.read(mp.getBodyPart(0).getInputStream());
186   }
187 
188   private void configure(String file) throws JoranException {
189     JoranConfigurator jc = new JoranConfigurator();
190     jc.setContext(lc);
191     System.out.println("port="+port);
192     lc.putProperty("port", "" + port);
193     jc.doConfigure(file);
194   }
195 
196   @Test
197   public void testCustomEvaluator() throws  Exception {
198     configure(TeztConstants.TEST_DIR_PREFIX
199         + "input/joran/smtp/customEvaluator.xml");
200     
201     logger.debug("hello");
202     String msg2 = "world";
203     logger.debug(msg2);
204     logger.debug("invisible");
205     MimeMultipart mp =  verify(this.getClass().getName()+ " - "+msg2);
206     String body = GreenMailUtil.getBody(mp.getBodyPart(0));
207     assertEquals("helloworld", body);
208   }
209 }