SGF-681 - EnableClusterConfiguration annotation attributes are silently ignored.

This commit is contained in:
John Blum
2017-10-18 09:26:23 -07:00
parent ec2d206ea1
commit 932f24e32e
2 changed files with 247 additions and 5 deletions

View File

@@ -148,17 +148,17 @@ public class ClusterConfigurationConfiguration extends AbstractAnnotationConfigS
AnnotationAttributes enableClusterConfigurationAttributes = getAnnotationAttributes(importMetadata);
setManagementHttpHost(resolveProperty(managementProperty("http.hostname"),
DEFAULT_MANAGEMENT_HTTP_HOST));
setManagementHttpHost(resolveProperty(managementProperty("http.host"),
enableClusterConfigurationAttributes.getString("host")));
setManagementHttpPort(resolveProperty(managementProperty("http.port"),
DEFAULT_MANAGEMENT_HTTP_PORT));
enableClusterConfigurationAttributes.<Integer>getNumber("port")));
setManagementUseHttp(resolveProperty(managementProperty("use-http"),
DEFAULT_MANAGEMENT_USE_HTTP));
enableClusterConfigurationAttributes.getBoolean("useHttp")));
setServerRegionShortcut(resolveProperty(clusterProperty("region.type"),
RegionShortcut.class, DEFAULT_SERVER_REGION_SHORTCUT));
RegionShortcut.class, enableClusterConfigurationAttributes.getEnum("serverRegionShortcut")));
}
}

View File

