This is an automated email from the ASF dual-hosted git repository. upthewaterspout pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/geode.git
The following commit(s) were added to refs/heads/develop by this push: new 4966e50 GEODE-7919: Moving membership integration test to geode-membership (#4862) 4966e50 is described below commit 4966e505b6fd6224967bbf1ac5487e8ddf1bdfc5 Author: Dan Smith <upthewatersp...@apache.org> AuthorDate: Mon Mar 30 11:18:01 2020 -0700 GEODE-7919: Moving membership integration test to geode-membership (#4862) Moving MembershipOnlyTest to MembershipIntegrationTest in the geode-membership module and adding some more tests. --- .../membership/gms/MembershipOnlyTest.java | 152 -------------- .../membership/gms/MembershipIntegrationTest.java | 221 +++++++++++++++++++++ 2 files changed, 221 insertions(+), 152 deletions(-) diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipOnlyTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipOnlyTest.java deleted file mode 100644 index 169297c..0000000 --- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipOnlyTest.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more contributor license - * agreements. See the NOTICE file distributed with this work for additional information regarding - * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. You may obtain a - * copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ -package org.apache.geode.distributed.internal.membership.gms; - -import static org.apache.geode.test.awaitility.GeodeAwaitility.await; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -import java.io.IOException; -import java.net.InetAddress; -import java.util.concurrent.ExecutorService; -import java.util.function.Supplier; - -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; - -import org.apache.geode.distributed.internal.membership.api.LifecycleListener; -import org.apache.geode.distributed.internal.membership.api.MemberIdentifier; -import org.apache.geode.distributed.internal.membership.api.MemberIdentifierFactoryImpl; -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.MembershipBuilder; -import org.apache.geode.distributed.internal.membership.api.MembershipConfig; -import org.apache.geode.distributed.internal.membership.api.MembershipConfigurationException; -import org.apache.geode.distributed.internal.membership.api.MembershipLocator; -import org.apache.geode.distributed.internal.membership.api.MembershipLocatorBuilder; -import org.apache.geode.distributed.internal.tcpserver.TcpClient; -import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreator; -import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreatorImpl; -import org.apache.geode.distributed.internal.tcpserver.TcpSocketFactory; -import org.apache.geode.internal.admin.SSLConfig; -import org.apache.geode.internal.net.SocketCreator; -import org.apache.geode.internal.serialization.DSFIDSerializer; -import org.apache.geode.internal.serialization.DSFIDSerializerFactory; -import org.apache.geode.logging.internal.executors.LoggingExecutors; - -public class MembershipOnlyTest { - - @Rule - public TemporaryFolder temporaryFolder = new TemporaryFolder(); - private InetAddress localHost; - private DSFIDSerializer dsfidSerializer; - private TcpSocketCreator socketCreator; - private MembershipLocator membershipLocator; - - @Before - public void before() throws IOException, MembershipConfigurationException { - localHost = InetAddress.getLocalHost(); - - dsfidSerializer = new DSFIDSerializerFactory().create(); - - // TODO - using geode-core socket creator - socketCreator = new SocketCreator(new SSLConfig.Builder().build()); - - final Supplier<ExecutorService> executorServiceSupplier = - () -> LoggingExecutors.newCachedThreadPool("membership", false); - membershipLocator = MembershipLocatorBuilder.<MemberIdentifierImpl>newLocatorBuilder( - new TcpSocketCreatorImpl(), - dsfidSerializer, - temporaryFolder.newFolder("locator").toPath(), - executorServiceSupplier) - .create(); - - membershipLocator.start(); - } - - @After - public void after() { - membershipLocator.stop(); - } - - @Test - public void locatorStarts() { - assertThat(membershipLocator.getPort()).isGreaterThan(0); - } - - @Test - public void memberCanConnectToSelfHostedLocator() throws MemberStartupException { - Membership<MemberIdentifier> membership = startMember("member", membershipLocator); - assertThat(membership.getView().getMembers()).hasSize(1); - } - - @Test - public void twoMembersCanConnect() throws MemberStartupException { - Membership<MemberIdentifier> member1 = startMember("member1", membershipLocator); - Membership<MemberIdentifier> member2 = startMember("member2", null); - await().untilAsserted(() -> assertThat(member1.getView().getMembers()).hasSize(2)); - await().untilAsserted(() -> assertThat(member2.getView().getMembers()).hasSize(2)); - } - - private Membership<MemberIdentifier> startMember(String name, - final MembershipLocator embeddedLocator) - throws MemberStartupException { - MembershipConfig config = new MembershipConfig() { - public String getLocators() { - return localHost.getHostName() + '[' + membershipLocator.getPort() + ']'; - } - - // TODO - the Membership system starting in the locator *MUST* be told that is - // is a locator through this flag. Ideally it should be able to infer this from - // being associated with a locator - @Override - public int getVmKind() { - return embeddedLocator != null ? MemberIdentifier.LOCATOR_DM_TYPE - : MemberIdentifier.NORMAL_DM_TYPE; - } - - @Override - public String getName() { - return name; - } - }; - - MemberIdentifierFactoryImpl memberIdFactory = new MemberIdentifierFactoryImpl(); - - TcpClient locatorClient = new TcpClient(socketCreator, dsfidSerializer.getObjectSerializer(), - dsfidSerializer.getObjectDeserializer(), TcpSocketFactory.DEFAULT); - - LifecycleListener<MemberIdentifier> lifeCycleListener = mock(LifecycleListener.class); - - - final Membership<MemberIdentifier> membership = - MembershipBuilder.<MemberIdentifier>newMembershipBuilder( - socketCreator, - locatorClient, - dsfidSerializer, - memberIdFactory) - .setMembershipLocator(membershipLocator) - .setConfig(config) - .setLifecycleListener(lifeCycleListener) - .create(); - - membership.start(); - membership.startEventProcessing(); - return membership; - } -} diff --git a/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipIntegrationTest.java b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipIntegrationTest.java new file mode 100644 index 0000000..0e823bd --- /dev/null +++ b/geode-membership/src/integrationTest/java/org/apache/geode/distributed/internal/membership/gms/MembershipIntegrationTest.java @@ -0,0 +1,221 @@ +/* + * 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.distributed.internal.membership.gms; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import java.net.InetAddress; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.concurrent.ExecutorService; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import org.apache.geode.distributed.internal.membership.api.MemberIdentifier; +import org.apache.geode.distributed.internal.membership.api.MemberIdentifierFactoryImpl; +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.MembershipBuilder; +import org.apache.geode.distributed.internal.membership.api.MembershipConfig; +import org.apache.geode.distributed.internal.membership.api.MembershipConfigurationException; +import org.apache.geode.distributed.internal.membership.api.MembershipLocator; +import org.apache.geode.distributed.internal.membership.api.MembershipLocatorBuilder; +import org.apache.geode.distributed.internal.tcpserver.TcpClient; +import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreator; +import org.apache.geode.distributed.internal.tcpserver.TcpSocketCreatorImpl; +import org.apache.geode.distributed.internal.tcpserver.TcpSocketFactory; +import org.apache.geode.internal.inet.LocalHostUtil; +import org.apache.geode.internal.serialization.DSFIDSerializer; +import org.apache.geode.internal.serialization.internal.DSFIDSerializerImpl; +import org.apache.geode.logging.internal.executors.LoggingExecutors; + +/** + * Tests of using the membership APIs to make multiple Membership systems that communicate + * with each other and form a group + */ +public class MembershipIntegrationTest { + private InetAddress localHost; + private DSFIDSerializer dsfidSerializer; + private TcpSocketCreator socketCreator; + + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Before + public void before() throws IOException, MembershipConfigurationException { + localHost = LocalHostUtil.getLocalHost(); + dsfidSerializer = new DSFIDSerializerImpl(); + socketCreator = new TcpSocketCreatorImpl(); + } + + @Test + public void oneMembershipCanStartWithALocator() + throws IOException, MemberStartupException { + final MembershipLocator<MemberIdentifier> locator = createLocator(0); + locator.start(); + + final Membership<MemberIdentifier> membership = createMembership(locator, + locator.getPort()); + start(membership); + + assertThat(membership.getView().getMembers()).hasSize(1); + } + + @Test + public void twoMembershipsCanStartWithOneLocator() + throws IOException, MemberStartupException { + final MembershipLocator<MemberIdentifier> locator = createLocator(0); + locator.start(); + final int locatorPort = locator.getPort(); + + final Membership<MemberIdentifier> membership1 = createMembership(locator, locatorPort); + start(membership1); + + final Membership<MemberIdentifier> membership2 = createMembership(null, locatorPort); + start(membership2); + + assertThat(membership1.getView().getMembers()).hasSize(2); + assertThat(membership2.getView().getMembers()).hasSize(2); + } + + @Test + public void twoLocatorsCanStartSequentially() + throws IOException, MemberStartupException { + + final MembershipLocator<MemberIdentifier> locator1 = createLocator(0); + locator1.start(); + final int locatorPort1 = locator1.getPort(); + + Membership<MemberIdentifier> membership1 = createMembership(locator1, locatorPort1); + start(membership1); + + final MembershipLocator<MemberIdentifier> locator2 = createLocator(0, locatorPort1); + locator2.start(); + final int locatorPort2 = locator2.getPort(); + + Membership<MemberIdentifier> membership2 = + createMembership(locator2, locatorPort1, locatorPort2); + start(membership2); + + assertThat(membership1.getView().getMembers()).hasSize(2); + assertThat(membership2.getView().getMembers()).hasSize(2); + } + + @Test + public void secondMembershipCanJoinUsingTheSecondLocatorToStart() + throws IOException, MemberStartupException { + + final MembershipLocator<MemberIdentifier> locator1 = createLocator(0); + locator1.start(); + final int locatorPort1 = locator1.getPort(); + + final Membership<MemberIdentifier> membership1 = createMembership(locator1, locatorPort1); + start(membership1); + + final MembershipLocator<MemberIdentifier> locator2 = createLocator(0, locatorPort1); + locator2.start(); + int locatorPort2 = locator2.getPort(); + + // Force the next membership to use locator2 by stopping locator1 + locator1.stop(); + + Membership<MemberIdentifier> membership2 = + createMembership(locator2, locatorPort1, locatorPort2); + start(membership2); + + assertThat(membership1.getView().getMembers()).hasSize(2); + assertThat(membership2.getView().getMembers()).hasSize(2); + } + + private void start(final Membership<MemberIdentifier> membership) + throws MemberStartupException { + membership.start(); + membership.startEventProcessing(); + } + + private Membership<MemberIdentifier> createMembership( + final MembershipLocator<MemberIdentifier> embeddedLocator, + final int... locatorPorts) + throws MembershipConfigurationException { + final boolean isALocator = embeddedLocator != null; + final MembershipConfig config = createMembershipConfig(isALocator, locatorPorts); + + final MemberIdentifierFactoryImpl memberIdFactory = new MemberIdentifierFactoryImpl(); + + final TcpClient locatorClient = + new TcpClient(socketCreator, dsfidSerializer.getObjectSerializer(), + dsfidSerializer.getObjectDeserializer(), TcpSocketFactory.DEFAULT); + + return MembershipBuilder.<MemberIdentifier>newMembershipBuilder( + socketCreator, locatorClient, dsfidSerializer, memberIdFactory) + .setMembershipLocator(embeddedLocator) + .setConfig(config) + .create(); + } + + private MembershipConfig createMembershipConfig( + final boolean isALocator, + final int[] locatorPorts) { + return new MembershipConfig() { + public String getLocators() { + return getLocatorString(locatorPorts); + } + + // TODO - the Membership system starting in the locator *MUST* be told that is + // is a locator through this flag. Ideally it should be able to infer this from + // being associated with a locator + @Override + public int getVmKind() { + return isALocator ? MemberIdentifier.LOCATOR_DM_TYPE : MemberIdentifier.NORMAL_DM_TYPE; + } + }; + } + + private String getLocatorString( + final int... locatorPorts) { + final String hostName = localHost.getHostName(); + return Arrays.stream(locatorPorts) + .mapToObj(port -> hostName + '[' + port + ']') + .collect(Collectors.joining(",")); + } + + private MembershipLocator<MemberIdentifier> createLocator( + final int localPort, + final int... locatorPorts) + throws MembershipConfigurationException, + IOException { + final Supplier<ExecutorService> executorServiceSupplier = + () -> LoggingExecutors.newCachedThreadPool("membership", false); + Path locatorDirectory = temporaryFolder.newFolder().toPath(); + + final MembershipConfig config = createMembershipConfig(true, locatorPorts); + + return MembershipLocatorBuilder.<MemberIdentifier>newLocatorBuilder( + socketCreator, + dsfidSerializer, + locatorDirectory, + executorServiceSupplier) + .setConfig(config) + .setPort(localPort) + .create(); + } + +}