blob: 599093c1c5807b1849f8b432142986e0ed9b774f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache license, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the license for the specific language governing permissions and
* limitations under the license.
*/
package org.apache.logging.log4j.smtp.appender;
import java.util.Iterator;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import org.apache.logging.dumbster.smtp.SimpleSmtpServer;
import org.apache.logging.dumbster.smtp.SmtpMessage;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.categories.Appenders;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.smtp.MimeMessageBuilder;
import org.apache.logging.log4j.smtp.appender.SmtpAppender;
import org.apache.logging.log4j.test.AvailablePortFinder;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import static org.junit.Assert.*;
@Category(Appenders.Smtp.class)
public class SmtpAppenderTest {
private static final String HOST = "localhost";
private static final int PORTNUM = AvailablePortFinder.getNextAvailable();
private static final String PORT = String.valueOf(PORTNUM);
@Test
public void testMessageFactorySetFrom() throws MessagingException {
final MimeMessageBuilder builder = new MimeMessageBuilder(null);
final String address = "testing@example.com";
assertNull(builder.build().getFrom());
builder.setFrom(null);
Address[] array = null;
final Address addr = InternetAddress.getLocalAddress(null);
if (addr != null) {
array = new Address[] { addr };
}
assertArrayEquals(array, builder.build().getFrom());
builder.setFrom(address);
assertArrayEquals(new Address[] { new InternetAddress(address) },
builder.build().getFrom());
}
@Test
public void testMessageFactorySetReplyTo() throws MessagingException {
final MimeMessageBuilder builder = new MimeMessageBuilder(null);
final String addresses = "testing1@example.com,testing2@example.com";
assertNull(builder.build().getReplyTo());
builder.setReplyTo(null);
assertNull(builder.build().getReplyTo());
builder.setReplyTo(addresses);
assertArrayEquals(InternetAddress.parse(addresses), builder
.build().getReplyTo());
}
@Test
public void testMessageFactorySetRecipients() throws MessagingException {
final MimeMessageBuilder builder = new MimeMessageBuilder(null);
final String addresses = "testing1@example.com,testing2@example.com";
assertNull(builder.build().getRecipients(
Message.RecipientType.TO));
builder.setRecipients(Message.RecipientType.TO, null);
assertNull(builder.build().getRecipients(
Message.RecipientType.TO));
builder.setRecipients(Message.RecipientType.TO, addresses);
assertArrayEquals(InternetAddress.parse(addresses), builder
.build().getRecipients(Message.RecipientType.TO));
}
@Test
public void testMessageFactorySetSubject() throws MessagingException {
final MimeMessageBuilder builder = new MimeMessageBuilder(null);
final String subject = "Test Subject";
assertNull(builder.build().getSubject());
builder.setSubject(null);
assertNull(builder.build().getSubject());
builder.setSubject(subject);
assertEquals(subject, builder.build().getSubject());
}
@Test
public void testDelivery() {
final String subjectKey = getClass().getName();
final String subjectValue = "SubjectValue1";
ThreadContext.put(subjectKey, subjectValue);
final SmtpAppender appender = SmtpAppender.createAppender(null, "Test", "to@example.com", "cc@example.com",
"bcc@example.com", "from@example.com", "replyTo@example.com", "Subject Pattern %X{" + subjectKey + "}",
null, HOST, PORT, null, null, "false", "3", null, null, "true");
appender.start();
final LoggerContext context = LoggerContext.getContext();
final Logger root = context.getLogger("SMTPAppenderTest");
root.addAppender(appender);
root.setAdditive(false);
root.setLevel(Level.DEBUG);
final SimpleSmtpServer server = SimpleSmtpServer.start(PORTNUM);
root.debug("Debug message #1");
root.debug("Debug message #2");
root.debug("Debug message #3");
root.debug("Debug message #4");
root.error("Error with exception", new RuntimeException("Exception message"));
root.error("Error message #2");
server.stop();
assertTrue(server.getReceivedEmailSize() == 2);
final Iterator<SmtpMessage> messages = server.getReceivedEmail();
final SmtpMessage email = messages.next();
assertEquals("to@example.com", email.getHeaderValue("To"));
assertEquals("cc@example.com", email.getHeaderValue("Cc"));
// assertEquals("bcc@example.com", email.getHeaderValue("Bcc")); // BCC
// can't be tested with Dumpster 1.6
assertEquals("from@example.com", email.getHeaderValue("From"));
assertEquals("replyTo@example.com", email.getHeaderValue("Reply-To"));
final String headerValue = email.getHeaderValue("Subject");
assertEquals(headerValue, "Subject Pattern " + subjectValue);
final String body = email.getBody();
assertFalse(body.contains("Debug message #1"));
assertTrue(body.contains("Debug message #2"));
assertTrue(body.contains("Debug message #3"));
assertTrue(body.contains("Debug message #4"));
assertTrue(body.contains("Error with exception"));
assertTrue(body.contains("RuntimeException"));
assertTrue(body.contains("Exception message"));
assertFalse(body.contains("Error message #2"));
final SmtpMessage email2 = messages.next();
final String body2 = email2.getBody();
assertFalse(body2.contains("Debug message #4"));
assertFalse(body2.contains("Error with exception"));
assertTrue(body2.contains("Error message #2"));
}
}