From cc50af08e4c25ec87931f784f8a88952a6818839 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sun, 4 Jun 2023 16:23:42 +0200 Subject: [PATCH] Enhance unit tests for status quo for SpEL 'selector' support in messaging See gh-30550 --- .../DefaultSubscriptionRegistryTests.java | 63 ++++++++++++++----- 1 file changed, 46 insertions(+), 17 deletions(-) diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java index eedd5d00be3..5b111dd1e38 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/broker/DefaultSubscriptionRegistryTests.java @@ -253,7 +253,7 @@ class DefaultSubscriptionRegistryTests { } @Test - void registerSubscriptionWithSelector() { + void registerSubscriptionWithSelectorHeaderEnabledByDefault() { String sessionId1 = "sess01"; String sessionId2 = "sess02"; String sessionId3 = "sess03"; @@ -278,41 +278,70 @@ class DefaultSubscriptionRegistryTests { accessor.setNativeHeader("foo", "bar"); Message message = MessageBuilder.createMessage("", accessor.getMessageHeaders()); - MultiValueMap actual = this.registry.findSubscriptions(message); - assertThat(actual).hasSize(2); + MultiValueMap subscriptions = this.registry.findSubscriptions(message); + assertThat(subscriptions).hasSize(2); // Subscription #1 has a 'selector' header that DOES match. - assertThat(actual.get(sessionId1)).containsExactly(subscriptionId1); + assertThat(subscriptions.get(sessionId1)).containsExactly(subscriptionId1); // Subscription #2 has a 'selector' header that does NOT match. - assertThat(actual.get(sessionId2)).isNull(); + assertThat(subscriptions.get(sessionId2)).isNull(); // Subscription #3 does NOT have a 'selector' header, so it matches anyway. - assertThat(actual.get(sessionId3)).containsExactly(subscriptionId3); + assertThat(subscriptions.get(sessionId3)).containsExactly(subscriptionId3); // Then try with message WITHOUT selected 'foo' header present - actual = this.registry.findSubscriptions(createMessage(destination)); + subscriptions = this.registry.findSubscriptions(createMessage(destination)); + assertThat(subscriptions).hasSize(1); // Subscription #3 does NOT have a 'selector' header, so it matches anyway. - assertThat(actual.get(sessionId3)).containsExactly(subscriptionId3); + assertThat(subscriptions.get(sessionId3)).containsExactly(subscriptionId3); } @Test - void registerSubscriptionWithSelectorNotSupported() { - String sessionId = "sess01"; - String subscriptionId = "subs01"; + void registerSubscriptionWithSelectorHeaderDisabled() { + String sessionId1 = "sess01"; + String sessionId2 = "sess02"; + String sessionId3 = "sess03"; + String subscriptionId1 = "subs01"; + String subscriptionId2 = "subs02"; + String subscriptionId3 = "subs02"; String destination = "/foo"; - String selector = "headers.foo == 'bar'"; + String selector1 = "headers.foo == 'bar'"; + String selector2 = "headers.foo == 'enigma'"; + // Explicitly disable selector header support this.registry.setSelectorHeaderName(null); - this.registry.registerSubscription(subscribeMessage(sessionId, subscriptionId, destination, selector)); + + // Register subscription with matching selector header + this.registry.registerSubscription(subscribeMessage(sessionId1, subscriptionId1, destination, selector1)); + // Register subscription with non-matching selector header + this.registry.registerSubscription(subscribeMessage(sessionId2, subscriptionId2, destination, selector2)); + // Register subscription without a selector header + this.registry.registerSubscription(subscribeMessage(sessionId3, subscriptionId3, destination, null)); + + // First, try with message WITH selected 'foo' header present SimpMessageHeaderAccessor accessor = SimpMessageHeaderAccessor.create(); accessor.setDestination(destination); - accessor.setNativeHeader("foo", "bazz"); + accessor.setNativeHeader("foo", "bar"); Message message = MessageBuilder.createMessage("", accessor.getMessageHeaders()); - MultiValueMap actual = this.registry.findSubscriptions(message); - assertThat(actual).hasSize(1); - assertThat(actual.get(sessionId)).containsExactly(subscriptionId); + MultiValueMap subscriptions = this.registry.findSubscriptions(message); + + // 'selector' header is ignored, so all 3 subscriptions should be found + assertThat(subscriptions).hasSize(3); + assertThat(subscriptions.get(sessionId1)).containsExactly(subscriptionId1); + assertThat(subscriptions.get(sessionId2)).containsExactly(subscriptionId2); + assertThat(subscriptions.get(sessionId3)).containsExactly(subscriptionId3); + + // Then try with message WITHOUT selected 'foo' header present + + subscriptions = this.registry.findSubscriptions(createMessage(destination)); + + // 'selector' header is ignored, so all 3 subscriptions should be found + assertThat(subscriptions).hasSize(3); + assertThat(subscriptions.get(sessionId1)).containsExactly(subscriptionId1); + assertThat(subscriptions.get(sessionId2)).containsExactly(subscriptionId2); + assertThat(subscriptions.get(sessionId3)).containsExactly(subscriptionId3); } @Test // SPR-11931