@@ -0,0 +1,242 @@
/*
* Copyright 2017 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
*
* 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.springframework.data.gemfire.config.annotation;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.HashMap;
import java.util.Map;
import org.apache.geode.cache.RegionShortcut;
import org.junit.Test;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotationMetadata;
/**
* Unit tests for {@link EnableClusterConfiguration} annotation and the {@link ClusterConfigurationConfiguration} class.
*
* @author John Blum
* @see org.junit.Test
* @see org.mockito.Mock
* @see org.mockito.Mockito
* @see org.springframework.core.env.Environment
* @see org.springframework.core.type.AnnotationMetadata
* @see org.springframework.data.gemfire.config.annotation.ClusterConfigurationConfiguration
* @see org.springframework.data.gemfire.config.annotation.EnableClusterConfiguration
* @since 2.0.1
*/
public class EnableClusterConfigurationUnitTests {
@Test
public void setImportMetadataFromAnnotationAttributes() {
AnnotationMetadata mockImportMetadata = mock(AnnotationMetadata.class);
Map<String, Object> annotationAttributes = new HashMap<>();
annotationAttributes.put("host", "skullbox");
annotationAttributes.put("port", 12345);
annotationAttributes.put("serverRegionShortcut", RegionShortcut.PARTITION_PERSISTENT);
annotationAttributes.put("useHttp", true);
when(mockImportMetadata.getAnnotationAttributes(EnableClusterConfiguration.class.getName()))
.thenReturn(annotationAttributes);
when(mockImportMetadata.hasAnnotation(eq(EnableClusterConfiguration.class.getName()))).thenReturn(true);
ClusterConfigurationConfiguration configuration = new ClusterConfigurationConfiguration();
configuration.setImportMetadata(mockImportMetadata);
assertThat(configuration.getManagementHttpHost().orElse(null)).isEqualTo("skullbox");
assertThat(configuration.getManagementHttpPort().orElse(0)).isEqualTo(12345);
assertThat(configuration.getManagementUseHttp().orElse(false)).isTrue();
assertThat(configuration.getServerRegionShortcut().orElse(null)).isEqualTo(RegionShortcut.PARTITION_PERSISTENT);
verify(mockImportMetadata, times(1))
.getAnnotationAttributes(eq(EnableClusterConfiguration.class.getName()));
verify(mockImportMetadata, times(1))
.hasAnnotation(eq(EnableClusterConfiguration.class.getName()));
}
@Test
public void setImportMetadataFromProperties() {
AnnotationMetadata mockImportMetadata = mock(AnnotationMetadata.class);
Map<String, Object> annotationAttributes = new HashMap<>();
annotationAttributes.put("host", "skullbox");
annotationAttributes.put("port", 12345);
annotationAttributes.put("serverRegionShortcut", RegionShortcut.PARTITION_PERSISTENT);
annotationAttributes.put("useHttp", false);
when(mockImportMetadata.getAnnotationAttributes(EnableClusterConfiguration.class.getName()))
.thenReturn(annotationAttributes);
when(mockImportMetadata.hasAnnotation(eq(EnableClusterConfiguration.class.getName()))).thenReturn(true);
Environment mockEnvironment = mock(Environment.class);
when(mockEnvironment.containsProperty(eq("spring.data.gemfire.cluster.region.type"))).thenReturn(true);
when(mockEnvironment.containsProperty(eq("spring.data.gemfire.management.http.host"))).thenReturn(true);
when(mockEnvironment.containsProperty(eq("spring.data.gemfire.management.http.port"))).thenReturn(true);
when(mockEnvironment.containsProperty(eq("spring.data.gemfire.management.use-http"))).thenReturn(true);
when(mockEnvironment.getProperty(eq("spring.data.gemfire.cluster.region.type"), eq(RegionShortcut.class), any(RegionShortcut.class)))
.thenReturn(RegionShortcut.LOCAL);
when(mockEnvironment.getProperty(eq("spring.data.gemfire.management.http.host"), eq(String.class), any(String.class)))
.thenReturn("cardboardBox");
when(mockEnvironment.getProperty(eq("spring.data.gemfire.management.http.port"), eq(Integer.class), any(Integer.class)))
.thenReturn(11235);
when(mockEnvironment.getProperty(eq("spring.data.gemfire.management.use-http"), eq(Boolean.class), any(Boolean.class)))
.thenReturn(true);
when(mockEnvironment.resolveRequiredPlaceholders(anyString()))
.thenAnswer(invocation -> invocation.getArgument(0));
ClusterConfigurationConfiguration configuration = new ClusterConfigurationConfiguration();
configuration.setEnvironment(mockEnvironment);
configuration.setImportMetadata(mockImportMetadata);
assertThat(configuration.getManagementHttpHost().orElse(null)).isEqualTo("cardboardBox");
assertThat(configuration.getManagementHttpPort().orElse(0)).isEqualTo(11235);
assertThat(configuration.getManagementUseHttp().orElse(false)).isTrue();
assertThat(configuration.getServerRegionShortcut().orElse(null)).isEqualTo(RegionShortcut.LOCAL);
verify(mockImportMetadata, times(1))
.getAnnotationAttributes(eq(EnableClusterConfiguration.class.getName()));
verify(mockImportMetadata, times(1))
.hasAnnotation(eq(EnableClusterConfiguration.class.getName()));
verify(mockEnvironment, times(1))
.containsProperty(eq("spring.data.gemfire.cluster.region.type"));
verify(mockEnvironment, times(1))
.containsProperty(eq("spring.data.gemfire.management.http.host"));
verify(mockEnvironment, times(1))
.containsProperty(eq("spring.data.gemfire.management.http.port"));
verify(mockEnvironment, times(1))
.containsProperty(eq("spring.data.gemfire.management.use-http"));
verify(mockEnvironment, times(1))
.getProperty(eq("spring.data.gemfire.cluster.region.type"), eq(RegionShortcut.class),
eq(RegionShortcut.PARTITION_PERSISTENT));
verify(mockEnvironment, times(1))
.getProperty(eq("spring.data.gemfire.management.http.host"), eq(String.class), anyString());
verify(mockEnvironment, times(1))
.getProperty(eq("spring.data.gemfire.management.http.port"), eq(Integer.class), anyInt());
verify(mockEnvironment, times(1))
.getProperty(eq("spring.data.gemfire.management.use-http"), eq(Boolean.class), eq(false));
}
@Test
public void setImportMetadataFromAnnotationAttributesAndProperties() {
AnnotationMetadata mockImportMetadata = mock(AnnotationMetadata.class);
Map<String, Object> annotationAttributes = new HashMap<>();
annotationAttributes.put("host", "postOfficeBox");
annotationAttributes.put("port", 10101);
annotationAttributes.put("serverRegionShortcut", RegionShortcut.REPLICATE);
annotationAttributes.put("useHttp", true);
when(mockImportMetadata.getAnnotationAttributes(EnableClusterConfiguration.class.getName()))
.thenReturn(annotationAttributes);
when(mockImportMetadata.hasAnnotation(eq(EnableClusterConfiguration.class.getName()))).thenReturn(true);
Environment mockEnvironment = mock(Environment.class);
when(mockEnvironment.containsProperty(eq("spring.data.gemfire.cluster.region.type"))).thenReturn(false);
when(mockEnvironment.containsProperty(eq("spring.data.gemfire.management.http.host"))).thenReturn(true);
when(mockEnvironment.containsProperty(eq("spring.data.gemfire.management.http.port"))).thenReturn(true);
when(mockEnvironment.containsProperty(eq("spring.data.gemfire.management.use-http"))).thenReturn(false);
when(mockEnvironment.getProperty(eq("spring.data.gemfire.management.http.host"), eq(String.class), any(String.class)))
.thenReturn("shoeBox");
when(mockEnvironment.getProperty(eq("spring.data.gemfire.management.http.port"), eq(Integer.class), any(Integer.class)))
.thenReturn(12480);
when(mockEnvironment.resolveRequiredPlaceholders(anyString()))
.thenAnswer(invocation -> invocation.getArgument(0));
ClusterConfigurationConfiguration configuration = new ClusterConfigurationConfiguration();
configuration.setEnvironment(mockEnvironment);
configuration.setImportMetadata(mockImportMetadata);
assertThat(configuration.getManagementHttpHost().orElse(null)).isEqualTo("shoeBox");
assertThat(configuration.getManagementHttpPort().orElse(0)).isEqualTo(12480);
assertThat(configuration.getManagementUseHttp().orElse(false)).isTrue();
assertThat(configuration.getServerRegionShortcut().orElse(null)).isEqualTo(RegionShortcut.REPLICATE);
verify(mockImportMetadata, times(1))
.getAnnotationAttributes(eq(EnableClusterConfiguration.class.getName()));
verify(mockImportMetadata, times(1))
.hasAnnotation(eq(EnableClusterConfiguration.class.getName()));
verify(mockEnvironment, times(1))
.containsProperty(eq("spring.data.gemfire.cluster.region.type"));
verify(mockEnvironment, times(1))
.containsProperty(eq("spring.data.gemfire.management.http.host"));
verify(mockEnvironment, times(1))
.containsProperty(eq("spring.data.gemfire.management.http.port"));
verify(mockEnvironment, times(1))
.containsProperty(eq("spring.data.gemfire.management.use-http"));
verify(mockEnvironment, never())
.getProperty(eq("spring.data.gemfire.cluster.region.type"), eq(RegionShortcut.class),
any(RegionShortcut.class));
verify(mockEnvironment, times(1))
.getProperty(eq("spring.data.gemfire.management.http.host"), eq(String.class), anyString());
verify(mockEnvironment, times(1))
.getProperty(eq("spring.data.gemfire.management.http.port"), eq(Integer.class), anyInt());
verify(mockEnvironment, never())
.getProperty(eq("spring.data.gemfire.management.use-http"), eq(Boolean.class), anyBoolean());
}
}