You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by bo...@apache.org on 2017/11/29 18:33:54 UTC

[geode] branch develop updated: GEODE-3987: enforce GatewayReceiver uniqueness per member

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

boglesby 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 ba8f963  GEODE-3987: enforce GatewayReceiver uniqueness per member
ba8f963 is described below

commit ba8f963c2f66c59d419ded26c729dfea91d27315
Author: Juan José Ramos <ju...@users.noreply.github.com>
AuthorDate: Wed Nov 29 18:33:51 2017 +0000

    GEODE-3987: enforce GatewayReceiver uniqueness per member
    
    * GEODE-3987: enforce GatewayReceiver uniqueness per member.
    
    Enforcements added in the different creation entry points to prevent
    the existence of more than one gateway receiver per member.
    
    - Added several XML parsing tests.
    - Added integration and Junit tests.
    - DTD allows 0 or 1 occurrences of the <gateway-receiver> element.
    - XSD allows 0 or 1 occurrences of the <gateway-receiver> element.
    - GatewayReceiverFactory checks before creating new gateway receiver.
    - Existing tests modified to use new MemberVM/GfshCommandRule features.
    
    * GEODE-3987: enforce GatewayReceiver uniqueness per member.
    
    Changes requested by reviewers have been incorporated.
---
 .../geode.apache.org/schema/cache/cache-1.0.xsd    |   2 +-
 .../org/apache/geode/cache/doc-files/cache8_0.dtd  |   2 +-
 ...ewayReceiverXmlParsingValidationsJUnitTest.java | 111 +++
 ...nsJUnitTest.correctConfiguration[DTD].cache.xml |  26 +
 ...nsJUnitTest.correctConfiguration[XSD].cache.xml |  27 +
 ...pleReceiversShouldThrowException[DTD].cache.xml |  27 +
 ...pleReceiversShouldThrowException[XSD].cache.xml |  28 +
 .../cache/wan/GatewayReceiverFactoryImpl.java      |   6 +
 .../wan/GatewayReceiverFactoryImplJUnitTest.java   | 136 ++++
 .../CreateGatewayReceiverCommandDUnitTest.java     | 784 +++++++++------------
 10 files changed, 681 insertions(+), 468 deletions(-)

diff --git a/geode-core/src/main/resources/META-INF/schemas/geode.apache.org/schema/cache/cache-1.0.xsd b/geode-core/src/main/resources/META-INF/schemas/geode.apache.org/schema/cache/cache-1.0.xsd
index f212490..a8a65de 100755
--- a/geode-core/src/main/resources/META-INF/schemas/geode.apache.org/schema/cache/cache-1.0.xsd
+++ b/geode-core/src/main/resources/META-INF/schemas/geode.apache.org/schema/cache/cache-1.0.xsd
@@ -205,7 +205,7 @@ declarative caching XML file elements unless indicated otherwise.
           </xsd:complexType>
         </xsd:element>
 
-        <xsd:element maxOccurs="unbounded" minOccurs="0" name="gateway-receiver">
+        <xsd:element maxOccurs="1" minOccurs="0" name="gateway-receiver">
           <xsd:complexType>
             <xsd:sequence>
               <xsd:element maxOccurs="unbounded" minOccurs="0" name="gateway-transport-filter" type="gf:class-with-parameters-type" />
diff --git a/geode-core/src/main/resources/org/apache/geode/cache/doc-files/cache8_0.dtd b/geode-core/src/main/resources/org/apache/geode/cache/doc-files/cache8_0.dtd
index f02c6b0..a28a17f 100644
--- a/geode-core/src/main/resources/org/apache/geode/cache/doc-files/cache8_0.dtd
+++ b/geode-core/src/main/resources/org/apache/geode/cache/doc-files/cache8_0.dtd
@@ -144,7 +144,7 @@ contains, if any.
     dynamic-region-factory?,
     gateway-hub*,
     gateway-sender*,
