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 2020/07/30 13:33:05 UTC

[activemq-artemis] branch master updated (48feb0d -> e048328)

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

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


    from 48feb0d  This closes #3225
     new 3d86d78  ARTEMIS-2587 Exposing ActiveMQServer::isActivate through management at ActiveMQServerControl
     new c00b210  ARTEMIS-2858 DNS Tests on reconnects and backups
     new e048328  This closes #3227

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../apache/activemq/artemis/util/ServerUtil.java   |  71 +-
 .../activemq/artemis/utils}/network/NetUtil.java   |  27 +-
 .../artemis/utils}/network/NetUtilResource.java    |   2 +-
 .../api/core/management/ActiveMQServerControl.java |   4 +
 .../management/impl/ActiveMQServerControlImpl.java |  15 +
 .../artemis/tests/util/ActiveMQTestBase.java       |  17 +-
 .../failover/NetworkFailureFailoverTest.java       |   4 +-
 .../management/ActiveMQServerControlTest.java      |   1 +
 .../ActiveMQServerControlUsingCoreTest.java        |   5 +
 tests/smoke-tests/pom.xml                          |  91 +++
 .../broker.xml                                     |  14 +-
 .../management.xml                                 |   0
 .../broker.xml                                     |  14 +-
 .../management.xml                                 |   0
 .../broker.xml                                     |  14 +-
 .../management.xml                                 |   0
 .../servers/{mqtt => dnsswitch}/broker.xml         |  19 +-
 .../servers/{mqtt => dnsswitch2}/broker.xml        |  19 +-
 .../artemis/tests/smoke/common/SmokeTestBase.java  |   6 +
 .../tests/smoke/dnsswitch/DNSSwitchTest.java       | 837 +++++++++++++++++++++
 20 files changed, 1057 insertions(+), 103 deletions(-)
 rename {tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/util => artemis-commons/src/test/java/org/apache/activemq/artemis/utils}/network/NetUtil.java (90%)
 rename {tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/util => artemis-commons/src/test/java/org/apache/activemq/artemis/utils}/network/NetUtilResource.java (94%)
 copy tests/smoke-tests/src/main/resources/servers/{replicated-failback-slave1 => dnsswitch-replicated-backup}/broker.xml (90%)
 copy tests/smoke-tests/src/main/resources/servers/{replicated-failback-master2 => dnsswitch-replicated-backup}/management.xml (100%)
 copy tests/smoke-tests/src/main/resources/servers/{replicated-failback-master1 => dnsswitch-replicated-main-noretrydns}/broker.xml (90%)
 copy tests/smoke-tests/src/main/resources/servers/{replicated-failback-master1 => dnsswitch-replicated-main-noretrydns}/management.xml (100%)
 copy tests/smoke-tests/src/main/resources/servers/{replicated-failback-master1 => dnsswitch-replicated-main}/broker.xml (90%)
 copy tests/smoke-tests/src/main/resources/servers/{replicated-failback-master1 => dnsswitch-replicated-main}/management.xml (100%)
 copy tests/smoke-tests/src/main/resources/servers/{mqtt => dnsswitch}/broker.xml (84%)
 copy tests/smoke-tests/src/main/resources/servers/{mqtt => dnsswitch2}/broker.xml (84%)
 create mode 100644 tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/dnsswitch/DNSSwitchTest.java


[activemq-artemis] 03/03: This closes #3227

Posted by cl...@apache.org.
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 e048328226c4be97fdf8e3e394173b502dfb0068
Merge: 48feb0d c00b210
Author: Clebert Suconic <cl...@apache.org>
AuthorDate: Thu Jul 30 09:32:38 2020 -0400

    This closes #3227

 .../apache/activemq/artemis/util/ServerUtil.java   |  71 +-
 .../activemq/artemis/utils}/network/NetUtil.java   |  27 +-
 .../artemis/utils}/network/NetUtilResource.java    |   2 +-
 .../api/core/management/ActiveMQServerControl.java |   4 +
 .../management/impl/ActiveMQServerControlImpl.java |  15 +
 .../artemis/tests/util/ActiveMQTestBase.java       |  17 +-
 .../failover/NetworkFailureFailoverTest.java       |   4 +-
 .../management/ActiveMQServerControlTest.java      |   1 +
 .../ActiveMQServerControlUsingCoreTest.java        |   5 +
 tests/smoke-tests/pom.xml                          |  91 +++
 .../servers/dnsswitch-replicated-backup/broker.xml | 133 ++++
 .../dnsswitch-replicated-backup/management.xml     |  20 +
 .../broker.xml                                     | 133 ++++
 .../management.xml                                 |  20 +
 .../servers/dnsswitch-replicated-main/broker.xml   | 133 ++++
 .../dnsswitch-replicated-main/management.xml       |  20 +
 .../main/resources/servers/dnsswitch/broker.xml    | 182 +++++
 .../main/resources/servers/dnsswitch2/broker.xml   | 182 +++++
 .../artemis/tests/smoke/common/SmokeTestBase.java  |   6 +
 .../tests/smoke/dnsswitch/DNSSwitchTest.java       | 837 +++++++++++++++++++++
 20 files changed, 1863 insertions(+), 40 deletions(-)


[activemq-artemis] 01/03: ARTEMIS-2587 Exposing ActiveMQServer::isActivate through management at ActiveMQServerControl

Posted by cl...@apache.org.
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 3d86d78828a8d8230d9287f88fe4697b0e1d60c8
Author: Clebert Suconic <cl...@apache.org>
AuthorDate: Wed Jul 29 11:24:53 2020 -0400

    ARTEMIS-2587 Exposing ActiveMQServer::isActivate through management at ActiveMQServerControl
---
 .../api/core/management/ActiveMQServerControl.java        |  4 ++++
 .../core/management/impl/ActiveMQServerControlImpl.java   | 15 +++++++++++++++
 .../integration/management/ActiveMQServerControlTest.java |  1 +
 3 files changed, 20 insertions(+)

diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
index c1f6e1d..84a70ad 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ActiveMQServerControl.java
@@ -37,6 +37,10 @@ public interface ActiveMQServerControl {
    @Attribute(desc = "Server's version")
    String getVersion();
 
+
+   @Attribute(desc = "Server is active")
+   boolean isActive();
+
    /**
     * Returns the number of clients connected to this server.
     */
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
index 60cabff..8b608ac 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/ActiveMQServerControlImpl.java
@@ -208,6 +208,21 @@ public class ActiveMQServerControlImpl extends AbstractControl implements Active
    }
 
    @Override
+   public boolean isActive() {
+      if (AuditLogger.isEnabled()) {
+         AuditLogger.getVersion(this.server);
+      }
+      checkStarted();
+
+      clearIO();
+      try {
+         return server.isActive();
+      } finally {
+         blockOnIO();
+      }
+   }
+
+   @Override
    public boolean isBackup() {
       if (AuditLogger.isEnabled()) {
          AuditLogger.isBackup(this.server);
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
index e559b0f..9347cc2 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlTest.java
@@ -194,6 +194,7 @@ public class ActiveMQServerControlTest extends ManagementTestBase {
       Assert.assertEquals(conf.getJournalCompactMinFiles(), serverControl.getJournalCompactMinFiles());
       Assert.assertEquals(conf.getJournalCompactPercentage(), serverControl.getJournalCompactPercentage());
       Assert.assertEquals(conf.isPersistenceEnabled(), serverControl.isPersistenceEnabled());
+      Assert.assertTrue(serverControl.isActive());
    }
 
    @Test


[activemq-artemis] 02/03: ARTEMIS-2858 DNS Tests on reconnects and backups

Posted by cl...@apache.org.
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 c00b210629aeda71837f2233252d0e314cc49482
Author: Clebert Suconic <cl...@apache.org>
AuthorDate: Wed Jul 29 11:33:22 2020 -0400

    ARTEMIS-2858 DNS Tests on reconnects and backups
    
    There are no fixes as part of this test addition.  As I wrote this test as I was debugging DNS issues.
---
 .../apache/activemq/artemis/util/ServerUtil.java   |  71 +-
 .../activemq/artemis/utils}/network/NetUtil.java   |  27 +-
 .../artemis/utils}/network/NetUtilResource.java    |   2 +-
 .../artemis/tests/util/ActiveMQTestBase.java       |  17 +-
 .../failover/NetworkFailureFailoverTest.java       |   4 +-
 .../ActiveMQServerControlUsingCoreTest.java        |   5 +
 tests/smoke-tests/pom.xml                          |  91 +++
 .../servers/dnsswitch-replicated-backup/broker.xml | 133 ++++
 .../dnsswitch-replicated-backup/management.xml     |  20 +
 .../broker.xml                                     | 133 ++++
 .../management.xml                                 |  20 +
 .../servers/dnsswitch-replicated-main/broker.xml   | 133 ++++
 .../dnsswitch-replicated-main/management.xml       |  20 +
 .../main/resources/servers/dnsswitch/broker.xml    | 182 +++++
 .../main/resources/servers/dnsswitch2/broker.xml   | 182 +++++
 .../artemis/tests/smoke/common/SmokeTestBase.java  |   6 +
 .../tests/smoke/dnsswitch/DNSSwitchTest.java       | 837 +++++++++++++++++++++
 17 files changed, 1843 insertions(+), 40 deletions(-)

diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/util/ServerUtil.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/util/ServerUtil.java
index 087a1b1..7c8675b 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/util/ServerUtil.java
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/util/ServerUtil.java
@@ -48,41 +48,62 @@ public class ServerUtil {
     * @throws Exception
     */
    public static Process startServer(String artemisInstance, String serverName, int id, int timeout) throws Exception {
-      boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().trim().startsWith("win");
+      final Process process = internalStartServer(artemisInstance, serverName);
 
-      ProcessBuilder builder = null;
-      if (IS_WINDOWS) {
-         builder = new ProcessBuilder("cmd", "/c", "artemis.cmd", "run");
-      } else {
-         builder = new ProcessBuilder("./artemis", "run");
+      // wait for start
+      if (timeout != 0) {
+         waitForServerToStart(id, timeout);
       }
 
-      builder.directory(new File(artemisInstance + "/bin"));
-
-      final Process process = builder.start();
-      Runtime.getRuntime().addShutdownHook(new Thread() {
-         @Override
-         public void run() {
-            process.destroy();
-         }
-      });
-
-      ProcessLogger outputLogger = new ProcessLogger(true, process.getInputStream(), serverName, false);
-      outputLogger.start();
+      return process;
+   }
 
-      // Adding a reader to System.err, so the VM won't hang on a System.err.println as identified on this forum thread:
-      // http://www.jboss.org/index.html?module=bb&op=viewtopic&t=151815
-      ProcessLogger errorLogger = new ProcessLogger(true, process.getErrorStream(), serverName, true);
-      errorLogger.start();
+   public static Process startServer(String artemisInstance, String serverName, String uri, int timeout) throws Exception {
+      final Process process = internalStartServer(artemisInstance, serverName);
 
       // wait for start
       if (timeout != 0) {
-         waitForServerToStart(id, timeout);
+         waitForServerToStart(uri, timeout);
       }
 
       return process;
    }
 
+   private static Process internalStartServer(String artemisInstance,
+                                              String serverName) throws IOException, ClassNotFoundException {
+      try {
+         boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().trim().startsWith("win");
+
+         ProcessBuilder builder = null;
+         if (IS_WINDOWS) {
+            builder = new ProcessBuilder("cmd", "/c", "artemis.cmd", "run");
+         } else {
+            builder = new ProcessBuilder("./artemis", "run");
+         }
+
+         builder.directory(new File(artemisInstance + "/bin"));
+
+         final Process process = builder.start();
+         Runtime.getRuntime().addShutdownHook(new Thread() {
+            @Override
+            public void run() {
+               process.destroy();
+            }
+         });
+
+         ProcessLogger outputLogger = new ProcessLogger(true, process.getInputStream(), serverName, false);
+         outputLogger.start();
+
+         // Adding a reader to System.err, so the VM won't hang on a System.err.println as identified on this forum thread:
+         // http://www.jboss.org/index.html?module=bb&op=viewtopic&t=151815
+         ProcessLogger errorLogger = new ProcessLogger(true, process.getErrorStream(), serverName, true);
+         errorLogger.start();
+         return process;
+      } catch (IOException e) {
+         throw new IOException("Cannot start server at " + artemisInstance, e);
+      }
+   }
+
    public static boolean waitForServerToStart(int id, int timeout) throws InterruptedException {
       return waitForServerToStart("tcp://localhost:" + (61616 + id), timeout);
    }
@@ -119,7 +140,9 @@ public class ServerUtil {
             server.destroy();
          }
          server.waitFor();
-         Thread.sleep(1000);
+         if (!forcibly) {
+            Thread.sleep(1000);
+         }
       }
    }
 
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/util/network/NetUtil.java b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/network/NetUtil.java
similarity index 90%
rename from tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/util/network/NetUtil.java
rename to artemis-commons/src/test/java/org/apache/activemq/artemis/utils/network/NetUtil.java
index 124face..489d47b 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/util/network/NetUtil.java
+++ b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/network/NetUtil.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.tests.util.network;
+package org.apache.activemq.artemis.utils.network;
 
 import java.io.BufferedReader;
 import java.io.IOException;
