broker/ProtocolProcessorTest: code formatter used

This commit is contained in:
Andreas Mager
2017-02-01 17:13:43 +01:00
parent 5125132f23
commit a0a758949e
@@ -13,6 +13,7 @@
*
* You may elect to redistribute this code under either of these licenses.
*/
package io.moquette.spi.impl;
import io.moquette.interception.InterceptHandler;
@@ -30,10 +31,8 @@ import io.netty.channel.embedded.EmbeddedChannel;
import io.netty.handler.codec.mqtt.*;
import org.junit.Before;
import org.junit.Test;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import static io.moquette.spi.impl.NettyChannelAssertions.assertConnAckAccepted;
import static io.moquette.spi.impl.ProtocolProcessor.lowerQosToTheSubscriptionDesired;
import static org.junit.Assert.*;
@@ -44,19 +43,20 @@ import static org.mockito.Mockito.*;
* @author andrea
*/
public class ProtocolProcessorTest {
final static String FAKE_CLIENT_ID = "FAKE_123";
final static String FAKE_CLIENT_ID2 = "FAKE_456";
final static String FAKE_PUBLISHER_ID = "Publisher";
final static String FAKE_TOPIC = "/news";
final static String BAD_FORMATTED_TOPIC = "#MQTTClient";
final static String TEST_USER = "fakeuser";
final static String TEST_PWD = "fakepwd";
final static String EVIL_TEST_USER = "eviluser";
final static String EVIL_TEST_PWD = "unsecret";
static final String FAKE_CLIENT_ID = "FAKE_123";
static final String FAKE_CLIENT_ID2 = "FAKE_456";
static final String FAKE_PUBLISHER_ID = "Publisher";
static final String FAKE_TOPIC = "/news";
static final String BAD_FORMATTED_TOPIC = "#MQTTClient";
final static List<InterceptHandler> EMPTY_OBSERVERS = Collections.emptyList();
final static BrokerInterceptor NO_OBSERVERS_INTERCEPTOR = new BrokerInterceptor(EMPTY_OBSERVERS);
static final String TEST_USER = "fakeuser";
static final String TEST_PWD = "fakepwd";
static final String EVIL_TEST_USER = "eviluser";
static final String EVIL_TEST_PWD = "unsecret";
static final List<InterceptHandler> EMPTY_OBSERVERS = Collections.emptyList();
static final BrokerInterceptor NO_OBSERVERS_INTERCEPTOR = new BrokerInterceptor(EMPTY_OBSERVERS);
EmbeddedChannel m_channel;
MqttConnectMessage connMsg;
@@ -69,14 +69,12 @@ public class ProtocolProcessorTest {
@Before
public void setUp() throws InterruptedException {
/*connMsg = new ConnectMessage();
connMsg.setProtocolVersion((byte) 0x03);
connMsg = MessageBuilder.connect()
.protocolVersion(MqttVersion.MQTT_3_1)
.clientId(FAKE_CLIENT_ID)
.cleanSession(true)
.build();*/
/*
* connMsg = new ConnectMessage(); connMsg.setProtocolVersion((byte) 0x03);
*
* connMsg = MessageBuilder.connect() .protocolVersion(MqttVersion.MQTT_3_1)
* .clientId(FAKE_CLIENT_ID) .cleanSession(true) .build();
*/
m_channel = new EmbeddedChannel();
NettyUtils.clientID(m_channel, FAKE_CLIENT_ID);
@@ -100,18 +98,23 @@ public class ProtocolProcessorTest {
subscriptions = new SubscriptionsStore();
subscriptions.init(memStorage.sessionsStore());
m_processor = new ProtocolProcessor();
m_processor.init(subscriptions, m_messagesStore, m_sessionStore, m_mockAuthenticator, true,
new PermitAllAuthorizator(), NO_OBSERVERS_INTERCEPTOR);
m_processor.init(
subscriptions,
m_messagesStore,
m_sessionStore,
m_mockAuthenticator,
true,
new PermitAllAuthorizator(),
NO_OBSERVERS_INTERCEPTOR);
}
@Test
public void testPublishToItself() throws InterruptedException {
final Subscription subscription = new Subscription(FAKE_CLIENT_ID,
FAKE_TOPIC, MqttQoS.AT_MOST_ONCE);
final Subscription subscription = new Subscription(FAKE_CLIENT_ID, FAKE_TOPIC, MqttQoS.AT_MOST_ONCE);
// subscriptions.matches(topic) redefine the method to return true
SubscriptionsStore subs = new SubscriptionsStore() {
@Override
public List<Subscription> matches(String topic) {
if (topic.equals(FAKE_TOPIC)) {
@@ -126,22 +129,21 @@ public class ProtocolProcessorTest {
MemoryStorageService storageService = new MemoryStorageService();
storageService.initStore();
subs.init(storageService.sessionsStore());
m_processor.init(subs, m_messagesStore, m_sessionStore, null, true, new PermitAllAuthorizator(), NO_OBSERVERS_INTERCEPTOR);
MqttConnectMessage connectMessage = MessageBuilder.connect()
.protocolVersion(MqttVersion.MQTT_3_1)
.clientId(FAKE_CLIENT_ID)
.cleanSession(true)
.build();
m_processor.init(
subs,
m_messagesStore,
m_sessionStore,
null,
true,
new PermitAllAuthorizator(),
NO_OBSERVERS_INTERCEPTOR);
MqttConnectMessage connectMessage = MessageBuilder.connect().protocolVersion(MqttVersion.MQTT_3_1)
.clientId(FAKE_CLIENT_ID).cleanSession(true).build();
m_processor.processConnect(m_channel, connectMessage);
// Exercise
MqttPublishMessage msg = MessageBuilder.publish()
.topicName(FAKE_TOPIC)
.qos(MqttQoS.AT_MOST_ONCE)
.retained(false)
.payload("Hello".getBytes())
.build();
MqttPublishMessage msg = MessageBuilder.publish().topicName(FAKE_TOPIC).qos(MqttQoS.AT_MOST_ONCE)
.retained(false).payload("Hello".getBytes()).build();
NettyUtils.userName(m_channel, "FakeCLI");
m_processor.processPublish(m_channel, msg);
@@ -153,13 +155,12 @@ public class ProtocolProcessorTest {
@Test
public void testPublishToMultipleSubscribers() throws InterruptedException {
final Subscription subscription = new Subscription(FAKE_CLIENT_ID,
FAKE_TOPIC, MqttQoS.AT_MOST_ONCE);
final Subscription subscriptionClient2 = new Subscription(FAKE_CLIENT_ID2,
FAKE_TOPIC, MqttQoS.AT_MOST_ONCE);
final Subscription subscription = new Subscription(FAKE_CLIENT_ID, FAKE_TOPIC, MqttQoS.AT_MOST_ONCE);
final Subscription subscriptionClient2 = new Subscription(FAKE_CLIENT_ID2, FAKE_TOPIC, MqttQoS.AT_MOST_ONCE);
// subscriptions.matches(topic) redefine the method to return true
SubscriptionsStore subs = new SubscriptionsStore() {
@Override
public List<Subscription> matches(String topic) {
if (topic.equals(FAKE_TOPIC)) {
@@ -174,38 +175,34 @@ public class ProtocolProcessorTest {
MemoryStorageService storageService = new MemoryStorageService();
storageService.initStore();
subs.init(storageService.sessionsStore());
m_processor.init(subs, m_messagesStore, m_sessionStore, null, true, new PermitAllAuthorizator(), NO_OBSERVERS_INTERCEPTOR);
m_processor.init(
subs,
m_messagesStore,
m_sessionStore,
null,
true,
new PermitAllAuthorizator(),
NO_OBSERVERS_INTERCEPTOR);
EmbeddedChannel firstReceiverChannel = new EmbeddedChannel();
MqttConnectMessage connectMessage = MessageBuilder.connect()
.protocolVersion(MqttVersion.MQTT_3_1)
.clientId(FAKE_CLIENT_ID)
.cleanSession(true)
.build();
MqttConnectMessage connectMessage = MessageBuilder.connect().protocolVersion(MqttVersion.MQTT_3_1)
.clientId(FAKE_CLIENT_ID).cleanSession(true).build();
m_processor.processConnect(firstReceiverChannel, connectMessage);
assertConnAckAccepted(firstReceiverChannel);
// connect the second fake subscriber
EmbeddedChannel secondReceiverChannel = new EmbeddedChannel();
MqttConnectMessage connectMessage2 = MessageBuilder.connect()
.protocolVersion(MqttVersion.MQTT_3_1)
.clientId(FAKE_CLIENT_ID2)
.cleanSession(true)
.build();
MqttConnectMessage connectMessage2 = MessageBuilder.connect().protocolVersion(MqttVersion.MQTT_3_1)
.clientId(FAKE_CLIENT_ID2).cleanSession(true).build();
m_processor.processConnect(secondReceiverChannel, connectMessage2);
assertConnAckAccepted(secondReceiverChannel);
// Exercise
MqttPublishMessage msg = MessageBuilder.publish()
.topicName(FAKE_TOPIC)
.qos(MqttQoS.AT_MOST_ONCE)
.retained(false)
.payload("Hello".getBytes())
.build();
MqttPublishMessage msg = MessageBuilder.publish().topicName(FAKE_TOPIC).qos(MqttQoS.AT_MOST_ONCE)
.retained(false).payload("Hello".getBytes()).build();
NettyUtils.userName(m_channel, "FakeCLI");
m_processor.processPublish(m_channel, msg);
// Verify
firstReceiverChannel.flush();
MqttPublishMessage pub2FirstSubscriber = firstReceiverChannel.readOutbound();
@@ -222,10 +219,8 @@ public class ProtocolProcessorTest {
@Test
public void testSubscribe() {
MqttSubscribeMessage msg = MessageBuilder.subscribe()
.addSubscription(MqttQoS.AT_MOST_ONCE, FAKE_TOPIC)
.messageId(10)
.build();
MqttSubscribeMessage msg = MessageBuilder.subscribe().addSubscription(MqttQoS.AT_MOST_ONCE, FAKE_TOPIC)
.messageId(10).build();
// Exercise
m_sessionStore.createNewSession(FAKE_CLIENT_ID, false);
m_processor.processSubscribe(m_channel, msg);
@@ -243,14 +238,18 @@ public class ProtocolProcessorTest {
IAuthorizator mockAuthorizator = mock(IAuthorizator.class);
when(mockAuthorizator.canRead(eq(FAKE_TOPIC), eq(fakeUserName), eq(FAKE_CLIENT_ID))).thenReturn(false);
m_processor.init(subscriptions, m_messagesStore, m_sessionStore, m_mockAuthenticator, true,
mockAuthorizator, NO_OBSERVERS_INTERCEPTOR);
m_processor.init(
subscriptions,
m_messagesStore,
m_sessionStore,
m_mockAuthenticator,
true,
mockAuthorizator,
NO_OBSERVERS_INTERCEPTOR);
// Exercise
MqttSubscribeMessage msg = MessageBuilder.subscribe()
.addSubscription(MqttQoS.AT_MOST_ONCE, FAKE_TOPIC)
.messageId(10)
.build();
MqttSubscribeMessage msg = MessageBuilder.subscribe().addSubscription(MqttQoS.AT_MOST_ONCE, FAKE_TOPIC)
.messageId(10).build();
m_sessionStore.createNewSession(FAKE_CLIENT_ID, false);
m_processor.processSubscribe(m_channel, msg);
@@ -270,10 +269,8 @@ public class ProtocolProcessorTest {
@Test
public void testDoubleSubscribe() {
MqttSubscribeMessage msg = MessageBuilder.subscribe()
.addSubscription(MqttQoS.AT_MOST_ONCE, FAKE_TOPIC)
.messageId(10)
.build();
MqttSubscribeMessage msg = MessageBuilder.subscribe().addSubscription(MqttQoS.AT_MOST_ONCE, FAKE_TOPIC)
.messageId(10).build();
m_sessionStore.createNewSession(FAKE_CLIENT_ID, false);
assertEquals(0, subscriptions.size());
@@ -288,13 +285,10 @@ public class ProtocolProcessorTest {
assertTrue(subscriptions.contains(expectedSubscription));
}
@Test
public void testSubscribeWithBadFormattedTopic() {
MqttSubscribeMessage msg = MessageBuilder.subscribe()
.addSubscription(MqttQoS.AT_MOST_ONCE, BAD_FORMATTED_TOPIC)
.messageId(10)
.build();
MqttSubscribeMessage msg = MessageBuilder.subscribe().addSubscription(MqttQoS.AT_MOST_ONCE, BAD_FORMATTED_TOPIC)
.messageId(10).build();
m_sessionStore.createNewSession(FAKE_CLIENT_ID, false);
assertEquals(0, subscriptions.size());
@@ -311,12 +305,10 @@ public class ProtocolProcessorTest {
/*
* Check topicFilter is a valid MQTT topic filter (issue 68)
* */
*/
@Test
public void testUnsubscribeWithBadFormattedTopic() {
MqttUnsubscribeMessage msg = MessageBuilder.unsubscribe()
.addTopicFilter(BAD_FORMATTED_TOPIC)
.messageId(1)
MqttUnsubscribeMessage msg = MessageBuilder.unsubscribe().addTopicFilter(BAD_FORMATTED_TOPIC).messageId(1)
.build();
// Exercise
@@ -326,15 +318,14 @@ public class ProtocolProcessorTest {
assertFalse("If client unsubscribe with bad topic than channel must be closed", m_channel.isOpen());
}
@Test
public void testPublishOfRetainedMessage_afterNewSubscription() throws Exception {
// simulate a connect that register a clientID to an IoSession
final Subscription subscription = new Subscription(FAKE_PUBLISHER_ID,
FAKE_TOPIC, MqttQoS.AT_MOST_ONCE);
final Subscription subscription = new Subscription(FAKE_PUBLISHER_ID, FAKE_TOPIC, MqttQoS.AT_MOST_ONCE);
// subscriptions.matches(topic) redefine the method to return true
SubscriptionsStore subs = new SubscriptionsStore() {
@Override
public List<Subscription> matches(String topic) {
if (topic.equals(FAKE_TOPIC)) {
@@ -349,30 +340,28 @@ public class ProtocolProcessorTest {
subs.init(storageService.sessionsStore());
// simulate a connect that register a clientID to an IoSession
m_processor.init(subs, m_messagesStore, m_sessionStore, null, true, new PermitAllAuthorizator(), NO_OBSERVERS_INTERCEPTOR);
MqttConnectMessage connectMessage = MessageBuilder.connect()
.clientId(FAKE_PUBLISHER_ID)
.protocolVersion(MqttVersion.MQTT_3_1)
.cleanSession(true)
.build();
m_processor.init(
subs,
m_messagesStore,
m_sessionStore,
null,
true,
new PermitAllAuthorizator(),
NO_OBSERVERS_INTERCEPTOR);
MqttConnectMessage connectMessage = MessageBuilder.connect().clientId(FAKE_PUBLISHER_ID)
.protocolVersion(MqttVersion.MQTT_3_1).cleanSession(true).build();
m_processor.processConnect(m_channel, connectMessage);
assertConnAckAccepted(m_channel);
MqttPublishMessage pubmsg = MessageBuilder.publish()
.topicName(FAKE_TOPIC)
.qos(MqttQoS.AT_MOST_ONCE)
.payload("Hello".getBytes())
.retained(true)
.build();
MqttPublishMessage pubmsg = MessageBuilder.publish().topicName(FAKE_TOPIC).qos(MqttQoS.AT_MOST_ONCE)
.payload("Hello".getBytes()).retained(true).build();
NettyUtils.clientID(m_channel, FAKE_PUBLISHER_ID);
m_processor.processPublish(m_channel, pubmsg);
NettyUtils.cleanSession(m_channel, false);
// Exercise
MqttSubscribeMessage msg = MessageBuilder.subscribe()
.messageId(10)
.addSubscription(MqttQoS.AT_MOST_ONCE, "#")
MqttSubscribeMessage msg = MessageBuilder.subscribe().messageId(10).addSubscription(MqttQoS.AT_MOST_ONCE, "#")
.build();
m_processor.processSubscribe(m_channel, msg);
@@ -396,12 +385,17 @@ public class ProtocolProcessorTest {
retainedMessage.setClientID(FAKE_PUBLISHER_ID);
m_messagesStore.storePublishForFuture(retainedMessage);
m_processor.init(subs, m_messagesStore, m_sessionStore, null, true, new PermitAllAuthorizator(), NO_OBSERVERS_INTERCEPTOR);
m_processor.init(
subs,
m_messagesStore,
m_sessionStore,
null,
true,
new PermitAllAuthorizator(),
NO_OBSERVERS_INTERCEPTOR);
MqttConnectMessage connectMessage = MessageBuilder.connect()
.clientId(FAKE_PUBLISHER_ID)
.protocolVersion(MqttVersion.MQTT_3_1)
.build();
MqttConnectMessage connectMessage = MessageBuilder.connect().clientId(FAKE_PUBLISHER_ID)
.protocolVersion(MqttVersion.MQTT_3_1).build();
m_processor.processConnect(m_channel, connectMessage);
@@ -420,16 +414,18 @@ public class ProtocolProcessorTest {
List<Subscription> inactiveSubscriptions = Collections.singletonList(inactiveSub);
when(mockedSubscriptions.matches(eq("/topic"))).thenReturn(inactiveSubscriptions);
m_processor = new ProtocolProcessor();
m_processor.init(mockedSubscriptions, m_messagesStore, m_sessionStore, null, true, new PermitAllAuthorizator(),
m_processor.init(
mockedSubscriptions,
m_messagesStore,
m_sessionStore,
null,
true,
new PermitAllAuthorizator(),
NO_OBSERVERS_INTERCEPTOR);
// Exercise
MqttPublishMessage msg = MessageBuilder.publish()
.topicName("/topic")
.qos(MqttQoS.AT_MOST_ONCE)
.payload("Hello".getBytes())
.retained(true)
.build();
MqttPublishMessage msg = MessageBuilder.publish().topicName("/topic").qos(MqttQoS.AT_MOST_ONCE)
.payload("Hello".getBytes()).retained(true).build();
NettyUtils.clientID(m_channel, "Publisher");
m_processor.processPublish(m_channel, msg);
@@ -439,30 +435,23 @@ public class ProtocolProcessorTest {
}
/**
* Verify that receiving a publish with retained message and with Q0S = 0
* clean the existing retained messages for that topic.
* Verify that receiving a publish with retained message and with Q0S = 0 clean the existing
* retained messages for that topic.
*/
@Test
public void testCleanRetainedStoreAfterAQoS0AndRetainedTrue() {
// force a connect
connMsg = MessageBuilder.connect()
.protocolVersion(MqttVersion.MQTT_3_1)
.clientId("Publisher")
.cleanSession(true)
.build();
connMsg = MessageBuilder.connect().protocolVersion(MqttVersion.MQTT_3_1).clientId("Publisher")
.cleanSession(true).build();
m_processor.processConnect(m_channel, connMsg);
// prepare and existing retained store
NettyUtils.clientID(m_channel, "Publisher");
MqttPublishMessage msg = MessageBuilder.publish()
.topicName(FAKE_TOPIC)
.qos(MqttQoS.AT_LEAST_ONCE)
.payload("Hello".getBytes())
.retained(true)
.messageId(100)
.build();
MqttPublishMessage msg = MessageBuilder.publish().topicName(FAKE_TOPIC).qos(MqttQoS.AT_LEAST_ONCE)
.payload("Hello".getBytes()).retained(true).messageId(100).build();
m_processor.processPublish(m_channel, msg);
Collection<IMessagesStore.StoredMessage> messages = m_messagesStore.searchMatching(new IMatchingCondition() {
public boolean match(String key) {
return SubscriptionsStore.matchTopics(key, FAKE_TOPIC);
}
@@ -470,17 +459,14 @@ public class ProtocolProcessorTest {
assertFalse(messages.isEmpty());
// Exercise
MqttPublishMessage cleanPubMsg = MessageBuilder.publish()
.topicName(FAKE_TOPIC)
.qos(MqttQoS.AT_MOST_ONCE)
.payload("Hello".getBytes())
.retained(true)
.build();
MqttPublishMessage cleanPubMsg = MessageBuilder.publish().topicName(FAKE_TOPIC).qos(MqttQoS.AT_MOST_ONCE)
.payload("Hello".getBytes()).retained(true).build();
m_processor.processPublish(m_channel, cleanPubMsg);
// Verify
messages = m_messagesStore.searchMatching(new IMatchingCondition() {
public boolean match(String key) {
return SubscriptionsStore.matchTopics(key, FAKE_TOPIC);
}