You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by up...@apache.org on 2017/10/05 20:11:05 UTC

[geode] branch develop updated: GEODE-3687: GatewayReceiverImpl constructor and create method updates (#859)

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

upthewaterspout pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new 2502ae0  GEODE-3687: GatewayReceiverImpl constructor and create method updates (#859)
2502ae0 is described below

commit 2502ae0be83e4a2d00003e42b366654749c52ed1
Author: S. Lynn Hughes-Godfrey <lh...@pivotal.io>
AuthorDate: Thu Oct 5 13:11:03 2017 -0700

    GEODE-3687: GatewayReceiverImpl constructor and create method updates (#859)
    
    GEODE-3687: GatewayReceiverImpl constructor and create method updates
    
    - bind-address specified in gemfire.properties is now used to configure Profile and ServerLocations
    - removed host field (previously calculated at config time based on hostname-for-sender and bind-address parameters)
      with result then passed to CacheServerImpl.start()
    - replaced host field with hostnameForSenders, which is now used (when set) to set hostnameForClients in CacheServerImpl.
    - replaced getHost with getHostnameForSenders
    - associated tests, including those to set bind-address and server-bind-address through gemfire.properties
---
 .../apache/geode/cache/wan/GatewayReceiver.java    |   5 +
 .../internal/cache/xmlcache/CacheCreation.java     |   2 +-
 .../cache/xmlcache/GatewayReceiverCreation.java    |  32 +-
 .../internal/cache/wan/GatewayReceiverImpl.java    |  72 ++--
 .../geode/cache/CacheXml70GatewayDUnitTest.java    |   2 +-
 .../cache/wan/GatewayReceiverImplJUnitTest.java    |  59 +++
 .../cache/wan/misc/WANConfigurationJUnitTest.java  |   2 +-
 .../CreateGatewayReceiverCommandDUnitTest.java     | 433 ++++++++++++++++-----
 .../cache/wan/wancommand/WANCommandTestBase.java   |  45 ++-
 9 files changed, 481 insertions(+), 171 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/cache/wan/GatewayReceiver.java b/geode-core/src/main/java/org/apache/geode/cache/wan/GatewayReceiver.java
index fd6f039..4e238a5 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/wan/GatewayReceiver.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/wan/GatewayReceiver.java
@@ -137,6 +137,11 @@ public interface GatewayReceiver {
   public String getHost();
 
   /**
+   * Returns the hostname configured by {@link GatewayReceiverFactory#setHostnameForSenders(String)}
+   */
+  public String getHostnameForSenders();
+
+  /**
    * Returns the configured buffer size of the socket connection for this
    * <code>GatewayReceiver</code>. The default is 524288 bytes.
    * 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/CacheCreation.java b/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/CacheCreation.java
index 3cd1971..cb19ee9 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/CacheCreation.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/CacheCreation.java
@@ -538,7 +538,7 @@ public class CacheCreation implements InternalCache {
       for (GatewayTransportFilter filter : receiverCreation.getGatewayTransportFilters()) {
         factory.addGatewayTransportFilter(filter);
       }
-      factory.setHostnameForSenders(receiverCreation.getHost());
+      factory.setHostnameForSenders(receiverCreation.getHostnameForSenders());
       GatewayReceiver receiver = factory.create();
       if (receiver.isManualStart()) {
         cache.getLoggerI18n().info(
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/GatewayReceiverCreation.java b/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/GatewayReceiverCreation.java
index a4241f5..f298bab 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/GatewayReceiverCreation.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/xmlcache/GatewayReceiverCreation.java
@@ -51,6 +51,8 @@ public class GatewayReceiverCreation implements GatewayReceiver {
 
   private String bindAddress;
 
+  private String hostnameForSenders;
+
   private boolean manualStart;
 
   private CacheServer receiver;
@@ -61,34 +63,12 @@ public class GatewayReceiverCreation implements GatewayReceiver {
       boolean manualStart) {
     this.cache = cache;
 
-    /*
-     * If user has set hostNameForSenders then it should take precedence over bindAddress. If user
-     * hasn't set either hostNameForSenders or bindAddress then getLocalHost().getHostName() should
-     * be used.
-     */
-    if (hostnameForSenders == null || hostnameForSenders.isEmpty()) {
-      if (bindAdd == null || bindAdd.isEmpty()) {
-        try {
-          logger
-              .warn(LocalizedMessage.create(LocalizedStrings.GatewayReceiverImpl_USING_LOCAL_HOST));
-          this.host = SocketCreator.getLocalHost().getHostName();
-        } catch (UnknownHostException e) {
-          throw new IllegalStateException(
-              LocalizedStrings.GatewayReceiverImpl_COULD_NOT_GET_HOST_NAME.toLocalizedString(), e);
-        }
-      } else {
-        this.host = bindAdd;
-      }
-    } else {
-      this.host = hostnameForSenders;
-    }
-
-
     this.startPort = startPort;
     this.endPort = endPort;
     this.maxTimeBetweenPings = timeBetPings;
     this.socketBufferSize = buffSize;
     this.bindAddress = bindAdd;
+    this.hostnameForSenders = hostnameForSenders;
     this.transFilter = filters;
     this.manualStart = manualStart;
   }
@@ -129,8 +109,12 @@ public class GatewayReceiverCreation implements GatewayReceiver {
     this.socketBufferSize = socketBufferSize;
   }
 
+  public String getHostnameForSenders() {
+    return this.hostnameForSenders;
+  }
+
   public String getHost() {
-    return this.host;
+    throw new IllegalStateException("getHost should not be invoked on GatewayReceiverCreation");
   }
 
   public String getBindAddress() {
diff --git a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewayReceiverImpl.java b/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewayReceiverImpl.java
index 5e26a46..1dbcc97 100644
--- a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewayReceiverImpl.java
+++ b/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewayReceiverImpl.java
@@ -44,7 +44,7 @@ public class GatewayReceiverImpl implements GatewayReceiver {
 
   private static final Logger logger = LogService.getLogger();
 
-  private String host;
+  private String hostnameForSenders;
 
   private int startPort;
 
@@ -71,28 +71,7 @@ public class GatewayReceiverImpl implements GatewayReceiver {
       boolean manualStart) {
     this.cache = cache;
 
-    /*
-     * If user has set hostNameForSenders then it should take precedence over bindAddress. If user
-     * hasn't set either hostNameForSenders or bindAddress then getLocalHost().getHostName() should
-     * be used.
-     */
-    if (hostnameForSenders == null || hostnameForSenders.isEmpty()) {
-      if (bindAdd == null || bindAdd.isEmpty()) {
-        try {
-          logger
-              .warn(LocalizedMessage.create(LocalizedStrings.GatewayReceiverImpl_USING_LOCAL_HOST));
-          this.host = SocketCreator.getLocalHost().getHostName();
-        } catch (UnknownHostException e) {
-          throw new IllegalStateException(
-              LocalizedStrings.GatewayReceiverImpl_COULD_NOT_GET_HOST_NAME.toLocalizedString(), e);
-        }
-      } else {
-        this.host = bindAdd;
-      }
-    } else {
-      this.host = hostnameForSenders;
-    }
-
+    this.hostnameForSenders = hostnameForSenders;
     this.startPort = startPort;
     this.endPort = endPort;
     this.timeBetPings = timeBetPings;
@@ -102,6 +81,31 @@ public class GatewayReceiverImpl implements GatewayReceiver {
     this.manualStart = manualStart;
   }
 
+  public String getHostnameForSenders() {
+    return hostnameForSenders;
+  }
+
+  public String getHost() {
+    if (receiver != null) {
+      return ((CacheServerImpl) receiver).getExternalAddress();
+    }
+
+    if (hostnameForSenders != null && !hostnameForSenders.isEmpty()) {
+      return hostnameForSenders;
+    }
+
+    if (bindAdd != null && !bindAdd.isEmpty()) {
+      return bindAdd;
+    }
+
+    try {
+      return SocketCreator.getLocalHost().getHostName();
+    } catch (UnknownHostException e) {
+      throw new IllegalStateException(
+          LocalizedStrings.GatewayReceiverImpl_COULD_NOT_GET_HOST_NAME.toLocalizedString(), e);
+    }
+  }
+
   public List<GatewayTransportFilter> getGatewayTransportFilters() {
     return this.filters;
   }
@@ -148,7 +152,9 @@ public class GatewayReceiverImpl implements GatewayReceiver {
       receiver.setPort(this.port);
       receiver.setSocketBufferSize(socketBufferSize);
       receiver.setMaximumTimeBetweenPings(timeBetPings);
-      receiver.setHostnameForClients(host);
+      if (hostnameForSenders != null && !hostnameForSenders.isEmpty()) {
+        receiver.setHostnameForClients(hostnameForSenders);
+      }
       receiver.setBindAddress(bindAdd);
       receiver.setGroups(new String[] {GatewayReceiver.RECEIVER_GROUP});
       ((CacheServerImpl) receiver).setGatewayTransportFilter(this.filters);
@@ -209,10 +215,6 @@ public class GatewayReceiverImpl implements GatewayReceiver {
     receiver.stop();
   }
 
-  public String getHost() {
-    return this.host;
-  }
-
   public String getBindAddress() {
     return this.bindAdd;
   }
@@ -226,13 +228,13 @@ public class GatewayReceiverImpl implements GatewayReceiver {
 
   public String toString() {
     return new StringBuffer().append("Gateway Receiver").append("@")
-        .append(Integer.toHexString(hashCode())).append(" [").append("host='").append(getHost())
-        .append("'; port=").append(getPort()).append("; bindAddress=").append(getBindAddress())
-        .append("; maximumTimeBetweenPings=").append(getMaximumTimeBetweenPings())
-        .append("; socketBufferSize=").append(getSocketBufferSize()).append("; isManualStart=")
-        .append(isManualStart()).append("; group=")
-        .append(Arrays.toString(new String[] {GatewayReceiver.RECEIVER_GROUP})).append("]")
-        .toString();
+        .append(Integer.toHexString(hashCode())).append("'; port=").append(getPort())
+        .append("; bindAddress=").append(getBindAddress()).append("'; hostnameForSenders=")
+        .append(getHostnameForSenders()).append("; maximumTimeBetweenPings=")
+        .append(getMaximumTimeBetweenPings()).append("; socketBufferSize=")
+        .append(getSocketBufferSize()).append("; isManualStart=").append(isManualStart())
+        .append("; group=").append(Arrays.toString(new String[] {GatewayReceiver.RECEIVER_GROUP}))
+        .append("]").toString();
   }
 
 }
diff --git a/geode-wan/src/test/java/org/apache/geode/cache/CacheXml70GatewayDUnitTest.java b/geode-wan/src/test/java/org/apache/geode/cache/CacheXml70GatewayDUnitTest.java
index 25cffb3..9e50c94 100644
--- a/geode-wan/src/test/java/org/apache/geode/cache/CacheXml70GatewayDUnitTest.java
+++ b/geode-wan/src/test/java/org/apache/geode/cache/CacheXml70GatewayDUnitTest.java
@@ -219,7 +219,7 @@ public class CacheXml70GatewayDUnitTest extends CacheXmlTestCase {
   }
 
   static void validateGatewayReceiver(GatewayReceiver receiver1, GatewayReceiver gatewayReceiver) {
-    assertEquals(receiver1.getHost(), gatewayReceiver.getHost());
+    assertEquals(receiver1.getHostnameForSenders(), gatewayReceiver.getHostnameForSenders());
     assertEquals(receiver1.getStartPort(), gatewayReceiver.getStartPort());
     assertEquals(receiver1.getEndPort(), gatewayReceiver.getEndPort());
     assertEquals(receiver1.getMaximumTimeBetweenPings(),
diff --git a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewayReceiverImplJUnitTest.java b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewayReceiverImplJUnitTest.java
new file mode 100644
index 0000000..472ba27
--- /dev/null
+++ b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewayReceiverImplJUnitTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.geode.internal.cache.wan;
+
+import static org.junit.Assert.*;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.net.UnknownHostException;
+
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.internal.cache.CacheServerImpl;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.net.SocketCreator;
+import org.apache.geode.test.junit.categories.UnitTest;
+
+@Category(UnitTest.class)
+public class GatewayReceiverImplJUnitTest {
+
+  @Test
+  public void getHostOnUnstartedGatewayShouldReturnLocalhost() throws UnknownHostException {
+    InternalCache cache = mock(InternalCache.class);
+    GatewayReceiverImpl gateway =
+        new GatewayReceiverImpl(cache, 2000, 2001, 5, 100, null, null, null, true);
+    assertEquals(SocketCreator.getLocalHost().getHostName(), gateway.getHost());
+  }
+
+  @Test
+  public void getHostOnRunningGatewayShouldReturnCacheServerAddress() throws IOException {
+    InternalCache cache = mock(InternalCache.class);
+    CacheServerImpl server = mock(CacheServerImpl.class);
+    InternalDistributedSystem system = mock(InternalDistributedSystem.class);
+    when(cache.getInternalDistributedSystem()).thenReturn(system);
+    when(server.getExternalAddress()).thenReturn("hello");
+    when(cache.addCacheServer(eq(true))).thenReturn(server);
+    GatewayReceiverImpl gateway =
+        new GatewayReceiverImpl(cache, 2000, 2001, 5, 100, null, null, null, true);
+    gateway.start();
+    assertEquals("hello", gateway.getHost());
+  }
+
+}
diff --git a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/misc/WANConfigurationJUnitTest.java b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/misc/WANConfigurationJUnitTest.java
index 202ffe9..43f8cb9 100644
--- a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/misc/WANConfigurationJUnitTest.java
+++ b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/misc/WANConfigurationJUnitTest.java
@@ -223,7 +223,7 @@ public class WANConfigurationJUnitTest {
     Region region = cache.createRegionFactory().create("test_ValidateGatewayReceiverAttributes");
     Set<GatewayReceiver> receivers = cache.getGatewayReceivers();
     GatewayReceiver rec = receivers.iterator().next();
-    assertEquals(receiver1.getHost(), rec.getHost());
+    assertEquals(receiver1.getHostnameForSenders(), rec.getHostnameForSenders());
     assertEquals(receiver1.getStartPort(), rec.getStartPort());
     assertEquals(receiver1.getEndPort(), rec.getEndPort());
     assertEquals(receiver1.getBindAddress(), rec.getBindAddress());
diff --git a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/CreateGatewayReceiverCommandDUnitTest.java b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/CreateGatewayReceiverCommandDUnitTest.java
index 63a5043..27da5da 100644
--- a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/CreateGatewayReceiverCommandDUnitTest.java
+++ b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/CreateGatewayReceiverCommandDUnitTest.java
@@ -20,12 +20,9 @@ import static org.apache.geode.test.dunit.Assert.fail;
 import static org.apache.geode.test.dunit.LogWriterUtils.getLogWriter;
 
 import java.net.InetAddress;
-import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.geode.internal.i18n.LocalizedStrings;
-import org.apache.geode.internal.logging.log4j.LocalizedMessage;
 import org.apache.geode.internal.net.SocketCreator;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
@@ -64,6 +61,47 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
     vm5.invoke(() -> createCache(dsIdPort));
 
     String command = CliStrings.CREATE_GATEWAYRECEIVER;
+    executeCommandAndVerifyStatus(command, 4);
+
+    // if neither bind-address or hostname-for-senders is set, profile
+    // uses AcceptorImpl.getExternalAddress() to derive canonical hostname
+    // when the Profile (and ServerLocation) are created
+    String hostname = getHostName();
+
+    vm3.invoke(() -> verifyGatewayReceiverProfile(hostname));
+    vm4.invoke(() -> verifyGatewayReceiverProfile(hostname));
+    vm5.invoke(() -> verifyGatewayReceiverProfile(hostname));
+
+    vm3.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, hostname));
+    vm4.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, hostname));
+    vm5.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, hostname));
+
+    vm3.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
+        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
+        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
+        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    vm4.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
+        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
+        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
+        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    vm5.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
+        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
+        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
+        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+  }
+
+  private String getHostName() throws Exception {
+    return SocketCreator.getLocalHost().getCanonicalHostName();
+  }
+
+  private String getBindAddress() throws Exception {
+    return InetAddress.getLocalHost().getHostAddress();
+  }
+
+  private void executeCommandAndVerifyStatus(String command, int numGatewayReceivers) {
     CommandResult cmdResult = executeCommand(command);
     if (cmdResult != null) {
       String strCmdResult = commandResultToString(cmdResult);
@@ -72,7 +110,9 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
 
       TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
       List<String> status = resultData.retrieveAllValues("Status");
-      assertEquals(4, status.size());// expected size 4 includes the manager node
+      // expected size of 4 includes the manager node when we don't set the receiver groups to
+      // ignore it)
+      assertEquals(numGatewayReceivers, status.size());
       // verify there is no error in the status
       for (String stat : status) {
         assertTrue("GatewayReceiver creation failed with: " + stat, !stat.contains("ERROR:"));
@@ -80,22 +120,6 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
     } else {
       fail("testCreateGatewayReceiver failed as did not get CommandResult");
     }
-
-    String hostname;
-    hostname = SocketCreator.getLocalHost().getHostName();
-
-    vm3.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
-        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
-        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
-        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null, hostname));
-    vm4.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
-        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
-        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
-        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null, hostname));
-    vm5.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
-        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
-        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
-        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null, hostname));
   }
 
   /**
@@ -119,35 +143,23 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
             + CliStrings.CREATE_GATEWAYRECEIVER__ENDPORT + "=11000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000";
-    CommandResult cmdResult = executeCommand(command);
-    if (cmdResult != null) {
-      String strCmdResult = commandResultToString(cmdResult);
-      getLogWriter().info("testCreateGatewayReceiver stringResult : " + strCmdResult + ">>>>");
-      assertEquals(Result.Status.OK, cmdResult.getStatus());
+    executeCommandAndVerifyStatus(command, 4);
+
+    // cannot verify Profile/ServerLocation when manualStart is true
 
-      TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-      List<String> status = resultData.retrieveAllValues("Status");
-      assertEquals(4, status.size());// expected size 4 includes the manager node
-      // verify there is no error in the status
-      for (String stat : status) {
-        assertTrue("GatewayReceiver creation failed with: " + stat, !stat.contains("ERROR:"));
-      }
-    } else {
-      fail("testCreateGatewayReceiver failed as did not get CommandResult");
-    }
     vm3.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
     vm4.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
     vm5.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
   }
 
   /**
    * GatewayReceiver with hostnameForSenders
    */
   @Test
