You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ds...@apache.org on 2017/03/09 20:49:01 UTC

[22/50] [abbrv] geode git commit: GEODE-2593: add port range to AvailablePortHelper to fix testUDPPortRange

GEODE-2593: add port range to AvailablePortHelper to fix testUDPPortRange


Project: http://git-wip-us.apache.org/repos/asf/geode/repo
Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/47697d40
Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/47697d40
Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/47697d40

Branch: refs/heads/feature/GEODE-1969
Commit: 47697d40acf53cb367ec584ec72efafbb47f4022
Parents: 950b8d7
Author: Kirk Lund <kl...@apache.org>
Authored: Fri Mar 3 17:36:07 2017 -0800
Committer: Kirk Lund <kl...@apache.org>
Committed: Tue Mar 7 11:16:12 2017 -0800

----------------------------------------------------------------------
 .../distributed/DistributedSystemDUnitTest.java |  50 ++--
 .../geode/internal/AvailablePortHelper.java     |  64 ++++-
 .../AvailablePortHelperIntegrationTest.java     | 264 +++++++++++++++++++
 3 files changed, 361 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/geode/blob/47697d40/geode-core/src/test/java/org/apache/geode/distributed/DistributedSystemDUnitTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/distributed/DistributedSystemDUnitTest.java b/geode-core/src/test/java/org/apache/geode/distributed/DistributedSystemDUnitTest.java
index c57ad17..c1ea5e6 100644
--- a/geode-core/src/test/java/org/apache/geode/distributed/DistributedSystemDUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/distributed/DistributedSystemDUnitTest.java
@@ -14,6 +14,10 @@
  */
 package org.apache.geode.distributed;
 
+import static org.apache.geode.distributed.ConfigurationProperties.*;
+import static org.apache.geode.internal.AvailablePort.*;
+import static org.junit.Assert.*;
+
 import org.apache.geode.CancelException;
 import org.apache.geode.GemFireConfigException;
 import org.apache.geode.SystemConnectException;
@@ -22,7 +26,12 @@ import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.CacheFactory;
 import org.apache.geode.cache.Region;
 import org.apache.geode.cache30.CacheSerializableRunnable;
-import org.apache.geode.distributed.internal.*;
+import org.apache.geode.distributed.internal.DistributionConfig;
+import org.apache.geode.distributed.internal.DistributionException;
+import org.apache.geode.distributed.internal.DistributionManager;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.distributed.internal.SerialDistributionMessage;
+import org.apache.geode.distributed.internal.SizeableRunnable;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.distributed.internal.membership.gms.MembershipManagerHelper;
 import org.apache.geode.distributed.internal.membership.gms.messenger.JGroupsMessenger;
@@ -30,12 +39,19 @@ import org.apache.geode.distributed.internal.membership.gms.mgr.GMSMembershipMan
 import org.apache.geode.internal.AvailablePort;
 import org.apache.geode.internal.AvailablePortHelper;
 import org.apache.geode.internal.net.SocketCreator;
-import org.apache.geode.test.dunit.*;
+import org.apache.geode.test.dunit.DistributedTestUtils;
+import org.apache.geode.test.dunit.Host;
+import org.apache.geode.test.dunit.LogWriterUtils;
+import org.apache.geode.test.dunit.RMIException;
+import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
 import org.apache.geode.test.junit.categories.DistributedTest;
 import org.apache.geode.test.junit.categories.FlakyTest;
 import org.apache.geode.test.junit.categories.MembershipTest;
-import org.junit.*;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
 import java.net.Inet4Address;
@@ -46,20 +62,19 @@ import java.util.Enumeration;
 import java.util.Properties;
 import java.util.concurrent.TimeoutException;
 
