Skip to content

Commit bacefb7

Browse files
committed
[broker-30] Add more tests
1 parent cc08339 commit bacefb7

File tree

5 files changed

+203
-27
lines changed

5 files changed

+203
-27
lines changed

acl-groovy-dsl/src/main/resources/acl.gdsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ contributor(context(scope: scriptScope())) {
3333
&& !enclosingCall("allOf") && !enclosingCall("anyOf")) {
3434
method name: 'topicFilter',
3535
type: 'javasabr.mqtt.service.acl.builder.SubscribeRuleBuilder',
36-
params: [string: 'javasabr.mqtt.model.acl.matcher.ValueMatcher<String>...'],
36+
params: [string: 'javasabr.mqtt.model.acl.matcher.TopicFilterMatcher...'],
3737
doc: 'Set of topic filters matching by rule'
3838
method name: 'match',
3939
type: 'javasabr.mqtt.model.acl.matcher.TopicFilterMatcher',

core-service/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ dependencies {
1212

1313
testImplementation projects.testSupport
1414
testImplementation testFixtures(projects.network)
15-
}
15+
testImplementation testFixtures(projects.model)
16+
}

core-service/src/test/groovy/javasabr/mqtt/service/impl/InMemorySubscriptionServiceTest.groovy

Lines changed: 131 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,12 @@ import javasabr.mqtt.model.QoS
55
import javasabr.mqtt.model.SubscribeRetainHandling
66
import javasabr.mqtt.model.reason.code.SubscribeAckReasonCode
77
import javasabr.mqtt.model.reason.code.UnsubscribeAckReasonCode
8+
import javasabr.mqtt.model.subscriber.SingleSubscriber
89
import javasabr.mqtt.model.subscription.Subscription
10+
import javasabr.mqtt.model.subscription.TestPublishFactory
11+
import javasabr.mqtt.network.message.out.PublishMqtt5OutMessage
912
import javasabr.mqtt.service.IntegrationServiceSpecification
10-
import javasabr.mqtt.service.SubscriptionService
13+
import javasabr.mqtt.service.TestExternalNetworkMqttUser
1114
import javasabr.rlib.collections.array.Array
1215

