diff --git a/pom.xml b/pom.xml
index 3dcdaa12e..9b8fd761e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -76,6 +76,8 @@
+ src/main/java
+ test/main/java
org.apache.maven.plugins
@@ -589,13 +591,33 @@
true
-
-
- net.ricecode
- string-similarity
- 1.0.0
+
+
+ junit
+ junit
+ test
+ 4.12
+
+
+ org.hamcrest
+ java-hamcrest
+ test
+ 2.0.0.0
+
+
+ org.mockito
+ mockito-core
+ test
+ 2.0.5-beta
+
+
+
+
+ net.ricecode
+ string-similarity
+ 1.0.0
compile
true
-
+
diff --git a/test/main/java/fr/xephi/authme/Log4JFilterTest.java b/test/main/java/fr/xephi/authme/Log4JFilterTest.java
new file mode 100644
index 000000000..e7d114101
--- /dev/null
+++ b/test/main/java/fr/xephi/authme/Log4JFilterTest.java
@@ -0,0 +1,186 @@
+package fr.xephi.authme;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.when;
+
+import org.apache.logging.log4j.core.Filter.Result;
+import org.apache.logging.log4j.core.LogEvent;
+import org.apache.logging.log4j.message.Message;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+/**
+ * Test for {@link Log4JFilter}.
+ */
+public class Log4JFilterTest {
+
+ private final Log4JFilter log4JFilter = new Log4JFilter();
+
+ private static final String SENSITIVE_COMMAND = "User issued server command: /login pass pass";
+ private static final String NORMAL_COMMAND = "User issued server command: /help";
+ private static final String OTHER_COMMAND = "Starting the server... Write /l for logs";
+
+ // ---------
+ // Test the filter(LogEvent) method
+ // ---------
+ @Test
+ public void shouldFilterSensitiveLogEvent() {
+ // given
+ Message message = mockMessage(SENSITIVE_COMMAND);
+ LogEvent event = Mockito.mock(LogEvent.class);
+ when(event.getMessage()).thenReturn(message);
+
+ // when
+ Result result = log4JFilter.filter(event);
+
+ // then
+ assertThat(result, equalTo(Result.DENY));
+ }
+
+ @Test
+ public void shouldNotFilterIrrelevantLogEvent() {
+ // given
+ Message message = mockMessage(NORMAL_COMMAND);
+ LogEvent event = Mockito.mock(LogEvent.class);
+ when(event.getMessage()).thenReturn(message);
+
+ // when
+ Result result = log4JFilter.filter(event);
+
+ // then
+ assertThat(result, equalTo(Result.NEUTRAL));
+ }
+
+ @Test
+ public void shouldNotFilterLogEventWithNullMessage() {
+ // given
+ Message message = mockMessage(null);
+ LogEvent event = Mockito.mock(LogEvent.class);
+ when(event.getMessage()).thenReturn(message);
+
+ // when
+ Result result = log4JFilter.filter(event);
+
+ // then
+ assertThat(result, equalTo(Result.NEUTRAL));
+ }
+
+ @Test
+ public void shouldNotFilterWhenLogEventIsNull() {
+ // given / when
+ Result result = log4JFilter.filter(null);
+
+ // then
+ assertThat(result, equalTo(Result.NEUTRAL));
+ }
+
+ // ----------
+ // Test filter(Logger, Level, Marker, String, Object...)
+ // ----------
+ @Test
+ public void shouldFilterSensitiveStringMessage() {
+ // given / when
+ Result result = log4JFilter.filter(null, null, null, SENSITIVE_COMMAND, new Object[0]);
+
+ // then
+ assertThat(result, equalTo(Result.DENY));
+ }
+
+ @Test
+ public void shouldNotFilterNormalStringMessage() {
+ // given / when
+ Result result = log4JFilter.filter(null, null, null, NORMAL_COMMAND, new Object[0]);
+
+ // then
+ assertThat(result, equalTo(Result.NEUTRAL));
+ }
+
+ @Test
+ public void shouldReturnNeutralForNullMessage() {
+ // given / when
+ Result result = log4JFilter.filter(null, null, null, null, new Object[0]);
+
+ // then
+ assertThat(result, equalTo(Result.NEUTRAL));
+ }
+
+ // --------
+ // Test filter(Logger, Level, Marker, Object, Throwable)
+ // --------
+ @Test
+ public void shouldFilterSensitiveObjectMessage() {
+ // given / when
+ Result result = log4JFilter.filter(null, null, null, SENSITIVE_COMMAND, new Exception());
+
+ // then
+ assertThat(result, equalTo(Result.DENY));
+ }
+
+ @Test
+ public void shouldNotFilterNullObjectParam() {
+ // given / when
+ Result result = log4JFilter.filter(null, null, null, null, new Exception());
+
+ // then
+ assertThat(result, equalTo(Result.NEUTRAL));
+ }
+
+ @Test
+ public void shouldNotFilterIrrelevantMessage() {
+ // given / when
+ Result result = log4JFilter.filter(null, null, null, OTHER_COMMAND, new Exception());
+
+ // then
+ assertThat(result, equalTo(Result.NEUTRAL));
+ }
+
+ // --------
+ // Test filter(Logger, Level, Marker, Message, Throwable)
+ // --------
+ @Test
+ public void shouldFilterSensitiveMessage() {
+ // given
+ Message message = mockMessage(SENSITIVE_COMMAND);
+
+ // when
+ Result result = log4JFilter.filter(null, null, null, message, new Exception());
+
+ // then
+ assertThat(result, equalTo(Result.DENY));
+ }
+
+ @Test
+ public void shouldNotFilterNonSensitiveMessage() {
+ // given
+ Message message = mockMessage(NORMAL_COMMAND);
+
+ // when
+ Result result = log4JFilter.filter(null, null, null, message, new Exception());
+
+ // then
+ assertThat(result, equalTo(Result.NEUTRAL));
+ }
+
+ @Test
+ public void shouldNotFilterNullMessage() {
+ // given / when
+ Result result = log4JFilter.filter(null, null, null, null, new Exception());
+
+ // then
+ assertThat(result, equalTo(Result.NEUTRAL));
+ }
+
+ /**
+ * Mocks a {@link Message} object and makes it return the given formatted message.
+ *
+ * @param formattedMessage the formatted message the mock should return
+ * @return Message mock
+ */
+ private static Message mockMessage(String formattedMessage) {
+ Message message = Mockito.mock(Message.class);
+ when(message.getFormattedMessage()).thenReturn(formattedMessage);
+ return message;
+ }
+
+}