You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2019/05/31 23:06:55 UTC

[activemq-artemis] 01/03: NO-JIRA Adding checking for leaking server socket

This is an automated email from the ASF dual-hosted git repository.

clebertsuconic pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git

commit b7047faea5f5fd309c71bcdcc7beedb75d6f32eb
Author: Clebert Suconic <cl...@apache.org>
AuthorDate: Fri May 31 13:45:15 2019 -0400

    NO-JIRA Adding checking for leaking server socket
---
 .../activemq/artemis/utils/PortCheckRule.java      | 74 ++++++++++++++++++++++
 .../artemis/tests/util/ActiveMQTestBase.java       | 30 ++-------
 .../cluster/distribution/ClusterTestBase.java      |  9 +--
 tests/jms-tests/pom.xml                            |  7 ++
 .../remoting/impl/netty/NettyAcceptorTest.java     | 21 +++---
 5 files changed, 101 insertions(+), 40 deletions(-)

diff --git a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/PortCheckRule.java b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/PortCheckRule.java
new file mode 100644
index 0000000..6a3bab6
--- /dev/null
+++ b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/PortCheckRule.java
@@ -0,0 +1,74 @@
+/**
+ * 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.activemq.artemis.utils;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+
+import org.junit.Assert;
+import org.junit.rules.TestWatcher;
+import org.junit.runner.Description;
+
+/**
+ * This will make sure any properties changed through tests are cleaned up between tests.
+ */
+public class PortCheckRule extends TestWatcher {
+
+   final int[] port;
+
+   public PortCheckRule(int... port) {
+      this.port = port;
+   }
+
+   @Override
+   protected void starting(Description description) {
+      for (int p : port) {
+         if (!checkAvailable(p)) {
+            Assert.fail("a previous test is using port " + p + " on " + description);
+         }
+      }
+   }
+
+   @Override
+   protected void finished(Description description) {
+      for (int p : port) {
+         if (!checkAvailable(p)) {
+            Assert.fail(description + " has left a server socket open on port " + p);
+         }
+      }
+   }
+
+   public static boolean checkAvailable(int port) {
+      ServerSocket s = null;
+      try {
+         s = new ServerSocket();
+         s.bind(new InetSocketAddress("localhost", 61616));
+         return true;
+      } catch (IOException e) {
+         e.printStackTrace();
+         return false;
+      } finally {
+         try {
+            s.close();
+         } catch (Throwable ignored) {
+         }
+      }
+   }
+
+}
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java b/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java
index 8f7880b..dc5c6cb 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java
@@ -36,7 +36,6 @@ import java.io.ObjectOutputStream;
 import java.io.OutputStream;
 import java.lang.management.ManagementFactory;
 import java.lang.ref.WeakReference;
-import java.net.ServerSocket;
 import java.sql.Connection;
 import java.sql.Driver;
 import java.sql.DriverManager;
@@ -139,6 +138,7 @@ import org.apache.activemq.artemis.utils.ActiveMQThreadFactory;
 import org.apache.activemq.artemis.utils.CleanupSystemPropertiesRule;
 import org.apache.activemq.artemis.utils.Env;
 import org.apache.activemq.artemis.utils.FileUtil;
+import org.apache.activemq.artemis.utils.PortCheckRule;
 import org.apache.activemq.artemis.utils.RandomUtil;
 import org.apache.activemq.artemis.utils.ThreadDumpUtil;
 import org.apache.activemq.artemis.utils.ThreadLeakCheckRule;
