@@ -357,12 +357,13 @@ class InMemorySubscriptionServiceTest extends IntegrationServiceSpecification {
357357 true ))
358358 and :
359359 def publishWithRetain = TestPublishFactory . makePublishWithRetain(" topic/filter/1" , " payload1" )
360- def publishWithoutRetain = TestPublishFactory . makePublishWithoutRetain(" topic/filter/1" , " payload2" )
361360 defaultPublishDeliveringService. startDelivering(publishWithRetain, new SingleSubscriber (mqttUser, subscription))
361+ and :
362+ def publishWithoutRetain = TestPublishFactory . makePublishWithoutRetain(" topic/filter/1" , " payload2" )
362363 defaultPublishDeliveringService. startDelivering(publishWithoutRetain, new SingleSubscriber (mqttUser, subscription))
363- defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
364364 when :
365365 defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
366+ defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
366367 then :
367368 def firstPublishMessage = mqttUser. nextSentMessage(PublishMqtt5OutMessage )
368369 firstPublishMessage. payload() == publishWithRetain. payload()
@@ -392,9 +393,9 @@ class InMemorySubscriptionServiceTest extends IntegrationServiceSpecification {
392393 and :
393394 def publishWithRetain = TestPublishFactory . makePublishWithRetain(" topic/filter/1" , " payload1" )
394395 defaultPublishDeliveringService. startDelivering(publishWithRetain, new SingleSubscriber (mqttUser, subscription))
395- defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
396396 when :
397397 defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
398+ defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
398399 then :
399400 def firstSentMessage = mqttUser. nextSentMessage(PublishMqtt5OutMessage )
400401 firstSentMessage. payload() == publishWithRetain. payload()
@@ -438,12 +439,13 @@ class InMemorySubscriptionServiceTest extends IntegrationServiceSpecification {
438439 true ))
439440 and :
440441 def publishWithRetain = TestPublishFactory . makePublishWithRetain(" topic/filter/1" , " payload1" )
441- def publishWithoutRetain = TestPublishFactory . makePublishWithoutRetain(" topic/filter/1" , " payload2" )
442442 defaultPublishDeliveringService. startDelivering(publishWithRetain, new SingleSubscriber (mqttUser, subscription))
443+ and :
444+ def publishWithoutRetain = TestPublishFactory . makePublishWithoutRetain(" topic/filter/1" , " payload2" )
443445 defaultPublishDeliveringService. startDelivering(publishWithoutRetain, new SingleSubscriber (mqttUser, subscription))
444- defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
445446 when :
446447 defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
448+ defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
447449 then :
448450 def firstPublishMessage = mqttUser. nextSentMessage(PublishMqtt5OutMessage )
449451 firstPublishMessage. payload() == publishWithRetain. payload()
@@ -453,4 +455,80 @@ class InMemorySubscriptionServiceTest extends IntegrationServiceSpecification {
453455 and :
454456 mqttUser. isEmpty()
455457 }
458+
459+ def " should reset retain flag if 'retain as published' is false" () {
460+ given :
461+ def serverConfig = defaultExternalServerConnectionConfig
462+ def mqttConnection = mockedExternalConnection(serverConfig, MqttVersion . MQTT_5 )
463+ def mqttUser = mqttConnection. user() as TestExternalNetworkMqttUser
464+ def subscription = new Subscription (
465+ defaultTopicService. createTopicFilter(mqttUser, " topic/filter/1" ),
466+ 30 ,
467+ QoS . AT_MOST_ONCE ,
468+ SubscribeRetainHandling . SEND ,
469+ true ,
470+ false )
471+ def subscriptions = Array . of(subscription)
472+ and :
473+ def publishWithRetain = TestPublishFactory . makePublishWithRetain(" topic/filter/1" , " payload1" )
474+ defaultPublishDeliveringService. startDelivering(publishWithRetain, new SingleSubscriber (mqttUser, subscription))
475+ when :
476+ defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
477+ then :
478+ def firstSentMessage = mqttUser. nextSentMessage(PublishMqtt5OutMessage )
479+ firstSentMessage. payload() == publishWithRetain. payload()
480+ firstSentMessage. retain()
481+ and :
482+ def thirdSentMessage = mqttUser. nextSentMessage(PublishMqtt5OutMessage )
483+ thirdSentMessage. payload() == publishWithRetain. payload()
484+ ! thirdSentMessage. retain()
485+ and :
486+ mqttUser. isEmpty()
487+ }
488+
489+ def " should keep retain flag if 'retain as published' is true" () {
490+ given :
491+ def serverConfig = defaultExternalServerConnectionConfig
492+ def mqttConnection = mockedExternalConnection(serverConfig, MqttVersion . MQTT_5 )
493+ def mqttUser = mqttConnection. user() as TestExternalNetworkMqttUser
494+ def subscription = new Subscription (
495+ defaultTopicService. createTopicFilter(mqttUser, " topic/filter/1" ),
496+ 30 ,
497+ QoS . AT_MOST_ONCE ,
498+ SubscribeRetainHandling . SEND ,
499+ true ,
500+ true )
501+ def subscriptions = Array . of(subscription)
502+
503+ when :
504+ def publishWithRetain = TestPublishFactory . makePublishWithRetain(" topic/filter/1" , " payload1" )
505+ defaultPublishDeliveringService. startDelivering(publishWithRetain, new SingleSubscriber (mqttUser, subscription))
506+ defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
507+ then :
508+ def firstSentMessage = mqttUser. nextSentMessage(PublishMqtt5OutMessage )
509+ firstSentMessage. payload() == publishWithRetain. payload()
510+ firstSentMessage. retain()
511+ and :
512+ def secondSentMessage = mqttUser. nextSentMessage(PublishMqtt5OutMessage )
513+ secondSentMessage. payload() == publishWithRetain. payload()
514+ secondSentMessage. retain()
515+ and :
516+ mqttUser. isEmpty()
517+
518+ when :
519+ def publishWithRetain2 = TestPublishFactory . makePublishWithRetain(" topic/filter/1" , " payload2" )
520+ defaultPublishDeliveringService. startDelivering(publishWithRetain2, new SingleSubscriber (mqttUser, subscription))
521+ defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
522+ then :
523+ def thirdSentMessage = mqttUser. nextSentMessage(PublishMqtt5OutMessage )
524+ thirdSentMessage. payload() == publishWithRetain2. payload()
525+ thirdSentMessage. retain()
526+ and :
527+ def fourthSentMessage = mqttUser. nextSentMessage(PublishMqtt5OutMessage )
528+ fourthSentMessage. payload() == publishWithRetain2. payload()
529+ fourthSentMessage. retain()
530+ and :
531+ mqttUser. isEmpty()
532+
533+ }
456534}
0 commit comments