GEODE-8664: Nest errors in DistributionImpl.start (#5751)

- If while calling DistributionImpl.start there was either a
   MembershipConfigurationException or MemberStartupException exceptions, its
   original cause was not propagated, therefore being unable to properly tackle
   issues on startup.
 - This commit propagates both exceptions.
 - Also 2 junit test were added to make sure this is working.
 - Also 2 DUnit tests were modified in order to integrate with this
   change.

Note: After having to revert the original change in PR #5725 due to some
      issues with the CI system, test have been sorted out and everything
      is working.
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorDUnitTest.java
index 1eb343e..52c99c1 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorDUnitTest.java
@@ -1001,8 +1001,7 @@
       // I guess it can throw this too...
 
     } catch (GemFireConfigException ex) {
-      String s = ex.getMessage();
-      assertThat(s.contains("Locator does not exist")).isTrue();
+      assertThat(ex.getCause().getMessage().contains("Locator does not exist")).isTrue();
     }
   }
 
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorUDPSecurityDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorUDPSecurityDUnitTest.java
index 474adc8..7ef6c0d 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorUDPSecurityDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorUDPSecurityDUnitTest.java
@@ -49,7 +49,7 @@
       system = getConnectedDistributedSystem(props);
       fail("Should not have reached this line, it should have caught the exception.");
     } catch (GemFireConfigException e) {
-      assertThat(e.getMessage()).contains("Rejecting findCoordinatorRequest");
+      assertThat(e.getCause().getMessage()).contains("Rejecting findCoordinatorRequest");
     }
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionImpl.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionImpl.java
index c6713a3..bc0ace3 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/DistributionImpl.java
@@ -181,9 +181,9 @@
       throw new GemFireSecurityException(e.getMessage(),
           e);
     } catch (MembershipConfigurationException e) {
-      throw new GemFireConfigException(e.getMessage());
+      throw new GemFireConfigException("Problem configuring membership services", e);
     } catch (MemberStartupException e) {
-      throw new SystemConnectException(e.getMessage());
+      throw new SystemConnectException("Problem starting up membership services", e);
     } catch (RuntimeException e) {
       logger.error("Unexpected problem starting up membership services", e);
       throw new SystemConnectException("Problem starting up membership services: " + e.getMessage()
diff --git a/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionTest.java b/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionTest.java
index 35abb5c..029a5b9 100644
--- a/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionTest.java
+++ b/geode-core/src/test/java/org/apache/geode/distributed/internal/DistributionTest.java
@@ -15,6 +15,7 @@
 package org.apache.geode.distributed.internal;
 
 import static org.apache.geode.distributed.internal.DistributionImpl.EMPTY_MEMBER_ARRAY;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -41,11 +42,15 @@
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.geode.GemFireConfigException;
+import org.apache.geode.SystemConnectException;
 import org.apache.geode.distributed.DistributedSystemDisconnectedException;
 import org.apache.geode.distributed.internal.direct.DirectChannel;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
+import org.apache.geode.distributed.internal.membership.api.MemberStartupException;
 import org.apache.geode.distributed.internal.membership.api.Membership;
 import org.apache.geode.distributed.internal.membership.api.MembershipClosedException;
+import org.apache.geode.distributed.internal.membership.api.MembershipConfigurationException;
 import org.apache.geode.distributed.internal.membership.gms.GMSMembership;
 import org.apache.geode.internal.admin.remote.AlertListenerMessage;
 import org.apache.geode.internal.admin.remote.RemoteTransportConfig;
@@ -81,7 +86,6 @@
     distribution = new DistributionImpl(clusterDistributionManager,
         remoteTransportConfig, internalDistributedSystem, membership);
 
-
     Random r = new Random();
     mockMembers = new InternalDistributedMember[5];
     for (int i = 0; i < mockMembers.length; i++) {
@@ -204,4 +208,24 @@
     distribution.send(emptyList, m);
     verify(membership, never()).send(any(), any());
   }
+
+  @Test
+  public void testExceptionNestedOnStartConfigError() throws Exception {
+    Throwable exception = new MembershipConfigurationException("Test exception");
+    doThrow(exception).when(membership).start();
+
+    assertThatThrownBy(() -> distribution.start())
+        .isInstanceOf(GemFireConfigException.class)
+        .hasCause(exception);
+  }
+
+  @Test
+  public void testExceptionNestedOnStartStartupError() throws Exception {
+    Throwable exception = new MemberStartupException("Test exception");
+    doThrow(exception).when(membership).start();
+
+    assertThatThrownBy(() -> distribution.start())
+        .isInstanceOf(SystemConnectException.class)
+        .hasCause(exception);
+  }
 }