1316
class InMemorySubscriptionServiceTest extends IntegrationServiceSpecification {
@@ -323,4 +326,131 @@ class InMemorySubscriptionServiceTest extends IntegrationServiceSpecification {
323326
storedSubscriptions.size() == 3
324327
storedSubscriptions ==~ resultSubscriptions
325328
}
329+
330+
def "should only deliver 'send-if-subscription-does-not-exist' Subscribe Retain Handling once"() {
331+
given:
332+
def serverConfig = defaultExternalServerConnectionConfig
333+
def mqttConnection = mockedExternalConnection(serverConfig, MqttVersion.MQTT_5)
334+
def mqttUser = mqttConnection.user() as TestExternalNetworkMqttUser
335+
def subscription = new Subscription(
336+
defaultTopicService.createTopicFilter(mqttUser, "topic/filter/1"),
337+
30,
338+
QoS.AT_MOST_ONCE,
339+
SubscribeRetainHandling.SEND_IF_SUBSCRIPTION_DOES_NOT_EXIST,
340+
true,
341+
true)
342+
def subscriptions = Array.of(
343+
subscription,
344+
new Subscription(
345+
defaultTopicService.createTopicFilter(mqttUser, "topic/filter/2"),
346+
30,
347+
QoS.AT_LEAST_ONCE,
348+
SubscribeRetainHandling.SEND,
349+
true,
350+
true),
351+
new Subscription(
352+
defaultTopicService.createTopicFilter(mqttUser, "topic/filter/3"),
353+
30,
354+
QoS.EXACTLY_ONCE,
355+
SubscribeRetainHandling.DO_NOT_SEND,
356+
true,
357+
true))
358+
and:
359+
def publishWithRetain = TestPublishFactory.makePublishWithRetain("topic/filter/1", "payload1")
360+
def publishWithoutRetain = TestPublishFactory.makePublishWithoutRetain("topic/filter/1", "payload2")
361+
defaultPublishDeliveringService.startDelivering(publishWithRetain, new SingleSubscriber(mqttUser, subscription))
362+
defaultPublishDeliveringService.startDelivering(publishWithoutRetain, new SingleSubscriber(mqttUser, subscription))
363+
defaultSubscriptionService.subscribe(mqttUser, mqttUser.session(), subscriptions)
364+
when:
365+
defaultSubscriptionService.subscribe(mqttUser, mqttUser.session(), subscriptions)
366+
then:
367+
def firstPublishMessage = mqttUser.nextSentMessage(PublishMqtt5OutMessage)
368+
firstPublishMessage.payload() == publishWithRetain.payload()
369+
and:
370+
def secondPublishMessage = mqttUser.nextSentMessage(PublishMqtt5OutMessage)
371+
secondPublishMessage.payload() == publishWithoutRetain.payload()
372+
and:
373+
def thirdPublishMessage = mqttUser.nextSentMessage(PublishMqtt5OutMessage)
374+
thirdPublishMessage.payload() == publishWithRetain.payload()
375+
and:
376+
mqttUser.isEmpty()
377+
}
378+
379+
def "should always deliver 'send' Subscribe Retain Handling"() {
380+
given:
381+
def serverConfig = defaultExternalServerConnectionConfig
382+
def mqttConnection = mockedExternalConnection(serverConfig, MqttVersion.MQTT_5)
383+
def mqttUser = mqttConnection.user() as TestExternalNetworkMqttUser
384+
def subscription = new Subscription(
385+
defaultTopicService.createTopicFilter(mqttUser, "topic/filter/1"),
386+
30,
387+
QoS.AT_MOST_ONCE,
388+
SubscribeRetainHandling.SEND,
389+
true,
390+
true)
391+
def subscriptions = Array.of(subscription)
392+
and:
393+
def publishWithRetain = TestPublishFactory.makePublishWithRetain("topic/filter/1", "payload1")
394+
defaultPublishDeliveringService.startDelivering(publishWithRetain, new SingleSubscriber(mqttUser, subscription))
395+
defaultSubscriptionService.subscribe(mqttUser, mqttUser.session(), subscriptions)
396+
when:
397+
defaultSubscriptionService.subscribe(mqttUser, mqttUser.session(), subscriptions)
398+
then:
399+
def firstSentMessage = mqttUser.nextSentMessage(PublishMqtt5OutMessage)
400+
firstSentMessage.payload() == publishWithRetain.payload()
401+
and:
402+
def thirdSentMessage = mqttUser.nextSentMessage(PublishMqtt5OutMessage)
403+
thirdSentMessage.payload() == publishWithRetain.payload()
404+
and:
405+
def fourthSentMessage = mqttUser.nextSentMessage(PublishMqtt5OutMessage)
406+
fourthSentMessage.payload() == publishWithRetain.payload()
407+
and:
408+
mqttUser.isEmpty()
409+
}
410+
411+
def "should not deliver 'do-not-send' Subscribe Retain Handling"() {
412+
given:
413+
def serverConfig = defaultExternalServerConnectionConfig
414+
def mqttConnection = mockedExternalConnection(serverConfig, MqttVersion.MQTT_5)
415+
def mqttUser = mqttConnection.user() as TestExternalNetworkMqttUser
416+
def subscription = new Subscription(
417+
defaultTopicService.createTopicFilter(mqttUser, "topic/filter/1"),
418+
30,
419+
QoS.AT_MOST_ONCE,
420+
SubscribeRetainHandling.DO_NOT_SEND,
421+
true,
422+
true)
423+
def subscriptions = Array.of(
424+
subscription,
425+
new Subscription(
426+
defaultTopicService.createTopicFilter(mqttUser, "topic/filter/2"),
427+
30,
428+
QoS.AT_LEAST_ONCE,
429+
SubscribeRetainHandling.SEND_IF_SUBSCRIPTION_DOES_NOT_EXIST,
430+
true,
431+
true),
432+
new Subscription(
433+
defaultTopicService.createTopicFilter(mqttUser, "topic/filter/3"),
434+
30,
435+
QoS.EXACTLY_ONCE,
436+
SubscribeRetainHandling.SEND,
437+
true,
438+
true))
439+
and:
440+
def publishWithRetain = TestPublishFactory.makePublishWithRetain("topic/filter/1", "payload1")
441+
def publishWithoutRetain = TestPublishFactory.makePublishWithoutRetain("topic/filter/1", "payload2")
442+
defaultPublishDeliveringService.startDelivering(publishWithRetain, new SingleSubscriber(mqttUser, subscription))
443+
defaultPublishDeliveringService.startDelivering(publishWithoutRetain, new SingleSubscriber(mqttUser, subscription))
444+
defaultSubscriptionService.subscribe(mqttUser, mqttUser.session(), subscriptions)
445+
when:
446+
defaultSubscriptionService.subscribe(mqttUser, mqttUser.session(), subscriptions)
447+
then:
448+
def firstPublishMessage = mqttUser.nextSentMessage(PublishMqtt5OutMessage)
449+
firstPublishMessage.payload() == publishWithRetain.payload()
450+
and:
451+
def secondPublishMessage = mqttUser.nextSentMessage(PublishMqtt5OutMessage)
452+
secondPublishMessage.payload() == publishWithoutRetain.payload()
453+
and:
454+
mqttUser.isEmpty()
455+
}
326456
}