-    gateway-receiver*,
+    gateway-receiver?,
     gateway-conflict-resolver?,
     async-event-queue*,
     cache-server*,
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.java
new file mode 100644
index 0000000..989ef54
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.apache.geode.distributed.ConfigurationProperties.CACHE_XML_FILE;
+import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.powermock.api.mockito.PowerMockito.mockStatic;
+import static org.powermock.api.mockito.PowerMockito.when;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.powermock.core.classloader.annotations.PowerMockIgnore;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.powermock.modules.junit4.PowerMockRunnerDelegate;
+
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.CacheFactory;
+import org.apache.geode.cache.CacheXmlException;
+import org.apache.geode.cache.wan.GatewayReceiverFactory;
+import org.apache.geode.test.junit.categories.IntegrationTest;
+import org.apache.geode.test.junit.rules.serializable.SerializableTestName;
+import org.apache.geode.util.test.TestUtil;
+
+@RunWith(PowerMockRunner.class)
+@Category(IntegrationTest.class)
+@PrepareForTest(WANServiceProvider.class)
+@PowerMockRunnerDelegate(Parameterized.class)
+@PowerMockIgnore({"javax.management.*", "javax.security.*", "*.IntegrationTest"})
+public class GatewayReceiverXmlParsingValidationsJUnitTest {
+  private Cache cache;
+  private GatewayReceiverFactory receiverFactory;
+
+  @Parameterized.Parameter
+  public static String validationStrategy;
+
+  @Rule
+  public TestName testName = new SerializableTestName();
+
+  @Parameterized.Parameters(name = "{0}")
+  public static Collection<String> strategies() throws Exception {
+    return Arrays.asList("DTD", "XSD");
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    mockStatic(WANServiceProvider.class);
+    receiverFactory = spy(GatewayReceiverFactory.class);
+    when(WANServiceProvider.createGatewayReceiverFactory(any())).thenReturn(receiverFactory);
+  }
+
+  @Test(expected = CacheXmlException.class)
+  public void multipleReceiversShouldThrowException() {
+    String cacheXmlFileName = TestUtil.getResourcePath(getClass(),
+        getClass().getSimpleName() + "." + testName.getMethodName() + ".cache.xml");
+    cache = new CacheFactory().set(MCAST_PORT, "0").set(CACHE_XML_FILE, cacheXmlFileName).create();
+  }
+
+  @Test
+  public void correctConfiguration() {
+    String cacheXmlFileName = TestUtil.getResourcePath(getClass(),
+        getClass().getSimpleName() + "." + testName.getMethodName() + ".cache.xml");
+    cache = new CacheFactory().set(MCAST_PORT, "0").set(CACHE_XML_FILE, cacheXmlFileName).create();
+
+    assertThat(cache.getGatewayReceivers()).isNotNull();
+    verify(receiverFactory, times(1)).setEndPort(1501);
+    verify(receiverFactory, times(1)).setStartPort(1500);
+    verify(receiverFactory, times(1)).setManualStart(true);
+    verify(receiverFactory, times(1)).setSocketBufferSize(32768);
+    verify(receiverFactory, times(1)).setBindAddress("localhost");
+    verify(receiverFactory, times(1)).setHostnameForSenders("localhost");
+    verify(receiverFactory, times(1)).setMaximumTimeBetweenPings(60000);
+    verify(receiverFactory, times(1)).create();
+  }
+
+  @After
+  public void tearDown() {
+    if (cache != null) {
+      cache.close();
+    }
+  }
+}
diff --git a/geode-core/src/test/resources/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.correctConfiguration[DTD].cache.xml b/geode-core/src/test/resources/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.correctConfiguration[DTD].cache.xml
new file mode 100755
index 0000000..3ea3edf
--- /dev/null
+++ b/geode-core/src/test/resources/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.correctConfiguration[DTD].cache.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  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.
+-->
+
+<!DOCTYPE cache PUBLIC
+        "-//GemStone Systems, Inc.//GemFire Declarative Caching 8.0//EN"
+        "http://www.gemstone.com/dtd/cache8_0.dtd">
+<cache>
+  <gateway-receiver start-port="1500" end-port="1501" manual-start="true" bind-address="localhost" hostname-for-senders="localhost" maximum-time-between-pings="60000" socket-buffer-size="32768"/>
+</cache>
+
diff --git a/geode-core/src/test/resources/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.correctConfiguration[XSD].cache.xml b/geode-core/src/test/resources/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.correctConfiguration[XSD].cache.xml
new file mode 100755
index 0000000..f2cc41b
--- /dev/null
+++ b/geode-core/src/test/resources/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.correctConfiguration[XSD].cache.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  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.
+-->
+
+<cache
+        xmlns="http://geode.apache.org/schema/cache"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://geode.apache.org/schema/cache http://geode.apache.org/schema/cache/cache-1.0.xsd"
+        version="1.0">
+
+    <gateway-receiver start-port="1500" end-port="1501" manual-start="true" bind-address="localhost" hostname-for-senders="localhost" maximum-time-between-pings="60000" socket-buffer-size="32768"/>
+</cache>
diff --git a/geode-core/src/test/resources/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.multipleReceiversShouldThrowException[DTD].cache.xml b/geode-core/src/test/resources/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.multipleReceiversShouldThrowException[DTD].cache.xml
new file mode 100755
index 0000000..1bc5ce0
--- /dev/null
+++ b/geode-core/src/test/resources/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.multipleReceiversShouldThrowException[DTD].cache.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  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.
+-->
+
+<!DOCTYPE cache PUBLIC
+        "-//GemStone Systems, Inc.//GemFire Declarative Caching 8.0//EN"
+        "http://www.gemstone.com/dtd/cache8_0.dtd">
+<cache>
+  <gateway-receiver start-port="1500" end-port="1501"/>
+  <gateway-receiver start-port="2500" end-port="2501"/>
+</cache>
+
diff --git a/geode-core/src/test/resources/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.multipleReceiversShouldThrowException[XSD].cache.xml b/geode-core/src/test/resources/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.multipleReceiversShouldThrowException[XSD].cache.xml
new file mode 100755
index 0000000..8b0fac8
--- /dev/null
+++ b/geode-core/src/test/resources/org/apache/geode/internal/cache/wan/GatewayReceiverXmlParsingValidationsJUnitTest.multipleReceiversShouldThrowException[XSD].cache.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  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.
+-->
+
+<cache
+        xmlns="http://geode.apache.org/schema/cache"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="http://geode.apache.org/schema/cache http://geode.apache.org/schema/cache/cache-1.0.xsd"
+        version="1.0">
+
+    <gateway-receiver start-port="1500" end-port="1501"/>
+    <gateway-receiver start-port="2500" end-port="2501"/>
+</cache>
diff --git a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewayReceiverFactoryImpl.java b/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewayReceiverFactoryImpl.java
index a5c09d3..be2aeff 100644
--- a/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewayReceiverFactoryImpl.java
+++ b/geode-wan/src/main/java/org/apache/geode/internal/cache/wan/GatewayReceiverFactoryImpl.java
@@ -110,6 +110,12 @@ public class GatewayReceiverFactoryImpl implements GatewayReceiverFactory {
       throw new IllegalStateException(
           "Please specify either start port a value which is less than end port.");
     }