-  public void testCreateGatewayReceiverWithHostnameForSenders() throws UnknownHostException {
+  public void testCreateGatewayReceiverWithHostnameForSenders() throws Exception {
     VM puneLocator = Host.getLocator();
     int dsIdPort = puneLocator.invoke(this::getLocatorPort);
     propsSetUp(dsIdPort);
@@ -157,7 +169,7 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
     vm4.invoke(() -> createCache(dsIdPort));
     vm5.invoke(() -> createCache(dsIdPort));
 
-    String hostnameForSenders = InetAddress.getLocalHost().getHostName();
+    String hostnameForSenders = getHostName();
     String command =
         CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.CREATE_GATEWAYRECEIVER__MANUALSTART
             + "=false" + " --" + CliStrings.CREATE_GATEWAYRECEIVER__HOSTNAMEFORSENDERS + "="
@@ -165,23 +177,205 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
             + " --" + CliStrings.CREATE_GATEWAYRECEIVER__ENDPORT + "=11000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000";
-    CommandResult cmdResult = executeCommand(command);
-    if (cmdResult != null) {
-      String strCmdResult = commandResultToString(cmdResult);
-      getLogWriter().info("testCreateGatewayReceiver stringResult : " + strCmdResult + ">>>>");
-      assertEquals(Result.Status.OK, cmdResult.getStatus());
+    executeCommandAndVerifyStatus(command, 4);
 
-      TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-      List<String> status = resultData.retrieveAllValues("Status");
-      assertEquals(4, status.size());// expected size 4 includes the manager node
-      // verify there is no error in the status
-      for (String stat : status) {
-        assertTrue("GatewayReceiver creation failed with: " + stat, !stat.contains("ERROR:"));
-      }
-    } else {
-      fail("testCreateGatewayReceiver failed as did not get CommandResult");
-    }
+    // verify hostname-for-senders is used when configured
+    vm3.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
+    vm4.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
+    vm5.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
+
+    vm3.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, hostnameForSenders));
+    vm4.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, hostnameForSenders));
+    vm5.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, hostnameForSenders));
+
+    vm3.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000, 512000,
+        null, hostnameForSenders));
+    vm4.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000, 512000,
+        null, hostnameForSenders));
+    vm5.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000, 512000,
+        null, hostnameForSenders));
+  }
+
+  /**
+   * GatewayReceiver with all default attributes and bind-address in gemfire-properties
+   */
+  @Test
+  public void testCreateGatewayReceiverWithDefaultAndBindProperty() throws Exception {
+    VM puneLocator = Host.getLocator();
+    int dsIdPort = puneLocator.invoke(this::getLocatorPort);
+    propsSetUp(dsIdPort);
+    vm2.invoke(() -> createFirstRemoteLocator(2, dsIdPort));
+
+    String expectedBindAddress = getBindAddress();
+
+    String receiverGroup = "receiverGroup";
+    vm3.invoke(() -> createCacheWithBindAddress(dsIdPort, expectedBindAddress, receiverGroup));
+    vm4.invoke(() -> createCacheWithBindAddress(dsIdPort, expectedBindAddress, receiverGroup));
+    vm5.invoke(() -> createCacheWithBindAddress(dsIdPort, expectedBindAddress, receiverGroup));
+
+    String command =
+        CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.GROUP + "=" + receiverGroup;
+    executeCommandAndVerifyStatus(command, 3);
+
+    // verify bind-address used when provided as a gemfire property
+    vm3.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
+    vm4.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
+    vm5.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
+
+    vm3.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, expectedBindAddress));
+    vm4.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, expectedBindAddress));
+    vm5.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, expectedBindAddress));
+
+    vm3.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
+        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
+        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
+        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    vm4.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
+        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
+        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
+        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    vm5.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
+        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
+        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
+        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+  }
+
+  /**
+   * GatewayReceiver with all default attributes and server-bind-address in the gemfire properties
+   */
+  @Test
+  public void testCreateGatewayReceiverWithDefaultsAndServerBindAddressProperty() throws Exception {
+    VM puneLocator = Host.getLocator();
+    int dsIdPort = puneLocator.invoke(this::getLocatorPort);
+    propsSetUp(dsIdPort);
+    vm2.invoke(() -> createFirstRemoteLocator(2, dsIdPort));
+
+    String expectedBindAddress = getBindAddress();
+
+    String receiverGroup = "receiverGroup";
+    vm3.invoke(
+        () -> createCacheWithServerBindAddress(dsIdPort, expectedBindAddress, receiverGroup));
+    vm4.invoke(
+        () -> createCacheWithServerBindAddress(dsIdPort, expectedBindAddress, receiverGroup));
+    vm5.invoke(
+        () -> createCacheWithServerBindAddress(dsIdPort, expectedBindAddress, receiverGroup));
+
+    String command =
+        CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.GROUP + "=" + receiverGroup;
+    executeCommandAndVerifyStatus(command, 3);
+
+    // verify server-bind-address used if provided as a gemfire property
+    vm3.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
+    vm4.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
+    vm5.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
+
+    vm3.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, expectedBindAddress));
+    vm4.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, expectedBindAddress));
+    vm5.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, expectedBindAddress));
+
+    vm3.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
+        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
+        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
+        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    vm4.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
+        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
+        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
+        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    vm5.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
+        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
+        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
+        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+  }
+
+  /**
+   * GatewayReceiver with all default attributes and server-bind-address in the gemfire properties
+   */
+  @Test
+  public void testCreateGatewayReceiverWithDefaultsAndMultipleBindAddressProperties()
+      throws Exception {
+    VM puneLocator = Host.getLocator();
+    int dsIdPort = puneLocator.invoke(this::getLocatorPort);
+    propsSetUp(dsIdPort);
+    vm2.invoke(() -> createFirstRemoteLocator(2, dsIdPort));
+
+    String extraBindAddress = "localhost";
+    String expectedBindAddress = getBindAddress();
+    String receiverGroup = "receiverGroup";
+
+    vm3.invoke(() -> createCacheWithMultipleBindAddressProperties(dsIdPort, extraBindAddress,
+        expectedBindAddress, receiverGroup));
+    vm4.invoke(() -> createCacheWithMultipleBindAddressProperties(dsIdPort, extraBindAddress,
+        expectedBindAddress, receiverGroup));
+    vm5.invoke(() -> createCacheWithMultipleBindAddressProperties(dsIdPort, extraBindAddress,
+        expectedBindAddress, receiverGroup));
+
+    String command =
+        CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.GROUP + "=" + receiverGroup;
+    executeCommandAndVerifyStatus(command, 3);
+
+    // verify server-bind-address used if provided as a gemfire property
+    vm3.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
+    vm4.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
+    vm5.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
 
+    vm3.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, expectedBindAddress));
+    vm4.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, expectedBindAddress));
+    vm5.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, expectedBindAddress));
+
+    vm3.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
+        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
+        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
+        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    vm4.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
+        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
+        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
+        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    vm5.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
+        GatewayReceiver.DEFAULT_START_PORT, GatewayReceiver.DEFAULT_END_PORT,
+        GatewayReceiver.DEFAULT_BIND_ADDRESS, GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS,
+        GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE, null,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+  }
+
+
+  /**
+   * GatewayReceiver with hostnameForSenders
+   */
+  @Test
+  public void testCreateGatewayReceiverWithHostnameForSendersAndServerBindAddressProperty()
+      throws Exception {
+    VM puneLocator = Host.getLocator();
+    int dsIdPort = puneLocator.invoke(this::getLocatorPort);
+    propsSetUp(dsIdPort);
+    vm2.invoke(() -> createFirstRemoteLocator(2, dsIdPort));
+
+    String hostnameForSenders = getHostName();
+    String serverBindAddress = getBindAddress();
+
+    String receiverGroup = "receiverGroup";
+    vm3.invoke(() -> createCacheWithServerBindAddress(dsIdPort, serverBindAddress, receiverGroup));
+    vm4.invoke(() -> createCacheWithServerBindAddress(dsIdPort, serverBindAddress, receiverGroup));
+    vm5.invoke(() -> createCacheWithServerBindAddress(dsIdPort, serverBindAddress, receiverGroup));
+
+    String command =
+        CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.CREATE_GATEWAYRECEIVER__MANUALSTART
+            + "=false" + " --" + CliStrings.CREATE_GATEWAYRECEIVER__HOSTNAMEFORSENDERS + "="
+            + hostnameForSenders + " --" + CliStrings.CREATE_GATEWAYRECEIVER__STARTPORT + "=10000"
+            + " --" + CliStrings.CREATE_GATEWAYRECEIVER__ENDPORT + "=11000" + " --"
+            + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
+            + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --"
+            + CliStrings.GROUP + "=" + receiverGroup;
+    executeCommandAndVerifyStatus(command, 3);
+
+    // verify server-bind-address takes precedence over hostname-for-senders
     vm3.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
     vm4.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
     vm5.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
@@ -198,6 +392,50 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
         null, hostnameForSenders));
   }
 
