JAMES-2262 Ensure MockSpamD binds a random port Without being vulnerable to race conditions.
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/1ef7dafc Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/1ef7dafc Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/1ef7dafc Branch: refs/heads/master Commit: 1ef7dafcd1e17b6e64c3c8649ccb111e202eb4ef Parents: 03b2633 Author: benwa <btell...@linagora.com> Authored: Mon Dec 18 08:30:10 2017 +0700 Committer: benwa <btell...@linagora.com> Committed: Mon Dec 25 11:24:28 2017 +0700 ---------------------------------------------------------------------- .../transport/mailets/SpamAssassinTest.java | 19 +++++++++--------- .../smtpserver/SpamAssassinHandlerTest.java | 21 ++++++++------------ .../james/smtpserver/mock/util/MockSpamd.java | 20 ++++++++++++++++--- 3 files changed, 34 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/1ef7dafc/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java ---------------------------------------------------------------------- diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java index e49d981..82279c0 100644 --- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java +++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/SpamAssassinTest.java @@ -24,7 +24,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import javax.mail.MessagingException; -import org.apache.james.protocols.lib.PortUtil; import org.apache.james.smtpserver.mock.util.MockSpamd; import org.apache.james.util.scanner.SpamAssassinInvoker; import org.apache.mailet.Mail; @@ -130,13 +129,13 @@ public class SpamAssassinTest { @Test public void serviceShouldWriteSpamAttributeOnMail() throws Exception { - int port = PortUtil.getNonPrivilegedPort(); - new Thread(new MockSpamd(port)).start(); + MockSpamd spamd = new MockSpamd(); + new Thread(spamd).start(); FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder() .mailetName("SpamAssassin") .setProperty(SpamAssassin.SPAMD_HOST, "localhost") - .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(port)) + .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(spamd.getPort())) .build(); mailet.init(mailetConfiguration); @@ -157,13 +156,13 @@ public class SpamAssassinTest { @Test public void serviceShouldWriteMessageAsNotSpamWhenNotSpam() throws Exception { - int port = PortUtil.getNonPrivilegedPort(); - new Thread(new MockSpamd(port)).start(); + MockSpamd spamd = new MockSpamd(); + new Thread(spamd).start(); FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder() .mailetName("SpamAssassin") .setProperty(SpamAssassin.SPAMD_HOST, "localhost") - .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(port)) + .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(spamd.getPort())) .build(); mailet.init(mailetConfiguration); @@ -183,13 +182,13 @@ public class SpamAssassinTest { @Test public void serviceShouldWriteMessageAsSpamWhenSpam() throws Exception { - int port = PortUtil.getNonPrivilegedPort(); - new Thread(new MockSpamd(port)).start(); + MockSpamd spamd = new MockSpamd(); + new Thread(spamd).start(); FakeMailetConfig mailetConfiguration = FakeMailetConfig.builder() .mailetName("SpamAssassin") .setProperty(SpamAssassin.SPAMD_HOST, "localhost") - .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(port)) + .setProperty(SpamAssassin.SPAMD_PORT, String.valueOf(spamd.getPort())) .build(); mailet.init(mailetConfiguration); http://git-wip-us.apache.org/repos/asf/james-project/blob/1ef7dafc/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java index d9c7dea..bc94b6a 100644 --- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java +++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/SpamAssassinHandlerTest.java @@ -27,7 +27,6 @@ import java.util.HashMap; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; -import org.apache.james.protocols.lib.PortUtil; import org.apache.james.protocols.smtp.SMTPSession; import org.apache.james.protocols.smtp.hook.HookResult; import org.apache.james.protocols.smtp.hook.HookReturnCode; @@ -108,9 +107,7 @@ public class SpamAssassinHandlerTest { @Test public void testNonSpam() throws IOException, MessagingException { - - int port = PortUtil.getNonPrivilegedPort(); - MockSpamd spamd = new MockSpamd(port); + MockSpamd spamd = new MockSpamd(); new Thread(spamd).start(); SMTPSession session = setupMockedSMTPSession(setupMockedMail(setupMockedMimeMessage("test"))); @@ -118,7 +115,7 @@ public class SpamAssassinHandlerTest { SpamAssassinHandler handler = new SpamAssassinHandler(); handler.setSpamdHost(SPAMD_HOST); - handler.setSpamdPort(port); + handler.setSpamdPort(spamd.getPort()); handler.setSpamdRejectionHits(200.0); HookResult response = handler.onMessage(session, mockedMail); @@ -130,16 +127,15 @@ public class SpamAssassinHandlerTest { @Test public void testSpam() throws IOException, MessagingException { - - int port = PortUtil.getNonPrivilegedPort(); - new Thread(new MockSpamd(port)).start(); + MockSpamd spamd = new MockSpamd(); + new Thread(spamd).start(); SMTPSession session = setupMockedSMTPSession(setupMockedMail(setupMockedMimeMessage(MockSpamd.GTUBE))); SpamAssassinHandler handler = new SpamAssassinHandler(); handler.setSpamdHost(SPAMD_HOST); - handler.setSpamdPort(port); + handler.setSpamdPort(spamd.getPort()); handler.setSpamdRejectionHits(2000.0); HookResult response = handler.onMessage(session, mockedMail); @@ -150,16 +146,15 @@ public class SpamAssassinHandlerTest { @Test public void testSpamReject() throws IOException, MessagingException { - - int port = PortUtil.getNonPrivilegedPort(); - new Thread(new MockSpamd(port)).start(); + MockSpamd spamd = new MockSpamd(); + new Thread(spamd).start(); SMTPSession session = setupMockedSMTPSession(setupMockedMail(setupMockedMimeMessage(MockSpamd.GTUBE))); SpamAssassinHandler handler = new SpamAssassinHandler(); handler.setSpamdHost(SPAMD_HOST); - handler.setSpamdPort(port); + handler.setSpamdPort(spamd.getPort()); handler.setSpamdRejectionHits(200.0); HookResult response = handler.onMessage(session, mockedMail); http://git-wip-us.apache.org/repos/asf/james-project/blob/1ef7dafc/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java ---------------------------------------------------------------------- diff --git a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java index a0ff6f9..45f6920 100644 --- a/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java +++ b/server/protocols/protocols-smtp/src/test/java/org/apache/james/smtpserver/mock/util/MockSpamd.java @@ -27,6 +27,8 @@ import java.net.Socket; import org.apache.commons.io.IOUtils; +import com.google.common.base.Preconditions; + /** * This class can be used to run a mocked SPAMD daemon */ @@ -42,6 +44,7 @@ public class MockSpamd implements Runnable { private OutputStream out; private Socket spamd; private ServerSocket socket; + private boolean isBinded; /** @@ -49,15 +52,26 @@ public class MockSpamd implements Runnable { * * @throws IOException */ - public MockSpamd(int port) throws IOException { - socket = new ServerSocket(port); + public MockSpamd() { + isBinded = false; + } + + public int getPort() { + Preconditions.checkState(isBinded, "SpamD mock server is not binded"); + return socket.getLocalPort(); } - + + public void bind() throws IOException { + socket = new ServerSocket(0); + isBinded = true; + } + /** * @see java.lang.Runnable#run() */ @Override public void run() { + try { boolean spam = false; --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org