From 9d2484855d95803191236e0acd0a63022d40edde Mon Sep 17 00:00:00 2001 From: John Blum Date: Mon, 9 Sep 2019 01:02:13 -0700 Subject: [PATCH] Cleanup all SSL configuration and state in Apache Geode. --- .../integration/IntegrationTestsSupport.java | 31 +++++++++ .../SslConfigurationIntegrationTests.java | 69 +++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 spring-data-geode-test/src/test/java/org/springframework/data/gemfire/tests/integration/SslConfigurationIntegrationTests.java diff --git a/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/integration/IntegrationTestsSupport.java b/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/integration/IntegrationTestsSupport.java index 5ae6b43..d985af0 100644 --- a/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/integration/IntegrationTestsSupport.java +++ b/spring-data-geode-test/src/main/java/org/springframework/data/gemfire/tests/integration/IntegrationTestsSupport.java @@ -21,6 +21,7 @@ import static org.springframework.data.gemfire.util.ArrayUtils.nullSafeArray; import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; @@ -35,6 +36,7 @@ import org.apache.geode.cache.CacheClosedException; import org.apache.geode.cache.GemFireCache; import org.apache.geode.distributed.Locator; import org.apache.geode.internal.InternalDataSerializer; +import org.apache.geode.internal.net.SSLConfigurationFactory; import org.apache.geode.internal.net.SocketCreatorFactory; import org.junit.AfterClass; @@ -46,6 +48,7 @@ import org.springframework.data.gemfire.support.GemfireBeanFactoryLocator; import org.springframework.data.gemfire.tests.mock.GemFireMockObjectsSupport; import org.springframework.data.gemfire.tests.util.FileUtils; import org.springframework.data.gemfire.util.CollectionUtils; +import org.springframework.util.ReflectionUtils; /** * The {@link IntegrationTestsSupport} class is an abstract base class supporting integration tests @@ -55,7 +58,11 @@ import org.springframework.data.gemfire.util.CollectionUtils; * @see java.io.File * @see java.time.LocalDateTime * @see java.util.concurrent.TimeUnit + * @see java.util.concurrent.atomic.AtomicBoolean + * @see java.util.function.Predicate + * @see org.apache.geode.DataSerializer * @see org.apache.geode.cache.GemFireCache + * @see org.apache.geode.distributed.Locator * @see org.springframework.data.gemfire.tests.mock.GemFireMockObjectsSupport * @since 1.0.0 */ @@ -114,7 +121,31 @@ public abstract class IntegrationTestsSupport { @BeforeClass public static void closeAnyExistingSocketConfigurationBeforeTestExecution() { SocketCreatorFactory.close(); + } + + @BeforeClass + // TODO: Remove once GEODE-7157 (https://issues.apache.org/jira/browse/GEODE-7157) is fixed! + // Do the job of Apache Geode & Pivotal GemFire since it cannot do its own damn job! + public static void closeAnyExistingSslConfigurationBeforeTestExecution() { + //SSLConfigurationFactory.close(); + + synchronized (SSLConfigurationFactory.class) { + try { + + Field instance = ReflectionUtils.findField(SSLConfigurationFactory.class, "instance", + SSLConfigurationFactory.class); + + Optional.ofNullable(instance) + .ifPresent(field -> { + ReflectionUtils.makeAccessible(field); + ReflectionUtils.setField(field, null, null); + }); + } + catch (Throwable ignore) { + // Not much we can do about it now! + } + } } @BeforeClass diff --git a/spring-data-geode-test/src/test/java/org/springframework/data/gemfire/tests/integration/SslConfigurationIntegrationTests.java b/spring-data-geode-test/src/test/java/org/springframework/data/gemfire/tests/integration/SslConfigurationIntegrationTests.java new file mode 100644 index 0000000..223ef7b --- /dev/null +++ b/spring-data-geode-test/src/test/java/org/springframework/data/gemfire/tests/integration/SslConfigurationIntegrationTests.java @@ -0,0 +1,69 @@ +/* + * Copyright 2019 the original author or authors. + * + * Licensed 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 + * + * https://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.springframework.data.gemfire.tests.integration; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.lang.reflect.Method; +import java.util.Optional; + +import org.apache.geode.internal.net.SSLConfigurationFactory; + +import org.junit.Test; + +import org.springframework.util.ReflectionUtils; + +/** + * Integration Tests asserting that {@link IntegrationTestsSupport} clears the SSL configuration of Apache Geode + * between test case runs. + * + * @author John Blum + * @see org.apache.geode.internal.net.SSLConfigurationFactory + * @see org.springframework.data.gemfire.tests.integration.IntegrationTestsSupport + * @since 0.0.8 + */ +public class SslConfigurationIntegrationTests { + + private SSLConfigurationFactory getInstance() { + + Method getInstance = ReflectionUtils.findMethod(SSLConfigurationFactory.class, "getInstance"); + + return Optional.ofNullable(getInstance) + .map(method -> { + + ReflectionUtils.makeAccessible(method); + + return (SSLConfigurationFactory) ReflectionUtils.invokeMethod(method, null); + }) + .orElse(null); + } + + @Test + public void getInstanceReturnsSameReferenceBeforeCloseThenReturnsDifferentReferenceAfterClose() { + + SSLConfigurationFactory sslConfigurationFactoryOne = getInstance(); + + assertThat(sslConfigurationFactoryOne).isNotNull(); + assertThat(getInstance()).isSameAs(sslConfigurationFactoryOne); + + IntegrationTestsSupport.closeAnyExistingSslConfigurationBeforeTestExecution(); + + SSLConfigurationFactory sslConfigurationFactoryTwo = getInstance(); + + assertThat(sslConfigurationFactoryTwo).isNotNull(); + assertThat(sslConfigurationFactoryTwo).isNotSameAs(sslConfigurationFactoryOne); + } +}