+  /**
+   * GatewayReceiver with hostnameForSenders
+   */
+  @Test
+  public void testCreateGatewayReceiverWithHostnameForSendersAndBindAddressProperty()
+      throws Exception {
+    VM puneLocator = Host.getLocator();
+    int dsIdPort = puneLocator.invoke(this::getLocatorPort);
+    propsSetUp(dsIdPort);
+    vm2.invoke(() -> createFirstRemoteLocator(2, dsIdPort));
+
+    String hostnameForSenders = getHostName();
+    String expectedBindAddress = getBindAddress();
+
+    String receiverGroup = "receiverGroup";
+    vm3.invoke(() -> createCacheWithBindAddress(dsIdPort, expectedBindAddress, receiverGroup));
+    vm4.invoke(() -> createCacheWithBindAddress(dsIdPort, expectedBindAddress, receiverGroup));
+    vm5.invoke(() -> createCacheWithBindAddress(dsIdPort, expectedBindAddress, receiverGroup));
+
+    String command =
+        CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.CREATE_GATEWAYRECEIVER__MANUALSTART
+            + "=false" + " --" + CliStrings.CREATE_GATEWAYRECEIVER__HOSTNAMEFORSENDERS + "="
+            + hostnameForSenders + " --" + CliStrings.CREATE_GATEWAYRECEIVER__STARTPORT + "=10000"
+            + " --" + CliStrings.CREATE_GATEWAYRECEIVER__ENDPORT + "=11000" + " --"
+            + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
+            + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --"
+            + CliStrings.GROUP + "=" + receiverGroup;
+    executeCommandAndVerifyStatus(command, 3);
+
+    vm3.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
+    vm4.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
+    vm5.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
+
+    vm3.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, hostnameForSenders));
+    vm4.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, hostnameForSenders));
+    vm5.invoke(() -> verifyGatewayReceiverServerLocations(dsIdPort, hostnameForSenders));
+
+    vm3.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000, 512000,
+        null, hostnameForSenders));
+    vm4.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000, 512000,
+        null, hostnameForSenders));
+    vm5.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000, 512000,
+        null, hostnameForSenders));
+  }
 
   /**
    * GatewayReceiver with given attributes and a single GatewayTransportFilter.
@@ -222,31 +460,16 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__GATEWAYTRANSPORTFILTER
             + "=org.apache.geode.cache30.MyGatewayTransportFilter1";
-    CommandResult cmdResult = executeCommand(command);
-    if (cmdResult != null) {
-      String strCmdResult = commandResultToString(cmdResult);
-      getLogWriter().info("testCreateGatewayReceiver stringResult : " + strCmdResult + ">>>>");
-      assertEquals(Result.Status.OK, cmdResult.getStatus());
-
-      TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-      List<String> status = resultData.retrieveAllValues("Status");
-      assertEquals(4, status.size());// expected size 4 includes the manager node
-      // verify there is no error in the status
-      for (String stat : status) {
-        assertTrue("GatewayReceiver creation failed with: " + stat, !stat.contains("ERROR:"));
-      }
-    } else {
-      fail("testCreateGatewayReceiver failed as did not get CommandResult");
-    }
+    executeCommandAndVerifyStatus(command, 4);
     List<String> transportFilters = new ArrayList<String>();
     transportFilters.add("org.apache.geode.cache30.MyGatewayTransportFilter1");
 
     vm3.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "localhost", 100000,
-        512000, transportFilters, "localhost"));
+        512000, transportFilters, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
     vm4.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "localhost", 100000,
-        512000, transportFilters, "localhost"));
+        512000, transportFilters, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
     vm5.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "localhost", 100000,
-        512000, transportFilters, "localhost"));
+        512000, transportFilters, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
   }
 
   /**
@@ -271,32 +494,20 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
         + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --"
         + CliStrings.CREATE_GATEWAYRECEIVER__GATEWAYTRANSPORTFILTER
         + "=org.apache.geode.cache30.MyGatewayTransportFilter1,org.apache.geode.cache30.MyGatewayTransportFilter2";
-    CommandResult cmdResult = executeCommand(command);
-    if (cmdResult != null) {
-      String strCmdResult = commandResultToString(cmdResult);
-      getLogWriter().info("testCreateGatewayReceiver stringResult : " + strCmdResult + ">>>>");
-      assertEquals(Result.Status.OK, cmdResult.getStatus());
-
-      TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-      List<String> status = resultData.retrieveAllValues("Status");
-      assertEquals(4, status.size());// expected size 4 includes the manager node
-      // verify there is no error in the status
-      for (String stat : status) {
-        assertTrue("GatewayReceiver creation failed with: " + stat, !stat.contains("ERROR:"));
-      }
-    } else {
-      fail("testCreateGatewayReceiver failed as did not get CommandResult");
-    }
+    executeCommandAndVerifyStatus(command, 4);
     List<String> transportFilters = new ArrayList<String>();
     transportFilters.add("org.apache.geode.cache30.MyGatewayTransportFilter1");
     transportFilters.add("org.apache.geode.cache30.MyGatewayTransportFilter2");
 
     vm3.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
-        10000, 11000, "localhost", 100000, 512000, transportFilters, "localhost"));
+        10000, 11000, "localhost", 100000, 512000, transportFilters,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
     vm4.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
-        10000, 11000, "localhost", 100000, 512000, transportFilters, "localhost"));
+        10000, 11000, "localhost", 100000, 512000, transportFilters,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
     vm5.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
-        10000, 11000, "localhost", 100000, 512000, transportFilters, "localhost"));
+        10000, 11000, "localhost", 100000, 512000, transportFilters,
+        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
   }
 
   /**
@@ -378,8 +589,11 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
     } else {
       fail("testCreateGatewayReceiver failed as did not get CommandResult");
     }
+
+    // cannot verify Profile/ServerLocation when manualStart is true
+
     vm3.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
   }
 
   /**
@@ -424,10 +638,13 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
     } else {
       fail("testCreateGatewayReceiver failed as did not get CommandResult");
     }
+
+    // cannot verify Profile/ServerLocation when manualStart is true
+
     vm3.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
     vm4.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
   }
 
   /**
@@ -469,12 +686,14 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
       fail("testCreateGatewayReceiver failed as did not get CommandResult");
     }
 
+    // cannot verify Profile/ServerLocation when manualStart is true
+
     vm3.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
     vm4.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
     vm5.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
   }
 
   /**
@@ -516,10 +735,13 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
     } else {
       fail("testCreateGatewayReceiver failed as did not get CommandResult");
     }
+
+    // cannot verify Profile/ServerLocation when manualStart is true
+
     vm3.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
     vm4.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
   }
 
   /**
@@ -560,11 +782,14 @@ public class CreateGatewayReceiverCommandDUnitTest extends WANCommandTestBase {
     } else {
       fail("testCreateGatewayReceiver failed as did not get CommandResult");
     }
+
+    // cannot verify Profile/ServerLocation when manualStart is true
+
     vm3.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
     vm4.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
     vm5.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000,
-        512000, null, "localhost"));
+        512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
   }
 }
diff --git a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/WANCommandTestBase.java b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/WANCommandTestBase.java
index eb5da71..f944064 100644
--- a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/WANCommandTestBase.java
+++ b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/wancommand/WANCommandTestBase.java
@@ -14,11 +14,13 @@
  */
 package org.apache.geode.internal.cache.wan.wancommand;
 
