package org.lunifera.sharky.m2m.test; import static org.junit.Assert.assertEquals; import java.net.URISyntaxException; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; import org.eclipse.paho.client.mqttv3.MqttCallback; import org.eclipse.paho.client.mqttv3.MqttClient; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @ContextConfiguration @RunWith(SpringJUnit4ClassRunner.class) public class ActiveMQBrokerIntegrationTest { private static final String TOPIC = "foo"; private static final String PAYLOAD = "Hello"; private String answer; private Throwable error; @Test public void shouldReceiveMqttClientAfterSendingOne() throws Throwable { MqttClient publishClient = createClient(); MqttClient receiveClient = createClient(); subscribe(receiveClient); Thread.sleep(100); send(publishClient); Thread.sleep(500); assertResult(); } private synchronized void assertResult() throws Throwable { assertEquals(PAYLOAD, answer); if (error != null) { throw error; } } private MqttClient createClient() throws URISyntaxException, MqttException { MqttClient mqtt = new MqttClient("tcp://127.0.0.1:1883", MqttClient.generateClientId()); mqtt.connect(); return mqtt; } private void subscribe(MqttClient client) throws Exception { client.subscribe(TOPIC); client.setCallback(new MqttCallback() { @Override public void messageArrived(String topic, MqttMessage message) throws Exception { setResponse(new String(message.getPayload())); } @Override public void deliveryComplete(IMqttDeliveryToken token) { } @Override public void connectionLost(Throwable ex) { setError(ex); } }); } private synchronized void setResponse(String value) { answer = value; } private synchronized void setError(Throwable value) { error = value; } private void send(MqttClient client) throws Exception { client.publish(TOPIC, PAYLOAD.getBytes(), 0, false); } }