broker/ProtocolProcessor_CONNECT_Test: code formatter used

This commit is contained in:
Andreas Mager
2017-02-01 17:13:43 +01:00
parent 5206cc3df7
commit 5125132f23
@@ -13,6 +13,7 @@
*
* You may elect to redistribute this code under either of these licenses.
*/
package io.moquette.spi.impl;
import io.moquette.server.netty.MessageBuilder;
@@ -30,12 +31,10 @@ import io.netty.handler.codec.mqtt.MqttSubscribeMessage;
import io.netty.handler.codec.mqtt.MqttVersion;
import org.junit.Before;
import org.junit.Test;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import static io.moquette.spi.impl.NettyChannelAssertions.assertEqualsConnAck;
import static io.moquette.spi.impl.NettyChannelAssertions.assertEqualsSubAck;
import static io.netty.handler.codec.mqtt.MqttConnectReturnCode.*;
@@ -59,19 +58,17 @@ public class ProtocolProcessor_CONNECT_Test {
@Before
public void setUp() throws InterruptedException {
connMsg = MessageBuilder.connect()
.protocolVersion(MqttVersion.MQTT_3_1)
.cleanSession(true);
connMsg = MessageBuilder.connect().protocolVersion(MqttVersion.MQTT_3_1).cleanSession(true);
m_session = new EmbeddedChannel();
//sleep to let the messaging batch processor to process the initEvent
// sleep to let the messaging batch processor to process the initEvent
Thread.sleep(300);
MemoryStorageService memStorage = new MemoryStorageService();
memStorage.initStore();
m_messagesStore = memStorage.messagesStore();
m_sessionStore = memStorage.sessionsStore();
//m_messagesStore.initStore();
// m_messagesStore.initStore();
Set<String> clientIds = new HashSet<>();
clientIds.add(ProtocolProcessorTest.FAKE_CLIENT_ID);
@@ -82,284 +79,273 @@ public class ProtocolProcessor_CONNECT_Test {
subscriptions = new SubscriptionsStore();
subscriptions.init(m_sessionStore);
m_processor = new ProtocolProcessor();
m_processor.init(subscriptions, m_messagesStore, m_sessionStore, m_mockAuthenticator, true,
new PermitAllAuthorizator(), ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
m_processor.init(
subscriptions,
m_messagesStore,
m_sessionStore,
m_mockAuthenticator,
true,
new PermitAllAuthorizator(),
ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
}
// @Test
// public void testHandleConnect_BadProtocol() {
// connMsg.setProtocolVersion((byte) 0x02);
//
// //Exercise
// m_processor.processConnect(m_session, connMsg);
//
// //Verify
// assertEqualsConnAck(UNNACEPTABLE_PROTOCOL_VERSION, m_session.readOutbound());
// assertFalse("Connection should be closed by the broker.", m_session.isOpen());
// }
// @Test
// public void testHandleConnect_BadProtocol() {
// connMsg.setProtocolVersion((byte) 0x02);
//
// //Exercise
// m_processor.processConnect(m_session, connMsg);
//
// //Verify
// assertEqualsConnAck(UNNACEPTABLE_PROTOCOL_VERSION, m_session.readOutbound());
// assertFalse("Connection should be closed by the broker.", m_session.isOpen());
// }
@Test
public void testConnect_badClientID() {
connMsg.clientId("extremely_long_clientID_greater_than_23").build();
//Exercise
// Exercise
m_processor.processConnect(m_session, connMsg.clientId("extremely_long_clientID_greater_than_23").build());
//Verify
// Verify
assertEqualsConnAck(CONNECTION_ACCEPTED, m_session.readOutbound());
}
@Test
public void testWill() {
MqttConnectMessage msg = connMsg
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.willFlag(true)
.willTopic("topic")
.willMessage("Topic message")
.build();
MqttConnectMessage msg = connMsg.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID).willFlag(true)
.willTopic("topic").willMessage("Topic message").build();
//Exercise
//m_handler.setMessaging(mockedMessaging);
// Exercise
// m_handler.setMessaging(mockedMessaging);
m_processor.processConnect(m_session, msg);
//Verify
// Verify
assertEqualsConnAck(CONNECTION_ACCEPTED, m_session.readOutbound());
assertTrue("Connection is accepted and therefore should remain open.", m_session.isOpen());
//TODO verify the call
/*verify(mockedMessaging).publish(eq("topic"), eq("Topic message".getBytes()),
any(AbstractMessage.QOSType.class), anyBoolean(), eq("123"), any(IoSession.class));*/
// TODO verify the call
/*
* verify(mockedMessaging).publish(eq("topic"), eq("Topic message".getBytes()),
* any(AbstractMessage.QOSType.class), anyBoolean(), eq("123"), any(IoSession.class));
*/
}
@Test
public void validAuthentication() {
MqttConnectMessage msg = connMsg
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.hasUser()
.hasPassword()
.username(ProtocolProcessorTest.TEST_USER)
.password(ProtocolProcessorTest.TEST_PWD)
.build();
MqttConnectMessage msg = connMsg.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID).hasUser().hasPassword()
.username(ProtocolProcessorTest.TEST_USER).password(ProtocolProcessorTest.TEST_PWD).build();
//Exercise
// Exercise
m_processor.processConnect(m_session, msg);
//Verify
// Verify
assertEqualsConnAck(CONNECTION_ACCEPTED, m_session.readOutbound());
assertTrue("Connection is accepted and therefore should remain open.", m_session.isOpen());
}
@Test
public void noPasswdAuthentication() {
MqttConnectMessage msg = connMsg
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.hasUser()
.username(ProtocolProcessorTest.TEST_USER)
.build();
MqttConnectMessage msg = connMsg.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID).hasUser()
.username(ProtocolProcessorTest.TEST_USER).build();
//Exercise
// Exercise
m_processor.processConnect(m_session, msg);
//Verify
// Verify
assertEqualsConnAck(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD, m_session.readOutbound());
assertFalse("Connection should be closed by the broker.", m_session.isOpen());
}
@Test
public void invalidAuthentication() {
MqttConnectMessage msg = connMsg
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.hasUser()
.hasPassword()
.username(ProtocolProcessorTest.TEST_USER + "_fake")
.password(ProtocolProcessorTest.TEST_PWD)
.build();
MqttConnectMessage msg = connMsg.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID).hasUser().hasPassword()
.username(ProtocolProcessorTest.TEST_USER + "_fake").password(ProtocolProcessorTest.TEST_PWD).build();
//Exercise
// Exercise
m_processor.processConnect(m_session, msg);
//Verify
// Verify
assertEqualsConnAck(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD, m_session.readOutbound());
assertFalse("Connection should be closed by the broker.", m_session.isOpen());
}
@Test
public void prohibitAnonymousClient() {
MqttConnectMessage msg = connMsg
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.build();
m_processor.init(subscriptions, m_messagesStore, m_sessionStore, m_mockAuthenticator, false,
new PermitAllAuthorizator(), ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
MqttConnectMessage msg = connMsg.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID).build();
m_processor.init(
subscriptions,
m_messagesStore,
m_sessionStore,
m_mockAuthenticator,
false,
new PermitAllAuthorizator(),
ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
//Exercise
// Exercise
m_processor.processConnect(m_session, msg);
//Verify
// Verify
assertEqualsConnAck(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD, m_session.readOutbound());
assertFalse("Connection should be closed by the broker.", m_session.isOpen());
}
@Test
public void prohibitAnonymousClient_providingUsername() {
MqttConnectMessage msg = connMsg
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.hasUser()
.username(ProtocolProcessorTest.TEST_USER + "_fake")
.build();
m_processor.init(subscriptions, m_messagesStore, m_sessionStore, m_mockAuthenticator, false,
new PermitAllAuthorizator(), ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
MqttConnectMessage msg = connMsg.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID).hasUser()
.username(ProtocolProcessorTest.TEST_USER + "_fake").build();
m_processor.init(
subscriptions,
m_messagesStore,
m_sessionStore,
m_mockAuthenticator,
false,
new PermitAllAuthorizator(),
ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
//Exercise
// Exercise
m_processor.processConnect(m_session, msg);
//Verify
// Verify
assertEqualsConnAck(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD, m_session.readOutbound());
assertFalse("Connection should be closed by the broker.", m_session.isOpen());
}
@Test
public void acceptAnonymousClient() {
MqttConnectMessage msg = connMsg
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.build();
m_processor.init(subscriptions, m_messagesStore, m_sessionStore, m_mockAuthenticator, true,
new PermitAllAuthorizator(), ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
MqttConnectMessage msg = connMsg.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID).build();
m_processor.init(
subscriptions,
m_messagesStore,
m_sessionStore,
m_mockAuthenticator,
true,
new PermitAllAuthorizator(),
ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
//Exercise
// Exercise
m_processor.processConnect(m_session, msg);
//Verify
// Verify
assertEqualsConnAck(CONNECTION_ACCEPTED, m_session.readOutbound());
assertTrue("Connection is accepted and therefore should remain open.", m_session.isOpen());
}
@Test
public void connectWithCleanSessionUpdateClientSession() throws InterruptedException {
m_processor.init(subscriptions, m_messagesStore, m_sessionStore, m_mockAuthenticator, true,
new PermitAllAuthorizator(), ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
m_processor.init(
subscriptions,
m_messagesStore,
m_sessionStore,
m_mockAuthenticator,
true,
new PermitAllAuthorizator(),
ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
//first connect with clean session true
MqttConnectMessage msg = connMsg
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.cleanSession(true)
.build();
// first connect with clean session true
MqttConnectMessage msg = connMsg.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID).cleanSession(true).build();
m_processor.processConnect(m_session, msg);
assertEqualsConnAck(CONNECTION_ACCEPTED, m_session.readOutbound());
m_processor.processDisconnect(m_session);
assertFalse(m_session.isOpen());
//second connect with clean session false
// second connect with clean session false
m_session = new EmbeddedChannel();
MqttConnectMessage secondConnMsg = MessageBuilder.connect()
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.protocolVersion(MqttVersion.MQTT_3_1)
.build();
MqttConnectMessage secondConnMsg = MessageBuilder.connect().clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.protocolVersion(MqttVersion.MQTT_3_1).build();
m_processor.processConnect(m_session, secondConnMsg);
assertEqualsConnAck(CONNECTION_ACCEPTED, m_session.readOutbound());
//Verify client session is clean false
// Verify client session is clean false
ClientSession session = m_sessionStore.sessionForClient(ProtocolProcessorTest.FAKE_CLIENT_ID);
assertFalse(session.isCleanSession());
//Verify
//assertEqualsConnAck(CONNECTION_ACCEPTED, m_session.readOutbound());
// Verify
// assertEqualsConnAck(CONNECTION_ACCEPTED, m_session.readOutbound());
}
@Test
public void connectWithSameClientIDBadCredentialsDoesntDropExistingClient() {
//Connect a client1
MqttConnectMessage msg = connMsg
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.hasUser()
.hasPassword()
.username(ProtocolProcessorTest.TEST_USER)
.password(ProtocolProcessorTest.TEST_PWD)
.build();
// Connect a client1
MqttConnectMessage msg = connMsg.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID).hasUser().hasPassword()
.username(ProtocolProcessorTest.TEST_USER).password(ProtocolProcessorTest.TEST_PWD).build();
m_processor.processConnect(m_session, msg);
assertEqualsConnAck(CONNECTION_ACCEPTED, m_session.readOutbound());
//create another connect same clientID but with bad credentials
MqttConnectMessage evilClientConnMsg = MessageBuilder.connect().
protocolVersion(MqttVersion.MQTT_3_1)
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.hasUser().username(ProtocolProcessorTest.EVIL_TEST_USER)
.hasPassword().password(ProtocolProcessorTest.EVIL_TEST_PWD)
.build();
// create another connect same clientID but with bad credentials
MqttConnectMessage evilClientConnMsg = MessageBuilder.connect().protocolVersion(MqttVersion.MQTT_3_1)
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID).hasUser().username(ProtocolProcessorTest.EVIL_TEST_USER)
.hasPassword().password(ProtocolProcessorTest.EVIL_TEST_PWD).build();
EmbeddedChannel evilSession = new EmbeddedChannel();
//Exercise
// Exercise
m_processor.processConnect(evilSession, evilClientConnMsg);
//Verify
//the evil client gets a not auth notification
// Verify
// the evil client gets a not auth notification
assertEqualsConnAck(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD, evilSession.readOutbound());
//the good client remains connected
// the good client remains connected
assertTrue(m_session.isOpen());
assertFalse(evilSession.isOpen());
}
@Test
public void testConnAckContainsSessionPresentFlag() throws InterruptedException {
MqttConnectMessage msg = connMsg
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.protocolVersion(MqttVersion.MQTT_3_1_1)
.build();
MqttConnectMessage msg = connMsg.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.protocolVersion(MqttVersion.MQTT_3_1_1).build();
NettyUtils.clientID(m_session, ProtocolProcessorTest.FAKE_CLIENT_ID);
NettyUtils.cleanSession(m_session, false);
//Connect a first time
// Connect a first time
m_processor.processConnect(m_session, msg);
//disconnect
// disconnect
m_processor.processDisconnect(m_session);
//Exercise, reconnect
// Exercise, reconnect
EmbeddedChannel firstReceiverSession = new EmbeddedChannel();
m_processor.processConnect(firstReceiverSession, msg);
//Verify
// Verify
assertEqualsConnAck(CONNECTION_ACCEPTED, firstReceiverSession.readOutbound());
assertTrue("Connection is accepted and therefore should remain open.", firstReceiverSession.isOpen());
}
@Test
public void testMultipleReconnection() throws InterruptedException {
//connect with clean a false and subscribe to a topic
MqttConnectMessage msg = MessageBuilder.connect()
.clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.protocolVersion(MqttVersion.MQTT_3_1_1)
.build();
// connect with clean a false and subscribe to a topic
MqttConnectMessage msg = MessageBuilder.connect().clientId(ProtocolProcessorTest.FAKE_CLIENT_ID)
.protocolVersion(MqttVersion.MQTT_3_1_1).build();
m_processor.processConnect(m_session, msg);
assertEqualsConnAck(CONNECTION_ACCEPTED, m_session.readOutbound());
assertTrue("Connection is accepted and therefore should remain open.", m_session.isOpen());
//subscribe
// subscribe
MqttSubscribeMessage subscribeMsg = MessageBuilder.subscribe()
.addSubscription(MqttQoS.AT_MOST_ONCE, ProtocolProcessorTest.FAKE_TOPIC)
.messageId(10)
.build();
.addSubscription(MqttQoS.AT_MOST_ONCE, ProtocolProcessorTest.FAKE_TOPIC).messageId(10).build();
NettyUtils.clientID(m_session, ProtocolProcessorTest.FAKE_CLIENT_ID);
NettyUtils.cleanSession(m_session, false);
m_processor.processSubscribe(m_session, subscribeMsg);
Subscription expectedSubscription = new Subscription(ProtocolProcessorTest.FAKE_CLIENT_ID, ProtocolProcessorTest.FAKE_TOPIC,
Subscription expectedSubscription = new Subscription(
ProtocolProcessorTest.FAKE_CLIENT_ID,
ProtocolProcessorTest.FAKE_TOPIC,
MqttQoS.AT_MOST_ONCE);
assertTrue(subscriptions.contains(expectedSubscription));
assertEqualsSubAck(m_session.readOutbound());
//disconnect
// disconnect
m_processor.processDisconnect(m_session);
assertFalse(m_session.isOpen());
//reconnect clean session a false
// reconnect clean session a false
m_session = new EmbeddedChannel();
m_processor.processConnect(m_session, msg);
assertEqualsConnAck(CONNECTION_ACCEPTED, m_session.readOutbound());
assertTrue("Connection is accepted and therefore should remain open.", m_session.isOpen());
//verify that the first subscription is still preserved
// verify that the first subscription is still preserved
assertTrue(subscriptions.contains(expectedSubscription));
}
@@ -367,18 +353,25 @@ public class ProtocolProcessor_CONNECT_Test {
public void testZeroByteClientIdWithoutCleanSession() {
// Allow zero byte client ids
m_processor = new ProtocolProcessor();
m_processor.init(subscriptions, m_messagesStore, m_sessionStore, m_mockAuthenticator, true, true,
new PermitAllAuthorizator(), ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
m_processor.init(
subscriptions,
m_messagesStore,
m_sessionStore,
m_mockAuthenticator,
true,
true,
new PermitAllAuthorizator(),
ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
// Connect message without clean session set to true but client id is still null
MqttConnectMessage msg = MessageBuilder.connect()
.clientId(null)
.protocolVersion(MqttVersion.MQTT_3_1_1)
MqttConnectMessage msg = MessageBuilder.connect().clientId(null).protocolVersion(MqttVersion.MQTT_3_1_1)
.build();
m_processor.processConnect(m_session, msg);
assertEqualsConnAck("Identifier should be rejected due to having clean session set to false.",
CONNECTION_REFUSED_IDENTIFIER_REJECTED, m_session.readOutbound());
assertEqualsConnAck(
"Identifier should be rejected due to having clean session set to false.",
CONNECTION_REFUSED_IDENTIFIER_REJECTED,
m_session.readOutbound());
assertFalse("Connection should be closed by the broker.", m_session.isOpen());
}
@@ -387,19 +380,26 @@ public class ProtocolProcessor_CONNECT_Test {
public void testZeroByteClientIdWithCleanSession() {
// Allow zero byte client ids
m_processor = new ProtocolProcessor();
m_processor.init(subscriptions, m_messagesStore, m_sessionStore, m_mockAuthenticator, true, true,
new PermitAllAuthorizator(), ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
m_processor.init(
subscriptions,
m_messagesStore,
m_sessionStore,
m_mockAuthenticator,
true,
true,
new PermitAllAuthorizator(),
ProtocolProcessorTest.NO_OBSERVERS_INTERCEPTOR);
// Connect message with clean session set to true and client id is null.
MqttConnectMessage msg = connMsg
.clientId(null)
.protocolVersion(MqttVersion.MQTT_3_1_1)
.cleanSession(true)
MqttConnectMessage msg = connMsg.clientId(null).protocolVersion(MqttVersion.MQTT_3_1_1).cleanSession(true)
.build();
m_processor.processConnect(m_session, msg);
assertEqualsConnAck("Connection should be accepted. A unique clientid should be generated" +
" and clean session set to true.", CONNECTION_ACCEPTED, m_session.readOutbound());
assertEqualsConnAck(
"Connection should be accepted. A unique clientid should be generated"
+ " and clean session set to true.",
CONNECTION_ACCEPTED,
m_session.readOutbound());
assertTrue("Connection should be valid and open,", m_session.isOpen());
}
@@ -407,15 +407,14 @@ public class ProtocolProcessor_CONNECT_Test {
@Test
public void testZeroByteClientIdNotAllowed() {
// Connect message with clean session set to true and client id is null.
MqttConnectMessage msg = connMsg
.clientId(null)
.protocolVersion(MqttVersion.MQTT_3_1_1)
.cleanSession(true)
MqttConnectMessage msg = connMsg.clientId(null).protocolVersion(MqttVersion.MQTT_3_1_1).cleanSession(true)
.build();
m_processor.processConnect(m_session, msg);
assertEqualsConnAck("Zero byte client identifiers are not allowed.",
CONNECTION_REFUSED_IDENTIFIER_REJECTED, m_session.readOutbound());
assertEqualsConnAck(
"Zero byte client identifiers are not allowed.",
CONNECTION_REFUSED_IDENTIFIER_REJECTED,
m_session.readOutbound());
assertFalse("Connection should closed.", m_session.isOpen());
}