@@ -148,6 +148,7 @@ import org.jboss.logging.Logger;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestName;
@@ -167,13 +168,16 @@ public abstract class ActiveMQTestBase extends Assert {
    private static final Logger logger = Logger.getLogger(ActiveMQTestBase.class);
 
    /** This will make sure threads are not leaking between tests */
-   @Rule
-   public ThreadLeakCheckRule leakCheckRule = new ThreadLeakCheckRule();
+   @ClassRule
+   public static ThreadLeakCheckRule leakCheckRule = new ThreadLeakCheckRule();
 
    /** This will cleanup any system property changed inside tests */
    @Rule
    public CleanupSystemPropertiesRule propertiesRule = new CleanupSystemPropertiesRule();
 
+   @ClassRule
+   public static PortCheckRule portCheckRule = new PortCheckRule(61616);
+
    public static final String TARGET_TMP = "./target/tmp";
    public static final String INVM_ACCEPTOR_FACTORY = InVMAcceptorFactory.class.getCanonicalName();
    public static final String INVM_CONNECTOR_FACTORY = InVMConnectorFactory.class.getCanonicalName();
@@ -365,8 +369,6 @@ public abstract class ActiveMQTestBase extends Assert {
       OperationContextImpl.clearContext();
 
       InVMRegistry.instance.clear();
-
-      // checkFreePort(TransportConstants.DEFAULT_PORT);
    }
 
    public static void assertEqualsByteArrays(final byte[] expected, final byte[] actual) {
@@ -794,24 +796,6 @@ public abstract class ActiveMQTestBase extends Assert {
       return connectors;
    }
 
-   protected static final void checkFreePort(final int... ports) {
-      for (int port : ports) {
-         ServerSocket ssocket = null;
-         try {
-            ssocket = new ServerSocket(port);
-         } catch (Exception e) {
-            throw new IllegalStateException("port " + port + " is bound", e);
-         } finally {
-            if (ssocket != null) {
-               try {
-                  ssocket.close();
-               } catch (IOException e) {
-               }
-            }
-         }
-      }
-   }
-
    /**
     * @return the testDir
     */
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterTestBase.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterTestBase.java
index af041fc..15b96db 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterTestBase.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterTestBase.java
@@ -86,9 +86,11 @@ import org.apache.activemq.artemis.core.server.impl.AddressInfo;
 import org.apache.activemq.artemis.core.server.impl.InVMNodeManager;
 import org.apache.activemq.artemis.tests.integration.IntegrationTestLogger;
 import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
+import org.apache.activemq.artemis.utils.PortCheckRule;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
+import org.junit.ClassRule;
 
 public abstract class ClusterTestBase extends ActiveMQTestBase {
 
@@ -96,6 +98,9 @@ public abstract class ClusterTestBase extends ActiveMQTestBase {
 
    private static final int[] PORTS = {TransportConstants.DEFAULT_PORT, TransportConstants.DEFAULT_PORT + 1, TransportConstants.DEFAULT_PORT + 2, TransportConstants.DEFAULT_PORT + 3, TransportConstants.DEFAULT_PORT + 4, TransportConstants.DEFAULT_PORT + 5, TransportConstants.DEFAULT_PORT + 6, TransportConstants.DEFAULT_PORT + 7, TransportConstants.DEFAULT_PORT + 8, TransportConstants.DEFAULT_PORT + 9,};
 
+   @ClassRule
+   public static PortCheckRule rule = new PortCheckRule(PORTS);
+
    protected int getLargeMessageSize() {
       return 500;
    }
@@ -131,8 +136,6 @@ public abstract class ClusterTestBase extends ActiveMQTestBase {
 
       forceGC();
 
-      ActiveMQTestBase.checkFreePort(ClusterTestBase.PORTS);
-
       consumers = new ConsumerHolder[ClusterTestBase.MAX_CONSUMERS];
 
       servers = new ActiveMQServer[ClusterTestBase.MAX_SERVERS];
@@ -175,8 +178,6 @@ public abstract class ClusterTestBase extends ActiveMQTestBase {
 
       super.tearDown();
 
-      ActiveMQTestBase.checkFreePort(ClusterTestBase.PORTS);
-
    }
 
    // Private -------------------------------------------------------------------------------------------------------
diff --git a/tests/jms-tests/pom.xml b/tests/jms-tests/pom.xml
index 3f69947..3d5c821 100644
--- a/tests/jms-tests/pom.xml
+++ b/tests/jms-tests/pom.xml
@@ -41,6 +41,13 @@
       </dependency>
       <dependency>
          <groupId>org.apache.activemq</groupId>
+         <artifactId>artemis-commons</artifactId>
+         <version>${project.version}</version>
+         <scope>test</scope>
+         <type>test-jar</type>
+      </dependency>
+      <dependency>
+         <groupId>org.apache.activemq</groupId>
          <artifactId>artemis-core-client</artifactId>
          <version>${project.version}</version>
       </dependency>
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/remoting/impl/netty/NettyAcceptorTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/remoting/impl/netty/NettyAcceptorTest.java
index 6206bf9..2ab990d 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/remoting/impl/netty/NettyAcceptorTest.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/remoting/impl/netty/NettyAcceptorTest.java
@@ -34,6 +34,7 @@ import org.apache.activemq.artemis.spi.core.remoting.Connection;
 import org.apache.activemq.artemis.spi.core.remoting.ServerConnectionLifeCycleListener;
 import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
 import org.apache.activemq.artemis.utils.ActiveMQThreadFactory;
+import org.apache.activemq.artemis.utils.PortCheckRule;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -48,24 +49,18 @@ public class NettyAcceptorTest extends ActiveMQTestBase {
    @Before
    public void setUp() throws Exception {
       super.setUp();
-
-      ActiveMQTestBase.checkFreePort(TransportConstants.DEFAULT_PORT);
    }
 
    @Override
    @After
    public void tearDown() throws Exception {
-      try {
-         ActiveMQTestBase.checkFreePort(TransportConstants.DEFAULT_PORT);
-      } finally {
+      if (pool3 != null)
+         pool3.shutdown();
 
-         if (pool3 != null)
-            pool3.shutdown();
+      if (pool2 != null)
+         pool2.shutdownNow();
 
-         if (pool2 != null)
-            pool2.shutdownNow();
-         super.tearDown();
-      }
+      super.tearDown();
    }
 
    @Test
@@ -107,13 +102,13 @@ public class NettyAcceptorTest extends ActiveMQTestBase {
       Assert.assertTrue(acceptor.isStarted());
       acceptor.stop();
       Assert.assertFalse(acceptor.isStarted());
-      ActiveMQTestBase.checkFreePort(TransportConstants.DEFAULT_PORT);
+      Assert.assertTrue(PortCheckRule.checkAvailable(TransportConstants.DEFAULT_PORT));
 
       acceptor.start();
       Assert.assertTrue(acceptor.isStarted());
       acceptor.stop();
       Assert.assertFalse(acceptor.isStarted());
-      ActiveMQTestBase.checkFreePort(TransportConstants.DEFAULT_PORT);
+      Assert.assertTrue(PortCheckRule.checkAvailable(TransportConstants.DEFAULT_PORT));
    }
 
 }