+import static org.apache.geode.distributed.ConfigurationProperties.BIND_ADDRESS;
 import static org.apache.geode.distributed.ConfigurationProperties.DISTRIBUTED_SYSTEM_ID;
 import static org.apache.geode.distributed.ConfigurationProperties.GROUPS;
 import static org.apache.geode.distributed.ConfigurationProperties.LOCATORS;
 import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
 import static org.apache.geode.distributed.ConfigurationProperties.REMOTE_LOCATORS;
+import static org.apache.geode.distributed.ConfigurationProperties.SERVER_BIND_ADDRESS;
 import static org.apache.geode.distributed.ConfigurationProperties.START_LOCATOR;
 import static org.apache.geode.test.dunit.Assert.assertEquals;
 import static org.apache.geode.test.dunit.Assert.fail;
@@ -60,6 +62,7 @@ import org.apache.geode.internal.cache.GemFireCacheImpl;
 import org.apache.geode.internal.cache.LocalRegion;
 import org.apache.geode.internal.cache.wan.AbstractGatewaySender;
 import org.apache.geode.internal.cache.wan.parallel.ParallelGatewaySenderQueue;
+import org.apache.geode.internal.net.SocketCreator;
 import org.apache.geode.management.ManagementService;
 import org.apache.geode.management.internal.cli.commands.CliCommandTestBase;
 import org.apache.geode.test.dunit.Host;
