|
17 | 17 | import static org.junit.jupiter.api.Assertions.assertTrue;
|
18 | 18 | import static org.mockito.Mockito.*;
|
19 | 19 |
|
20 |
| -import io.lettuce.core.protocol.AsyncCommand; |
21 | 20 | import io.lettuce.core.pubsub.api.async.RedisPubSubAsyncCommands;
|
22 |
| -import io.lettuce.core.pubsub.PubSubOutput; |
23 |
| -import io.lettuce.core.pubsub.RedisPubSubAdapter; |
24 | 21 |
|
25 | 22 | import java.lang.reflect.Field;
|
26 | 23 | import java.nio.ByteBuffer;
|
27 | 24 | import java.time.Duration;
|
28 | 25 | import java.util.Arrays;
|
29 | 26 | import java.util.HashSet;
|
30 | 27 | import java.util.List;
|
| 28 | +import java.util.Set; |
31 | 29 |
|
32 | 30 | @Tag(UNIT_TEST)
|
33 | 31 | class StatefulRedisPubSubConnectionImplUnitTests {
|
@@ -132,66 +130,27 @@ void resubscribeChannelAndPatternAndShardChanelSubscription() {
|
132 | 130 |
|
133 | 131 | @Test
|
134 | 132 | void autoResubscribeListenerIsRegistered() {
|
135 |
| - // Verify that the connection has the markIntentionalUnsubscribe method |
136 |
| - // This confirms the auto-resubscribe functionality is available |
137 | 133 | connection.markIntentionalUnsubscribe("test-channel");
|
138 |
| - // If no exception is thrown, the method exists and works |
139 | 134 | assertTrue(true);
|
140 | 135 | }
|
141 | 136 |
|
142 | 137 | @Test
|
143 | 138 | void intentionalUnsubscribeBypassesAutoResubscribe() throws Exception {
|
144 |
| - // Test 1: Intentional unsubscribe should NOT trigger auto-resubscribe |
145 |
| - |
146 |
| - // Create a mock async commands to verify ssubscribe is NOT called |
147 |
| - RedisPubSubAsyncCommands<String, String> mockAsync = mock(RedisPubSubAsyncCommands.class); |
148 |
| - StatefulRedisPubSubConnectionImpl<String, String> spyConnection = spy(connection); |
149 |
| - when(spyConnection.async()).thenReturn(mockAsync); |
150 |
| - |
151 |
| - // Mark the channel as intentionally unsubscribed |
152 |
| - spyConnection.markIntentionalUnsubscribe("test-channel"); |
153 |
| - |
154 |
| - // Use reflection to access the private endpoint and trigger sunsubscribed event |
155 |
| - PubSubEndpoint<String, String> endpoint = getEndpointViaReflection(spyConnection); |
156 |
| - PubSubOutput<String, String> sunsubscribeMessage = createSunsubscribeMessage("test-channel", codec); |
157 |
| - endpoint.notifyMessage(sunsubscribeMessage); |
| 139 | + connection.markIntentionalUnsubscribe("test-channel"); |
158 | 140 |
|
159 |
| - // Wait a moment for any async processing |
160 |
| - Thread.sleep(50); |
| 141 | + RedisPubSubListener<String, String> autoResubscribeListener = getAutoResubscribeListener(connection); |
161 | 142 |
|
162 |
| - // Verify that ssubscribe was NOT called (intentional unsubscribe bypassed auto-resubscribe) |
163 |
| - verify(mockAsync, never()).ssubscribe("test-channel"); |
| 143 | + autoResubscribeListener.sunsubscribed("test-channel", 0); |
| 144 | + verify(mockedWriter, never()).write(any(io.lettuce.core.protocol.RedisCommand.class)); |
164 | 145 | }
|
165 | 146 |
|
166 | 147 | @Test
|
167 | 148 | void unintentionalUnsubscribeTriggersAutoResubscribe() throws Exception {
|
168 |
| - // Test 2: Unintentional unsubscribe (from Redis) should trigger auto-resubscribe |
| 149 | + RedisPubSubListener<String, String> autoResubscribeListener = getAutoResubscribeListener(connection); |
169 | 150 |
|
170 |
| - // Create a fresh connection with a mock async |
171 |
| - PubSubEndpoint<String, String> mockEndpoint = mock(PubSubEndpoint.class); |
172 |
| - StatefulRedisPubSubConnectionImpl<String, String> testConnection = new StatefulRedisPubSubConnectionImpl<>(mockEndpoint, |
173 |
| - mockedWriter, codec, timeout); |
174 |
| - |
175 |
| - // Create a mock async commands to verify ssubscribe IS called |
176 |
| - RedisPubSubAsyncCommands<String, String> mockAsync = mock(RedisPubSubAsyncCommands.class); |
177 |
| - @SuppressWarnings("unchecked") |
178 |
| - RedisFuture<Void> mockFuture = mock(RedisFuture.class); |
179 |
| - when(mockAsync.ssubscribe("test-channel")).thenReturn(mockFuture); |
180 |
| - |
181 |
| - StatefulRedisPubSubConnectionImpl<String, String> spyConnection = spy(testConnection); |
182 |
| - when(spyConnection.async()).thenReturn(mockAsync); |
183 |
| - |
184 |
| - // Get the auto-resubscribe listener directly and trigger it |
185 |
| - RedisPubSubListener<String, String> autoResubscribeListener = getAutoResubscribeListener(spyConnection); |
186 |
| - |
187 |
| - // Do NOT mark as intentional - simulate Redis server sunsubscribe during slot movement |
188 | 151 | autoResubscribeListener.sunsubscribed("test-channel", 0);
|
189 | 152 |
|
190 |
| - // Wait a moment for async processing |
191 |
| - Thread.sleep(50); |
192 |
| - |
193 |
| - // Verify that ssubscribe WAS called (auto-resubscribe triggered) |
194 |
| - verify(mockAsync, times(1)).ssubscribe("test-channel"); |
| 153 | + verify(mockedWriter, times(1)).write(any(io.lettuce.core.protocol.RedisCommand.class)); |
195 | 154 | }
|
196 | 155 |
|
197 | 156 | @SuppressWarnings("unchecked")
|
|
0 commit comments