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
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
90 layout.setPattern("%level%class%msg");
91
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
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
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
164
165
166
167
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
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 }