@@ -142,6 +145,38 @@ public abstract class WANCommandTestBase extends CliCommandTestBase {
     cache = CacheFactory.create(ds);
   }
 
+  public void createCacheWithBindAddress(Integer locPort, String bindAddress, String groups) {
+    Properties props = getDistributedSystemProperties();
+    props.setProperty(MCAST_PORT, "0");
+    props.setProperty(LOCATORS, "localhost[" + locPort + "]");
+    props.setProperty(BIND_ADDRESS, bindAddress);
+    props.setProperty(GROUPS, groups);
+    InternalDistributedSystem ds = getSystem(props);
+    cache = CacheFactory.create(ds);
+  }
+
+  public void createCacheWithServerBindAddress(Integer locPort, String bindAddress, String groups) {
+    Properties props = getDistributedSystemProperties();
+    props.setProperty(MCAST_PORT, "0");
+    props.setProperty(LOCATORS, "localhost[" + locPort + "]");
+    props.setProperty(SERVER_BIND_ADDRESS, bindAddress);
+    props.setProperty(GROUPS, groups);
+    InternalDistributedSystem ds = getSystem(props);
+    cache = CacheFactory.create(ds);
+  }
+
+  public void createCacheWithMultipleBindAddressProperties(Integer locPort, String bindAddress,
+      String serverBindAddress, String groups) {
+    Properties props = getDistributedSystemProperties();
+    props.setProperty(MCAST_PORT, "0");
+    props.setProperty(LOCATORS, "localhost[" + locPort + "]");
+    props.setProperty(BIND_ADDRESS, bindAddress);
+    props.setProperty(SERVER_BIND_ADDRESS, serverBindAddress);
+    props.setProperty(GROUPS, groups);
+    InternalDistributedSystem ds = getSystem(props);
+    cache = CacheFactory.create(ds);
+  }
+
   public void createSender(String dsName, int remoteDsId, boolean isParallel, Integer maxMemory,
       Integer batchSize, boolean isConflation, boolean isPersistent, GatewayEventFilter filter,
       boolean isManualStart) {
@@ -416,7 +451,7 @@ public abstract class WANCommandTestBase extends CliCommandTestBase {
     }
   }
 