-import static org.apache.geode.distributed.ConfigurationProperties.*;
-import static org.apache.geode.internal.AvailablePort.SOCKET;
-import static org.junit.Assert.*;
-
 /**
  * Tests the functionality of the {@link DistributedSystem} class.
- *
- * @see InternalDistributedSystemJUnitTest
- *
  */
 @Category({DistributedTest.class, MembershipTest.class})
 public class DistributedSystemDUnitTest extends JUnit4DistributedTestCase {
 
-  public void postSetUp() throws Exception {
+  @Before
+  public void before() throws Exception {
+    disconnectAllFromDS();
+  }
+
+  @After
+  public void after() throws Exception {
     disconnectAllFromDS();
   }
 
@@ -298,18 +313,21 @@ public class DistributedSystemDUnitTest extends JUnit4DistributedTestCase {
 
   @Test
   public void testUDPPortRange() throws Exception {
+    int[] unicastPort = AvailablePortHelper.getRandomAvailableTCPPortRange(3, true);
+
     Properties config = new Properties();
-    int unicastPort =
-        AvailablePort.getRandomAvailablePort(SOCKET, AvailablePort.getAddress(SOCKET), true);
     config.put(LOCATORS, "localhost[" + DistributedTestUtils.getDUnitLocatorPort() + "]");
     // Minimum 3 ports required in range for UDP, FD_SOCK and TcpConduit.
-    config.setProperty(MEMBERSHIP_PORT_RANGE, "" + unicastPort + "-" + (unicastPort + 2));
+    config.setProperty(MEMBERSHIP_PORT_RANGE, unicastPort[0] + "-" + unicastPort[2]);
+
     InternalDistributedSystem system = getSystem(config);
     DistributionManager dm = (DistributionManager) system.getDistributionManager();
     InternalDistributedMember idm = dm.getDistributionManagerId();
+
+    assertTrue(unicastPort[0] <= idm.getPort() && idm.getPort() <= unicastPort[2]);
+    assertTrue(unicastPort[0] <= idm.getPort() && idm.getDirectChannelPort() <= unicastPort[2]);
+
     system.disconnect();
-    assertTrue(unicastPort <= idm.getPort() && idm.getPort() <= unicastPort + 2);
-    assertTrue(unicastPort <= idm.getPort() && idm.getDirectChannelPort() <= unicastPort + 2);
   }
 
   /***

http://git-wip-us.apache.org/repos/asf/geode/blob/47697d40/geode-core/src/test/java/org/apache/geode/internal/AvailablePortHelper.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/internal/AvailablePortHelper.java b/geode-core/src/test/java/org/apache/geode/internal/AvailablePortHelper.java
index e09a7a0..6a1c1d4 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/AvailablePortHelper.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/AvailablePortHelper.java
@@ -14,6 +14,10 @@
  */
 package org.apache.geode.internal;
 
+import static org.apache.geode.distributed.internal.DistributionConfig.*;
+import static org.apache.geode.internal.AvailablePort.*;
+
+import java.net.InetAddress;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -66,11 +70,69 @@ public class AvailablePortHelper {
     List<Keeper> result = new ArrayList<Keeper>();
     while (result.size() < count) {
       result.add(AvailablePort.getRandomAvailablePortKeeper(AvailablePort.SOCKET,
-          AvailablePort.getAddress(AvailablePort.SOCKET), useMembershipPortRange));
+          getAddress(AvailablePort.SOCKET), useMembershipPortRange));
+    }
+    return result;
+  }
+
+  public static int[] getRandomAvailableTCPPortRange(final int count) {
+    return getRandomAvailableTCPPortRange(count, false);
+  }
+
+  public static int[] getRandomAvailableTCPPortRange(final int count,
+      final boolean useMembershipPortRange) {
+    List<Keeper> list = getRandomAvailableTCPPortRangeKeepers(count, useMembershipPortRange);
+    int[] ports = new int[list.size()];
+    int i = 0;
+    for (Keeper k : list) {
+      ports[i] = k.getPort();
+      k.release();
+      i++;
+    }
+    return ports;
+  }
+
+  public static List<Keeper> getRandomAvailableTCPPortRangeKeepers(final int count) {
+    return getRandomAvailableTCPPortRangeKeepers(count, false);
+  }
+
+  public static List<Keeper> getRandomAvailableTCPPortRangeKeepers(final int count,
+      final boolean useMembershipPortRange) {
+    List<Keeper> result = new ArrayList<>();
+
+    InetAddress addr = getAddress(AvailablePort.SOCKET);
+
+    int lowerBound =
+        useMembershipPortRange ? DEFAULT_MEMBERSHIP_PORT_RANGE[0] : AVAILABLE_PORTS_LOWER_BOUND;
+
+    int upperBound =
+        useMembershipPortRange ? DEFAULT_MEMBERSHIP_PORT_RANGE[1] : AVAILABLE_PORTS_UPPER_BOUND;
+
+    for (int i = lowerBound; i <= upperBound; i++) {
+      for (int j = 0; j < count && ((i + j) <= upperBound); j++) {
+        int port = i + j;
+        Keeper keeper = isPortKeepable(port, SOCKET, addr);
+        if (keeper == null) {
+          releaseKeepers(result);
+          result.clear();
+          break;
+        }
+        result.add(keeper);
+        if (result.size() == count) {
+          return result;
+        }
+      }
     }
+
     return result;
   }
 
+  private static void releaseKeepers(List<Keeper> keepers) {
+    for (Keeper keeper : keepers) {
+      keeper.release();
+    }
+  }
+
   /**
    * Returns array of unique randomly available tcp ports of specified count.
    */

http://git-wip-us.apache.org/repos/asf/geode/blob/47697d40/geode-core/src/test/java/org/apache/geode/internal/AvailablePortHelperIntegrationTest.java
----------------------------------------------------------------------
diff --git a/geode-core/src/test/java/org/apache/geode/internal/AvailablePortHelperIntegrationTest.java b/geode-core/src/test/java/org/apache/geode/internal/AvailablePortHelperIntegrationTest.java
new file mode 100644
index 0000000..d6cfddc
--- /dev/null
+++ b/geode-core/src/test/java/org/apache/geode/internal/AvailablePortHelperIntegrationTest.java
@@ -0,0 +1,264 @@
+/*
+ * 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;
+
+import static org.apache.geode.distributed.internal.DistributionConfig.*;
+import static org.apache.geode.internal.AvailablePort.*;
+import static org.apache.geode.internal.AvailablePortHelper.*;
+import static org.assertj.core.api.Assertions.*;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.ServerSocket;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import junitparams.JUnitParamsRunner;
+import junitparams.Parameters;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import org.apache.geode.internal.AvailablePort.Keeper;
+import org.apache.geode.test.junit.categories.IntegrationTest;
+
+@Category(IntegrationTest.class)
+@RunWith(JUnitParamsRunner.class)
+public class AvailablePortHelperIntegrationTest {
+
+  private Set<ServerSocket> serverSockets;
+
+  @Before
+  public void before() throws Exception {
+    this.serverSockets = new HashSet<>();
+  }
+
+  @After
+  public void after() throws Exception {
+    for (ServerSocket serverSocket : this.serverSockets) {
+      try {
+        if (serverSocket != null && !serverSocket.isClosed()) {
+          serverSocket.close();
+        }
+      } catch (IOException ignore) {
+        System.err.println("Unable to close " + serverSocket);
+      }
+    }
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRange_zero(final boolean useMembershipPortRange)
+      throws Exception {
+    int[] results = getRandomAvailableTCPPortRange(0, useMembershipPortRange);
+    assertThat(results).isEmpty();
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRange_one_returnsOne(final boolean useMembershipPortRange)
+      throws Exception {
+    int[] results = getRandomAvailableTCPPortRange(1, useMembershipPortRange);
+    assertThat(results).hasSize(1);
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRange_two_returnsTwo(final boolean useMembershipPortRange)
+      throws Exception {
+    int[] results = getRandomAvailableTCPPortRange(2, useMembershipPortRange);
+    assertThat(results).hasSize(2);
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRange_many_returnsMany(final boolean useMembershipPortRange)
+      throws Exception {
+    int[] results = getRandomAvailableTCPPortRange(10, useMembershipPortRange);
+    assertThat(results).hasSize(10);
+    assertPortsAreUsable(results);
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRange_returnsUniquePorts(
+      final boolean useMembershipPortRange) throws Exception {
+    int[] results = getRandomAvailableTCPPortRange(10, useMembershipPortRange);
+
+    Set<Integer> ports = new HashSet<>();
+    for (int port : results) {
+      ports.add(port);
+    }
+
+    assertThat(ports).hasSize(results.length);
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRange_returnsConsecutivePorts(
+      final boolean useMembershipPortRange) throws Exception {
+    int[] results = getRandomAvailableTCPPortRange(10, useMembershipPortRange);
+
+    List<Integer> ports = new ArrayList<>();
+    for (int port : results) {
+      if (useMembershipPortRange) {
+        assertThat(port).isGreaterThanOrEqualTo(DEFAULT_MEMBERSHIP_PORT_RANGE[0])
+            .isLessThanOrEqualTo(DEFAULT_MEMBERSHIP_PORT_RANGE[1]);
+      } else {
+        assertThat(port).isGreaterThanOrEqualTo(AVAILABLE_PORTS_LOWER_BOUND)
+            .isLessThanOrEqualTo(AVAILABLE_PORTS_UPPER_BOUND);
+      }
+      ports.add(port);
+    }
+
+    assertThat(ports).hasSize(10);
+
+    int previousPort = 0;
+    for (int port : ports) {
+      if (previousPort != 0) {
+        assertThat(port).isEqualTo(previousPort + 1);
+      }
+      previousPort = port;
+    }
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRangeKeepers_zero(final boolean useMembershipPortRange)
+      throws Exception {
+    List<Keeper> results = getRandomAvailableTCPPortRangeKeepers(0, useMembershipPortRange);
+    assertThat(results).isEmpty();
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRangeKeepers_one_returnsOne(
+      final boolean useMembershipPortRange) throws Exception {
+    List<Keeper> results = getRandomAvailableTCPPortRangeKeepers(1, useMembershipPortRange);
+    assertThat(results).hasSize(1);
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRangeKeepers_two_returnsTwo(
+      final boolean useMembershipPortRange) throws Exception {
+    List<Keeper> results = getRandomAvailableTCPPortRangeKeepers(2, useMembershipPortRange);
+    assertThat(results).hasSize(2);
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRangeKeepers_many_returnsMany(
+      final boolean useMembershipPortRange) throws Exception {
+    List<Keeper> results = getRandomAvailableTCPPortRangeKeepers(10, useMembershipPortRange);
+    assertThat(results).hasSize(10);
+    assertKeepersAreUsable(results);
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRangeKeepers_returnsUsableKeeper(
+      final boolean useMembershipPortRange) throws Exception {
+    List<Keeper> results = getRandomAvailableTCPPortRangeKeepers(1, useMembershipPortRange);
+    assertKeepersAreUsable(results);
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRangeKeepers_returnsUniqueKeepers(
+      final boolean useMembershipPortRange) throws Exception {
+    List<Keeper> results = getRandomAvailableTCPPortRangeKeepers(10, useMembershipPortRange);
+
+    Set<Integer> ports = new HashSet<>();
+    for (Keeper keeper : results) {
+      ports.add(keeper.getPort());
+    }
+
+    assertThat(ports).hasSize(results.size());
+  }
+
+  @Test
+  @Parameters({"true", "false"})
+  public void getRandomAvailableTCPPortRangeKeepers_returnsConsecutivePorts(
+      final boolean useMembershipPortRange) throws Exception {
+    List<Keeper> results = getRandomAvailableTCPPortRangeKeepers(10, useMembershipPortRange);
+
+    List<Integer> ports = new ArrayList<>();
+    for (Keeper keeper : results) {
+      assertThat(keeper).isNotNull();
+      int port = keeper.getPort();
+      if (useMembershipPortRange) {
+        assertThat(port).isGreaterThanOrEqualTo(DEFAULT_MEMBERSHIP_PORT_RANGE[0])
+            .isLessThanOrEqualTo(DEFAULT_MEMBERSHIP_PORT_RANGE[1]);
+      } else {
+        assertThat(port).isGreaterThanOrEqualTo(AVAILABLE_PORTS_LOWER_BOUND)
+            .isLessThanOrEqualTo(AVAILABLE_PORTS_UPPER_BOUND);
+      }
+      ports.add(port);
+    }
+
+    assertThat(ports).hasSize(10);
+
+    int previousPort = 0;
+    for (int port : ports) {
+      if (previousPort != 0) {
+        assertThat(port).isEqualTo(previousPort + 1);
+      }
+      previousPort = port;
+    }
+  }
+
+  private void assertPortsAreUsable(int[] ports) throws IOException {
+    for (int port : ports) {
+      assertPortIsUsable(port);
+    }
+  }
+
+  private void assertPortIsUsable(int port) throws IOException {
+    ServerSocket serverSocket = createServerSocket();
+    serverSocket.setReuseAddress(true);
+
+    serverSocket.bind(new InetSocketAddress(port));
+
+    assertThat(serverSocket.isBound()).isTrue();
+    assertThat(serverSocket.isClosed()).isFalse();
+    serverSocket.close();
+    assertThat(serverSocket.isClosed()).isTrue();
+  }
+
+  private void assertKeepersAreUsable(Collection<Keeper> keepers) throws IOException {
+    for (Keeper keeper : keepers) {
+      assertKeeperIsUsable(keeper);
+    }
+  }
+
+  private void assertKeeperIsUsable(Keeper keeper) throws IOException {
+    int port = keeper.getPort();
+    keeper.release();
+    assertPortIsUsable(port);
+  }
+
+  private ServerSocket createServerSocket() throws IOException {
+    ServerSocket serverSocket = new ServerSocket();
+    this.serverSockets.add(serverSocket);
+    return serverSocket;
+  }
+
+}