From e1dea5e0a8e69916346191c4684de2a001990a75 Mon Sep 17 00:00:00 2001 From: Eleftheria Stein Date: Fri, 1 Apr 2022 18:21:23 +0200 Subject: [PATCH] Revise Redis test mocks based on new Data implementation Issue gh-2070 --- ...onClassPathXmlApplicationContextTests.java | 14 +++++++- ...gurationNoOpConfigureRedisActionTests.java | 22 +++++++++++-- ...urationOverrideDefaultSerializerTests.java | 14 +++++++- ...figurationOverrideSessionTaskExecutor.java | 24 +++++++++++--- ...igurationOverrideSessionTaskExecutors.java | 32 ++++++++++++++++--- .../RedisHttpSessionConfigurationTests.java | 31 +++++++++++++----- ...sionConfigurationXmlCustomExpireTests.java | 14 +++++++- ...RedisHttpSessionConfigurationXmlTests.java | 14 +++++++- .../annotation/web/http/gh109/Gh109Tests.java | 13 +++++++- ...ationNoOpConfigureRedisActionXmlTests.java | 22 +++++++++++-- ...gurationNoOpConfigureRedisActionTests.java | 22 +++++++++++-- .../AbstractHttpSessionListenerTests.java | 14 +++++++- 12 files changed, 207 insertions(+), 29 deletions(-) diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationClassPathXmlApplicationContextTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationClassPathXmlApplicationContextTests.java index 7ab13ace..c9bf121b 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationClassPathXmlApplicationContextTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationClassPathXmlApplicationContextTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -23,11 +23,14 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.SubscriptionListener; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; /** @@ -50,6 +53,15 @@ public class RedisHttpSessionConfigurationClassPathXmlApplicationContextTests { given(factory.getConnection()).willReturn(connection); given(connection.getConfig(anyString())).willReturn(new Properties()); + willAnswer((it) -> { + SubscriptionListener listener = it.getArgument(0); + listener.onPatternSubscribed(it.getArgument(1), 0); + listener.onChannelSubscribed("__keyevent@0__:del".getBytes(), 0); + listener.onChannelSubscribed("__keyevent@0__:expired".getBytes(), 0); + + return null; + }).given(connection).pSubscribe(any(), any()); + return factory; } diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationNoOpConfigureRedisActionTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationNoOpConfigureRedisActionTests.java index 7acba88a..280978a6 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationNoOpConfigureRedisActionTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationNoOpConfigureRedisActionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -21,12 +21,17 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.SubscriptionListener; import org.springframework.session.data.redis.config.ConfigureRedisAction; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; /** @@ -52,7 +57,20 @@ class RedisHttpSessionConfigurationNoOpConfigureRedisActionTests { @Bean RedisConnectionFactory redisConnectionFactory() { - return mock(RedisConnectionFactory.class); + RedisConnectionFactory redisConnectionFactory = mock(RedisConnectionFactory.class); + RedisConnection connection = mock(RedisConnection.class); + given(redisConnectionFactory.getConnection()).willReturn(connection); + + willAnswer((it) -> { + SubscriptionListener listener = it.getArgument(0); + listener.onPatternSubscribed(it.getArgument(1), 0); + listener.onChannelSubscribed("__keyevent@0__:del".getBytes(), 0); + listener.onChannelSubscribed("__keyevent@0__:expired".getBytes(), 0); + + return null; + }).given(connection).pSubscribe(any(), any()); + + return redisConnectionFactory; } } diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationOverrideDefaultSerializerTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationOverrideDefaultSerializerTests.java index 3b2bfa97..1314b7a8 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationOverrideDefaultSerializerTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationOverrideDefaultSerializerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -26,6 +26,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.SubscriptionListener; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.session.data.redis.config.annotation.SpringSessionRedisOperations; @@ -34,8 +35,10 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; /** @@ -76,6 +79,15 @@ class RedisHttpSessionConfigurationOverrideDefaultSerializerTests { given(factory.getConnection()).willReturn(connection); given(connection.getConfig(anyString())).willReturn(new Properties()); + willAnswer((it) -> { + SubscriptionListener listener = it.getArgument(0); + listener.onPatternSubscribed(it.getArgument(1), 0); + listener.onChannelSubscribed("__keyevent@0__:del".getBytes(), 0); + listener.onChannelSubscribed("__keyevent@0__:expired".getBytes(), 0); + + return null; + }).given(connection).pSubscribe(any(), any()); + return factory; } diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationOverrideSessionTaskExecutor.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationOverrideSessionTaskExecutor.java index 038736a0..fca2d967 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationOverrideSessionTaskExecutor.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationOverrideSessionTaskExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -27,8 +27,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.SubscriptionListener; import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import org.springframework.scheduling.SchedulingAwareRunnable; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; @@ -36,6 +36,7 @@ import org.springframework.test.context.web.WebAppConfiguration; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -57,7 +58,7 @@ class RedisHttpSessionConfigurationOverrideSessionTaskExecutor { @Test void overrideSessionTaskExecutor() { - verify(this.springSessionRedisTaskExecutor, times(1)).execute(any(SchedulingAwareRunnable.class)); + verify(this.springSessionRedisTaskExecutor, times(1)).execute(any(Runnable.class)); } @EnableRedisHttpSession @@ -66,7 +67,13 @@ class RedisHttpSessionConfigurationOverrideSessionTaskExecutor { @Bean Executor springSessionRedisTaskExecutor() { - return mock(Executor.class); + Executor executor = mock(Executor.class); + willAnswer((it) -> { + Runnable r = it.getArgument(0); + new Thread(r).start(); + return null; + }).given(executor).execute(any()); + return executor; } @Bean @@ -76,6 +83,15 @@ class RedisHttpSessionConfigurationOverrideSessionTaskExecutor { given(factory.getConnection()).willReturn(connection); given(connection.getConfig(anyString())).willReturn(new Properties()); + willAnswer((it) -> { + SubscriptionListener listener = it.getArgument(0); + listener.onPatternSubscribed(it.getArgument(1), 0); + listener.onChannelSubscribed("__keyevent@0__:del".getBytes(), 0); + listener.onChannelSubscribed("__keyevent@0__:expired".getBytes(), 0); + + return null; + }).given(connection).pSubscribe(any(), any()); + return factory; } diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationOverrideSessionTaskExecutors.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationOverrideSessionTaskExecutors.java index d5104605..92bded75 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationOverrideSessionTaskExecutors.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationOverrideSessionTaskExecutors.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -27,8 +27,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.SubscriptionListener; import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import org.springframework.scheduling.SchedulingAwareRunnable; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; @@ -36,6 +36,7 @@ import org.springframework.test.context.web.WebAppConfiguration; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -62,7 +63,7 @@ class RedisHttpSessionConfigurationOverrideSessionTaskExecutors { @Test void overrideSessionTaskExecutors() { - verify(this.springSessionRedisSubscriptionExecutor, times(1)).execute(any(SchedulingAwareRunnable.class)); + verify(this.springSessionRedisSubscriptionExecutor, times(1)).execute(any(Runnable.class)); verify(this.springSessionRedisTaskExecutor, never()).execute(any(Runnable.class)); } @@ -72,12 +73,24 @@ class RedisHttpSessionConfigurationOverrideSessionTaskExecutors { @Bean Executor springSessionRedisTaskExecutor() { - return mock(Executor.class); + Executor executor = mock(Executor.class); + willAnswer((it) -> { + Runnable r = it.getArgument(0); + new Thread(r).start(); + return null; + }).given(executor).execute(any()); + return executor; } @Bean Executor springSessionRedisSubscriptionExecutor() { - return mock(Executor.class); + Executor executor = mock(Executor.class); + willAnswer((it) -> { + Runnable r = it.getArgument(0); + new Thread(r).start(); + return null; + }).given(executor).execute(any()); + return executor; } @Bean @@ -87,6 +100,15 @@ class RedisHttpSessionConfigurationOverrideSessionTaskExecutors { given(factory.getConnection()).willReturn(connection); given(connection.getConfig(anyString())).willReturn(new Properties()); + willAnswer((it) -> { + SubscriptionListener listener = it.getArgument(0); + listener.onPatternSubscribed(it.getArgument(1), 0); + listener.onChannelSubscribed("__keyevent@0__:del".getBytes(), 0); + listener.onChannelSubscribed("__keyevent@0__:expired".getBytes(), 0); + + return null; + }).given(connection).pSubscribe(any(), any()); + return factory; } diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationTests.java index d243410f..1f9437ba 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -32,6 +32,7 @@ import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.annotation.Order; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.SubscriptionListener; import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.mock.env.MockEnvironment; @@ -47,8 +48,9 @@ import org.springframework.test.util.ReflectionTestUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; /** @@ -264,11 +266,24 @@ class RedisHttpSessionConfigurationTests { } private static RedisConnectionFactory mockRedisConnectionFactory() { - RedisConnectionFactory connectionFactory = mock(RedisConnectionFactory.class); - RedisConnection connection = mock(RedisConnection.class); - given(connectionFactory.getConnection()).willReturn(connection); - given(connection.getConfig(anyString())).willReturn(new Properties()); - return connectionFactory; + RedisConnectionFactory connectionFactoryMock = mock(RedisConnectionFactory.class); + RedisConnection connectionMock = mock(RedisConnection.class); + given(connectionFactoryMock.getConnection()).willReturn(connectionMock); + + Properties keyspaceEventsConfig = new Properties(); + keyspaceEventsConfig.put("notify-keyspace-events", "KEA"); + given(connectionMock.getConfig("notify-keyspace-events")).willReturn(keyspaceEventsConfig); + + willAnswer((it) -> { + SubscriptionListener listener = it.getArgument(0); + listener.onPatternSubscribed(it.getArgument(1), 0); + listener.onChannelSubscribed("__keyevent@0__:del".getBytes(), 0); + listener.onChannelSubscribed("__keyevent@0__:expired".getBytes(), 0); + + return null; + }).given(connectionMock).pSubscribe(any(), any()); + + return connectionFactoryMock; } @Configuration @@ -445,7 +460,7 @@ class RedisHttpSessionConfigurationTests { @Bean RedisMessageListenerContainer redisMessageListenerContainer() { - return new RedisMessageListenerContainer(); + return mock(RedisMessageListenerContainer.class); } } diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationXmlCustomExpireTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationXmlCustomExpireTests.java index 0f408e02..9c78a1d4 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationXmlCustomExpireTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationXmlCustomExpireTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -23,12 +23,15 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.SubscriptionListener; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; @ExtendWith(SpringExtension.class) @@ -46,6 +49,15 @@ public class RedisHttpSessionConfigurationXmlCustomExpireTests { given(factory.getConnection()).willReturn(connection); given(connection.getConfig(anyString())).willReturn(new Properties()); + willAnswer((it) -> { + SubscriptionListener listener = it.getArgument(0); + listener.onPatternSubscribed(it.getArgument(1), 0); + listener.onChannelSubscribed("__keyevent@0__:del".getBytes(), 0); + listener.onChannelSubscribed("__keyevent@0__:expired".getBytes(), 0); + + return null; + }).given(connection).pSubscribe(any(), any()); + return factory; } diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationXmlTests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationXmlTests.java index 5f7a00c9..5a61f29b 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationXmlTests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfigurationXmlTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -23,12 +23,15 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.SubscriptionListener; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; @ExtendWith(SpringExtension.class) @@ -46,6 +49,15 @@ public class RedisHttpSessionConfigurationXmlTests { given(factory.getConnection()).willReturn(connection); given(connection.getConfig(anyString())).willReturn(new Properties()); + willAnswer((it) -> { + SubscriptionListener listener = it.getArgument(0); + listener.onPatternSubscribed(it.getArgument(1), 0); + listener.onChannelSubscribed("__keyevent@0__:del".getBytes(), 0); + listener.onChannelSubscribed("__keyevent@0__:expired".getBytes(), 0); + + return null; + }).given(connection).pSubscribe(any(), any()); + return factory; } diff --git a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/gh109/Gh109Tests.java b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/gh109/Gh109Tests.java index 32bc3131..0db6c898 100644 --- a/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/gh109/Gh109Tests.java +++ b/spring-session-data-redis/src/test/java/org/springframework/session/data/redis/config/annotation/web/http/gh109/Gh109Tests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -26,6 +26,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.SubscriptionListener; import org.springframework.data.redis.core.RedisOperations; import org.springframework.session.data.redis.RedisIndexedSessionRepository; import org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration; @@ -33,8 +34,10 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; /** @@ -75,6 +78,14 @@ class Gh109Tests { RedisConnection connection = mock(RedisConnection.class); given(factory.getConnection()).willReturn(connection); given(connection.getConfig(anyString())).willReturn(new Properties()); + willAnswer((it) -> { + SubscriptionListener listener = it.getArgument(0); + listener.onPatternSubscribed(it.getArgument(1), 0); + listener.onChannelSubscribed("__keyevent@0__:del".getBytes(), 0); + listener.onChannelSubscribed("__keyevent@0__:expired".getBytes(), 0); + + return null; + }).given(connection).pSubscribe(any(), any()); return factory; } diff --git a/spring-session-docs/modules/ROOT/examples/java/docs/HttpSessionConfigurationNoOpConfigureRedisActionXmlTests.java b/spring-session-docs/modules/ROOT/examples/java/docs/HttpSessionConfigurationNoOpConfigureRedisActionXmlTests.java index f3e3d25d..080c4c75 100644 --- a/spring-session-docs/modules/ROOT/examples/java/docs/HttpSessionConfigurationNoOpConfigureRedisActionXmlTests.java +++ b/spring-session-docs/modules/ROOT/examples/java/docs/HttpSessionConfigurationNoOpConfigureRedisActionXmlTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -20,7 +20,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.SubscriptionListener; import org.springframework.session.Session; import org.springframework.session.web.http.SessionRepositoryFilter; import org.springframework.test.context.ContextConfiguration; @@ -28,6 +30,9 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; /** @@ -47,7 +52,20 @@ public class HttpSessionConfigurationNoOpConfigureRedisActionXmlTests { } static RedisConnectionFactory connectionFactory() { - return mock(RedisConnectionFactory.class); + RedisConnectionFactory connectionFactoryMock = mock(RedisConnectionFactory.class); + RedisConnection connectionMock = mock(RedisConnection.class); + given(connectionFactoryMock.getConnection()).willReturn(connectionMock); + + willAnswer((it) -> { + SubscriptionListener listener = it.getArgument(0); + listener.onPatternSubscribed(it.getArgument(1), 0); + listener.onChannelSubscribed("__keyevent@0__:del".getBytes(), 0); + listener.onChannelSubscribed("__keyevent@0__:expired".getBytes(), 0); + + return null; + }).given(connectionMock).pSubscribe(any(), any()); + + return connectionFactoryMock; } } diff --git a/spring-session-docs/modules/ROOT/examples/java/docs/RedisHttpSessionConfigurationNoOpConfigureRedisActionTests.java b/spring-session-docs/modules/ROOT/examples/java/docs/RedisHttpSessionConfigurationNoOpConfigureRedisActionTests.java index 27b1ebd8..a512dfc4 100644 --- a/spring-session-docs/modules/ROOT/examples/java/docs/RedisHttpSessionConfigurationNoOpConfigureRedisActionTests.java +++ b/spring-session-docs/modules/ROOT/examples/java/docs/RedisHttpSessionConfigurationNoOpConfigureRedisActionTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -21,13 +21,18 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.SubscriptionListener; import org.springframework.session.data.redis.config.ConfigureRedisAction; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; /** @@ -55,7 +60,20 @@ class RedisHttpSessionConfigurationNoOpConfigureRedisActionTests { @Bean RedisConnectionFactory redisConnectionFactory() { - return mock(RedisConnectionFactory.class); + RedisConnectionFactory connectionFactoryMock = mock(RedisConnectionFactory.class); + RedisConnection connectionMock = mock(RedisConnection.class); + given(connectionFactoryMock.getConnection()).willReturn(connectionMock); + + willAnswer((it) -> { + SubscriptionListener listener = it.getArgument(0); + listener.onPatternSubscribed(it.getArgument(1), 0); + listener.onChannelSubscribed("__keyevent@0__:del".getBytes(), 0); + listener.onChannelSubscribed("__keyevent@0__:expired".getBytes(), 0); + + return null; + }).given(connectionMock).pSubscribe(any(), any()); + + return connectionFactoryMock; } } diff --git a/spring-session-docs/modules/ROOT/examples/java/docs/http/AbstractHttpSessionListenerTests.java b/spring-session-docs/modules/ROOT/examples/java/docs/http/AbstractHttpSessionListenerTests.java index 81e1161c..2ae6519d 100644 --- a/spring-session-docs/modules/ROOT/examples/java/docs/http/AbstractHttpSessionListenerTests.java +++ b/spring-session-docs/modules/ROOT/examples/java/docs/http/AbstractHttpSessionListenerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2019 the original author or authors. + * Copyright 2014-2022 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. @@ -26,6 +26,7 @@ import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationListener; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.SubscriptionListener; import org.springframework.security.core.session.SessionDestroyedEvent; import org.springframework.session.MapSession; import org.springframework.session.Session; @@ -33,8 +34,10 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.willAnswer; import static org.mockito.Mockito.mock; /** @@ -67,6 +70,15 @@ public abstract class AbstractHttpSessionListenerTests { given(factory.getConnection()).willReturn(connection); given(connection.getConfig(anyString())).willReturn(new Properties()); + + willAnswer((it) -> { + SubscriptionListener listener = it.getArgument(0); + listener.onPatternSubscribed(it.getArgument(1), 0); + listener.onChannelSubscribed("__keyevent@0__:del".getBytes(), 0); + listener.onChannelSubscribed("__keyevent@0__:expired".getBytes(), 0); + + return null; + }).given(connection).pSubscribe(any(), any()); return factory; }