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

Reply via email to