|
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