model/src/test/groovy/javasabr/mqtt/model/topic/tree/RetainedMessageTreeTest.groovy

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
package javasabr.mqtt.model.topic.tree
22

33

4-
import javasabr.mqtt.model.PayloadFormat
5-
import javasabr.mqtt.model.QoS
64
import javasabr.mqtt.model.publishing.Publish
75
import javasabr.mqtt.model.topic.TopicFilter
8-
import javasabr.mqtt.model.topic.TopicName
96
import javasabr.mqtt.test.support.UnitSpecification
10-
import javasabr.rlib.collections.array.Array
11-
import javasabr.rlib.collections.array.IntArray
127

138
import java.util.function.Function
149

15-
import static java.nio.charset.StandardCharsets.UTF_8
10+
import static javasabr.mqtt.model.subscription.TestPublishFactory.makePublish
1611

1712
class RetainedMessageTreeTest extends UnitSpecification {
1813

@@ -103,22 +98,4 @@ class RetainedMessageTreeTest extends UnitSpecification {
10398
]
10499
]
105100
}
106-
107-
static def makePublish(String topicName) {
108-
return new Publish(
109-
1,
110-
QoS.AT_MOST_ONCE,
111-
TopicName.valueOf(topicName),
112-
null,
113-
"payload".getBytes(UTF_8),
114-
false,
115-
true,
116-
null,
117-
IntArray.of(30),
118-
null,
119-
60000,
120-
1,
121-
PayloadFormat.UTF8_STRING,
122-
Array.of());
123-
}
124101
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package javasabr.mqtt.model.subscription
2+
3+
import javasabr.mqtt.model.PayloadFormat
4+
import javasabr.mqtt.model.QoS
5+
import javasabr.mqtt.model.publishing.Publish
6+
import javasabr.mqtt.model.topic.TopicName
7+
import javasabr.rlib.collections.array.Array
8+
import javasabr.rlib.collections.array.IntArray
9+
10+
import static java.nio.charset.StandardCharsets.UTF_8
11+
12+
class TestPublishFactory {
13+
14+
static def makePublish(String topicName) {
15+
return new Publish(
16+
1,
17+
QoS.AT_MOST_ONCE,
18+
TopicName.valueOf(topicName),
19+
null,
20+
"payload".getBytes(UTF_8),
21+
false,
22+
true,
23+
null,
24+
IntArray.of(30),
25+
null,
26+
60000,
27+
1,
28+
PayloadFormat.UTF8_STRING,
29+
Array.of());
30+
}
31+
32+
static def makePublishWithRetain(String topicName, String payload) {
33+
return new Publish(
34+
1,
35+
QoS.AT_MOST_ONCE,
36+
TopicName.valueOf(topicName),
37+
null,
38+
payload.getBytes(UTF_8),
39+
false,
40+
true,
41+
null,
42+
IntArray.of(30),
43+
null,
44+
60000,
45+
1,
46+
PayloadFormat.UTF8_STRING,
47+
Array.of());
48+
}
49+
50+
static def makePublishWithoutRetain(String topicName, String payload) {
51+
return new Publish(
52+
1,
53+
QoS.AT_MOST_ONCE,
54+
TopicName.valueOf(topicName),
55+
null,
56+
payload.getBytes(UTF_8),
57+
false,
58+
false,
59+
null,
60+
IntArray.of(30),
61+
null,
62+
60000,
63+
1,
64+
PayloadFormat.UTF8_STRING,
65+
Array.of());
66+
}
67+
68+
}

0 commit comments

Comments
 (0)