|
23 | 23 | import com.hivemq.client.internal.mqtt.message.subscribe.MqttSubscription;
|
24 | 24 | import com.hivemq.client.internal.mqtt.message.subscribe.MqttSubscriptionBuilder;
|
25 | 25 | import com.hivemq.client.internal.util.collections.HandleList;
|
| 26 | +import com.hivemq.client.internal.util.collections.ImmutableList; |
26 | 27 | import org.jetbrains.annotations.NotNull;
|
27 | 28 | import org.junit.jupiter.api.BeforeEach;
|
28 | 29 | import org.junit.jupiter.api.Test;
|
|
32 | 33 | import org.junit.jupiter.params.converter.SimpleArgumentConverter;
|
33 | 34 | import org.junit.jupiter.params.provider.CsvSource;
|
34 | 35 |
|
| 36 | +import java.util.List; |
| 37 | +import java.util.Map; |
| 38 | +import java.util.concurrent.atomic.AtomicInteger; |
35 | 39 | import java.util.function.Supplier;
|
36 | 40 |
|
37 | 41 | import static org.junit.jupiter.api.Assertions.*;
|
@@ -744,6 +748,64 @@ void clear_notAcknowledged_noFlow() {
|
744 | 748 | MqttStatefulPublish.DEFAULT_NO_SUBSCRIPTION_IDENTIFIERS));
|
745 | 749 | }
|
746 | 750 |
|
| 751 | + @Test |
| 752 | + void getSubscriptions() { |
| 753 | + final ImmutableList<MqttSubscription> subscriptions = ImmutableList.of( |
| 754 | + new MqttSubscriptionBuilder.Default().topicFilter("abc").build(), |
| 755 | + new MqttSubscriptionBuilder.Default().topicFilter("$share/group/abc").build(), |
| 756 | + new MqttSubscriptionBuilder.Default().topicFilter("#").build(), |
| 757 | + new MqttSubscriptionBuilder.Default().topicFilter("$share/group/#").build(), |
| 758 | + new MqttSubscriptionBuilder.Default().topicFilter("test/#").build(), |
| 759 | + new MqttSubscriptionBuilder.Default().topicFilter("$share/group/test/#").build(), |
| 760 | + new MqttSubscriptionBuilder.Default().topicFilter("+/#").build(), |
| 761 | + new MqttSubscriptionBuilder.Default().topicFilter("$share/group/+/#").build(), |
| 762 | + new MqttSubscriptionBuilder.Default().topicFilter("+/abc").build(), |
| 763 | + new MqttSubscriptionBuilder.Default().topicFilter("$share/group/+/abc").build()); |
| 764 | + for (int i = 0; i < subscriptions.size(); i++) { |
| 765 | + flows.subscribe(subscriptions.get(i), i, null); |
| 766 | + flows.suback(subscriptions.get(i).getTopicFilter(), i, false); |
| 767 | + } |
| 768 | + final Map<Integer, List<MqttSubscription>> allSubscriptions = flows.getSubscriptions(); |
| 769 | + for (int i = 0; i < subscriptions.size(); i++) { |
| 770 | + assertEquals(ImmutableList.of(subscriptions.get(i)), allSubscriptions.get(i)); |
| 771 | + } |
| 772 | + // check if sorted in reverse order |
| 773 | + final AtomicInteger atomicInteger = new AtomicInteger(subscriptions.size()); |
| 774 | + allSubscriptions.forEach( |
| 775 | + (subscriptionId, subscriptionsForId) -> assertEquals(atomicInteger.decrementAndGet(), subscriptionId)); |
| 776 | + } |
| 777 | + |
| 778 | + @Test |
| 779 | + void getSubscriptions_sameSubscriptionIdentifiers() { |
| 780 | + final ImmutableList<MqttSubscription> subscriptions = ImmutableList.of( |
| 781 | + new MqttSubscriptionBuilder.Default().topicFilter("abc").build(), |
| 782 | + new MqttSubscriptionBuilder.Default().topicFilter("$share/group/abc").build(), |
| 783 | + new MqttSubscriptionBuilder.Default().topicFilter("#").build(), |
| 784 | + new MqttSubscriptionBuilder.Default().topicFilter("$share/group/#").build(), |
| 785 | + new MqttSubscriptionBuilder.Default().topicFilter("test/#").build(), |
| 786 | + new MqttSubscriptionBuilder.Default().topicFilter("$share/group/test/#").build(), |
| 787 | + new MqttSubscriptionBuilder.Default().topicFilter("+/#").build(), |
| 788 | + new MqttSubscriptionBuilder.Default().topicFilter("$share/group/+/#").build(), |
| 789 | + new MqttSubscriptionBuilder.Default().topicFilter("+/abc").build(), |
| 790 | + new MqttSubscriptionBuilder.Default().topicFilter("$share/group/+/abc").build()); |
| 791 | + for (int i = 0; i < subscriptions.size(); i += 2) { |
| 792 | + for (int j = 0; j < 2; j++) { |
| 793 | + flows.subscribe(subscriptions.get(i + j), i, null); |
| 794 | + flows.suback(subscriptions.get(i + j).getTopicFilter(), i, false); |
| 795 | + } |
| 796 | + } |
| 797 | + final Map<Integer, List<MqttSubscription>> allSubscriptions = flows.getSubscriptions(); |
| 798 | + for (int i = 0; i < subscriptions.size(); i += 2) { |
| 799 | + assertEquals( |
| 800 | + ImmutableSet.of(subscriptions.get(i), subscriptions.get(i + 1)), |
| 801 | + ImmutableSet.copyOf(allSubscriptions.get(i))); |
| 802 | + } |
| 803 | + // check if sorted in reverse order |
| 804 | + final AtomicInteger atomicInteger = new AtomicInteger(subscriptions.size()); |
| 805 | + allSubscriptions.forEach( |
| 806 | + (subscriptionId, subscriptionsForId) -> assertEquals(atomicInteger.addAndGet(-2), subscriptionId)); |
| 807 | + } |
| 808 | + |
747 | 809 | private static @NotNull MqttSubscribedPublishFlow mockSubscriptionFlow(final @NotNull String name) {
|
748 | 810 | final MqttSubscribedPublishFlow flow = mock(MqttSubscribedPublishFlow.class);
|
749 | 811 | final HandleList<MqttTopicFilterImpl> topicFilters = new HandleList<>();
|
|
0 commit comments