-  protected void verifyGatewayReceiverServerLocations(int locatorPort, String hostname) {
+  protected void verifyGatewayReceiverServerLocations(int locatorPort, String expected) {
     PoolFactory pf = PoolManager.createFactory();
     pf.setServerGroup(GatewayReceiver.RECEIVER_GROUP);
     pf.addLocator("localhost", locatorPort);
@@ -424,17 +459,17 @@ public abstract class WANCommandTestBase extends CliCommandTestBase {
     ConnectionSource connectionSource = pool.getConnectionSource();
     List<ServerLocation> serverLocations = connectionSource.getAllServers();
     for (ServerLocation serverLocation : serverLocations) {
-      assertEquals(hostname, serverLocation.getHostName());
+      assertEquals(expected, serverLocation.getHostName());
     }
   }
 
-  protected void verifyGatewayReceiverProfile(String hostname) {
+  protected void verifyGatewayReceiverProfile(String expected) {
     Set<GatewayReceiver> receivers = ((Cache) this.cache).getGatewayReceivers();
     for (GatewayReceiver receiver : receivers) {
       CacheServerImpl server = (CacheServerImpl) receiver.getServer();
       CacheServerAdvisor.CacheServerProfile profile =
           (CacheServerAdvisor.CacheServerProfile) server.getProfile();
-      assertEquals(hostname, profile.getHost());
+      assertEquals(expected, profile.getHost());
     }
   }
 
@@ -452,7 +487,7 @@ public abstract class WANCommandTestBase extends CliCommandTestBase {
       assertEquals("maximumTimeBetweenPings", maxTimeBetweenPings,
           receiver.getMaximumTimeBetweenPings());
       assertEquals("socketBufferSize", socketBufferSize, receiver.getSocketBufferSize());
-      assertEquals("hostnameForSenders", hostnameForSenders, receiver.getHost());
+      assertEquals("hostnameForSenders", hostnameForSenders, receiver.getHostnameForSenders());
 
       // verify GatewayTransportFilters
       if (expectedGatewayTransportFilters != null) {

-- 
To stop receiving notification emails like this one, please contact
['"commits@geode.apache.org" <co...@geode.apache.org>'].