@@ -8,6 +8,10 @@ import javasabr.mqtt.model.reason.code.UnsubscribeAckReasonCode
88import javasabr.mqtt.model.subscriber.SingleSubscriber
99import javasabr.mqtt.model.subscription.Subscription
1010import javasabr.mqtt.model.subscription.TestPublishFactory
11+ import javasabr.mqtt.model.topic.TopicFilter
12+ import javasabr.mqtt.model.topic.TopicName
13+ import javasabr.mqtt.network.handler.NetworkMqttUserReleaseHandler
14+ import javasabr.mqtt.network.impl.InternalNetworkMqttUser
1115import javasabr.mqtt.network.message.out.PublishMqtt5OutMessage
1216import javasabr.mqtt.service.IntegrationServiceSpecification
1317import javasabr.mqtt.service.TestExternalNetworkMqttUser
@@ -514,21 +518,90 @@ class InMemorySubscriptionServiceTest extends IntegrationServiceSpecification {
514518 secondSentMessage. retain()
515519 and :
516520 mqttUser. isEmpty()
521+ }
517522
523+ def " should not send retained messages in case of invalid QoS" () {
524+ given :
525+ def serverConfig = defaultExternalServerConnectionConfig
526+ def mqttConnection = mockedExternalConnection(serverConfig, MqttVersion . MQTT_5 )
527+ def mqttUser = mqttConnection. user() as TestExternalNetworkMqttUser
528+ def subscription = new Subscription (
529+ defaultTopicService. createTopicFilter(mqttUser, " topic/filter/1" ),
530+ 30 ,
531+ QoS . INVALID ,
532+ SubscribeRetainHandling . SEND ,
533+ true ,
534+ true )
535+ def subscriptions = Array . of(subscription)
536+ and :
537+ def publishWithRetain = TestPublishFactory . makePublishWithRetain(" topic/filter/1" , " payload1" )
538+ defaultPublishDeliveringService. startDelivering(publishWithRetain, new SingleSubscriber (mqttUser, subscription))
518539 when :
519- def publishWithRetain2 = TestPublishFactory . makePublishWithRetain(" topic/filter/1" , " payload2" )
520- defaultPublishDeliveringService. startDelivering(publishWithRetain2, new SingleSubscriber (mqttUser, subscription))
521540 defaultSubscriptionService. subscribe(mqttUser, mqttUser. session(), subscriptions)
522541 then :
523- def thirdSentMessage = mqttUser. nextSentMessage(PublishMqtt5OutMessage )
524- thirdSentMessage. payload() == publishWithRetain2. payload()
525- thirdSentMessage. retain()
542+ mqttUser. isEmpty()
543+ }
544+
545+ def " should clean and restore subscriptions" () {
546+ given :
547+ def serverConfig = defaultExternalServerConnectionConfig
548+ def mqttConnection = mockedExternalConnection(serverConfig, MqttVersion . MQTT_5 )
549+ def expectedUser = mqttConnection. user() as TestExternalNetworkMqttUser
550+ def expectedSubscription = new Subscription (
551+ TopicFilter . valueOf(" topic" ),
552+ 30 ,
553+ QoS . AT_MOST_ONCE ,
554+ SubscribeRetainHandling . SEND ,
555+ true ,
556+ true )
557+ when :
558+ defaultSubscriptionService. subscribe(expectedUser, expectedUser. session(), Array . of(expectedSubscription))
559+ def subscribers = defaultSubscriptionService. findSubscribers(TopicName . valueOf(" topic" ))
560+ then :
561+ ! subscribers. isEmpty()
562+ with(subscribers[0 ]) {
563+ user() == expectedUser
564+ subscription() == expectedSubscription
565+ }
566+ when :
567+ defaultSubscriptionService. cleanSubscriptions(expectedUser, expectedUser. session())
568+ subscribers = defaultSubscriptionService. findSubscribers(TopicName . valueOf(" topic" ))
569+ then :
570+ subscribers. isEmpty()
571+
572+ when :
573+ defaultSubscriptionService. restoreSubscriptions(expectedUser, expectedUser. session())
574+ subscribers = defaultSubscriptionService. findSubscribers(TopicName . valueOf(" topic" ))
575+ then :
576+ ! subscribers. isEmpty()
577+ with(subscribers[0 ]) {
578+ user() == expectedUser
579+ subscription() == expectedSubscription
580+ }
581+ }
582+ def " should suppress retained message delivering failure" () {
583+ given :
584+ def serverConfig = defaultExternalServerConnectionConfig
585+ def mqttConnection = mockedExternalConnection(serverConfig, MqttVersion . MQTT_5 )
586+ def mqttUser = mqttConnection. user() as TestExternalNetworkMqttUser
587+ def anotherUser = new InternalNetworkMqttUser (mqttConnection, Mock (NetworkMqttUserReleaseHandler ))
588+ def subscription = new Subscription (
589+ defaultTopicService. createTopicFilter(mqttUser, " topic/filter/1" ),
590+ 30 ,
591+ QoS . AT_MOST_ONCE ,
592+ SubscribeRetainHandling . SEND ,
593+ true ,
594+ true )
595+ def subscriptions = Array . of(subscription)
526596 and :
527- def fourthSentMessage = mqttUser. nextSentMessage(PublishMqtt5OutMessage )
528- fourthSentMessage. payload() == publishWithRetain2. payload()
529- fourthSentMessage. retain()
597+ def publishWithRetain = TestPublishFactory . makePublishWithRetain(" topic/filter/1" , " payload1" )
598+ defaultPublishDeliveringService. startDelivering(publishWithRetain, new SingleSubscriber (mqttUser, subscription))
599+ when :
600+ defaultSubscriptionService. subscribe(anotherUser, mqttUser. session(), subscriptions)
601+ then :
602+ def firstSentMessage = mqttUser. nextSentMessage(PublishMqtt5OutMessage )
603+ firstSentMessage. payload() == publishWithRetain. payload()
530604 and :
531605 mqttUser. isEmpty()
532-
533606 }
534607}
0 commit comments