/* * JBoss, Home of Professional Open Source * Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual * contributors by the @authors tag. See the copyright.txt in the * distribution for a full listing of individual contributors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.switchyard.quickstarts.camel.mqtt.binding; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import org.apache.activemq.broker.BrokerService; import org.fusesource.mqtt.client.BlockingConnection; import org.fusesource.mqtt.client.MQTT; import org.fusesource.mqtt.client.Message; import org.fusesource.mqtt.client.QoS; import org.fusesource.mqtt.client.Topic; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.switchyard.Exchange; import org.switchyard.test.BeforeDeploy; import org.switchyard.test.Invoker; import org.switchyard.test.MockHandler; import org.switchyard.test.ServiceOperation; import org.switchyard.test.SwitchYardRunner; import org.switchyard.test.SwitchYardTestCaseConfig; import org.switchyard.test.SwitchYardTestKit; import org.switchyard.component.test.mixins.cdi.CDIMixIn; /** * CamelMQTTBindingTest. */ @SwitchYardTestCaseConfig( config = SwitchYardTestCaseConfig.SWITCHYARD_XML, mixins = CDIMixIn.class) @RunWith(SwitchYardRunner.class) public class CamelMQTTBindingTest { private static final String TOPIC_INPUT = "camel/mqtt/test/input"; private static final String TOPIC_OUTPUT = "camel/mqtt/test/output"; private static final String MESSAGE_INPUT = "Captain Crunch"; private static final String MESSAGE_OUTPUT = "Hello there " + MESSAGE_INPUT + " :-) "; private static BrokerService _broker; private SwitchYardTestKit _testKit; @ServiceOperation("GreetingService.greet") private Invoker _greet; @BeforeDeploy public void initialize() throws Exception { if (_broker != null && _broker.isStarted()) { _broker.stop(); } _broker = new BrokerService(); _broker.setBrokerName("default"); _broker.setUseJmx(false); _broker.setPersistent(false); _broker.addConnector("mqtt://localhost:1883"); _broker.setUseShutdownHook(false); _broker.start(); } @Before public void before() { MQTT mqtt = new MQTT(); Topic outputTopic = new Topic(TOPIC_OUTPUT, QoS.AT_LEAST_ONCE); BlockingConnection connection = mqtt.blockingConnection(); try { connection.connect(); connection.subscribe(new Topic[]{outputTopic}); while(connection.receive(1000, TimeUnit.MILLISECONDS) != null); } catch (Exception e) { e.printStackTrace(); } finally { try { connection.disconnect(); } catch (Exception e) { e.printStackTrace(); } } } @Ignore("Disable for now due to https://issues.jboss.org/browse/SWITCHYARD-2221") @Test public void testReferenceBinding() throws Exception { MQTT mqtt = new MQTT(); Topic outputTopic = new Topic(TOPIC_OUTPUT, QoS.AT_LEAST_ONCE); BlockingConnection connection = mqtt.blockingConnection(); try { connection.connect(); connection.subscribe(new Topic[]{outputTopic}); _greet.sendInOnly(MESSAGE_INPUT); Message message = connection.receive(1000, TimeUnit.MILLISECONDS); Assert.assertNotNull("No output message from " + TOPIC_OUTPUT, message); Assert.assertEquals(MESSAGE_OUTPUT, new String(message.getPayload())); Assert.assertNull("More than one message received from " + TOPIC_OUTPUT, connection.receive(1000, TimeUnit.MILLISECONDS)); } finally { connection.disconnect(); } } @Test public void testServiceBinding() throws Exception { MockHandler mock = _testKit.replaceService("StoreReference"); MQTT mqtt = new MQTT(); BlockingConnection connection = mqtt.blockingConnection(); try { connection.connect(); connection.publish(TOPIC_INPUT, MESSAGE_INPUT.getBytes(), QoS.AT_LEAST_ONCE, false); Thread.sleep(1000); LinkedBlockingQueue<Exchange> received = mock.getMessages(); Assert.assertNotNull(received); Exchange exchange = received.iterator().next(); Assert.assertEquals(MESSAGE_OUTPUT, exchange.getMessage().getContent(String.class)); } finally { connection.disconnect(); } } }