Add support to disable client subscriptions and register interest.
Resolves gh-38.
This commit is contained in:
@@ -0,0 +1,266 @@
|
|||||||
|
/*
|
||||||
|
* 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.session.data.gemfire;
|
||||||
|
|
||||||
|
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.anyString;
|
||||||
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.time.Duration;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import org.apache.geode.cache.InterestResultPolicy;
|
||||||
|
import org.apache.geode.cache.Region;
|
||||||
|
|
||||||
|
import org.springframework.beans.BeansException;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.config.BeanPostProcessor;
|
||||||
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.data.gemfire.config.annotation.CacheServerApplication;
|
||||||
|
import org.springframework.data.gemfire.config.annotation.ClientCacheApplication;
|
||||||
|
import org.springframework.session.Session;
|
||||||
|
import org.springframework.session.data.gemfire.config.annotation.web.http.EnableGemFireHttpSession;
|
||||||
|
import org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration;
|
||||||
|
import org.springframework.session.events.AbstractSessionEvent;
|
||||||
|
import org.springframework.session.events.SessionCreatedEvent;
|
||||||
|
import org.springframework.session.events.SessionDeletedEvent;
|
||||||
|
import org.springframework.test.context.ContextConfiguration;
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Integration tests using the Apache Geode client/server topology to test that no client subscriptions
|
||||||
|
* or register interests calls are made when HTTP {@link Session} events are disabled.
|
||||||
|
*
|
||||||
|
* @author John Blum
|
||||||
|
* @see org.junit.Test
|
||||||
|
* @see org.mockito.Mockito
|
||||||
|
* @see org.mockito.Spy
|
||||||
|
* @see org.apache.geode.cache.Region
|
||||||
|
* @see org.springframework.context.annotation.AnnotationConfigApplicationContext
|
||||||
|
* @see org.springframework.context.annotation.Bean
|
||||||
|
* @see org.springframework.data.gemfire.config.annotation.CacheServerApplication
|
||||||
|
* @see org.springframework.data.gemfire.config.annotation.ClientCacheApplication
|
||||||
|
* @see org.springframework.session.Session
|
||||||
|
* @see org.springframework.session.data.gemfire.config.annotation.web.http.EnableGemFireHttpSession
|
||||||
|
* @see org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration
|
||||||
|
* @see org.springframework.session.data.gemfire.AbstractGemFireIntegrationTests
|
||||||
|
* @see org.springframework.session.data.gemfire.GemFireOperationsSessionRepository
|
||||||
|
* @see org.springframework.session.events.AbstractSessionEvent
|
||||||
|
* @see org.springframework.test.context.ContextConfiguration
|
||||||
|
* @see org.springframework.test.context.junit4.SpringRunner
|
||||||
|
* @since 2.2.0
|
||||||
|
*/
|
||||||
|
@RunWith(SpringRunner.class)
|
||||||
|
@ContextConfiguration(
|
||||||
|
classes = DisabledClientSubscriptionsIntegrationTests.TestSpringSessionGemFireClientConfiguration.class
|
||||||
|
)
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
public class DisabledClientSubscriptionsIntegrationTests extends AbstractGemFireIntegrationTests {
|
||||||
|
|
||||||
|
private static final int MAX_INACTIVE_INTERVAL_IN_SECONDS = 1;
|
||||||
|
|
||||||
|
private static final String GEMFIRE_LOG_LEVEL = "error";
|
||||||
|
private static final String TEST_SESSION_REGION_NAME = "TestNonInterestingSessions";
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void startGemFireServer() throws IOException {
|
||||||
|
startGemFireServer(TestSpringSessionGemFireServerConfiguration.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Resource(name = GemFireHttpSessionConfiguration.DEFAULT_SESSION_REGION_NAME)
|
||||||
|
private Region<?, ?> sessions;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SessionEventListener sessionEventListener;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() {
|
||||||
|
|
||||||
|
assertThat(this.sessions).isNotNull();
|
||||||
|
assertThat(this.sessionRepository).isInstanceOf(GemFireOperationsSessionRepository.class);
|
||||||
|
assertThat(((GemFireOperationsSessionRepository) this.sessionRepository).getMaxInactiveIntervalInSeconds())
|
||||||
|
.isEqualTo(MAX_INACTIVE_INTERVAL_IN_SECONDS);
|
||||||
|
assertThat(((GemFireOperationsSessionRepository) this.sessionRepository).isRegisterInterestEnabled()).isFalse();
|
||||||
|
assertThat(((GemFireOperationsSessionRepository) this.sessionRepository).getSessionsRegionName())
|
||||||
|
.isEqualTo(this.sessions.getFullPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public void tearDown() {
|
||||||
|
|
||||||
|
verify(this.sessions, never()).registerInterest(any());
|
||||||
|
verify(this.sessions, never()).registerInterest(any(), anyBoolean());
|
||||||
|
verify(this.sessions, never()).registerInterest(any(), anyBoolean(), anyBoolean());
|
||||||
|
verify(this.sessions, never()).registerInterest(any(), anyBoolean(), anyBoolean());
|
||||||
|
verify(this.sessions, never()).registerInterest(any(), any(InterestResultPolicy.class));
|
||||||
|
verify(this.sessions, never()).registerInterest(any(), any(InterestResultPolicy.class), anyBoolean());
|
||||||
|
verify(this.sessions, never()).registerInterest(any(), any(InterestResultPolicy.class), anyBoolean(), anyBoolean());
|
||||||
|
verify(this.sessions, never()).registerInterestForAllKeys();
|
||||||
|
verify(this.sessions, never()).registerInterestForAllKeys(any(InterestResultPolicy.class));
|
||||||
|
verify(this.sessions, never()).registerInterestForAllKeys(any(InterestResultPolicy.class), anyBoolean());
|
||||||
|
verify(this.sessions, never()).registerInterestForAllKeys(any(InterestResultPolicy.class), anyBoolean(), anyBoolean());
|
||||||
|
verify(this.sessions, never()).registerInterestForKeys(any(Iterable.class));
|
||||||
|
verify(this.sessions, never()).registerInterestForKeys(any(Iterable.class), any(InterestResultPolicy.class));
|
||||||
|
verify(this.sessions, never()).registerInterestForKeys(any(Iterable.class), any(InterestResultPolicy.class), anyBoolean());
|
||||||
|
verify(this.sessions, never()).registerInterestForKeys(any(Iterable.class), any(InterestResultPolicy.class), anyBoolean(), anyBoolean());
|
||||||
|
verify(this.sessions, never()).registerInterestRegex(anyString());
|
||||||
|
verify(this.sessions, never()).registerInterestRegex(anyString(), anyBoolean());
|
||||||
|
verify(this.sessions, never()).registerInterestRegex(anyString(), anyBoolean(), anyBoolean());
|
||||||
|
verify(this.sessions, never()).registerInterestRegex(anyString(), any(InterestResultPolicy.class));
|
||||||
|
verify(this.sessions, never()).registerInterestRegex(anyString(), any(InterestResultPolicy.class), anyBoolean());
|
||||||
|
verify(this.sessions, never()).registerInterestRegex(anyString(), any(InterestResultPolicy.class), anyBoolean(), anyBoolean());
|
||||||
|
verify(this.sessions, never()).unregisterInterest(any());
|
||||||
|
verify(this.sessions, never()).unregisterInterestRegex(anyString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sessionEventsFireSuccessfully() {
|
||||||
|
|
||||||
|
Session expectedSession = save(createSession());
|
||||||
|
|
||||||
|
assertThat(expectedSession).isNotNull();
|
||||||
|
assertThat(expectedSession.isExpired()).isFalse();
|
||||||
|
assertThat(expectedSession.getId()).isNotEmpty();
|
||||||
|
assertThat(expectedSession.getMaxInactiveInterval())
|
||||||
|
.isEqualTo(Duration.ofSeconds(MAX_INACTIVE_INTERVAL_IN_SECONDS));
|
||||||
|
|
||||||
|
// Wait for Session created event
|
||||||
|
AbstractSessionEvent sessionEvent = this.sessionEventListener.waitForSessionEvent(500L);
|
||||||
|
|
||||||
|
assertThat(sessionEvent).isInstanceOf(SessionCreatedEvent.class);
|
||||||
|
assertThat(sessionEvent.<Session>getSession()).isEqualTo(expectedSession);
|
||||||
|
|
||||||
|
Session actualSession = get(expectedSession.getId());
|
||||||
|
|
||||||
|
assertThat(actualSession).isNotNull();
|
||||||
|
assertThat(actualSession).isEqualTo(expectedSession);
|
||||||
|
assertThat(actualSession).isNotSameAs(expectedSession);
|
||||||
|
|
||||||
|
delete(actualSession);
|
||||||
|
|
||||||
|
actualSession = get(actualSession.getId());
|
||||||
|
|
||||||
|
assertThat(actualSession).isNull();
|
||||||
|
|
||||||
|
// Wait for Session deleted event
|
||||||
|
sessionEvent = this.sessionEventListener.waitForSessionEvent(500L);
|
||||||
|
|
||||||
|
assertThat(sessionEvent).isInstanceOf(SessionDeletedEvent.class);
|
||||||
|
assertThat(sessionEvent.getSessionId()).isEqualTo(expectedSession.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sessionExpirationIsNotFired() {
|
||||||
|
|
||||||
|
Session expectedSession = save(createSession());
|
||||||
|
|
||||||
|
assertThat(expectedSession).isNotNull();
|
||||||
|
assertThat(expectedSession.isExpired()).isFalse();
|
||||||
|
assertThat(expectedSession.getId()).isNotEmpty();
|
||||||
|
assertThat(expectedSession.getMaxInactiveInterval())
|
||||||
|
.isEqualTo(Duration.ofSeconds(MAX_INACTIVE_INTERVAL_IN_SECONDS));
|
||||||
|
|
||||||
|
AbstractSessionEvent sessionEvent = this.sessionEventListener.waitForSessionEvent(500L);
|
||||||
|
|
||||||
|
assertThat(sessionEvent).isInstanceOf(SessionCreatedEvent.class);
|
||||||
|
assertThat(sessionEvent.<Session>getSession()).isEqualTo(expectedSession);
|
||||||
|
|
||||||
|
Session actualSession = get(expectedSession.getId());
|
||||||
|
|
||||||
|
assertThat(actualSession).isNotNull();
|
||||||
|
assertThat(actualSession).isEqualTo(expectedSession);
|
||||||
|
assertThat(actualSession).isNotSameAs(expectedSession);
|
||||||
|
|
||||||
|
long duration = Duration.ofSeconds(MAX_INACTIVE_INTERVAL_IN_SECONDS).toMillis() * 2L;
|
||||||
|
|
||||||
|
sessionEvent = this.sessionEventListener.waitForSessionEvent(duration);
|
||||||
|
|
||||||
|
assertThat(sessionEvent).isNull();
|
||||||
|
|
||||||
|
actualSession = get(expectedSession.getId());
|
||||||
|
|
||||||
|
assertThat(actualSession).isNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
@ClientCacheApplication(
|
||||||
|
name = "DisabledClientSubscriptionsIntegrationTests",
|
||||||
|
logLevel = GEMFIRE_LOG_LEVEL,
|
||||||
|
copyOnRead = true
|
||||||
|
)
|
||||||
|
@EnableGemFireHttpSession(
|
||||||
|
regionName = TEST_SESSION_REGION_NAME,
|
||||||
|
poolName = "DEFAULT",
|
||||||
|
maxInactiveIntervalInSeconds = MAX_INACTIVE_INTERVAL_IN_SECONDS
|
||||||
|
)
|
||||||
|
static class TestSpringSessionGemFireClientConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
BeanPostProcessor sessionRegionSpyBeanPostProcessor() {
|
||||||
|
|
||||||
|
return new BeanPostProcessor() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
||||||
|
|
||||||
|
if (bean instanceof Region) {
|
||||||
|
|
||||||
|
Region<Object, Session> region = (Region<Object, Session>) bean;
|
||||||
|
|
||||||
|
bean = TEST_SESSION_REGION_NAME.equals(region.getName()) ? spy(region) : region;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bean;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
SessionEventListener sessionEventListener() {
|
||||||
|
return new SessionEventListener();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@CacheServerApplication(name = "DisabledClientSubscriptionsIntegrationTests", logLevel = GEMFIRE_LOG_LEVEL)
|
||||||
|
@EnableGemFireHttpSession(
|
||||||
|
regionName = TEST_SESSION_REGION_NAME,
|
||||||
|
maxInactiveIntervalInSeconds = MAX_INACTIVE_INTERVAL_IN_SECONDS
|
||||||
|
)
|
||||||
|
static class TestSpringSessionGemFireServerConfiguration {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
|
||||||
|
AnnotationConfigApplicationContext applicationContext =
|
||||||
|
new AnnotationConfigApplicationContext(TestSpringSessionGemFireServerConfiguration.class);
|
||||||
|
|
||||||
|
applicationContext.registerShutdownHook();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -44,6 +44,9 @@ import org.apache.geode.InvalidDeltaException;
|
|||||||
import org.apache.geode.cache.EntryEvent;
|
import org.apache.geode.cache.EntryEvent;
|
||||||
import org.apache.geode.cache.InterestResultPolicy;
|
import org.apache.geode.cache.InterestResultPolicy;
|
||||||
import org.apache.geode.cache.Region;
|
import org.apache.geode.cache.Region;
|
||||||
|
import org.apache.geode.cache.RegionAttributes;
|
||||||
|
import org.apache.geode.cache.client.Pool;
|
||||||
|
import org.apache.geode.cache.client.PoolManager;
|
||||||
import org.apache.geode.cache.util.CacheListenerAdapter;
|
import org.apache.geode.cache.util.CacheListenerAdapter;
|
||||||
|
|
||||||
import org.springframework.context.ApplicationEvent;
|
import org.springframework.context.ApplicationEvent;
|
||||||
@@ -109,6 +112,7 @@ import org.slf4j.LoggerFactory;
|
|||||||
public abstract class AbstractGemFireOperationsSessionRepository
|
public abstract class AbstractGemFireOperationsSessionRepository
|
||||||
implements ApplicationEventPublisherAware, FindByIndexNameSessionRepository<Session> {
|
implements ApplicationEventPublisherAware, FindByIndexNameSessionRepository<Session> {
|
||||||
|
|
||||||
|
private static final boolean DEFAULT_CLIENT_SUBSCRIPTIONS_ENABLED = false;
|
||||||
private static final boolean DEFAULT_REGISTER_INTEREST_DURABILITY = false;
|
private static final boolean DEFAULT_REGISTER_INTEREST_DURABILITY = false;
|
||||||
private static final boolean DEFAULT_REGISTER_INTEREST_ENABLED = false;
|
private static final boolean DEFAULT_REGISTER_INTEREST_ENABLED = false;
|
||||||
private static final boolean DEFAULT_REGISTER_INTEREST_RECEIVE_VALUES = true;
|
private static final boolean DEFAULT_REGISTER_INTEREST_RECEIVE_VALUES = true;
|
||||||
@@ -214,7 +218,7 @@ public abstract class AbstractGemFireOperationsSessionRepository
|
|||||||
|
|
||||||
sessionsRegionAttributesMutator.addCacheListener(this.sessionEventHandler);
|
sessionsRegionAttributesMutator.addCacheListener(this.sessionEventHandler);
|
||||||
|
|
||||||
if (GemFireUtils.isNonLocalClientRegion(sessionsRegion)) {
|
if (isRegionRegisterInterestAllowed(sessionsRegion)) {
|
||||||
this.registerInterestEnabled = true;
|
this.registerInterestEnabled = true;
|
||||||
sessionsRegionAttributesMutator.addCacheListener(newSessionIdInterestRegistrar());
|
sessionsRegionAttributesMutator.addCacheListener(newSessionIdInterestRegistrar());
|
||||||
}
|
}
|
||||||
@@ -223,6 +227,28 @@ public abstract class AbstractGemFireOperationsSessionRepository
|
|||||||
return sessionsRegion;
|
return sessionsRegion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean isNonLocalClientRegion(Region<?, ?> region) {
|
||||||
|
return GemFireUtils.isNonLocalClientRegion(region);
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isRegionPoolSubscriptionsEnabled(Region<?, ?> region) {
|
||||||
|
|
||||||
|
return Boolean.TRUE.equals(Optional.ofNullable(region)
|
||||||
|
.map(Region::getAttributes)
|
||||||
|
.map(RegionAttributes::getPoolName)
|
||||||
|
.map(this::resolvePool)
|
||||||
|
.map(Pool::getSubscriptionEnabled)
|
||||||
|
.orElse(DEFAULT_CLIENT_SUBSCRIPTIONS_ENABLED));
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean isRegionRegisterInterestAllowed(Region<?, ?> region) {
|
||||||
|
return isNonLocalClientRegion(region) && isRegionPoolSubscriptionsEnabled(region);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Pool resolvePool(String name) {
|
||||||
|
return PoolManager.find(name);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new instance of {@link Logger} using Apache Commons {@link LoggerFactory}.
|
* Constructs a new instance of {@link Logger} using Apache Commons {@link LoggerFactory}.
|
||||||
*
|
*
|
||||||
@@ -263,6 +289,7 @@ public abstract class AbstractGemFireOperationsSessionRepository
|
|||||||
* @throws IllegalArgumentException if {@link ApplicationEventPublisher} is {@literal null}.
|
* @throws IllegalArgumentException if {@link ApplicationEventPublisher} is {@literal null}.
|
||||||
* @see org.springframework.context.ApplicationEventPublisher
|
* @see org.springframework.context.ApplicationEventPublisher
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void setApplicationEventPublisher(@NonNull ApplicationEventPublisher applicationEventPublisher) {
|
public void setApplicationEventPublisher(@NonNull ApplicationEventPublisher applicationEventPublisher) {
|
||||||
|
|
||||||
Assert.notNull(applicationEventPublisher, "ApplicationEventPublisher is required");
|
Assert.notNull(applicationEventPublisher, "ApplicationEventPublisher is required");
|
||||||
@@ -561,7 +588,7 @@ public abstract class AbstractGemFireOperationsSessionRepository
|
|||||||
protected void registerInterest(@Nullable Object sessionId) {
|
protected void registerInterest(@Nullable Object sessionId) {
|
||||||
|
|
||||||
Optional.ofNullable(sessionId)
|
Optional.ofNullable(sessionId)
|
||||||
.filter(it -> this.isRegisterInterestEnabled())
|
.filter(it -> isRegisterInterestEnabled())
|
||||||
.filter(SessionUtils::isValidSessionId)
|
.filter(SessionUtils::isValidSessionId)
|
||||||
.map(ObjectUtils::nullSafeHashCode)
|
.map(ObjectUtils::nullSafeHashCode)
|
||||||
.filter(this.interestingSessionIds::add)
|
.filter(this.interestingSessionIds::add)
|
||||||
|
|||||||
@@ -787,7 +787,7 @@ public class GemFireHttpSessionConfiguration extends AbstractGemFireHttpSessionC
|
|||||||
SpringSessionGemFireConfigurer::getClientRegionShortcut, this::setClientRegionShortcut);
|
SpringSessionGemFireConfigurer::getClientRegionShortcut, this::setClientRegionShortcut);
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T> SpringSessionGemFireConfigurer applyExposeConfigurationAsProperties(SpringSessionGemFireConfigurer configurer) {
|
private SpringSessionGemFireConfigurer applyExposeConfigurationAsProperties(SpringSessionGemFireConfigurer configurer) {
|
||||||
|
|
||||||
return applySpringSessionGemFireConfigurerConfiguration(configurer,
|
return applySpringSessionGemFireConfigurerConfiguration(configurer,
|
||||||
CONFIGURER_GET_EXPOSE_CONFIGURATION_IN_PROPERTIES_METHOD_NAME,
|
CONFIGURER_GET_EXPOSE_CONFIGURATION_IN_PROPERTIES_METHOD_NAME,
|
||||||
@@ -898,6 +898,7 @@ public class GemFireHttpSessionConfiguration extends AbstractGemFireHttpSessionC
|
|||||||
.ifPresent(it -> properties.setProperty(sessionExpirationPolicyBeanNamePropertyName(), it));
|
.ifPresent(it -> properties.setProperty(sessionExpirationPolicyBeanNamePropertyName(), it));
|
||||||
|
|
||||||
properties.setProperty(sessionSerializerBeanNamePropertyName(), getSessionSerializerBeanName());
|
properties.setProperty(sessionSerializerBeanNamePropertyName(), getSessionSerializerBeanName());
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.session.data.gemfire.config.annotation.web.http.support;
|
package org.springframework.session.data.gemfire.config.annotation.web.http.support;
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
@@ -37,12 +36,15 @@ import org.springframework.session.data.gemfire.serialization.SessionSerializer;
|
|||||||
* in Spring Session.
|
* in Spring Session.
|
||||||
*
|
*
|
||||||
* @author John Blum
|
* @author John Blum
|
||||||
|
* @see java.lang.annotation.Annotation
|
||||||
|
* @see java.util.Properties
|
||||||
* @see org.apache.geode.cache.Cache
|
* @see org.apache.geode.cache.Cache
|
||||||
* @see org.apache.geode.cache.Region
|
* @see org.apache.geode.cache.Region
|
||||||
* @see org.apache.geode.cache.RegionShortcut
|
* @see org.apache.geode.cache.RegionShortcut
|
||||||
* @see org.apache.geode.cache.client.ClientCache
|
* @see org.apache.geode.cache.client.ClientCache
|
||||||
* @see org.apache.geode.cache.client.ClientRegionShortcut
|
* @see org.apache.geode.cache.client.ClientRegionShortcut
|
||||||
* @see org.apache.geode.cache.client.Pool
|
* @see org.apache.geode.cache.client.Pool
|
||||||
|
* @see org.springframework.session.Session
|
||||||
* @see org.springframework.session.data.gemfire.config.annotation.web.http.EnableGemFireHttpSession
|
* @see org.springframework.session.data.gemfire.config.annotation.web.http.EnableGemFireHttpSession
|
||||||
* @see org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration
|
* @see org.springframework.session.data.gemfire.config.annotation.web.http.GemFireHttpSessionConfiguration
|
||||||
* @see org.springframework.session.data.gemfire.expiration.SessionExpirationPolicy
|
* @see org.springframework.session.data.gemfire.expiration.SessionExpirationPolicy
|
||||||
|
|||||||
@@ -13,7 +13,6 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.springframework.session.data.gemfire;
|
package org.springframework.session.data.gemfire;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
@@ -78,6 +77,7 @@ import org.apache.geode.cache.Operation;
|
|||||||
import org.apache.geode.cache.Region;
|
import org.apache.geode.cache.Region;
|
||||||
import org.apache.geode.cache.RegionAttributes;
|
import org.apache.geode.cache.RegionAttributes;
|
||||||
import org.apache.geode.cache.client.ClientCache;
|
import org.apache.geode.cache.client.ClientCache;
|
||||||
|
import org.apache.geode.cache.client.Pool;
|
||||||
|
|
||||||
import org.springframework.context.ApplicationEvent;
|
import org.springframework.context.ApplicationEvent;
|
||||||
import org.springframework.context.ApplicationEventPublisher;
|
import org.springframework.context.ApplicationEventPublisher;
|
||||||
@@ -135,6 +135,9 @@ public class AbstractGemFireOperationsSessionRepositoryTests {
|
|||||||
@Mock
|
@Mock
|
||||||
private Logger mockLog;
|
private Logger mockLog;
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
private Pool mockPool;
|
||||||
|
|
||||||
@Mock
|
@Mock
|
||||||
private Region<Object, Session> mockRegion;
|
private Region<Object, Session> mockRegion;
|
||||||
|
|
||||||
@@ -217,7 +220,7 @@ public class AbstractGemFireOperationsSessionRepositoryTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void constructGemFireOperationsSessionRepository() throws Exception {
|
public void constructGemFireOperationsSessionRepository() {
|
||||||
|
|
||||||
ApplicationEventPublisher mockApplicationEventPublisher = mock(ApplicationEventPublisher.class);
|
ApplicationEventPublisher mockApplicationEventPublisher = mock(ApplicationEventPublisher.class);
|
||||||
|
|
||||||
@@ -229,6 +232,7 @@ public class AbstractGemFireOperationsSessionRepositoryTests {
|
|||||||
|
|
||||||
RegionAttributes<Object, Session> mockRegionAttributes = mock(RegionAttributes.class);
|
RegionAttributes<Object, Session> mockRegionAttributes = mock(RegionAttributes.class);
|
||||||
|
|
||||||
|
when(this.mockPool.getSubscriptionEnabled()).thenReturn(true);
|
||||||
when(mockRegion.getAttributes()).thenReturn(mockRegionAttributes);
|
when(mockRegion.getAttributes()).thenReturn(mockRegionAttributes);
|
||||||
when(mockRegion.getAttributesMutator()).thenReturn(mockAttributesMutator);
|
when(mockRegion.getAttributesMutator()).thenReturn(mockAttributesMutator);
|
||||||
when(mockRegion.getFullPath()).thenReturn(RegionUtils.toRegionPath("Example"));
|
when(mockRegion.getFullPath()).thenReturn(RegionUtils.toRegionPath("Example"));
|
||||||
@@ -258,11 +262,12 @@ public class AbstractGemFireOperationsSessionRepositoryTests {
|
|||||||
assertThat(sessionRepository.getApplicationEventPublisher()).isSameAs(mockApplicationEventPublisher);
|
assertThat(sessionRepository.getApplicationEventPublisher()).isSameAs(mockApplicationEventPublisher);
|
||||||
assertThat(sessionRepository.getMaxInactiveIntervalInSeconds()).isEqualTo(300);
|
assertThat(sessionRepository.getMaxInactiveIntervalInSeconds()).isEqualTo(300);
|
||||||
|
|
||||||
verify(mockRegion, times(1)).getAttributes();
|
verify(this.mockPool, times(1)).getSubscriptionEnabled();
|
||||||
|
verify(mockRegion, times(2)).getAttributes();
|
||||||
verify(mockRegion, times(1)).getAttributesMutator();
|
verify(mockRegion, times(1)).getAttributesMutator();
|
||||||
verify(mockRegion, times(1)).getFullPath();
|
verify(mockRegion, times(1)).getFullPath();
|
||||||
verify(mockRegion, times(1)).getRegionService();
|
verify(mockRegion, times(1)).getRegionService();
|
||||||
verify(mockRegionAttributes, times(1)).getPoolName();
|
verify(mockRegionAttributes, times(2)).getPoolName();
|
||||||
verify(mockAttributesMutator, times(1))
|
verify(mockAttributesMutator, times(1))
|
||||||
.addCacheListener(isA(SessionEventHandlerCacheListenerAdapter.class));
|
.addCacheListener(isA(SessionEventHandlerCacheListenerAdapter.class));
|
||||||
verify(mockAttributesMutator, times(1))
|
verify(mockAttributesMutator, times(1))
|
||||||
@@ -432,6 +437,7 @@ public class AbstractGemFireOperationsSessionRepositoryTests {
|
|||||||
|
|
||||||
RegionAttributes mockRegionAttributes = mock(RegionAttributes.class);
|
RegionAttributes mockRegionAttributes = mock(RegionAttributes.class);
|
||||||
|
|
||||||
|
when(this.mockPool.getSubscriptionEnabled()).thenReturn(true);
|
||||||
when(mockRegion.getAttributes()).thenReturn(mockRegionAttributes);
|
when(mockRegion.getAttributes()).thenReturn(mockRegionAttributes);
|
||||||
when(mockRegion.getAttributesMutator()).thenReturn(mockAttributesMutator);
|
when(mockRegion.getAttributesMutator()).thenReturn(mockAttributesMutator);
|
||||||
when(mockRegion.getRegionService()).thenReturn(mockClientCache);
|
when(mockRegion.getRegionService()).thenReturn(mockClientCache);
|
||||||
@@ -3626,11 +3632,16 @@ public class AbstractGemFireOperationsSessionRepositoryTests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static class TestGemFireOperationsSessionRepository extends GemFireOperationsSessionRepositorySupport {
|
class TestGemFireOperationsSessionRepository extends GemFireOperationsSessionRepositorySupport {
|
||||||
|
|
||||||
TestGemFireOperationsSessionRepository(GemfireOperations gemfireOperations) {
|
TestGemFireOperationsSessionRepository(GemfireOperations gemfireOperations) {
|
||||||
super(gemfireOperations);
|
super(gemfireOperations);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Pool resolvePool(String name) {
|
||||||
|
return mockPool;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static class Tombstone { }
|
static class Tombstone { }
|
||||||
|
|||||||
Reference in New Issue
Block a user