@@ -100,7 +100,7 @@ public class NetUtil {
       while (iter.hasNext()) {
          Map.Entry<String, String> entry = (Map.Entry<String, String>) iter.next();
          try {
-            netDown(entry.getKey(), entry.getValue());
+            netDown(entry.getKey(), entry.getValue(), true);
          } catch (Exception e) {
             e.printStackTrace();
          }
@@ -125,20 +125,31 @@ public class NetUtil {
    }
 
    public static void netDown(String ip) throws Exception {
-      String device = networks.remove(ip);
-      Assert.assertNotNull("ip " + ip + "wasn't set up before", device);
-      netDown(ip, device);
+      netDown(ip, false);
+   }
+
 
+   public static void netDown(String ip, boolean force) throws Exception {
+      String device = networks.remove(ip);
+      if (!force) {
+         // in case the netDown is coming from a different VM (spawned tests)
+         Assert.assertNotNull("ip " + ip + "wasn't set up before", device);
+      }
+      netDown(ip, device, force);
    }
 
-   private static void netDown(String ip, String device) throws Exception {
+   private static void netDown(String ip, String device, boolean force) throws Exception {
       if (osUsed == OS.MAC) {
          if (runCommand("sudo", "-n", "ifconfig", "lo0", "-alias", ip) != 0) {
-            Assert.fail("Cannot sudo ifconfig for ip " + ip);
+            if (!force) {
+               Assert.fail("Cannot sudo ifconfig for ip " + ip);
+            }
          }
       } else if (osUsed == OS.LINUX) {
          if (runCommand("sudo", "-n", "ifconfig", device, "down") != 0) {
-            Assert.fail("Cannot sudo ifconfig for ip " + ip);
+            if (!force) {
+               Assert.fail("Cannot sudo ifconfig for ip " + ip);
+            }
          }
       } else {
          Assert.fail("OS not supported");
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/util/network/NetUtilResource.java b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/network/NetUtilResource.java
similarity index 94%
rename from tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/util/network/NetUtilResource.java
rename to artemis-commons/src/test/java/org/apache/activemq/artemis/utils/network/NetUtilResource.java
index 0f2abd9..b58f3f6 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/util/network/NetUtilResource.java
+++ b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/network/NetUtilResource.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.activemq.artemis.tests.util.network;
+package org.apache.activemq.artemis.utils.network;
 
 import org.junit.rules.ExternalResource;
 
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 981e38e..d1adf59 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
@@ -1127,24 +1127,22 @@ public abstract class ActiveMQTestBase extends Assert {
       assertFalse(store.isPaging());
    }
 
-   protected Topology waitForTopology(final ActiveMQServer server, final int nodes) throws Exception {
+   protected static Topology waitForTopology(final ActiveMQServer server, final int nodes) throws Exception {
       return waitForTopology(server, nodes, -1, WAIT_TIMEOUT);
    }
 
-   protected Topology waitForTopology(final ActiveMQServer server,
+   protected static Topology waitForTopology(final ActiveMQServer server,
                                       final int nodes,
                                       final int backups) throws Exception {
       return waitForTopology(server, nodes, backups, WAIT_TIMEOUT);
    }
 
-   protected Topology waitForTopology(final ActiveMQServer server,
+   protected static Topology waitForTopology(final ActiveMQServer server,
                                       final int liveNodes,
                                       final int backupNodes,
                                       final long timeout) throws Exception {
       logger.debug("waiting for " + liveNodes + " on the topology for server = " + server);
 
-      long start = System.currentTimeMillis();
-
       Set<ClusterConnection> ccs = server.getClusterManager().getClusterConnections();
 
       if (ccs.size() != 1) {
@@ -1153,6 +1151,15 @@ public abstract class ActiveMQTestBase extends Assert {
 
       Topology topology = server.getClusterManager().getDefaultConnection(null).getTopology();
 
+      return waitForTopology(topology, timeout, liveNodes, backupNodes);
+   }
+
+   protected static Topology waitForTopology(Topology topology,
+                                    long timeout,
+                                    int liveNodes,
+                                    int backupNodes) throws Exception {
+      final long start = System.currentTimeMillis();
+
       int liveNodesCount = 0;
 
       int backupNodesCount = 0;
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/NetworkFailureFailoverTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/NetworkFailureFailoverTest.java
index fc1f5bc..8bae6e8 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/NetworkFailureFailoverTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/failover/NetworkFailureFailoverTest.java
@@ -45,8 +45,8 @@ import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
 import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
 import org.apache.activemq.artemis.tests.util.Wait;
 import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
-import org.apache.activemq.artemis.tests.util.network.NetUtil;
-import org.apache.activemq.artemis.tests.util.network.NetUtilResource;
+import org.apache.activemq.artemis.utils.network.NetUtil;
+import org.apache.activemq.artemis.utils.network.NetUtilResource;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Rule;
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
index 4b8138b..95f0513 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ActiveMQServerControlUsingCoreTest.java
@@ -121,6 +121,11 @@ public class ActiveMQServerControlUsingCoreTest extends ActiveMQServerControlTes
          }
 
          @Override
+         public boolean isActive() {
+            return (Boolean) proxy.retrieveAttributeValue("active");
+         }
+
+         @Override
          public String createQueue(String address,
                                    String routingType,
                                    String name,
diff --git a/tests/smoke-tests/pom.xml b/tests/smoke-tests/pom.xml
index 604495b..ee0a5a9 100644
--- a/tests/smoke-tests/pom.xml
+++ b/tests/smoke-tests/pom.xml
@@ -221,6 +221,97 @@
                </execution>
                <execution>
                   <phase>test-compile</phase>
+                  <id>create-dnsswitch</id>
+                  <goals>
+                     <goal>create</goal>
+                  </goals>
+                  <configuration>
+                     <configuration>${basedir}/target/classes/servers/dnsswitch</configuration>
+                     <allowAnonymous>true</allowAnonymous>
+                     <user>admin</user>
+                     <password>admin</password>
+                     <instance>${basedir}/target/dnsswitch</instance>
+                  </configuration>
+               </execution>
+               <execution>
+                  <phase>test-compile</phase>
+                  <id>create-dnsswitch2</id>
+                  <goals>
+                     <goal>create</goal>
+                  </goals>
+                  <configuration>
+                     <configuration>${basedir}/target/classes/servers/dnsswitch2</configuration>
+                     <allowAnonymous>true</allowAnonymous>
+                     <user>admin</user>
+                     <password>admin</password>
+                     <instance>${basedir}/target/dnsswitch2</instance>
+                  </configuration>
+               </execution>
+               <execution>
+                  <phase>test-compile</phase>
+                  <id>create-dnsswitch-main</id>
+                  <goals>
+                     <goal>create</goal>
+                  </goals>
+                  <configuration>
+                     <configuration>${basedir}/target/classes/servers/dnsswitch-replicated-main</configuration>
+                     <allowAnonymous>true</allowAnonymous>
+                     <user>admin</user>
+                     <password>admin</password>
+                     <noWeb>true</noWeb>
+                     <instance>${basedir}/target/dnsswitch-replicated-main</instance>
+                     <args>
+                        <arg>--java-options</arg>
+                        <!-- notice these files are only available on dnsswitch, so this is not a copy and paste error
+                             where I really meant dnsswitch here -->
+                        <arg>-Djdk.net.hosts.file=${basedir}/target/dnsswitch/etc/hosts.conf -Djava.security.properties=${basedir}/target/dnsswitch/etc/zerocache.security -Djava.rmi.server.hostname=localhost</arg>
+                     </args>
+                  </configuration>
+               </execution>
+               <execution>
+                  <phase>test-compile</phase>
+                  <id>create-dnsswitch-main-noretrydns</id>
+                  <goals>
+                     <goal>create</goal>
+                  </goals>
+                  <configuration>
+                     <configuration>${basedir}/target/classes/servers/dnsswitch-replicated-main-noretrydns</configuration>
+                     <allowAnonymous>true</allowAnonymous>
+                     <user>admin</user>
+                     <password>admin</password>
+                     <noWeb>true</noWeb>
+                     <instance>${basedir}/target/dnsswitch-replicated-main-noretrydns</instance>
+                     <args>
+                        <arg>--java-options</arg>
+                        <!-- notice these files are only available on dnsswitch, so this is not a copy and paste error
+                             where I really meant dnsswitch here -->
+                        <arg>-Djdk.net.hosts.file=${basedir}/target/dnsswitch/etc/hosts.conf -Djava.security.properties=${basedir}/target/dnsswitch/etc/noretrydns.security -Djava.rmi.server.hostname=localhost</arg>
+                     </args>
+                  </configuration>
+               </execution>
+               <execution>
+                  <phase>test-compile</phase>
+                  <id>create-dnsswitch-backup</id>
+                  <goals>
+                     <goal>create</goal>
+                  </goals>
+                  <configuration>
+                     <configuration>${basedir}/target/classes/servers/dnsswitch-replicated-backup</configuration>
+                     <allowAnonymous>true</allowAnonymous>
+                     <user>admin</user>
+                     <password>admin</password>
+                     <noWeb>true</noWeb>
+                     <instance>${basedir}/target/dnsswitch-replicated-backup</instance>
+                     <args>
+                        <arg>--java-options</arg>
+                        <!-- notice these files are only available on dnsswitch, so this is not a copy and paste error
+                             where I really meant dnsswitch here -->
+                        <arg>-Djdk.net.hosts.file=${basedir}/target/dnsswitch/etc/hosts.conf -Djava.security.properties=${basedir}/target/dnsswitch/etc/zerocache.security -Djava.rmi.server.hostname=localhost</arg>
+                     </args>
+                  </configuration>
+               </execution>
+               <execution>
+                  <phase>test-compile</phase>
                   <id>create-maxConsumers</id>
                   <goals>
                      <goal>create</goal>
diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/broker.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/broker.xml
new file mode 100644
index 0000000..36a07a6
--- /dev/null
+++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/broker.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+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.
+--><configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq /schema/artemis-server.xsd">
+
+   <core xmlns="urn:activemq:core">
+
+      <name>backup</name>
+
+      <bindings-directory>./data/bindings</bindings-directory>
+
+      <journal-directory>./data/journal</journal-directory>
+
+      <large-messages-directory>./data/largemessages</large-messages-directory>
+
+      <paging-directory>./data/paging</paging-directory>
+
+      <ha-policy>
+         <replication>
+            <slave>
+               <group-name>a</group-name>
+               <allow-failback>true</allow-failback>
+            </slave>
+         </replication>
+      </ha-policy>
+
+      <connectors>
+         <!-- Connector used to be announced through cluster connections and notifications -->
+         <connector name="artemis">tcp://SECOND:61616</connector>
+         <connector name="main">tcp://FIRST:61616</connector>
+      </connectors>
+
+
+      <!-- Acceptors -->
+      <acceptors>
+         <acceptor name="artemis">tcp://SECOND:61616</acceptor>
+      </acceptors>
+
+      <cluster-user>admin</cluster-user>
+
+      <cluster-password>password</cluster-password>
+
+      <cluster-connections>
+         <cluster-connection name="my-cluster">
+            <connector-ref>artemis</connector-ref>
+            <message-load-balancing>OFF</message-load-balancing>
+            <max-hops>1</max-hops>
+            <static-connectors>
+               <connector-ref>main</connector-ref>
+            </static-connectors>
+         </cluster-connection>
+      </cluster-connections>
+
+      <!-- Other config -->
+
+      <security-settings>
+         <!--security for example queue-->
+         <security-setting match="#">
+            <permission type="createNonDurableQueue" roles="amq, guest"/>
+            <permission type="deleteNonDurableQueue" roles="amq, guest"/>
+            <permission type="createDurableQueue" roles="amq, guest"/>
+            <permission type="deleteDurableQueue" roles="amq, guest"/>
+            <permission type="createAddress" roles="amq, guest"/>
+            <permission type="deleteAddress" roles="amq, guest"/>
+            <permission type="consume" roles="amq, guest"/>
+            <permission type="browse" roles="amq, guest"/>
+            <permission type="send" roles="amq, guest"/>
+            <!-- we need this otherwise ./artemis data imp wouldn't work -->
+            <permission type="manage" roles="amq"/>
+         </security-setting>
+      </security-settings>
+
+      <address-settings>
+         <!-- if you define auto-create on certain queues, management has to be auto-create -->
+         <address-setting match="activemq.management#">
+            <dead-letter-address>DLQ</dead-letter-address>
+            <expiry-address>ExpiryQueue</expiry-address>
+            <redelivery-delay>0</redelivery-delay>
+            <!-- with -1 only the global-max-size is in use for limiting -->
+            <max-size-bytes>-1</max-size-bytes>
+            <message-counter-history-day-limit>10</message-counter-history-day-limit>
+            <address-full-policy>PAGE</address-full-policy>
+            <auto-create-queues>true</auto-create-queues>
+            <auto-create-addresses>true</auto-create-addresses>
+            <auto-create-jms-queues>true</auto-create-jms-queues>
+            <auto-create-jms-topics>true</auto-create-jms-topics>
+         </address-setting>
+         <!--default for catch all-->
+         <address-setting match="#">
+            <dead-letter-address>DLQ</dead-letter-address>
+            <expiry-address>ExpiryQueue</expiry-address>
+            <redelivery-delay>0</redelivery-delay>
+            <!-- with -1 only the global-max-size is in use for limiting -->
+            <max-size-bytes>10MB</max-size-bytes>
+            <page-size-bytes>1MB</page-size-bytes>
+
+            <message-counter-history-day-limit>10</message-counter-history-day-limit>
+            <address-full-policy>PAGE</address-full-policy>
+            <auto-create-queues>true</auto-create-queues>
+            <auto-create-addresses>true</auto-create-addresses>
+            <auto-create-jms-queues>true</auto-create-jms-queues>
+            <auto-create-jms-topics>true</auto-create-jms-topics>
+         </address-setting>
+      </address-settings>
+
+      <addresses>
+         <address name="exampleTopic">
+            <multicast>
+            </multicast>
+         </address>
+         <address name="exampleQueue">
+            <anycast>
+               <queue name="exampleQueue"/>
+            </anycast>
+         </address>
+      </addresses>
+   </core>
+</configuration>
diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/management.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/management.xml
new file mode 100644
index 0000000..14bbaf2
--- /dev/null
+++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-backup/management.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  ~ 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.
+  -->
+<management-context xmlns="http://activemq.org/schema">
+   <connector connector-port="10199" connector-host="localhost"/>
+</management-context>
\ No newline at end of file
diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/broker.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/broker.xml
new file mode 100644
index 0000000..bb5995e
--- /dev/null
+++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/broker.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+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.
+--><configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq /schema/artemis-server.xsd">
+
+   <core xmlns="urn:activemq:core">
+
+      <name>live</name>
+
+      <bindings-directory>./data/bindings</bindings-directory>
+
+      <journal-directory>./data/journal</journal-directory>
+
+      <large-messages-directory>./data/largemessages</large-messages-directory>
+
+      <paging-directory>./data/paging</paging-directory>
+
+      <ha-policy>
+         <replication>
+            <master>
+               <group-name>a</group-name>
+               <check-for-live-server>true</check-for-live-server>
+               <vote-on-replication-failure>true</vote-on-replication-failure>
+            </master>
+         </replication>
+      </ha-policy>
+
+      <connectors>
+         <!-- Connector used to be announced through cluster connections and notifications -->
+         <connector name="artemis">tcp://FIRST:61616</connector>
+         <connector name="backup">tcp://SECOND:61616</connector>
+      </connectors>
+
+      <!-- Acceptors -->
+      <acceptors>
+         <acceptor name="artemis">tcp://FIRST:61616</acceptor>
+      </acceptors>
+
+      <cluster-user>admin</cluster-user>
+
+      <cluster-password>password</cluster-password>
+
+      <cluster-connections>
+         <cluster-connection name="my-cluster">
+            <connector-ref>artemis</connector-ref>
+            <message-load-balancing>OFF</message-load-balancing>
+            <max-hops>1</max-hops>
+            <static-connectors>
+               <connector-ref>backup</connector-ref>
+            </static-connectors>
+         </cluster-connection>
+      </cluster-connections>
+
+      <!-- Other config -->
+
+      <security-settings>
+         <!--security for example queue-->
+         <security-setting match="#">
+            <permission type="createNonDurableQueue" roles="amq, guest"/>
+            <permission type="deleteNonDurableQueue" roles="amq, guest"/>
+            <permission type="createDurableQueue" roles="amq, guest"/>
+            <permission type="deleteDurableQueue" roles="amq, guest"/>
+            <permission type="createAddress" roles="amq, guest"/>
+            <permission type="deleteAddress" roles="amq, guest"/>
+            <permission type="consume" roles="amq, guest"/>
+            <permission type="browse" roles="amq, guest"/>
+            <permission type="send" roles="amq, guest"/>
+            <!-- we need this otherwise ./artemis data imp wouldn't work -->
+            <permission type="manage" roles="amq"/>
+         </security-setting>
+      </security-settings>
+
+      <address-settings>
+         <!-- if you define auto-create on certain queues, management has to be auto-create -->
+         <address-setting match="activemq.management#">
+            <dead-letter-address>DLQ</dead-letter-address>
+            <expiry-address>ExpiryQueue</expiry-address>
+            <redelivery-delay>0</redelivery-delay>
+            <!-- with -1 only the global-max-size is in use for limiting -->
+            <max-size-bytes>-1</max-size-bytes>
+            <message-counter-history-day-limit>10</message-counter-history-day-limit>
+            <address-full-policy>PAGE</address-full-policy>
+            <auto-create-queues>true</auto-create-queues>
+            <auto-create-addresses>true</auto-create-addresses>
+            <auto-create-jms-queues>true</auto-create-jms-queues>
+            <auto-create-jms-topics>true</auto-create-jms-topics>
+         </address-setting>
+         <!--default for catch all-->
+         <address-setting match="#">
+            <dead-letter-address>DLQ</dead-letter-address>
+            <expiry-address>ExpiryQueue</expiry-address>
+            <redelivery-delay>0</redelivery-delay>
+            <!-- with -1 only the global-max-size is in use for limiting -->
+            <max-size-bytes>10MB</max-size-bytes>
+            <page-size-bytes>1MB</page-size-bytes>
+
+            <message-counter-history-day-limit>10</message-counter-history-day-limit>
+            <address-full-policy>PAGE</address-full-policy>
+            <auto-create-queues>true</auto-create-queues>
+            <auto-create-addresses>true</auto-create-addresses>
+            <auto-create-jms-queues>true</auto-create-jms-queues>
+            <auto-create-jms-topics>true</auto-create-jms-topics>
+         </address-setting>
+      </address-settings>
+
+      <addresses>
+         <address name="exampleTopic">
+            <multicast>
+            </multicast>
+         </address>
+         <address name="exampleQueue">
+            <anycast>
+               <queue name="exampleQueue"/>
+            </anycast>
+         </address>
+      </addresses>
+   </core>
+</configuration>
diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/management.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/management.xml
new file mode 100644
index 0000000..576f1e5
--- /dev/null
+++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main-noretrydns/management.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  ~ 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.
+  -->
+<management-context xmlns="http://activemq.org/schema">
+   <connector connector-port="10099" connector-host="localhost"/>
+</management-context>
\ No newline at end of file
diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main/broker.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main/broker.xml
new file mode 100644
index 0000000..bb5995e
--- /dev/null
+++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main/broker.xml
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+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.
+--><configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq /schema/artemis-server.xsd">
+
+   <core xmlns="urn:activemq:core">
+
+      <name>live</name>
+
+      <bindings-directory>./data/bindings</bindings-directory>
+
+      <journal-directory>./data/journal</journal-directory>
+
+      <large-messages-directory>./data/largemessages</large-messages-directory>
+
+      <paging-directory>./data/paging</paging-directory>
+
+      <ha-policy>
+         <replication>
+            <master>
+               <group-name>a</group-name>
+               <check-for-live-server>true</check-for-live-server>
+               <vote-on-replication-failure>true</vote-on-replication-failure>
+            </master>
+         </replication>
+      </ha-policy>
+
+      <connectors>
+         <!-- Connector used to be announced through cluster connections and notifications -->
+         <connector name="artemis">tcp://FIRST:61616</connector>
+         <connector name="backup">tcp://SECOND:61616</connector>
+      </connectors>
+
+      <!-- Acceptors -->
+      <acceptors>
+         <acceptor name="artemis">tcp://FIRST:61616</acceptor>
+      </acceptors>
+
+      <cluster-user>admin</cluster-user>
+
+      <cluster-password>password</cluster-password>
+
+      <cluster-connections>
+         <cluster-connection name="my-cluster">
+            <connector-ref>artemis</connector-ref>
+            <message-load-balancing>OFF</message-load-balancing>
+            <max-hops>1</max-hops>
+            <static-connectors>
+               <connector-ref>backup</connector-ref>
+            </static-connectors>
+         </cluster-connection>
+      </cluster-connections>
+
+      <!-- Other config -->
+
+      <security-settings>
+         <!--security for example queue-->
+         <security-setting match="#">
+            <permission type="createNonDurableQueue" roles="amq, guest"/>
+            <permission type="deleteNonDurableQueue" roles="amq, guest"/>
+            <permission type="createDurableQueue" roles="amq, guest"/>
+            <permission type="deleteDurableQueue" roles="amq, guest"/>
+            <permission type="createAddress" roles="amq, guest"/>
+            <permission type="deleteAddress" roles="amq, guest"/>
+            <permission type="consume" roles="amq, guest"/>
+            <permission type="browse" roles="amq, guest"/>
+            <permission type="send" roles="amq, guest"/>
+            <!-- we need this otherwise ./artemis data imp wouldn't work -->
+            <permission type="manage" roles="amq"/>
+         </security-setting>
+      </security-settings>
+
+      <address-settings>
+         <!-- if you define auto-create on certain queues, management has to be auto-create -->
+         <address-setting match="activemq.management#">
+            <dead-letter-address>DLQ</dead-letter-address>
+            <expiry-address>ExpiryQueue</expiry-address>
+            <redelivery-delay>0</redelivery-delay>
+            <!-- with -1 only the global-max-size is in use for limiting -->
+            <max-size-bytes>-1</max-size-bytes>
+            <message-counter-history-day-limit>10</message-counter-history-day-limit>
+            <address-full-policy>PAGE</address-full-policy>
+            <auto-create-queues>true</auto-create-queues>
+            <auto-create-addresses>true</auto-create-addresses>
+            <auto-create-jms-queues>true</auto-create-jms-queues>
+            <auto-create-jms-topics>true</auto-create-jms-topics>
+         </address-setting>
+         <!--default for catch all-->
+         <address-setting match="#">
+            <dead-letter-address>DLQ</dead-letter-address>
+            <expiry-address>ExpiryQueue</expiry-address>
+            <redelivery-delay>0</redelivery-delay>
+            <!-- with -1 only the global-max-size is in use for limiting -->
+            <max-size-bytes>10MB</max-size-bytes>
+            <page-size-bytes>1MB</page-size-bytes>
+
+            <message-counter-history-day-limit>10</message-counter-history-day-limit>
+            <address-full-policy>PAGE</address-full-policy>
+            <auto-create-queues>true</auto-create-queues>
+            <auto-create-addresses>true</auto-create-addresses>
+            <auto-create-jms-queues>true</auto-create-jms-queues>
+            <auto-create-jms-topics>true</auto-create-jms-topics>
+         </address-setting>
+      </address-settings>
+
+      <addresses>
+         <address name="exampleTopic">
+            <multicast>
+            </multicast>
+         </address>
+         <address name="exampleQueue">
+            <anycast>
+               <queue name="exampleQueue"/>
+            </anycast>
+         </address>
+      </addresses>
+   </core>
+</configuration>
diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main/management.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main/management.xml
new file mode 100644
index 0000000..576f1e5
--- /dev/null
+++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch-replicated-main/management.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  ~ 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.
+  -->
+<management-context xmlns="http://activemq.org/schema">
+   <connector connector-port="10099" connector-host="localhost"/>
+</management-context>
\ No newline at end of file
diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch/broker.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch/broker.xml
new file mode 100644
index 0000000..de9a37e
--- /dev/null
+++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch/broker.xml
@@ -0,0 +1,182 @@
+<?xml version='1.0'?>
+<!--
+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.
+-->
+
+<configuration xmlns="urn:activemq"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="urn:activemq /schema/artemis-configuration.xsd">
+
+   <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="urn:activemq:core ">
+
+      <name>0.0.0.0</name>
+
+      <persistence-enabled>true</persistence-enabled>
+
+      <!-- this could be ASYNCIO, MAPPED, NIO
+           ASYNCIO: Linux Libaio
+           MAPPED: mmap files
+           NIO: Plain Java Files
+       -->
+      <journal-type>NIO</journal-type>
+
+      <paging-directory>./data/paging</paging-directory>
+
+      <bindings-directory>./data/bindings</bindings-directory>
+
+      <journal-directory>./data/journal</journal-directory>
+
+      <large-messages-directory>./data/large-messages</large-messages-directory>
+
+      <journal-datasync>true</journal-datasync>
+
+      <journal-min-files>2</journal-min-files>
+
+      <journal-pool-files>-1</journal-pool-files>
+
+      <journal-buffer-size>10485760</journal-buffer-size>
+
+      <!--
+        You can specify the NIC you want to use to verify if the network
+         <network-check-NIC>theNickName</network-check-NIC>
+        -->
+
+      <!--
+        Use this to use an HTTP server to validate the network
+         <network-check-URL-list>http://www.apache.org</network-check-URL-list> -->
+
+      <!-- <network-check-period>10000</network-check-period> -->
+      <!-- <network-check-timeout>1000</network-check-timeout> -->
+
+      <!-- this is a comma separated list, no spaces, just DNS or IPs
+           it should accept IPV6
+
+           Warning: Make sure you understand your network topology as this is meant to validate if your network is valid.
+                    Using IPs that could eventually disappear or be partially visible may defeat the purpose.
+                    You can use a list of multiple IPs, and if any successful ping will make the server OK to continue running -->
+      <!-- <network-check-list>10.0.0.1</network-check-list> -->
+
+      <!-- use this to customize the ping used for ipv4 addresses -->
+      <!-- <network-check-ping-command>ping -c 1 -t %d %s</network-check-ping-command> -->
+
+      <!-- use this to customize the ping used for ipv6 addresses -->
+      <!-- <network-check-ping6-command>ping6 -c 1 %2$s</network-check-ping6-command> -->
+
+
+
+      <!--
+       This value was determined through a calculation.
+       Your system could perform 0.15 writes per millisecond
+       on the current journal configuration.
+       That translates as a sync write every 6488000 nanoseconds
+      -->
+      <journal-buffer-timeout>6488000</journal-buffer-timeout>
+
+
+      <!-- how often we are looking for how many bytes are being used on the disk in ms -->
+      <disk-scan-period>5000</disk-scan-period>
+
+      <!-- once the disk hits this limit the system will block, or close the connection in certain protocols
+           that won't support flow control. -->
+      <max-disk-usage>90</max-disk-usage>
+
+      <!-- the system will enter into page mode once you hit this limit.
+           This is an estimate in bytes of how much the messages are using in memory
+
+            The system will use half of the available memory (-Xmx) by default for the global-max-size.
+            You may specify a different value here if you need to customize it to your needs.
+
+            <global-max-size>100Mb</global-max-size>
+
+      -->
+      <global-max-size>100Mb</global-max-size>
+
+      <acceptors>
+         <!-- Acceptor for every supported protocol -->
+         <acceptor name="artemis">tcp://192.0.2.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300</acceptor>
+
+      </acceptors>
+
+
+      <security-settings>
+         <security-setting match="#">
+            <permission type="createNonDurableQueue" roles="guest"/>
+            <permission type="deleteNonDurableQueue" roles="guest"/>
+            <permission type="createDurableQueue" roles="guest"/>
+            <permission type="deleteDurableQueue" roles="guest"/>
+            <permission type="createAddress" roles="guest"/>
+            <permission type="deleteAddress" roles="guest"/>
+            <permission type="consume" roles="guest"/>
+            <permission type="browse" roles="guest"/>
+            <permission type="send" roles="guest"/>
+            <!-- we need this otherwise ./artemis data imp wouldn't work -->
+            <permission type="manage" roles="guest"/>
+         </security-setting>
+      </security-settings>
+
+      <address-settings>
+         <!-- if you define auto-create on certain queues, management has to be auto-create -->
+         <address-setting match="activemq.management#">
+            <dead-letter-address>DLQ</dead-letter-address>
+            <expiry-address>ExpiryQueue</expiry-address>
+            <redelivery-delay>0</redelivery-delay>
+            <!-- with -1 only the global-max-size is in use for limiting -->
+            <!-- <max-size-bytes>-1</max-size-bytes> -->
+            <max-size-bytes>1M</max-size-bytes>
+            <page-size-bytes>50000</page-size-bytes>
+            <message-counter-history-day-limit>10</message-counter-history-day-limit>
+            <address-full-policy>PAGE</address-full-policy>
+            <auto-create-queues>true</auto-create-queues>
+            <auto-create-addresses>true</auto-create-addresses>
+            <auto-create-jms-queues>true</auto-create-jms-queues>
+            <auto-create-jms-topics>true</auto-create-jms-topics>
+         </address-setting>
+         <!--default for catch all-->
+         <address-setting match="#">
+            <dead-letter-address>DLQ</dead-letter-address>
+            <expiry-address>ExpiryQueue</expiry-address>
+            <redelivery-delay>0</redelivery-delay>
+            <!-- with -1 only the global-max-size is in use for limiting -->
+            <!-- <max-size-bytes>-1</max-size-bytes> -->
+            <page-size-bytes>50000</page-size-bytes>
+            <message-counter-history-day-limit>10</message-counter-history-day-limit>
+            <address-full-policy>PAGE</address-full-policy>
+            <auto-create-queues>true</auto-create-queues>
+            <auto-create-addresses>true</auto-create-addresses>
+            <auto-create-jms-queues>true</auto-create-jms-queues>
+            <auto-create-jms-topics>true</auto-create-jms-topics>
+         </address-setting>
+      </address-settings>
+
+      <addresses>
+         <address name="DLQ">
+            <anycast>
+               <queue name="DLQ" />
+            </anycast>
+         </address>
+         <address name="ExpiryQueue">
+            <anycast>
+               <queue name="ExpiryQueue" />
+            </anycast>
+         </address>
+
+      </addresses>
+
+   </core>
+</configuration>
diff --git a/tests/smoke-tests/src/main/resources/servers/dnsswitch2/broker.xml b/tests/smoke-tests/src/main/resources/servers/dnsswitch2/broker.xml
new file mode 100644
index 0000000..7dd8850
--- /dev/null
+++ b/tests/smoke-tests/src/main/resources/servers/dnsswitch2/broker.xml
@@ -0,0 +1,182 @@
+<?xml version='1.0'?>
+<!--
+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.
+-->
+
+<configuration xmlns="urn:activemq"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               xsi:schemaLocation="urn:activemq /schema/artemis-configuration.xsd">
+
+   <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="urn:activemq:core ">
+
+      <name>0.0.0.0</name>
+
+      <persistence-enabled>true</persistence-enabled>
+
+      <!-- this could be ASYNCIO, MAPPED, NIO
+           ASYNCIO: Linux Libaio
+           MAPPED: mmap files
+           NIO: Plain Java Files
+       -->
+      <journal-type>NIO</journal-type>
+
+      <paging-directory>./data/paging</paging-directory>
+
+      <bindings-directory>./data/bindings</bindings-directory>
+
+      <journal-directory>./data/journal</journal-directory>
+
+      <large-messages-directory>./data/large-messages</large-messages-directory>
+
+      <journal-datasync>true</journal-datasync>
+
+      <journal-min-files>2</journal-min-files>
+
+      <journal-pool-files>-1</journal-pool-files>
+
+      <journal-buffer-size>10485760</journal-buffer-size>
+
+      <!--
+        You can specify the NIC you want to use to verify if the network
+         <network-check-NIC>theNickName</network-check-NIC>
+        -->
+
+      <!--
+        Use this to use an HTTP server to validate the network
+         <network-check-URL-list>http://www.apache.org</network-check-URL-list> -->
+
+      <!-- <network-check-period>10000</network-check-period> -->
+      <!-- <network-check-timeout>1000</network-check-timeout> -->
+
+      <!-- this is a comma separated list, no spaces, just DNS or IPs
+           it should accept IPV6
+
+           Warning: Make sure you understand your network topology as this is meant to validate if your network is valid.
+                    Using IPs that could eventually disappear or be partially visible may defeat the purpose.
+                    You can use a list of multiple IPs, and if any successful ping will make the server OK to continue running -->
+      <!-- <network-check-list>10.0.0.1</network-check-list> -->
+
+      <!-- use this to customize the ping used for ipv4 addresses -->
+      <!-- <network-check-ping-command>ping -c 1 -t %d %s</network-check-ping-command> -->
+
+      <!-- use this to customize the ping used for ipv6 addresses -->
+      <!-- <network-check-ping6-command>ping6 -c 1 %2$s</network-check-ping6-command> -->
+
+
+
+      <!--
+       This value was determined through a calculation.
+       Your system could perform 0.15 writes per millisecond
+       on the current journal configuration.
+       That translates as a sync write every 6488000 nanoseconds
+      -->
+      <journal-buffer-timeout>6488000</journal-buffer-timeout>
+
+
+      <!-- how often we are looking for how many bytes are being used on the disk in ms -->
+      <disk-scan-period>5000</disk-scan-period>
+
+      <!-- once the disk hits this limit the system will block, or close the connection in certain protocols
+           that won't support flow control. -->
+      <max-disk-usage>90</max-disk-usage>
+
+      <!-- the system will enter into page mode once you hit this limit.
+           This is an estimate in bytes of how much the messages are using in memory
+
+            The system will use half of the available memory (-Xmx) by default for the global-max-size.
+            You may specify a different value here if you need to customize it to your needs.
+
+            <global-max-size>100Mb</global-max-size>
+
+      -->
+      <global-max-size>100Mb</global-max-size>
+
+      <acceptors>
+         <!-- Acceptor for every supported protocol -->
+         <acceptor name="artemis">tcp://192.0.3.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300</acceptor>
+
+      </acceptors>
+
+
+      <security-settings>
+         <security-setting match="#">
+            <permission type="createNonDurableQueue" roles="guest"/>
+            <permission type="deleteNonDurableQueue" roles="guest"/>
+            <permission type="createDurableQueue" roles="guest"/>
+            <permission type="deleteDurableQueue" roles="guest"/>
+            <permission type="createAddress" roles="guest"/>
+            <permission type="deleteAddress" roles="guest"/>
+            <permission type="consume" roles="guest"/>
+            <permission type="browse" roles="guest"/>
+            <permission type="send" roles="guest"/>
+            <!-- we need this otherwise ./artemis data imp wouldn't work -->
+            <permission type="manage" roles="guest"/>
+         </security-setting>
+      </security-settings>
+
+      <address-settings>
+         <!-- if you define auto-create on certain queues, management has to be auto-create -->
+         <address-setting match="activemq.management#">
+            <dead-letter-address>DLQ</dead-letter-address>
+            <expiry-address>ExpiryQueue</expiry-address>
+            <redelivery-delay>0</redelivery-delay>
+            <!-- with -1 only the global-max-size is in use for limiting -->
+            <!-- <max-size-bytes>-1</max-size-bytes> -->
+            <max-size-bytes>1M</max-size-bytes>
+            <page-size-bytes>50000</page-size-bytes>
+            <message-counter-history-day-limit>10</message-counter-history-day-limit>
+            <address-full-policy>PAGE</address-full-policy>
+            <auto-create-queues>true</auto-create-queues>
+            <auto-create-addresses>true</auto-create-addresses>
+            <auto-create-jms-queues>true</auto-create-jms-queues>
+            <auto-create-jms-topics>true</auto-create-jms-topics>
+         </address-setting>
+         <!--default for catch all-->
+         <address-setting match="#">
+            <dead-letter-address>DLQ</dead-letter-address>
+            <expiry-address>ExpiryQueue</expiry-address>
+            <redelivery-delay>0</redelivery-delay>
+            <!-- with -1 only the global-max-size is in use for limiting -->
+            <!-- <max-size-bytes>-1</max-size-bytes> -->
+            <page-size-bytes>50000</page-size-bytes>
+            <message-counter-history-day-limit>10</message-counter-history-day-limit>
+            <address-full-policy>PAGE</address-full-policy>
+            <auto-create-queues>true</auto-create-queues>
+            <auto-create-addresses>true</auto-create-addresses>
+            <auto-create-jms-queues>true</auto-create-jms-queues>
+            <auto-create-jms-topics>true</auto-create-jms-topics>
+         </address-setting>
+      </address-settings>
+
+      <addresses>
+         <address name="DLQ">
+            <anycast>
+               <queue name="DLQ" />
+            </anycast>
+         </address>
+         <address name="ExpiryQueue">
+            <anycast>
+               <queue name="ExpiryQueue" />
+            </anycast>
+         </address>
+
+      </addresses>
+
+   </core>
+</configuration>
diff --git a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/common/SmokeTestBase.java b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/common/SmokeTestBase.java
index e35ffa5..543de50 100644
--- a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/common/SmokeTestBase.java
+++ b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/common/SmokeTestBase.java
@@ -70,4 +70,10 @@ public class SmokeTestBase extends ActiveMQTestBase {
       return process;
    }
 
+   public Process startServer(String serverName, String uri, int timeout) throws Exception {
+      Process process = ServerUtil.startServer(getServerLocation(serverName), serverName, uri, timeout);
+      addProcess(process);
+      return process;
+   }
+
 }
diff --git a/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/dnsswitch/DNSSwitchTest.java b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/dnsswitch/DNSSwitchTest.java
new file mode 100644
index 0000000..31a76d0
--- /dev/null
+++ b/tests/smoke-tests/src/test/java/org/apache/activemq/artemis/tests/smoke/dnsswitch/DNSSwitchTest.java
@@ -0,0 +1,837 @@
+/*
+ * 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.tests.smoke.dnsswitch;
+
+import javax.jms.Connection;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.management.MBeanServerInvocationHandler;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.net.InetSocketAddress;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+import java.util.Properties;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
+import org.apache.activemq.artemis.api.core.management.ActiveMQServerControl;
+import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
+import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
+import org.apache.activemq.artemis.tests.smoke.common.SmokeTestBase;
+import org.apache.activemq.artemis.util.ServerUtil;
+import org.apache.activemq.artemis.utils.SpawnedVMSupport;
+import org.apache.activemq.artemis.utils.Wait;
+import org.apache.activemq.artemis.utils.network.NetUtil;
+import org.apache.activemq.artemis.utils.network.NetUtilResource;
+import org.jboss.logging.Logger;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Rule;
+import org.junit.Test;
+
+/**
+ * Validating connection retry scenarios where the DNS had changes
+ */
+public class DNSSwitchTest extends SmokeTestBase {
+
+   private static boolean USING_SPAWN = true;
+   public static final File ETC_HOSTS = new File("/etc/hosts");
+
+   private static File ETC_BACKUP;
+
+   private static final String JMX_SERVER_HOSTNAME = "localhost";
+   private static final int JMX_SERVER_PORT_0 = 10099;
+   private static final int JMX_SERVER_PORT_1 = 10199;
+
+   static String liveURI = "service:jmx:rmi:///jndi/rmi://" + JMX_SERVER_HOSTNAME + ":" + JMX_SERVER_PORT_0 + "/jmxrmi";
+   static String backupURI = "service:jmx:rmi:///jndi/rmi://" + JMX_SERVER_HOSTNAME + ":" + JMX_SERVER_PORT_1 + "/jmxrmi";
+
+   static ObjectNameBuilder liveNameBuilder = ObjectNameBuilder.create(ActiveMQDefaultConfiguration.getDefaultJmxDomain(), "live", true);
+   static ObjectNameBuilder backupNameBuilder = ObjectNameBuilder.create(ActiveMQDefaultConfiguration.getDefaultJmxDomain(), "backup", true);
+
+   // This is a more intrusive option to use with JDK 8
+   // Instead of using a separate jdk hsots, which is not supported on jdk8,
+   // with this option set to true we would use the original /etc/hosts
+   private static boolean USE_ETC_HOSTS = System.getProperty("java.version").startsWith("1.8");
+
+   private static final Logger logger = Logger.getLogger(DNSSwitchTest.class);
+
+   private static final String SERVER_NAME_0 = "dnsswitch";
+   private static final String SERVER_NAME_1 = "dnsswitch2";
+   private static final String SERVER_STANDARD = "standard";
+   private static final String SERVER_LIVE = "dnsswitch-replicated-main";
+   private static final String SERVER_LIVE_NORETRYDNS = "dnsswitch-replicated-main-noretrydns";
+   private static final String SERVER_BACKUP = "dnsswitch-replicated-backup";
+
+   // 192.0.2.0 is reserved for documentation (and testing on this case).
+   private static final String FIRST_IP = "192.0.2.0";
+   private static final String SECOND_IP = "192.0.3.0";
+   private static final String THIRD_IP = "192.0.3.0";
+   private static final String FOURTH_IP = "192.0.4.0";
+
+   private static String serverLocation;
+
+   @Rule
+   public NetUtilResource netUtilResource = new NetUtilResource();
+
+   private static JMXConnector newJMXFactory(String uri) throws Throwable {
+      return JMXConnectorFactory.connect(new JMXServiceURL(uri));
+   }
+
+   private static ActiveMQServerControl getServerControl(String uri,
+                                                         ObjectNameBuilder builder,
+                                                         long timeout) throws Throwable {
+      long expireLoop = System.currentTimeMillis() + timeout;
+      Throwable lastException = null;
+      do {
+         try {
+            JMXConnector connector = newJMXFactory(uri);
+
+            ActiveMQServerControl serverControl = MBeanServerInvocationHandler.newProxyInstance(connector.getMBeanServerConnection(), builder.getActiveMQServerObjectName(), ActiveMQServerControl.class, false);
+            serverControl.isActive(); // making one call to make sure it's working
+            return serverControl;
+         } catch (Throwable e) {
+            System.err.println("Retrying error : " + e.getMessage());
+            lastException = e;
+            Thread.sleep(500);
+         }
+      }
+      while (expireLoop > System.currentTimeMillis());
+
+      throw lastException;
+   }
+
+   @BeforeClass
+   public static void beforeClassMethod() throws Exception {
+      serverLocation = getServerLocation(SERVER_NAME_0);
+      // Before anything we must copy the jave security and change what we need for no cache
+      // this will be used to spawn new tests
+      generateNoCacheSecurity(serverLocation);
+      generateNoRetrySecurity(serverLocation);
+      if (USE_ETC_HOSTS) {
+         Assert.assertTrue("If you want to run this test, you must do 'sudo chmod 666 " + ETC_HOSTS + "'", ETC_HOSTS.canWrite());
+         File tmpDirectory = new File(System.getProperty("java.io.tmpdir"));
+         ETC_BACKUP = new File(tmpDirectory, "etcHostsBackup");
+
+         if (!ETC_BACKUP.exists()) {
+            Files.copy(ETC_HOSTS.toPath(), ETC_BACKUP.toPath(), StandardCopyOption.COPY_ATTRIBUTES);
+         }
+      }
+      NetUtil.failIfNotSudo();
+   }
+
+   private static File getETCBackup() {
+
+      if (ETC_BACKUP == null) {
+         File tmpDirectory = new File(System.getProperty("java.io.tmpdir"));
+         ETC_BACKUP = new File(tmpDirectory, "etcHostsBackup");
+      }
+
+      Assert.assertTrue(ETC_BACKUP.exists());
+
+      return ETC_BACKUP;
+   }
+
+   @AfterClass
+   public static void afterClassMethod() throws Exception {
+
+      if (USE_ETC_HOSTS && ETC_BACKUP != null) {
+         Assert.assertTrue(ETC_BACKUP.exists());
+         try {
+            recoverETCHosts();
+         } finally {
+            ETC_BACKUP.delete();
+            ETC_BACKUP = null;
+         }
+
+      }
+
+   }
+
+   private static void recoverETCHosts() throws IOException {
+      // it seems silly to use a FileInputStream / FileOutputStream to copy
+      // a file these days, but on this case we have authorization to write on the file
+      // but not to replace the file in any way.
+      // So, Files.copy is not acceptable.
+      // I could use a library that was doing the same here
+      // but I didn't bother about it and simply went to the simplest way possible
+      FileInputStream inputStream = new FileInputStream(getETCBackup());
+      FileOutputStream outputStream = new FileOutputStream(ETC_HOSTS);
+      byte[] buffer = new byte[4 * 1024];
+      int bytes;
+      try {
+         while ((bytes = inputStream.read(buffer)) > 0) {
+            outputStream.write(buffer, 0, bytes);
+         }
+      } finally {
+         inputStream.close();
+         outputStream.close();
+      }
+   }
+
+   private static void generateNoCacheSecurity(String serverLocation) throws Exception {
+      File outputSecurity = new File(serverLocation + File.separator + "etc" + File.separator + "zerocache.security");
+      generateSecurity(outputSecurity, "networkaddress.cache.ttl", "0", "networkaddress.cache.negative.ttl", "0");
+   }
+
+   private static void generateNoRetrySecurity(String serverLocation) throws Exception {
+      File outputSecurity = new File(serverLocation + File.separator + "etc" + File.separator + "noretrydns.security");
+      generateSecurity(outputSecurity, "networkaddress.cache.ttl", "-1", "networkaddress.cache.negative.ttl", "-1");
+   }
+
+   private static void generateSecurity(File outputSecurity, String... overrideParameters) throws IOException {
+
+      Assert.assertTrue("You must send pairs as overrideParameters", overrideParameters.length % 2 == 0);
+
+      File security = new File(System.getProperty("java.home") + File.separator + "lib" + File.separator + "security" + File.separator + "java.security");
+      Properties securityProperties = new Properties();
+      securityProperties.load(new FileInputStream(security));
+
+      for (int i = 0; i < overrideParameters.length; i += 2) {
+         securityProperties.setProperty(overrideParameters[i], overrideParameters[i + 1]);
+      }
+
+      securityProperties.store(new FileOutputStream(outputSecurity), "# generated by DNSSwitchTest");
+   }
+
+   private static final String hostsFile = System.getProperty("jdk.net.hosts.file");
+
+   @Before
+   public void before() throws Exception {
+      cleanupData(SERVER_NAME_0);
+      cleanupData(SERVER_NAME_1);
+      cleanupData(SERVER_STANDARD);
+      cleanupData(SERVER_LIVE);
+      cleanupData(SERVER_LIVE_NORETRYDNS);
+      cleanupData(SERVER_BACKUP);
+   }
+
+   @Test
+   public void testBackupRedefinition() throws Throwable {
+      System.out.println(System.getProperty("java.security.properties"));
+
+      spawnRun(serverLocation, "testBackupRedefinition", getServerLocation(SERVER_LIVE), getServerLocation(SERVER_BACKUP));
+   }
+
+   public static void testBackupRedefinition(String[] args) throws Throwable {
+      NetUtil.netUp(FIRST_IP);
+      NetUtil.netUp(SECOND_IP);
+      // NetUtil.netUp(THIRD_IP);
+      saveConf(hostsFile, FIRST_IP, "FIRST", SECOND_IP, "SECOND");
+
+      //System.out.println("Waiting here");
+      //Thread.sleep(300_000);
+
+      Process serverLive = null;
+      Process serverBackup = null;
+
+      try {
+         serverLive = ServerUtil.startServer(args[1], "live", "tcp://FIRST:61616", 30_000);
+         serverBackup = ServerUtil.startServer(args[2], "backup", "tcp://SECOND:61716", 0);
+
+         connectAndWaitBackup();
+         saveConf(hostsFile, FIRST_IP, "FIRST", THIRD_IP, "SECOND");
+
+         NetUtil.netDown(SECOND_IP, true);
+         serverBackup.destroyForcibly();
+
+         Thread.sleep(1000); // wait some time at least until a reconnection is in place
+
+         saveConf(hostsFile, FIRST_IP, "FIRST", THIRD_IP, "SECOND");
+
+         // waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 0);
+
+         serverBackup = ServerUtil.startServer(args[2], "backup", "tcp://SECOND:61716", 0);
+
+         ActiveMQServerControl backupControl = getServerControl(backupURI, backupNameBuilder, 20_000);
+         Wait.assertTrue(backupControl::isStarted);
+         Wait.assertTrue(backupControl::isReplicaSync);
+
+         connectAndWaitBackup();
+
+         //waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 1);
+
+         //System.out.println("I'm here!!!");
+         //Thread.sleep(300_000);
+
+         ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://FIRST:61616?ha=true");
+         Assert.assertTrue(connectionFactory.getServerLocator().isHA());
+         Connection connection = connectionFactory.createConnection();
+         waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 1);
+
+         Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
+
+         Queue queue = session.createQueue("test");
+
+         MessageProducer producer = session.createProducer(queue);
+
+         producer.send(session.createTextMessage("hello"));
+         session.commit();
+
+         NetUtil.netUp(THIRD_IP);
+         serverLive.destroyForcibly();
+
+         Wait.assertTrue(backupControl::isActive);
+
+         MessageConsumer consumer = null;
+         int errors = 0;
+         while (true) {
+            try {
+               consumer = session.createConsumer(queue);
+               connection.start();
+               TextMessage message = (TextMessage) consumer.receive(5000);
+               Assert.assertNotNull(message);
+               Assert.assertEquals("hello", message.getText());
+               session.commit();
+               break;
+            } catch (Exception e) {
+               e.printStackTrace();
+               errors++;
+               Assert.assertTrue(errors < 20); // I would accept one or two errors, but the code must connect itself
+               connection.close();
+               connectionFactory = new ActiveMQConnectionFactory("tcp://SECOND:61616?ha=true");
+               connection = connectionFactory.createConnection();
+               connection.start();
+               session = connection.createSession(true, Session.SESSION_TRANSACTED);
+            }
+         }
+
+      } finally {
+         if (serverLive != null) {
+            serverLive.destroyForcibly();
+         }
+         if (serverBackup != null) {
+            serverBackup.destroyForcibly();
+         }
+
+      }
+
+   }
+
+
+   @Test
+   public void testBackupRedefinition2() throws Throwable {
+      System.out.println(System.getProperty("java.security.properties"));
+
+      spawnRun(serverLocation, "testBackupRedefinition2", getServerLocation(SERVER_LIVE), getServerLocation(SERVER_BACKUP));
+   }
+
+   public static void testBackupRedefinition2(String[] args) throws Throwable {
+      NetUtil.netUp(FIRST_IP);
+      NetUtil.netUp(SECOND_IP);
+      NetUtil.netUp(THIRD_IP);
+      saveConf(hostsFile, FIRST_IP, "FIRST", SECOND_IP, "SECOND");
+
+      //System.out.println("Waiting here");
+      //Thread.sleep(300_000);
+
+      Process serverLive = null;
+      Process serverBackup = null;
+
+      try {
+         serverLive = ServerUtil.startServer(args[1], "live", "tcp://FIRST:61616", 30_000);
+         serverBackup = ServerUtil.startServer(args[2], "backup", "tcp://SECOND:61716", 0);
+
+         connectAndWaitBackup();
+         saveConf(hostsFile, FIRST_IP, "FIRST", THIRD_IP, "SECOND");
+
+         NetUtil.netDown(SECOND_IP, true);
+         serverBackup.destroyForcibly();
+
+         Thread.sleep(1000); // wait some time at least until a reconnection is in place
+
+         saveConf(hostsFile, FIRST_IP, "FIRST", THIRD_IP, "SECOND");
+
+         // waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 0);
+
+         serverBackup = ServerUtil.startServer(args[2], "backup", "tcp://SECOND:61716", 0);
+
+         ActiveMQServerControl backupControl = getServerControl(backupURI, backupNameBuilder, 20_000);
+         Wait.assertTrue(backupControl::isStarted);
+         Wait.assertTrue(backupControl::isReplicaSync);
+
+
+         saveConf(hostsFile, FIRST_IP, "FIRST", SECOND_IP, "SECOND");
+         serverBackup.destroyForcibly();
+         serverBackup = ServerUtil.startServer(args[2], "backup", "tcp://SECOND:61716", 0);
+         connectAndWaitBackup();
+
+         backupControl = getServerControl(backupURI, backupNameBuilder, 20_000);
+         Wait.assertTrue(backupControl::isStarted);
+         Wait.assertTrue(backupControl::isReplicaSync);
+
+         //waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 1);
+
+         //System.out.println("I'm here!!!");
+         //Thread.sleep(300_000);
+
+         ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://FIRST:61616?ha=true");
+         Assert.assertTrue(connectionFactory.getServerLocator().isHA());
+         Connection connection = connectionFactory.createConnection();
+         waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 1);
+
+         Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
+
+         Queue queue = session.createQueue("test");
+
+         MessageProducer producer = session.createProducer(queue);
+
+         producer.send(session.createTextMessage("hello"));
+         session.commit();
+
+         NetUtil.netUp(THIRD_IP);
+         serverLive.destroyForcibly();
+
+         Wait.assertTrue(backupControl::isActive);
+
+         MessageConsumer consumer = null;
+         int errors = 0;
+         while (true) {
+            try {
+               consumer = session.createConsumer(queue);
+               connection.start();
+               TextMessage message = (TextMessage) consumer.receive(5000);
+               Assert.assertNotNull(message);
+               Assert.assertEquals("hello", message.getText());
+               session.commit();
+               break;
+            } catch (Exception e) {
+               e.printStackTrace();
+               errors++;
+               Assert.assertTrue(errors < 20); // I would accept one or two errors, but the code must connect itself
+               connection.close();
+               connectionFactory = new ActiveMQConnectionFactory("tcp://SECOND:61616?ha=true");
+               connection = connectionFactory.createConnection();
+               connection.start();
+               session = connection.createSession(true, Session.SESSION_TRANSACTED);
+            }
+         }
+
+      } finally {
+         if (serverBackup != null) {
+            serverBackup.destroyForcibly();
+         }
+         if (serverLive != null) {
+            serverLive.destroyForcibly();
+         }
+      }
+
+   }
+
+
+   @Test
+   public void testBackupRedefinition3() throws Throwable {
+      System.out.println(System.getProperty("java.security.properties"));
+
+      spawnRun(serverLocation, "testBackupRedefinition2", getServerLocation(SERVER_LIVE), getServerLocation(SERVER_BACKUP));
+   }
+
+   public static void testBackupRedefinition3(String[] args) throws Throwable {
+      NetUtil.netUp(FIRST_IP);
+      NetUtil.netUp(SECOND_IP);
+      NetUtil.netUp(THIRD_IP);
+      saveConf(hostsFile, FIRST_IP, "FIRST", SECOND_IP, "SECOND");
+
+      //System.out.println("Waiting here");
+      //Thread.sleep(300_000);
+
+      Process serverLive = null;
+      Process serverBackup = null;
+
+      try {
+         serverLive = ServerUtil.startServer(args[1], "live", "tcp://FIRST:61616", 30_000);
+         serverBackup = ServerUtil.startServer(args[2], "backup", "tcp://SECOND:61716", 0);
+
+         connectAndWaitBackup();
+         saveConf(hostsFile, FIRST_IP, "FIRST", THIRD_IP, "SECOND");
+
+         NetUtil.netDown(SECOND_IP, true);
+         serverBackup.destroyForcibly();
+
+         Thread.sleep(1000); // wait some time at least until a reconnection is in place
+
+         saveConf(hostsFile, FIRST_IP, "FIRST", THIRD_IP, "SECOND");
+
+         // waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 0);
+
+         serverBackup = ServerUtil.startServer(args[2], "backup", "tcp://SECOND:61716", 0);
+
+         ActiveMQServerControl backupControl = getServerControl(backupURI, backupNameBuilder, 20_000);
+         Wait.assertTrue(backupControl::isStarted);
+         Wait.assertTrue(backupControl::isReplicaSync);
+
+
+         saveConf(hostsFile, FIRST_IP, "FIRST", SECOND_IP, "SECOND");
+         serverBackup.destroyForcibly();
+         serverBackup = ServerUtil.startServer(args[2], "backup", "tcp://SECOND:61716", 0);
+         connectAndWaitBackup();
+
+         backupControl = getServerControl(backupURI, backupNameBuilder, 20_000);
+         Wait.assertTrue(backupControl::isStarted);
+         Wait.assertTrue(backupControl::isReplicaSync);
+
+         //waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 1);
+
+         //System.out.println("I'm here!!!");
+         //Thread.sleep(300_000);
+
+         ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://FIRST:61616?ha=true");
+         Assert.assertTrue(connectionFactory.getServerLocator().isHA());
+         Connection connection = connectionFactory.createConnection();
+         waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 1);
+
+         Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
+
+         Queue queue = session.createQueue("test");
+
+         MessageProducer producer = session.createProducer(queue);
+
+         producer.send(session.createTextMessage("hello"));
+         session.commit();
+
+         NetUtil.netUp(THIRD_IP);
+         serverLive.destroyForcibly();
+
+         Wait.assertTrue(backupControl::isActive);
+
+         MessageConsumer consumer = null;
+         int errors = 0;
+         while (true) {
+            try {
+               consumer = session.createConsumer(queue);
+               connection.start();
+               TextMessage message = (TextMessage) consumer.receive(5000);
+               Assert.assertNotNull(message);
+               Assert.assertEquals("hello", message.getText());
+               session.commit();
+               break;
+            } catch (Exception e) {
+               e.printStackTrace();
+               errors++;
+               Assert.assertTrue(errors < 20); // I would accept one or two errors, but the code must connect itself
+               connection.close();
+               connectionFactory = new ActiveMQConnectionFactory("tcp://SECOND:61616?ha=true");
+               connection = connectionFactory.createConnection();
+               connection.start();
+               session = connection.createSession(true, Session.SESSION_TRANSACTED);
+            }
+         }
+
+      } finally {
+         if (serverBackup != null) {
+            serverBackup.destroyForcibly();
+         }
+         if (serverLive != null) {
+            serverLive.destroyForcibly();
+         }
+
+
+      }
+
+   }
+
+
+   @Test
+   public void testCantReachBack() throws Throwable {
+      System.out.println(System.getProperty("java.security.properties"));
+
+      spawnRun(serverLocation, "testCantReachBack", getServerLocation(SERVER_LIVE_NORETRYDNS), getServerLocation(SERVER_BACKUP));
+   }
+
+   public static void testCantReachBack(String[] args) throws Throwable {
+      NetUtil.netUp(FIRST_IP);
+      NetUtil.netUp(SECOND_IP);
+
+      // notice there's no THIRD_IP anywhere
+      saveConf(hostsFile, FIRST_IP, "FIRST", THIRD_IP, "SECOND");
+
+      Process serverLive = null;
+      Process serverBackup = null;
+
+      try {
+         serverLive = ServerUtil.startServer(args[1], "live", "tcp://FIRST:61616", 30_000);
+         ActiveMQServerControl liveControl = getServerControl(liveURI, liveNameBuilder, 20_000);
+
+         Wait.assertTrue(liveControl::isStarted);
+
+         // notice the first server does not know about this server at all
+         saveConf(hostsFile, FIRST_IP, "FIRST", SECOND_IP, "SECOND");
+         serverBackup = ServerUtil.startServer(args[2], "backup", "tcp://SECOND:61716", 0);
+         ActiveMQServerControl backupControl = getServerControl(backupURI, backupNameBuilder, 20_000);
+
+         Wait.assertTrue(backupControl::isStarted);
+         Wait.assertTrue(backupControl::isReplicaSync);
+
+         connectAndWaitBackup();
+
+      } finally {
+         if (serverBackup != null) {
+            serverBackup.destroyForcibly();
+         }
+         if (serverLive != null) {
+            serverLive.destroyForcibly();
+         }
+
+
+      }
+
+   }
+
+   private static void connectAndWaitBackup() throws Exception {
+      ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://FIRST:61616?ha=true");
+      Assert.assertTrue(connectionFactory.getServerLocator().isHA());
+      Connection connection = connectionFactory.createConnection();
+      waitForTopology(connectionFactory.getServerLocator().getTopology(), 60_000, 1, 1);
+      connection.close();
+   }
+
+   @Test
+   public void testFailoverDifferentIPRedefinition() throws Throwable {
+
+      spawnRun(serverLocation, "testFailoverDifferentIPRedefinition", serverLocation, getServerLocation(SERVER_NAME_1));
+   }
+
+   public static void testFailoverDifferentIPRedefinition(String[] arg) throws Throwable {
+      NetUtil.netUp(FIRST_IP);
+      NetUtil.netUp(SECOND_IP);
+
+      saveConf(hostsFile, FIRST_IP, "test");
+      Process server = null;
+      Process server2 = null;
+      try {
+         server = ServerUtil.startServer(arg[1], "original-server", "tcp://test:61616", 5000);
+
+         ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://test:61616?initialConnectAttempts=500&retryInterval=100&connect-timeout-millis=100&reconnectAttempts=500&connectionTTL=1000");
+
+         Connection connection = factory.createConnection();
+
+         server.destroyForcibly();
+         NetUtil.netDown(FIRST_IP, true);
+
+         CountDownLatch latchConnect = new CountDownLatch(1);
+         AtomicInteger errors = new AtomicInteger(0);
+
+         Thread connecting = new Thread(() -> {
+            try {
+               latchConnect.countDown();
+               Connection connection2 = factory.createConnection();
+               connection2.close();
+            } catch (Exception e) {
+               e.printStackTrace();
+               errors.incrementAndGet();
+            }
+         });
+
+         connecting.start();
+
+         Assert.assertTrue(latchConnect.await(5, TimeUnit.SECONDS));
+
+         Thread.sleep(500);
+
+         server = ServerUtil.startServer(arg[2], "new-server", "tcp://" + SECOND_IP + ":61616", 5000);
+
+         saveConf(hostsFile, SECOND_IP, "test");
+         connecting.join(5000);
+         Assert.assertFalse(connecting.isAlive());
+         Assert.assertEquals(0, errors.get());
+      } finally {
+         if (server != null)
+            server.destroyForcibly();
+         if (server2 != null)
+            server2.destroyForcibly();
+      }
+
+   }
+
+   @Test
+   public void testInitialConnector() throws Throwable {
+      ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://test:61616?initialConnectAttempts=500&retryInterval=100&connect-timeout-millis=100");
+      startServer(SERVER_STANDARD, 0, 30000);
+
+      String location = getServerLocation(SERVER_NAME_0);
+
+      spawnRun(location, "testInitialConnector");
+      // If you eed to debug the test, comment out spawnRun, and call the method directly
+      // you will need to add roperties on the JDK for that
+      // Add the properties you need
+      // testInitialConnector("testInitialConnector", location);
+   }
+
+   // called with reflection
+   public static void testInitialConnector(String... arg) throws Throwable {
+      saveConf(hostsFile, "192.0.0.3", "test");
+      validateIP("test", "192.0.0.3");
+
+      AtomicInteger errors = new AtomicInteger(0);
+
+      CountDownLatch initialConnectTried = new CountDownLatch(1);
+
+      ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://test:61616?initialConnectAttempts=500&retryInterval=100&connect-timeout-millis=100");
+      Thread connecting = new Thread(() -> {
+         try {
+            initialConnectTried.countDown();
+            Connection connection = factory.createConnection();
+            connection.close();
+         } catch (Exception e) {
+            e.printStackTrace();
+            errors.incrementAndGet();
+         }
+      });
+
+      connecting.start();
+
+      Assert.assertTrue(initialConnectTried.await(10, TimeUnit.SECONDS));
+
+      Thread.sleep(1000);
+
+      saveConf(hostsFile, "127.0.0.1", "test");
+      validateIP("test", "127.0.0.1");
+      connecting.join(10_000);
+
+      Connection connection = factory.createConnection();
+      connection.close();
+
+      Assert.assertEquals(0, errors.get());
+
+      Assert.assertFalse(connecting.isAlive());
+   }
+
+   // This test is just validating the DNS is not being cached on the separte VM
+   @Test
+   public void testSimpleResolution() throws Throwable {
+      spawnRun(serverLocation, "testSimpleResolution");
+   }
+
+   // called with reflection
+   public static void testSimpleResolution(String[] arg) throws Throwable {
+      // This is just to validate the DNS hosts is picking up the right host
+      saveConf(hostsFile, "192.0.0.1", "test");
+      validateIP("test", "192.0.0.1");
+
+      // and it should not cache anything if the right properties are in place
+      saveConf(hostsFile, "192.0.0.3", "test");
+      validateIP("test", "192.0.0.3");
+   }
+
+   /**
+    * it will continue the test on a spwned VM with the properties we need for this test
+    */
+   private void spawnRun(String location, String... args) throws Throwable {
+      // We have to run part of the test on a separate VM, as we need VM settings to tweak the DNS
+
+      String securityProperties = System.getProperty("java.security.properties");
+
+      if (securityProperties != null && securityProperties.equals(location + "/etc/zerocache.security3")) {
+         System.out.println("No need to spawn a VM, the zerocache is already in place");
+         System.setProperty("artemis.config.location", location);
+         USING_SPAWN = false;
+         main(args);
+      } else {
+
+         securityProperties = "-Djava.security.properties=" + location + "/etc/zerocache.security";
+         String hostProperties = "-Djdk.net.hosts.file=" + location + "/etc/hosts.conf";
+         String configLocation = "-Dartemis.config.location=" + location;
+         String temporaryLocation = "-Djava.io.tmpdir=" + System.getProperty("java.io.tmpdir");
+
+         logger.info("if you would like to run without Spawn for debugging purposes, add these properties to your VM arguments on this test: " + securityProperties + " " + hostProperties);
+         Process p = SpawnedVMSupport.spawnVM(DNSSwitchTest.class.getName(), new String[]{securityProperties, hostProperties, configLocation, temporaryLocation}, args);
+         addProcess(p);
+         Assert.assertEquals(1, p.waitFor());
+      }
+   }
+
+   public static void saveConf(String fileName, String... hostDefinition) throws Exception {
+      if (USE_ETC_HOSTS) {
+         recoverETCHosts();
+         saveConf(ETC_HOSTS, true, hostDefinition);
+      } else {
+         saveConf(new File(fileName), false, hostDefinition);
+      }
+   }
+
+   public static void saveConf(File fileName, boolean append, String... hostDefinition) throws Exception {
+      PrintWriter writer = new PrintWriter(new FileOutputStream(fileName, append));
+      Assert.assertTrue("you must send pairs", hostDefinition.length % 2 == 0);
+
+      if (USE_ETC_HOSTS) {
+         writer.println();
+         writer.println("# this was generated by DNSSwitchTest. Make sure you recover from your backup");
+      }
+
+      for (int i = 0; i < hostDefinition.length; i += 2) {
+         writer.println(hostDefinition[i] + "                  " + hostDefinition[i + 1]);
+      }
+      writer.close();
+   }
+
+   private static void validateIP(String host, String ip) {
+      InetSocketAddress inetSocketAddress;
+      inetSocketAddress = new InetSocketAddress(host, 8080);
+      // And this is to validate no cache
+      Assert.assertEquals(ip, inetSocketAddress.getAddress().getHostAddress());
+   }
+
+   // This main method will be used with spawnRun to continue the test on a separate VM
+   public static void main(String[] arg) throws Throwable {
+      try {
+
+         String methodName = arg[0];
+
+         Method methodReflection = DNSSwitchTest.class.getMethod(methodName, arg.getClass());
+         methodReflection.invoke(null, new Object[]{arg});
+
+         if (USING_SPAWN) {
+            NetUtil.cleanup();
+            System.exit(1);
+         }
+      } catch (InvocationTargetException e) {
+         e.getCause().printStackTrace();
+         if (USING_SPAWN) {
+            NetUtil.cleanup();
+            System.exit(2);
+         } else {
+            throw e;
+         }
+      } catch (Throwable e) {
+         e.printStackTrace();
+         if (USING_SPAWN) {
+            NetUtil.cleanup();
+            System.exit(2);
+         } else {
+            throw e;
+         }
+      }
+   }
+
+}