3434
3535
3636/**
37- * Test fixture for {@link org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry}.
37+ * Test fixture for
38+ * {@link org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry}.
3839 *
3940 * @author Rossen Stoyanchev
4041 * @author Sebastien Deleuze
4142 */
4243public class DefaultSubscriptionRegistryTests {
4344
44- private DefaultSubscriptionRegistry registry ;
45-
46-
47- @ Before
48- public void setup () {
49- this .registry = new DefaultSubscriptionRegistry ();
50- }
45+ private final DefaultSubscriptionRegistry registry = new DefaultSubscriptionRegistry ();
5146
5247
5348 @ Test
5449 public void registerSubscriptionInvalidInput () {
55-
5650 String sessId = "sess01" ;
5751 String subsId = "subs01" ;
5852 String dest = "/foo" ;
@@ -69,7 +63,6 @@ public void registerSubscriptionInvalidInput() {
6963
7064 @ Test
7165 public void registerSubscription () {
72-
7366 String sessId = "sess01" ;
7467 String subsId = "subs01" ;
7568 String dest = "/foo" ;
@@ -83,7 +76,6 @@ public void registerSubscription() {
8376
8477 @ Test
8578 public void registerSubscriptionOneSession () {
86-
8779 String sessId = "sess01" ;
8880 List <String > subscriptionIds = Arrays .asList ("subs01" , "subs02" , "subs03" );
8981 String dest = "/foo" ;
@@ -93,14 +85,12 @@ public void registerSubscriptionOneSession() {
9385 }
9486
9587 MultiValueMap <String , String > actual = this .registry .findSubscriptions (message (dest ));
96-
9788 assertEquals ("Expected one element " + actual , 1 , actual .size ());
9889 assertEquals (subscriptionIds , sort (actual .get (sessId )));
9990 }
10091
10192 @ Test
10293 public void registerSubscriptionMultipleSessions () {
103-
10494 List <String > sessIds = Arrays .asList ("sess01" , "sess02" , "sess03" );
10595 List <String > subscriptionIds = Arrays .asList ("subs01" , "subs02" , "subs03" );
10696 String dest = "/foo" ;
@@ -112,7 +102,6 @@ public void registerSubscriptionMultipleSessions() {
112102 }
113103
114104 MultiValueMap <String , String > actual = this .registry .findSubscriptions (message (dest ));
115-
116105 assertEquals ("Expected three elements " + actual , 3 , actual .size ());
117106 assertEquals (subscriptionIds , sort (actual .get (sessIds .get (0 ))));
118107 assertEquals (subscriptionIds , sort (actual .get (sessIds .get (1 ))));
@@ -121,22 +110,18 @@ public void registerSubscriptionMultipleSessions() {
121110
122111 @ Test
123112 public void registerSubscriptionWithDestinationPattern () {
124-
125113 String sessId = "sess01" ;
126114 String subsId = "subs01" ;
127115 String destPattern = "/topic/PRICE.STOCK.*.IBM" ;
128116 String dest = "/topic/PRICE.STOCK.NASDAQ.IBM" ;
129-
130117 this .registry .registerSubscription (subscribeMessage (sessId , subsId , destPattern ));
131- MultiValueMap <String , String > actual = this .registry .findSubscriptions (message (dest ));
132118
119+ MultiValueMap <String , String > actual = this .registry .findSubscriptions (message (dest ));
133120 assertEquals ("Expected one element " + actual , 1 , actual .size ());
134121 assertEquals (Arrays .asList (subsId ), actual .get (sessId ));
135122 }
136123
137- // SPR-11657
138-
139- @ Test
124+ @ Test // SPR-11657
140125 public void registerSubscriptionsWithSimpleAndPatternDestinations () {
141126
142127 String sess1 = "sess01" ;
@@ -148,51 +133,55 @@ public void registerSubscriptionsWithSimpleAndPatternDestinations() {
148133
149134 this .registry .registerSubscription (subscribeMessage (sess1 , subs2 , "/topic/PRICE.STOCK.NASDAQ.IBM" ));
150135 this .registry .registerSubscription (subscribeMessage (sess1 , subs1 , "/topic/PRICE.STOCK.*.IBM" ));
136+
151137 MultiValueMap <String , String > actual = this .registry .findSubscriptions (message ("/topic/PRICE.STOCK.NASDAQ.IBM" ));
152138 assertEquals (1 , actual .size ());
153139 assertEquals (Arrays .asList (subs2 , subs1 ), actual .get (sess1 ));
154140
155141 this .registry .registerSubscription (subscribeMessage (sess2 , subs1 , "/topic/PRICE.STOCK.NASDAQ.IBM" ));
156142 this .registry .registerSubscription (subscribeMessage (sess2 , subs2 , "/topic/PRICE.STOCK.NYSE.IBM" ));
157143 this .registry .registerSubscription (subscribeMessage (sess2 , subs3 , "/topic/PRICE.STOCK.NASDAQ.GOOG" ));
144+
158145 actual = this .registry .findSubscriptions (message ("/topic/PRICE.STOCK.NASDAQ.IBM" ));
159146 assertEquals (2 , actual .size ());
160147 assertEquals (Arrays .asList (subs2 , subs1 ), actual .get (sess1 ));
161148 assertEquals (Arrays .asList (subs1 ), actual .get (sess2 ));
162149
163150 this .registry .unregisterAllSubscriptions (sess1 );
151+
164152 actual = this .registry .findSubscriptions (message ("/topic/PRICE.STOCK.NASDAQ.IBM" ));
165153 assertEquals (1 , actual .size ());
166154 assertEquals (Arrays .asList (subs1 ), actual .get (sess2 ));
167155
168156 this .registry .registerSubscription (subscribeMessage (sess1 , subs1 , "/topic/PRICE.STOCK.*.IBM" ));
169157 this .registry .registerSubscription (subscribeMessage (sess1 , subs2 , "/topic/PRICE.STOCK.NASDAQ.IBM" ));
158+
170159 actual = this .registry .findSubscriptions (message ("/topic/PRICE.STOCK.NASDAQ.IBM" ));
171160 assertEquals (2 , actual .size ());
172161 assertEquals (Arrays .asList (subs1 , subs2 ), actual .get (sess1 ));
173162 assertEquals (Arrays .asList (subs1 ), actual .get (sess2 ));
174163
175164 this .registry .unregisterSubscription (unsubscribeMessage (sess1 , subs2 ));
165+
176166 actual = this .registry .findSubscriptions (message ("/topic/PRICE.STOCK.NASDAQ.IBM" ));
177167 assertEquals (2 , actual .size ());
178168 assertEquals (Arrays .asList (subs1 ), actual .get (sess1 ));
179169 assertEquals (Arrays .asList (subs1 ), actual .get (sess2 ));
180170
181171 this .registry .unregisterSubscription (unsubscribeMessage (sess1 , subs1 ));
172+
182173 actual = this .registry .findSubscriptions (message ("/topic/PRICE.STOCK.NASDAQ.IBM" ));
183174 assertEquals (1 , actual .size ());
184175 assertEquals (Arrays .asList (subs1 ), actual .get (sess2 ));
185176
186177 this .registry .unregisterSubscription (unsubscribeMessage (sess2 , subs1 ));
178+
187179 actual = this .registry .findSubscriptions (message ("/topic/PRICE.STOCK.NASDAQ.IBM" ));
188180 assertEquals (0 , actual .size ());
189181 }
190182
191- // SPR-11755
192-
193- @ Test
183+ @ Test // SPR-11755
194184 public void registerAndUnregisterMultipleDestinations () {
195-
196185 String sess1 = "sess01" ;
197186 String sess2 = "sess02" ;
198187
@@ -219,13 +208,13 @@ public void registerAndUnregisterMultipleDestinations() {
219208 this .registry .registerSubscription (subscribeMessage (sess1 , subs3 , "/topic/PRICE.STOCK.NASDAQ.GOOG" ));
220209 this .registry .registerSubscription (subscribeMessage (sess1 , subs4 , "/topic/PRICE.STOCK.NYSE.IBM" ));
221210 this .registry .registerSubscription (subscribeMessage (sess2 , subs5 , "/topic/PRICE.STOCK.NASDAQ.GOOG" ));
211+
222212 this .registry .unregisterAllSubscriptions (sess1 );
223213 this .registry .unregisterAllSubscriptions (sess2 );
224214 }
225215
226216 @ Test
227217 public void registerSubscriptionWithDestinationPatternRegex () {
228-
229218 String sessId = "sess01" ;
230219 String subsId = "subs01" ;
231220 String destPattern = "/topic/PRICE.STOCK.*.{ticker:(IBM|MSFT)}" ;
@@ -249,9 +238,29 @@ public void registerSubscriptionWithDestinationPatternRegex() {
249238 assertEquals ("Expected no elements " + actual , 0 , actual .size ());
250239 }
251240
241+ @ Test // SPR-11931
242+ public void registerTwiceAndUnregisterSubscriptions () {
243+ this .registry .registerSubscription (subscribeMessage ("sess01" , "subs01" , "/foo" ));
244+ this .registry .registerSubscription (subscribeMessage ("sess01" , "subs02" , "/foo" ));
245+
246+ MultiValueMap <String , String > actual = this .registry .findSubscriptions (message ("/foo" ));
247+ assertEquals ("Expected 1 element" , 1 , actual .size ());
248+ assertEquals (Arrays .asList ("subs01" , "subs02" ), actual .get ("sess01" ));
249+
250+ this .registry .unregisterSubscription (unsubscribeMessage ("sess01" , "subs01" ));
251+
252+ actual = this .registry .findSubscriptions (message ("/foo" ));
253+ assertEquals ("Expected 1 element" , 1 , actual .size ());
254+ assertEquals (Arrays .asList ("subs02" ), actual .get ("sess01" ));
255+
256+ this .registry .unregisterSubscription (unsubscribeMessage ("sess01" , "subs02" ));
257+
258+ actual = this .registry .findSubscriptions (message ("/foo" ));
259+ assertEquals ("Expected no element" , 0 , actual .size ());
260+ }
261+
252262 @ Test
253263 public void unregisterSubscription () {
254-
255264 List <String > sessIds = Arrays .asList ("sess01" , "sess02" , "sess03" );
256265 List <String > subscriptionIds = Arrays .asList ("subs01" , "subs02" , "subs03" );
257266 String dest = "/foo" ;
@@ -267,36 +276,13 @@ public void unregisterSubscription() {
267276 this .registry .unregisterSubscription (unsubscribeMessage (sessIds .get (0 ), subscriptionIds .get (2 )));
268277
269278 MultiValueMap <String , String > actual = this .registry .findSubscriptions (message (dest ));
270-
271279 assertEquals ("Expected two elements: " + actual , 2 , actual .size ());
272280 assertEquals (subscriptionIds , sort (actual .get (sessIds .get (1 ))));
273281 assertEquals (subscriptionIds , sort (actual .get (sessIds .get (2 ))));
274282 }
275283
276- // SPR-11931
277-
278- @ Test
279- public void registerTwiceAndUnregisterSubscriptions () {
280-
281- this .registry .registerSubscription (subscribeMessage ("sess01" , "subs01" , "/foo" ));
282- this .registry .registerSubscription (subscribeMessage ("sess01" , "subs02" , "/foo" ));
283- MultiValueMap <String , String > actual = this .registry .findSubscriptions (message ("/foo" ));
284- assertEquals ("Expected 1 element" , 1 , actual .size ());
285- assertEquals (Arrays .asList ("subs01" , "subs02" ), actual .get ("sess01" ));
286-
287- this .registry .unregisterSubscription (unsubscribeMessage ("sess01" , "subs01" ));
288- actual = this .registry .findSubscriptions (message ("/foo" ));
289- assertEquals ("Expected 1 element" , 1 , actual .size ());
290- assertEquals (Arrays .asList ("subs02" ), actual .get ("sess01" ));
291-
292- this .registry .unregisterSubscription (unsubscribeMessage ("sess01" , "subs02" ));
293- actual = this .registry .findSubscriptions (message ("/foo" ));
294- assertEquals ("Expected no element" , 0 , actual .size ());
295- }
296-
297284 @ Test
298285 public void unregisterAllSubscriptions () {
299-
300286 List <String > sessIds = Arrays .asList ("sess01" , "sess02" , "sess03" );
301287 List <String > subscriptionIds = Arrays .asList ("subs01" , "subs02" , "subs03" );
302288 String dest = "/foo" ;
@@ -311,7 +297,6 @@ public void unregisterAllSubscriptions() {
311297 this .registry .unregisterAllSubscriptions (sessIds .get (1 ));
312298
313299 MultiValueMap <String , String > actual = this .registry .findSubscriptions (message (dest ));
314-
315300 assertEquals ("Expected one element: " + actual , 1 , actual .size ());
316301 assertEquals (subscriptionIds , sort (actual .get (sessIds .get (2 ))));
317302 }
@@ -328,9 +313,7 @@ public void findSubscriptionsNoMatches() {
328313 assertEquals ("Expected no elements " + actual , 0 , actual .size ());
329314 }
330315
331- // SPR-12665
332-
333- @ Test
316+ @ Test // SPR-12665
334317 public void findSubscriptionsReturnsMapSafeToIterate () throws Exception {
335318 this .registry .registerSubscription (subscribeMessage ("sess1" , "1" , "/foo" ));
336319 this .registry .registerSubscription (subscribeMessage ("sess2" , "1" , "/foo" ));
@@ -346,6 +329,25 @@ public void findSubscriptionsReturnsMapSafeToIterate() throws Exception {
346329 // no ConcurrentModificationException
347330 }
348331
332+ @ Test // SPR-13185
333+ public void findSubscriptionsReturnsMapSafeToIterateIncludingValues () throws Exception {
334+ this .registry .registerSubscription (subscribeMessage ("sess1" , "1" , "/foo" ));
335+ this .registry .registerSubscription (subscribeMessage ("sess1" , "2" , "/foo" ));
336+
337+ MultiValueMap <String , String > allSubscriptions = this .registry .findSubscriptions (message ("/foo" ));
338+ assertNotNull (allSubscriptions );
339+ assertEquals (1 , allSubscriptions .size ());
340+
341+ Iterator <String > iteratorValues = allSubscriptions .get ("sess1" ).iterator ();
342+ iteratorValues .next ();
343+
344+ this .registry .unregisterSubscription (unsubscribeMessage ("sess1" , "2" ));
345+
346+ iteratorValues .next ();
347+ // no ConcurrentModificationException
348+ }
349+
350+
349351 private Message <?> subscribeMessage (String sessionId , String subscriptionId , String destination ) {
350352 SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor .create (SimpMessageType .SUBSCRIBE );
351353 headers .setSessionId (sessionId );
0 commit comments