+
+    if ((this.cache.getGatewayReceivers() != null)
+        && (!this.cache.getGatewayReceivers().isEmpty())) {
+      throw new IllegalStateException("A Gateway Receiver already exists on this member.");
+    }
+
     GatewayReceiver recv = null;
     if (this.cache instanceof GemFireCacheImpl) {
       recv = new GatewayReceiverImpl(this.cache, this.startPort, this.endPort, this.timeBetPings,
diff --git a/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewayReceiverFactoryImplJUnitTest.java b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewayReceiverFactoryImplJUnitTest.java
new file mode 100644
index 0000000..7b88477
--- /dev/null
+++ b/geode-wan/src/test/java/org/apache/geode/internal/cache/wan/GatewayReceiverFactoryImplJUnitTest.java
@@ -0,0 +1,136 @@
+/*
+ * 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.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import org.apache.geode.cache.wan.GatewayReceiver;
+import org.apache.geode.cache.wan.GatewayTransportFilter;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.internal.cache.GemFireCacheImpl;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.cache.xmlcache.CacheCreation;
+import org.apache.geode.test.junit.categories.UnitTest;
+
+@Category(UnitTest.class)
+@RunWith(Parameterized.class)
+public class GatewayReceiverFactoryImplJUnitTest {
+  @Parameterized.Parameter
+  public static InternalCache cache;
+  private GatewayReceiverFactoryImpl gatewayReceiverFactory;
+
+  @Parameterized.Parameters(name = "{0}")
+  public static Collection<InternalCache> cacheTypes() throws Exception {
+    InternalCache gemfireCacheImpl = spy(mock(GemFireCacheImpl.class, "GemFireCacheImpl"));
+    when(gemfireCacheImpl.getDistributedSystem()).thenReturn(mock(InternalDistributedSystem.class));
+
+    InternalCache declarativeCacheImpl = spy(mock(CacheCreation.class, "CacheCreation"));
+
+    return Arrays.asList(new InternalCache[] {gemfireCacheImpl, declarativeCacheImpl});
+  }
+
+  @Before
+  public void setUp() {
+    gatewayReceiverFactory = spy(new GatewayReceiverFactoryImpl(cache));
+    gatewayReceiverFactory.setManualStart(true);
+  }
+
+  @Test
+  public void createWithDefaultAttributes() {
+    GatewayReceiver receiver = gatewayReceiverFactory.create();
+
+    assertThat(receiver.isManualStart()).isTrue();
+    assertThat(receiver.getGatewayTransportFilters()).isEmpty();
+    assertThat(receiver.getEndPort()).isEqualTo(GatewayReceiver.DEFAULT_END_PORT);
+    assertThat(receiver.getStartPort()).isEqualTo(GatewayReceiver.DEFAULT_START_PORT);
+    assertThat(receiver.getBindAddress()).isEqualTo(GatewayReceiver.DEFAULT_BIND_ADDRESS);
+    assertThat(receiver.getSocketBufferSize())
+        .isEqualTo(GatewayReceiver.DEFAULT_SOCKET_BUFFER_SIZE);
+    assertThat(receiver.getHostnameForSenders())
+        .isEqualTo(GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS);
+    assertThat(receiver.getMaximumTimeBetweenPings())
+        .isEqualTo(GatewayReceiver.DEFAULT_MAXIMUM_TIME_BETWEEN_PINGS);
+
+    verify(cache, times(1)).addGatewayReceiver(receiver);
+  }
+
+  @Test
+  public void createWithCustomAttributes() {
+    int endPort = 2500;
+    int startPort = 1500;
+    int socketBufferSize = 128;
+    int timeoutBetweenPings = 1;
+    String bindAddress = "kaos";
+    String hostnameForSenders = "kaos.com";
+    GatewayTransportFilter gatewayTransportFilter = mock(GatewayTransportFilter.class);
+
+    gatewayReceiverFactory.setEndPort(endPort);
+    gatewayReceiverFactory.setStartPort(startPort);
+    gatewayReceiverFactory.setBindAddress(bindAddress);
+    gatewayReceiverFactory.setSocketBufferSize(socketBufferSize);
+    gatewayReceiverFactory.setHostnameForSenders(hostnameForSenders);
+    gatewayReceiverFactory.setMaximumTimeBetweenPings(timeoutBetweenPings);
+    gatewayReceiverFactory.addGatewayTransportFilter(gatewayTransportFilter);
+    GatewayReceiver receiver = gatewayReceiverFactory.create();
+
+    assertThat(receiver.isManualStart()).isTrue();
+    assertThat(receiver.getEndPort()).isEqualTo(endPort);
+    assertThat(receiver.getStartPort()).isEqualTo(startPort);
+    assertThat(receiver.getBindAddress()).isEqualTo(bindAddress);
+    assertThat(receiver.getGatewayTransportFilters()).isNotEmpty();
+    assertThat(receiver.getSocketBufferSize()).isEqualTo(socketBufferSize);
+    assertThat(receiver.getHostnameForSenders()).isEqualTo(hostnameForSenders);
+    assertThat(receiver.getMaximumTimeBetweenPings()).isEqualTo(timeoutBetweenPings);
+    assertThat(receiver.getGatewayTransportFilters()).contains(gatewayTransportFilter);
+
+    verify(cache, times(1)).addGatewayReceiver(receiver);
+  }
+
+  @Test(expected = IllegalStateException.class)
+  public void createShouldThrowExceptionWhenPortRangeIsInvalid() {
+    gatewayReceiverFactory.setEndPort(1400);
+    gatewayReceiverFactory.setStartPort(1500);
+    gatewayReceiverFactory.create();
+
+    fail("Exception should have been thrown: endPort < startPort.");
+  }
+
+  @Test(expected = IllegalStateException.class)
+  public void createShouldThrownExceptionWhenGatewayReceiverAlreadyExists() {
+    Set mockReceivers = new HashSet();
+    mockReceivers.add(mock(GatewayReceiver.class));
+    when(cache.getGatewayReceivers()).thenReturn(mockReceivers);
+    gatewayReceiverFactory.create();
+
+    fail("Exception should have been thrown: a GatewayReceiver already exists on this cache.");
+  }
+}
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 d8d7fde..c9c6754 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
@@ -17,17 +17,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.REMOTE_LOCATORS;
 import static org.apache.geode.distributed.ConfigurationProperties.SERVER_BIND_ADDRESS;
 import static org.apache.geode.internal.cache.wan.wancommand.WANCommandUtils.getMemberIdCallable;
 import static org.apache.geode.internal.cache.wan.wancommand.WANCommandUtils.verifyGatewayReceiverProfile;
 import static org.apache.geode.internal.cache.wan.wancommand.WANCommandUtils.verifyGatewayReceiverServerLocations;
 import static org.apache.geode.internal.cache.wan.wancommand.WANCommandUtils.verifyReceiverCreationWithAttributes;
 import static org.apache.geode.management.internal.cli.i18n.CliStrings.GROUP;
-import static org.apache.geode.test.dunit.Assert.assertEquals;
-import static org.apache.geode.test.dunit.Assert.assertTrue;
-import static org.apache.geode.test.dunit.Assert.fail;
-import static org.apache.geode.test.dunit.LogWriterUtils.getLogWriter;
+import static org.assertj.core.api.Assertions.assertThat;
 
 import java.net.InetAddress;
 import java.util.ArrayList;
@@ -39,13 +35,11 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
+import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.wan.GatewayReceiver;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.internal.net.SocketCreator;
-import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.CommandResult;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
 import org.apache.geode.test.dunit.rules.LocatorServerStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.categories.DistributedTest;
@@ -56,8 +50,8 @@ import org.apache.geode.test.junit.rules.GfshCommandRule;
  */
 @Category(DistributedTest.class)
 public class CreateGatewayReceiverCommandDUnitTest {
-
-  private static final long serialVersionUID = 1L;
+  private MemberVM locatorSite1;
+  private MemberVM server1, server2, server3;
 
   @Rule
   public LocatorServerStartupRule locatorServerStartupRule = new LocatorServerStartupRule();
@@ -65,97 +59,126 @@ public class CreateGatewayReceiverCommandDUnitTest {
   @Rule
   public GfshCommandRule gfsh = new GfshCommandRule();
 
-  private MemberVM locatorSite1;
-  private MemberVM locatorSite2;
-  private MemberVM server1;
-  private MemberVM server2;
-  private MemberVM server3;
-
   @Before
   public void before() throws Exception {
     Properties props = new Properties();
     props.setProperty(DISTRIBUTED_SYSTEM_ID, "" + 1);
     locatorSite1 = locatorServerStartupRule.startLocatorVM(1, props);
 
-    props.setProperty(DISTRIBUTED_SYSTEM_ID, "" + 2);
-    props.setProperty(REMOTE_LOCATORS, "localhost[" + locatorSite1.getPort() + "]");
-    locatorSite2 = locatorServerStartupRule.startLocatorVM(2, props);
-
     // Connect Gfsh to locator.
     gfsh.connectAndVerify(locatorSite1);
   }
 
+  private String getHostName() throws Exception {
+    return SocketCreator.getLocalHost().getCanonicalHostName();
+  }
+
+  private String getBindAddress() throws Exception {
+    return InetAddress.getLocalHost().getHostAddress();
+  }
+
+  private MemberVM startServerWithGroups(int index, String groups, int locPort) throws Exception {
+    Properties props = new Properties();
+    props.setProperty(GROUPS, groups);
+    return locatorServerStartupRule.startServerVM(index, props, locPort);
+  }
+
   /**
-   * GatewayReceiver with all default attributes
+   * GatewayReceiver with given attributes. Error scenario where startPort is greater than endPort.
    */
   @Test
-  public void testCreateGatewayReceiverWithDefault() throws Exception {
+  public void testCreateGatewayReceiverErrorOnInvalidPortRange() throws Exception {
+    Integer locator1Port = locatorSite1.getPort();
+    server1 = locatorServerStartupRule.startServerVM(3, locator1Port);
+    server2 = locatorServerStartupRule.startServerVM(4, locator1Port);
+    server3 = locatorServerStartupRule.startServerVM(5, locator1Port);
 
+    String command =
+        CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.CREATE_GATEWAYRECEIVER__BINDADDRESS
+            + "=localhost" + " --" + CliStrings.CREATE_GATEWAYRECEIVER__STARTPORT + "=11000" + " --"
+            + CliStrings.CREATE_GATEWAYRECEIVER__ENDPORT + "=10000" + " --"
+            + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
+            + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000";
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithExactValuesInAnyOrder("Status",
+            "ERROR: Please specify either start port a value which is less than end port.",
+            "ERROR: Please specify either start port a value which is less than end port.",
+            "ERROR: Please specify either start port a value which is less than end port.");
+  }
+
+  /**
+   * GatewayReceiver with given attributes. Error scenario where the user tries to create more than
+   * one receiver per member.
+   */
+  @Test
+  public void testCreateGatewayReceiverErrorWhenGatewayReceiverAlreadyExists() throws Exception {
     Integer locator1Port = locatorSite1.getPort();
+    server1 = locatorServerStartupRule.startServerVM(3, locator1Port);
+    server2 = locatorServerStartupRule.startServerVM(4, locator1Port);
+    server3 = locatorServerStartupRule.startServerVM(5, locator1Port);
+
+    // Initial Creation should succeed
+    String command =
+        CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.CREATE_GATEWAYRECEIVER__BINDADDRESS
+            + "=localhost" + " --" + CliStrings.CREATE_GATEWAYRECEIVER__STARTPORT + "=10000" + " --"
+            + CliStrings.CREATE_GATEWAYRECEIVER__ENDPORT + "=11000" + " --"
+            + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
+            + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000";
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START, 10000, 11000,
+          "localhost", 100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS);
+    }, server1, server2, server3);
+
+    // This should fail as there's already a gateway receiver created on the member.
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithExactValuesInAnyOrder("Status",
+            "ERROR: A Gateway Receiver already exists on this member.",
+            "ERROR: A Gateway Receiver already exists on this member.",
+            "ERROR: A Gateway Receiver already exists on this member.");
+  }
 
-    // setup servers in Site #1
+  /**
+   * GatewayReceiver with all default attributes
+   */
+  @Test
+  public void testCreateGatewayReceiverWithDefault() throws Exception {
+    Integer locator1Port = locatorSite1.getPort();
     server1 = locatorServerStartupRule.startServerVM(3, locator1Port);
     server2 = locatorServerStartupRule.startServerVM(4, locator1Port);
     server3 = locatorServerStartupRule.startServerVM(5, locator1Port);
 
+    // Default attributes.
     String command = CliStrings.CREATE_GATEWAYRECEIVER;
-    executeCommandAndVerifyStatus(command, 3);
-
-    // if neither bind-address or hostname-for-senders is set, profile
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    // 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();
 
-    server1.invoke(() -> verifyGatewayReceiverProfile(hostname));
-    server2.invoke(() -> verifyGatewayReceiverProfile(hostname));
-    server3.invoke(() -> verifyGatewayReceiverProfile(hostname));
-
-    server1.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, hostname));
-    server2.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, hostname));
-    server3.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, hostname));
-
-    server1.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));
-    server2.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));
-    server3.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 = gfsh.executeCommand(command);
-    if (cmdResult != null) {
-      String strCmdResult = cmdResult.toString();
-      getLogWriter().info("testCreateGatewayReceiver stringResult : " + strCmdResult + ">>>>");
-      assertEquals(Result.Status.OK, cmdResult.getStatus());
-
-      TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-      List<String> status = resultData.retrieveAllValues("Status");
-      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:"));
-      }
-    } else {
-      fail("testCreateGatewayReceiver failed as did not get CommandResult");
-    }
+    MemberVM.invokeInEveryMember(() -> {
+      verifyGatewayReceiverProfile(hostname);
+      verifyGatewayReceiverServerLocations(locator1Port, hostname);
+      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);
+    }, server1, server2, server3);
   }
 
   /**
@@ -163,10 +186,7 @@ public class CreateGatewayReceiverCommandDUnitTest {
    */
   @Test
   public void testCreateGatewayReceiver() throws Exception {
-
     Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
     server1 = locatorServerStartupRule.startServerVM(3, locator1Port);
     server2 = locatorServerStartupRule.startServerVM(4, locator1Port);
     server3 = locatorServerStartupRule.startServerVM(5, locator1Port);
@@ -178,16 +198,17 @@ public class CreateGatewayReceiverCommandDUnitTest {
             + CliStrings.CREATE_GATEWAYRECEIVER__ENDPORT + "=11000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000";
-    executeCommandAndVerifyStatus(command, 3);
-
-    // cannot verify Profile/ServerLocation when manualStart is true
-
-    server1.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-    server2.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-    server3.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000, 512000, null,
+          GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS);
+    }, server1, server2, server3);
   }
 
   /**
@@ -195,10 +216,7 @@ public class CreateGatewayReceiverCommandDUnitTest {
    */
   @Test
   public void testCreateGatewayReceiverWithHostnameForSenders() throws Exception {
-
     Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
     server1 = locatorServerStartupRule.startServerVM(3, locator1Port);
     server2 = locatorServerStartupRule.startServerVM(4, locator1Port);
     server3 = locatorServerStartupRule.startServerVM(5, locator1Port);
@@ -211,23 +229,20 @@ public class CreateGatewayReceiverCommandDUnitTest {
             + " --" + CliStrings.CREATE_GATEWAYRECEIVER__ENDPORT + "=11000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000";
-    executeCommandAndVerifyStatus(command, 3);
-
-    // verify hostname-for-senders is used when configured
-    server1.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
-    server2.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
-    server3.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
-
-    server1.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, hostnameForSenders));
-    server2.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, hostnameForSenders));
-    server3.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, hostnameForSenders));
-
-    server1.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000,
-        512000, null, hostnameForSenders));
-    server2.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000,
-        512000, null, hostnameForSenders));
-    server3.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000,
-        512000, null, hostnameForSenders));
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      // verify hostname-for-senders is used when configured
+      verifyGatewayReceiverProfile(hostnameForSenders);
+      verifyGatewayReceiverServerLocations(locator1Port, hostnameForSenders);
+      verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000, 512000, null,
+          hostnameForSenders);
+    }, server1, server2, server3);
   }
 
   /**
@@ -235,48 +250,36 @@ public class CreateGatewayReceiverCommandDUnitTest {
    */
   @Test
   public void testCreateGatewayReceiverWithDefaultAndBindProperty() throws Exception {
-
+    String receiverGroup = "receiverGroup";
     Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
     String expectedBindAddress = getBindAddress();
-    String receiverGroup = "receiverGroup";
 
     Properties props = new Properties();
-    props.setProperty(BIND_ADDRESS, expectedBindAddress);
     props.setProperty(GROUPS, receiverGroup);
+    props.setProperty(BIND_ADDRESS, expectedBindAddress);
 
     server1 = locatorServerStartupRule.startServerVM(3, props, locator1Port);
     server2 = locatorServerStartupRule.startServerVM(4, props, locator1Port);
     server3 = locatorServerStartupRule.startServerVM(5, props, locator1Port);
 
     String command = CliStrings.CREATE_GATEWAYRECEIVER + " --" + GROUP + "=" + receiverGroup;
-    executeCommandAndVerifyStatus(command, 3);
-
-    // verify bind-address used when provided as a gemfire property
-    server1.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
-    server2.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
-    server3.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
-
-    server1.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, expectedBindAddress));
-    server2.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, expectedBindAddress));
-    server3.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, expectedBindAddress));
-
-    server1.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));
-    server2.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));
-    server3.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));
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      // verify bind-address used when provided as a gemfire property
+      verifyGatewayReceiverProfile(expectedBindAddress);
+      verifyGatewayReceiverServerLocations(locator1Port, expectedBindAddress);
+      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);
+    }, server1, server2, server3);
   }
 
   /**
@@ -284,48 +287,36 @@ public class CreateGatewayReceiverCommandDUnitTest {
    */
   @Test
   public void testCreateGatewayReceiverWithDefaultsAndServerBindAddressProperty() throws Exception {
-
+    String receiverGroup = "receiverGroup";
     Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
     String expectedBindAddress = getBindAddress();
-    String receiverGroup = "receiverGroup";
 
     Properties props = new Properties();
-    props.setProperty(SERVER_BIND_ADDRESS, expectedBindAddress);
     props.setProperty(GROUPS, receiverGroup);
+    props.setProperty(SERVER_BIND_ADDRESS, expectedBindAddress);
 
     server1 = locatorServerStartupRule.startServerVM(3, props, locator1Port);
     server2 = locatorServerStartupRule.startServerVM(4, props, locator1Port);
     server3 = locatorServerStartupRule.startServerVM(5, props, locator1Port);
 
     String command = CliStrings.CREATE_GATEWAYRECEIVER + " --" + GROUP + "=" + receiverGroup;
-    executeCommandAndVerifyStatus(command, 3);
-
-    // verify server-bind-address used if provided as a gemfire property
-    server1.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
-    server2.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
-    server3.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
-
-    server1.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, expectedBindAddress));
-    server2.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, expectedBindAddress));
-    server3.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, expectedBindAddress));
-
-    server1.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));
-    server2.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));
-    server3.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));
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      // verify server-bind-address used if provided as a gemfire property
+      verifyGatewayReceiverProfile(expectedBindAddress);
+      verifyGatewayReceiverServerLocations(locator1Port, expectedBindAddress);
+      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);
+    }, server1, server2, server3);
   }
 
   /**
@@ -334,74 +325,59 @@ public class CreateGatewayReceiverCommandDUnitTest {
   @Test
   public void testCreateGatewayReceiverWithDefaultsAndMultipleBindAddressProperties()
       throws Exception {
-
-    Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
     String extraBindAddress = "localhost";
-    String expectedBindAddress = getBindAddress();
     String receiverGroup = "receiverGroup";
+    Integer locator1Port = locatorSite1.getPort();
+    String expectedBindAddress = getBindAddress();
 
     Properties props = new Properties();
+    props.setProperty(GROUPS, receiverGroup);
     props.setProperty(BIND_ADDRESS, extraBindAddress);
     props.setProperty(SERVER_BIND_ADDRESS, expectedBindAddress);
-    props.setProperty(GROUPS, receiverGroup);
 
     server1 = locatorServerStartupRule.startServerVM(3, props, locator1Port);
     server2 = locatorServerStartupRule.startServerVM(4, props, locator1Port);
     server3 = locatorServerStartupRule.startServerVM(5, props, locator1Port);
 
     String command = CliStrings.CREATE_GATEWAYRECEIVER + " --" + GROUP + "=" + receiverGroup;
-    executeCommandAndVerifyStatus(command, 3);
-
-    // verify server-bind-address used if provided as a gemfire property
-    server1.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
-    server2.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
-    server3.invoke(() -> verifyGatewayReceiverProfile(expectedBindAddress));
-
-    server1.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, expectedBindAddress));
-    server2.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, expectedBindAddress));
-    server3.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, expectedBindAddress));
-
-    server1.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));
-    server2.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));
-    server3.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));
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      // verify server-bind-address used if provided as a gemfire property
+      verifyGatewayReceiverProfile(expectedBindAddress);
+      verifyGatewayReceiverServerLocations(locator1Port, expectedBindAddress);
+      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);
+    }, server1, server2, server3);
   }
 
-
   /**
    * GatewayReceiver with hostnameForSenders
    */
   @Test
   public void testCreateGatewayReceiverWithHostnameForSendersAndServerBindAddressProperty()
       throws Exception {
-
+    String receiverGroup = "receiverGroup";
+    String hostnameForSenders = getHostName();
+    String serverBindAddress = getBindAddress();
     Integer locator1Port = locatorSite1.getPort();
 
-    // setup servers in Site #1
     Properties props = new Properties();
-    String serverBindAddress = getBindAddress();
-    String receiverGroup = "receiverGroup";
-    props.setProperty(SERVER_BIND_ADDRESS, serverBindAddress);
     props.setProperty(GROUPS, receiverGroup);
+    props.setProperty(SERVER_BIND_ADDRESS, serverBindAddress);
 
     server1 = locatorServerStartupRule.startServerVM(3, props, locator1Port);
     server2 = locatorServerStartupRule.startServerVM(4, props, locator1Port);
     server3 = locatorServerStartupRule.startServerVM(5, props, locator1Port);
 
-    String hostnameForSenders = getHostName();
     String command =
         CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.CREATE_GATEWAYRECEIVER__MANUALSTART
             + "=false" + " --" + CliStrings.CREATE_GATEWAYRECEIVER__HOSTNAMEFORSENDERS + "="
@@ -410,23 +386,20 @@ public class CreateGatewayReceiverCommandDUnitTest {
             + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --" + GROUP + "="
             + receiverGroup;
-    executeCommandAndVerifyStatus(command, 3);
-
-    // verify server-bind-address takes precedence over hostname-for-senders
-    server1.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
-    server2.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
-    server3.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
-
-    server1.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, hostnameForSenders));
-    server2.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, hostnameForSenders));
-    server3.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, hostnameForSenders));
-
-    server1.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000,
-        512000, null, hostnameForSenders));
-    server2.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000,
-        512000, null, hostnameForSenders));
-    server3.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000,
-        512000, null, hostnameForSenders));
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      // verify server-bind-address takes precedence over hostname-for-senders
+      verifyGatewayReceiverProfile(hostnameForSenders);
+      verifyGatewayReceiverServerLocations(locator1Port, hostnameForSenders);
+      verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000, 512000, null,
+          hostnameForSenders);
+    }, server1, server2, server3);
   }
 
   /**
@@ -435,21 +408,19 @@ public class CreateGatewayReceiverCommandDUnitTest {
   @Test
   public void testCreateGatewayReceiverWithHostnameForSendersAndBindAddressProperty()
       throws Exception {
-
+    String receiverGroup = "receiverGroup";
+    String hostnameForSenders = getHostName();
     Integer locator1Port = locatorSite1.getPort();
+    String expectedBindAddress = getBindAddress();
 
-    // setup servers in Site #1
     Properties props = new Properties();
-    String expectedBindAddress = getBindAddress();
-    String receiverGroup = "receiverGroup";
-    props.setProperty(BIND_ADDRESS, expectedBindAddress);
     props.setProperty(GROUPS, receiverGroup);
+    props.setProperty(BIND_ADDRESS, expectedBindAddress);
 
     server1 = locatorServerStartupRule.startServerVM(3, props, locator1Port);
     server2 = locatorServerStartupRule.startServerVM(4, props, locator1Port);
     server3 = locatorServerStartupRule.startServerVM(5, props, locator1Port);
 
-    String hostnameForSenders = getHostName();
     String command =
         CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.CREATE_GATEWAYRECEIVER__MANUALSTART
             + "=false" + " --" + CliStrings.CREATE_GATEWAYRECEIVER__HOSTNAMEFORSENDERS + "="
@@ -458,22 +429,19 @@ public class CreateGatewayReceiverCommandDUnitTest {
             + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --" + GROUP + "="
             + receiverGroup;
-    executeCommandAndVerifyStatus(command, 3);
-
-    server1.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
-    server2.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
-    server3.invoke(() -> verifyGatewayReceiverProfile(hostnameForSenders));
-
-    server1.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, hostnameForSenders));
-    server2.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, hostnameForSenders));
-    server3.invoke(() -> verifyGatewayReceiverServerLocations(locator1Port, hostnameForSenders));
-
-    server1.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000,
-        512000, null, hostnameForSenders));
-    server2.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000,
-        512000, null, hostnameForSenders));
-    server3.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000,
-        512000, null, hostnameForSenders));
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      verifyGatewayReceiverProfile(hostnameForSenders);
+      verifyGatewayReceiverServerLocations(locator1Port, hostnameForSenders);
+      verifyReceiverCreationWithAttributes(true, 10000, 11000, "", 100000, 512000, null,
+          hostnameForSenders);
+    }, server1, server2, server3);
   }
 
   /**
@@ -481,10 +449,7 @@ public class CreateGatewayReceiverCommandDUnitTest {
    */
   @Test
   public void testCreateGatewayReceiverWithGatewayTransportFilter() throws Exception {
-
     Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
     server1 = locatorServerStartupRule.startServerVM(3, locator1Port);
     server2 = locatorServerStartupRule.startServerVM(4, locator1Port);
     server3 = locatorServerStartupRule.startServerVM(5, locator1Port);
@@ -498,16 +463,19 @@ public class CreateGatewayReceiverCommandDUnitTest {
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__GATEWAYTRANSPORTFILTER
             + "=org.apache.geode.cache30.MyGatewayTransportFilter1";
-    executeCommandAndVerifyStatus(command, 3);
-    List<String> transportFilters = new ArrayList<String>();
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    List<String> transportFilters = new ArrayList<>();
     transportFilters.add("org.apache.geode.cache30.MyGatewayTransportFilter1");
-
-    server1.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "localhost",
-        100000, 512000, transportFilters, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-    server2.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "localhost",
-        100000, 512000, transportFilters, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-    server3.invoke(() -> verifyReceiverCreationWithAttributes(true, 10000, 11000, "localhost",
-        100000, 512000, transportFilters, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    MemberVM.invokeInEveryMember(() -> {
+      verifyReceiverCreationWithAttributes(true, 10000, 11000, "localhost", 100000, 512000,
+          transportFilters, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS);
+    }, server1, server2, server3);
   }
 
   /**
@@ -515,10 +483,7 @@ public class CreateGatewayReceiverCommandDUnitTest {
    */
   @Test
   public void testCreateGatewayReceiverWithMultipleGatewayTransportFilters() throws Exception {
-
     Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
     server1 = locatorServerStartupRule.startServerVM(3, locator1Port);
     server2 = locatorServerStartupRule.startServerVM(4, locator1Port);
     server3 = locatorServerStartupRule.startServerVM(5, locator1Port);
@@ -531,75 +496,34 @@ public class CreateGatewayReceiverCommandDUnitTest {
         + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --"
         + CliStrings.CREATE_GATEWAYRECEIVER__GATEWAYTRANSPORTFILTER
         + "=org.apache.geode.cache30.MyGatewayTransportFilter1,org.apache.geode.cache30.MyGatewayTransportFilter2";
-    executeCommandAndVerifyStatus(command, 3);
-    List<String> transportFilters = new ArrayList<String>();
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    List<String> transportFilters = new ArrayList<>();
     transportFilters.add("org.apache.geode.cache30.MyGatewayTransportFilter1");
     transportFilters.add("org.apache.geode.cache30.MyGatewayTransportFilter2");
 
-    server1.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
-        10000, 11000, "localhost", 100000, 512000, transportFilters,
-        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-    server2.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
-        10000, 11000, "localhost", 100000, 512000, transportFilters,
-        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-    server3.invoke(() -> verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START,
-        10000, 11000, "localhost", 100000, 512000, transportFilters,
-        GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-  }
-
-  /**
-   * GatewayReceiver with given attributes. Error scenario where startPort is greater than endPort.
-   */
-  @Test
-  public void testCreateGatewayReceiver_Error() throws Exception {
-
-    Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
-    server1 = locatorServerStartupRule.startServerVM(3, locator1Port);
-    server2 = locatorServerStartupRule.startServerVM(4, locator1Port);
-    server3 = locatorServerStartupRule.startServerVM(5, locator1Port);
-
-    String command =
-        CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.CREATE_GATEWAYRECEIVER__BINDADDRESS
-            + "=localhost" + " --" + CliStrings.CREATE_GATEWAYRECEIVER__STARTPORT + "=11000" + " --"
-            + CliStrings.CREATE_GATEWAYRECEIVER__ENDPORT + "=10000" + " --"
-            + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
-            + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000";
-    CommandResult cmdResult = gfsh.executeCommand(command);
-    if (cmdResult != null) {
-      String strCmdResult = cmdResult.toString();
-      getLogWriter().info("testCreateGatewayReceiver stringResult : " + strCmdResult + ">>>>");
-      assertEquals(Result.Status.OK, cmdResult.getStatus());
-
-      TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-      List<String> status = resultData.retrieveAllValues("Status");
-      assertEquals(3, status.size());
-
-      // verify there is no error in the status
-      for (String stat : status) {
-        assertTrue("GatewayReceiver creation should have failed", stat.contains("ERROR:"));
-      }
-    } else {
-      fail("testCreateGatewayReceiver failed as did not get CommandResult");
-    }
+    MemberVM.invokeInEveryMember(() -> {
+      verifyReceiverCreationWithAttributes(!GatewayReceiver.DEFAULT_MANUAL_START, 10000, 11000,
+          "localhost", 100000, 512000, transportFilters,
+          GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS);
+    }, server1, server2, server3);
   }
 
   /**
    * GatewayReceiver with given attributes on the given member.
    */
   @Test
-  public void testCreateGatewayReceiver_onMember() throws Exception {
-
+  public void testCreateGatewayReceiverOnSingleMember() throws Exception {
     Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
     server1 = locatorServerStartupRule.startServerVM(3, locator1Port);
     server2 = locatorServerStartupRule.startServerVM(4, locator1Port);
     server3 = locatorServerStartupRule.startServerVM(5, locator1Port);
-
-    final DistributedMember server1Member =
-        (DistributedMember) server1.invoke(getMemberIdCallable());
+    final DistributedMember server1Member = server1.invoke(getMemberIdCallable());
 
     String command =
         CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.CREATE_GATEWAYRECEIVER__MANUALSTART
@@ -609,46 +533,33 @@ public class CreateGatewayReceiverCommandDUnitTest {
             + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --"
             + CliStrings.MEMBER + "=" + server1Member.getId();
-    CommandResult cmdResult = gfsh.executeCommand(command);
-    if (cmdResult != null) {
-      String strCmdResult = cmdResult.toString();
-      getLogWriter().info("testCreateGatewayReceiver stringResult : " + strCmdResult + ">>>>");
-      assertEquals(Result.Status.OK, cmdResult.getStatus());
-
-      TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-      List<String> status = resultData.retrieveAllValues("Status");
-      assertEquals(1, status.size());
-      // 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");
-    }
-
-    // cannot verify Profile/ServerLocation when manualStart is true
-
-    server1.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000, 512000, null,
+          GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS);
+    }, server1);
+
+    MemberVM.invokeInEveryMember(() -> {
+      Cache cache = LocatorServerStartupRule.getCache();
+      assertThat(cache.getGatewayReceivers()).isEmpty();
+    }, server2, server3);
   }
 
   /**
    * GatewayReceiver with given attributes on multiple members.
    */
   @Test
-  public void testCreateGatewayReceiver_onMultipleMembers() throws Exception {
-
+  public void testCreateGatewayReceiverOnMultipleMembers() throws Exception {
     Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
     server1 = locatorServerStartupRule.startServerVM(3, locator1Port);
     server2 = locatorServerStartupRule.startServerVM(4, locator1Port);
     server3 = locatorServerStartupRule.startServerVM(5, locator1Port);
-
-    final DistributedMember server1Member =
-        (DistributedMember) server1.invoke(getMemberIdCallable());
-    final DistributedMember server2Member =
-        (DistributedMember) server2.invoke(getMemberIdCallable());
+    final DistributedMember server1Member = server1.invoke(getMemberIdCallable());
+    final DistributedMember server2Member = server2.invoke(getMemberIdCallable());
 
     String command =
         CliStrings.CREATE_GATEWAYRECEIVER + " --" + CliStrings.CREATE_GATEWAYRECEIVER__MANUALSTART
@@ -658,41 +569,30 @@ public class CreateGatewayReceiverCommandDUnitTest {
             + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --"
             + CliStrings.MEMBER + "=" + server1Member.getId() + "," + server2Member.getId();
-    CommandResult cmdResult = gfsh.executeCommand(command);
-    if (cmdResult != null) {
-      String strCmdResult = cmdResult.toString();
-      getLogWriter().info("testCreateGatewayReceiver stringResult : " + strCmdResult + ">>>>");
-      assertEquals(Result.Status.OK, cmdResult.getStatus());
-
-      TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-      List<String> status = resultData.retrieveAllValues("Status");
-      assertEquals(2, status.size());
-      // 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");
-    }
-
-    // cannot verify Profile/ServerLocation when manualStart is true
-
-    server1.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-    server2.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000, 512000, null,
+          GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS);
+    }, server1, server2);
+
+    MemberVM.invokeInEveryMember(() -> {
+      Cache cache = LocatorServerStartupRule.getCache();
+      assertThat(cache.getGatewayReceivers()).isEmpty();
+    }, server3);
   }
 
   /**
    * GatewayReceiver with given attributes on the given group.
    */
   @Test
-  public void testCreateGatewayReceiver_onGroup() throws Exception {
-
-    Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
+  public void testCreateGatewayReceiverOnGroup() throws Exception {
     String groups = "receiverGroup1";
+    Integer locator1Port = locatorSite1.getPort();
     server1 = startServerWithGroups(3, groups, locator1Port);
     server2 = startServerWithGroups(4, groups, locator1Port);
     server3 = startServerWithGroups(5, groups, locator1Port);
@@ -705,31 +605,17 @@ public class CreateGatewayReceiverCommandDUnitTest {
             + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --" + GROUP
             + "=receiverGroup1";
-    CommandResult cmdResult = gfsh.executeCommand(command);
-    if (cmdResult != null) {
-      String strCmdResult = cmdResult.toString();
-      getLogWriter().info("testCreateGatewayReceiver stringResult : " + strCmdResult + ">>>>");
-      assertEquals(Result.Status.OK, cmdResult.getStatus());
-
-      TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-      List<String> status = resultData.retrieveAllValues("Status");
-      assertEquals(3, status.size());//
-      // 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");
-    }
-
-    // cannot verify Profile/ServerLocation when manualStart is true
-
-    server1.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-    server2.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-    server3.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000, 512000, null,
+          GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS);
+    }, server1, server2, server3);
   }
 
   /**
@@ -737,13 +623,10 @@ public class CreateGatewayReceiverCommandDUnitTest {
    * group.
    */
   @Test
-  public void testCreateGatewayReceiver_onGroup_Scenario2() throws Exception {
-
-    Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
+  public void testCreateGatewayReceiverOnGroupScenario2() throws Exception {
     String group1 = "receiverGroup1";
     String group2 = "receiverGroup2";
+    Integer locator1Port = locatorSite1.getPort();
     server1 = startServerWithGroups(3, group1, locator1Port);
     server2 = startServerWithGroups(4, group1, locator1Port);
     server3 = startServerWithGroups(5, group2, locator1Port);
@@ -756,40 +639,29 @@ public class CreateGatewayReceiverCommandDUnitTest {
             + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --" + GROUP
             + "=receiverGroup1";
-    CommandResult cmdResult = gfsh.executeCommand(command);
-    if (cmdResult != null) {
-      String strCmdResult = cmdResult.toString();
-      getLogWriter().info("testCreateGatewayReceiver stringResult : " + strCmdResult + ">>>>");
-      assertEquals(Result.Status.OK, cmdResult.getStatus());
-
-      TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-      List<String> status = resultData.retrieveAllValues("Status");
-      assertEquals(2, status.size());//
-      // 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");
-    }
-
-    // cannot verify Profile/ServerLocation when manualStart is true
-
-    server1.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-    server2.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000, 512000, null,
+          GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS);
+    }, server1, server2);
+
+    MemberVM.invokeInEveryMember(() -> {
+      Cache cache = LocatorServerStartupRule.getCache();
+      assertThat(cache.getGatewayReceivers()).isEmpty();
+    }, server3);
   }
 
   /**
    * GatewayReceiver with given attributes on multiple groups.
    */
   @Test
-  public void testCreateGatewayReceiver_onMultipleGroups() throws Exception {
-
+  public void testCreateGatewayReceiverOnMultipleGroups() throws Exception {
     Integer locator1Port = locatorSite1.getPort();
-
-    // setup servers in Site #1
     server1 = startServerWithGroups(3, "receiverGroup1", locator1Port);
     server2 = startServerWithGroups(4, "receiverGroup1", locator1Port);
     server3 = startServerWithGroups(5, "receiverGroup2", locator1Port);
@@ -802,36 +674,16 @@ public class CreateGatewayReceiverCommandDUnitTest {
             + CliStrings.CREATE_GATEWAYRECEIVER__MAXTIMEBETWEENPINGS + "=100000" + " --"
             + CliStrings.CREATE_GATEWAYRECEIVER__SOCKETBUFFERSIZE + "=512000" + " --" + GROUP
             + "=receiverGroup1,receiverGroup2";
-    CommandResult cmdResult = gfsh.executeCommand(command);
-    if (cmdResult != null) {
-      String strCmdResult = cmdResult.toString();
-      getLogWriter().info("testCreateGatewayReceiver stringResult : " + strCmdResult + ">>>>");
-      assertEquals(Result.Status.OK, cmdResult.getStatus());
-
-      TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-      List<String> status = resultData.retrieveAllValues("Status");
-      assertEquals(3, status.size());//
-      // 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");
-    }
-
-    // cannot verify Profile/ServerLocation when manualStart is true
-
-    server1.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-    server2.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-    server3.invoke(() -> verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost",
-        100000, 512000, null, GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS));
-  }
-
-  private MemberVM startServerWithGroups(int index, String groups, int locPort) throws Exception {
-    Properties props = new Properties();
-    props.setProperty(GROUPS, groups);
-    return locatorServerStartupRule.startServerVM(index, props, locPort);
+    gfsh.executeAndAssertThat(command).statusIsSuccess()
+        .tableHasColumnWithExactValuesInAnyOrder("Member", "server-3", "server-4", "server-5")
+        .tableHasColumnWithValuesContaining("Status",
+            "GatewayReceiver created on member \"server-3\"",
+            "GatewayReceiver created on member \"server-4\"",
+            "GatewayReceiver created on member \"server-5\"");
+
+    MemberVM.invokeInEveryMember(() -> {
+      verifyReceiverCreationWithAttributes(false, 10000, 11000, "localhost", 100000, 512000, null,
+          GatewayReceiver.DEFAULT_HOSTNAME_FOR_SENDERS);
+    }, server1, server2, server3);
   }
 }

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