package org.ow2.chameleon.fuchsia.importer.mqtt.it;
import org.apache.felix.ipojo.ComponentInstance;
import org.apache.felix.ipojo.Factory;
import org.fusesource.mqtt.client.BlockingConnection;
import org.fusesource.mqtt.client.MQTT;
import org.fusesource.mqtt.client.QoS;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
import org.ops4j.pax.exam.spi.reactors.PerMethod;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventAdmin;
import org.osgi.service.event.EventConstants;
import org.osgi.service.event.EventHandler;
import org.ow2.chameleon.fuchsia.core.FuchsiaConstants;
import org.ow2.chameleon.fuchsia.core.declaration.Constants;
import org.ow2.chameleon.fuchsia.core.declaration.ImportDeclaration;
import org.ow2.chameleon.fuchsia.importer.mqtt.it.dao.MessageHandler;
import org.ow2.chameleon.fuchsia.importer.mqtt.it.util.RabbitMQTestSuite;
import org.ow2.chameleon.fuchsia.tools.shell.FuchsiaGogoCommand;
import org.ow2.chameleon.testing.helpers.IPOJOHelper;
import javax.inject.Inject;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Properties;
import static org.fest.assertions.Assertions.assertThat;
import static org.mockito.Mockito.*;
import static org.ow2.chameleon.fuchsia.core.component.ImportationLinker.FILTER_IMPORTDECLARATION_PROPERTY;
import static org.ow2.chameleon.fuchsia.core.component.ImportationLinker.FILTER_IMPORTERSERVICE_PROPERTY;
/**
* Test class MQTT.
*
* @author botelho@imag.fr
*/
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerMethod.class)
public class MQTTMessageCaptureTest extends RabbitMQTestSuite {
@Inject
EventAdmin eventAdmin;
@Inject
FuchsiaGogoCommand command;
ComponentInstance linkerComponentInstance;
ComponentInstance importerComponentInstance;
protected IPOJOHelper ipojoHelper;
@Before
public void instantiateAMPQPlaform() {
ipojoHelper = new IPOJOHelper(bundleContext);
Properties linker = new Properties();
linker.put(FILTER_IMPORTDECLARATION_PROPERTY, "(id=*)");
linker.put(FILTER_IMPORTERSERVICE_PROPERTY, "(instance.name=MQTTImporter)");
linker.put(Factory.INSTANCE_NAME_PROPERTY, "MQTTLinker");
linkerComponentInstance = ipojoHelper.createComponentInstance(FuchsiaConstants.DEFAULT_IMPORTATION_LINKER_FACTORY_NAME, linker);
Properties importer = new Properties();
importer.put(FILTER_IMPORTDECLARATION_PROPERTY, "(id=*)");
importer.put("target", "(id=*)");
importer.put(Factory.INSTANCE_NAME_PROPERTY, "MQTTImporter");
importerComponentInstance = ipojoHelper.createComponentInstance("org.ow2.chameleon.fuchsia.importer.mqtt.MQTTImporter", importer);
}
@After
public void uninstantiateAMPQPlatform() {
linkerComponentInstance.dispose();
importerComponentInstance.dispose();
}
@Test
public void ConsumeSingleMessageEventAdmin() throws Exception {
assertRabbitMQisRunning();
final String queue = "public";
Dictionary handlerProperties = new Hashtable();
handlerProperties.put(EventConstants.EVENT_TOPIC, queue);
MessageHandler ht = new MessageHandler();
MessageHandler htmock = spy(ht);
bundleContext.registerService(EventHandler.class.getName(), htmock, handlerProperties);
HashMap<String, Object> metadata = new HashMap<String, Object>();
metadata.put(Constants.DEVICE_ID, "00000000-54b3-e7c7-0000-000046bffd98");
metadata.put("mqtt.queue", queue);
ImportDeclaration declaration = createImportationDeclaration("importDeclaration", metadata);
assertThat(declaration).isNotNull();
sendSampleMQTTMessage();
verify(htmock, times(1)).handleEvent(any(Event.class));
}
/**
* Seinding message ot type MQTT do not work properly with version 3.1.5 of RabbitMQ, See https://github.com/rabbitmq/rabbitmq-mqtt/issues/5
*
* @throws Exception
*/
private void sendSampleMQTTMessage() throws Exception {
final String topic = "public";
final String quote = "The force of mind is only as great as its expression; its depth only as deep as its power to expand and lose itself";
// MQTT Client
MQTT mqtt = new MQTT();
mqtt.setHost("localhost", 1883);
final BlockingConnection connection = mqtt.blockingConnection();
mqtt.setCleanSession(false);
connection.connect();
Thread.sleep(1000);
assertThat(connection.isConnected()).isTrue();
LOG.info("<eventadmin type='outbound'>");
LOG.info("\tTOPIC: {}", topic);
LOG.info("\tQuote: {}", quote);
LOG.info("</eventadmin>\n");
connection.publish(topic, quote.getBytes(), QoS.AT_MOST_ONCE, false);
}
}