/**
* Copyright (c) 2010-2016 by the respective copyright holders.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.openhab.binding.mqtt.internal;
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.openhab.binding.mqtt.internal.AbstractMqttMessagePubSub.MessageType;
import org.openhab.core.library.items.ColorItem;
import org.openhab.core.library.items.DimmerItem;
import org.openhab.core.library.items.LocationItem;
import org.openhab.core.library.items.NumberItem;
import org.openhab.core.library.items.RollershutterItem;
import org.openhab.core.library.items.StringItem;
import org.openhab.core.library.items.SwitchItem;
import org.openhab.core.library.types.DecimalType;
import org.openhab.core.library.types.HSBType;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.library.types.PercentType;
import org.openhab.core.library.types.PointType;
import org.openhab.core.library.types.StringType;
import org.openhab.core.transform.TransformationService;
import org.openhab.model.item.binding.BindingConfigParseException;
/**
* @author Davy Vanherbergen
* @since 1.3.0
*/
@RunWith(MockitoJUnitRunner.class)
public class MqttMessageSubscriberTest {
@Mock
private TransformationService transformer;
private void validateConfig(String configString, String broker, String topic, MessageType type,
String transformString) throws BindingConfigParseException {
MqttMessageSubscriber subscriber = new MqttMessageSubscriber(configString);
assertEquals(broker, subscriber.getBroker());
assertEquals(topic, subscriber.getTopic());
assertEquals(type, subscriber.getMessageType());
assertEquals(transformString, subscriber.getTransformationRule());
}
private void validateBadConfig(String configString) {
try {
new MqttMessageSubscriber(configString);
fail("Missing exception for config " + configString);
} catch (BindingConfigParseException e) {
return;
}
}
@Test
public void canParseValidConfigurations() throws BindingConfigParseException {
try {
validateConfig("mybroker:/mytopic:command:1", "mybroker", "/mytopic", MessageType.COMMAND, "1");
validateConfig("mybroker1:/a/long/topic/goes/here:command:default", "mybroker1", "/a/long/topic/goes/here",
MessageType.COMMAND, "default");
validateConfig("mybroker1:/a/long/topic/goes/here:command:dummyfunction", "mybroker1",
"/a/long/topic/goes/here", MessageType.COMMAND, "dummyfunction");
validateConfig("mybroker1:/wildcard/+/topic/#:command:xslt(myfile.xslt)", "mybroker1",
"/wildcard/+/topic/#", MessageType.COMMAND, "xslt(myfile.xslt)");
validateConfig("testbroker:/mytopic:state:json(/group/person[2]/value)", "testbroker", "/mytopic",
MessageType.STATE, "json(/group/person[2]/value)");
validateConfig("mybroker:/mytopic:command:file(/tmp/myfile.txt)", "mybroker", "/mytopic",
MessageType.COMMAND, "file(/tmp/myfile.txt)");
validateConfig("mybroker:/mytopic:command:file(/tmp/myfile.txt)", "mybroker", "/mytopic",
MessageType.COMMAND, "file(/tmp/myfile.txt)");
validateConfig("mybroker:/mytopic:command:file(c\\:\\tmp\\myfile.txt)", "mybroker", "/mytopic",
MessageType.COMMAND, "file(c:\\tmp\\myfile.txt)");
} catch (BindingConfigParseException e) {
e.printStackTrace();
throw e;
}
}
@Test
public void canDetectInvalidConfigurations() {
validateBadConfig(" :/mytopic:command:ON:.*:1");
validateBadConfig("mybroker:/mytopic:command:ON:.*:1");
validateBadConfig("mybroker:/mytopic:command:ON:1:99");
validateBadConfig("mybroker::/mytopic:command:ON:1");
validateBadConfig("mybroker:command:ON:1");
validateBadConfig("mybroker:/mytopic:command:ON:.*:1");
validateBadConfig(null);
validateBadConfig("");
validateBadConfig(" mybroker : /mytopic : command : * : .* : file(/tmp/myfile.txt)");
validateBadConfig("mybroker:/mytopic:comand:ON:1");
}
@Test
public void canParseCommand() throws Exception {
ColorItem colorItem = new ColorItem("ColorItem");
DimmerItem dimmerItem = new DimmerItem("DimmerItem");
LocationItem locationItem = new LocationItem("LocationItem");
NumberItem numberItem = new NumberItem("NumberItem");
RollershutterItem rollershutterItem = new RollershutterItem("SetpointItem");
StringItem stringItem = new StringItem("StringItem");
SwitchItem switchItem = new SwitchItem("SwitchItem");
MqttMessageSubscriber subscriber = new MqttMessageSubscriber("mybroker:/mytopic:command:default");
assertEquals(StringType.valueOf("test"), subscriber.getCommand("test", stringItem.getAcceptedCommandTypes()));
assertEquals(StringType.valueOf("{\"person\"{\"name\":\"me\"}}"),
subscriber.getCommand("{\"person\"{\"name\":\"me\"}}", stringItem.getAcceptedCommandTypes()));
assertEquals(StringType.valueOf(""), subscriber.getCommand("", stringItem.getAcceptedCommandTypes()));
assertEquals(OnOffType.ON, subscriber.getCommand("ON", switchItem.getAcceptedCommandTypes()));
assertEquals(HSBType.valueOf("5,6,5"), subscriber.getCommand("5,6,5", colorItem.getAcceptedCommandTypes()));
assertEquals(DecimalType.ZERO,
subscriber.getCommand(DecimalType.ZERO.toString(), numberItem.getAcceptedCommandTypes()));
assertEquals(PercentType.HUNDRED,
subscriber.getCommand(PercentType.HUNDRED.toString(), dimmerItem.getAcceptedCommandTypes()));
assertEquals(PercentType.valueOf("80"), subscriber.getCommand(PercentType.valueOf("80").toString(),
rollershutterItem.getAcceptedCommandTypes()));
assertEquals(PointType.valueOf("53.3239919,-6.5258807"), subscriber.getCommand(
PointType.valueOf("53.3239919,-6.5258807").toString(), locationItem.getAcceptedCommandTypes()));
}
@Test
public void canParseState() throws Exception {
LocationItem locationItem = new LocationItem("LocationItem");
StringItem stringItem = new StringItem("StringItem");
SwitchItem switchItem = new SwitchItem("SwitchItem");
MqttMessageSubscriber subscriber = new MqttMessageSubscriber("mybroker:/mytopic:state:default");
assertEquals(OnOffType.ON, subscriber.getState("ON", switchItem.getAcceptedDataTypes()));
assertEquals(StringType.valueOf(""), subscriber.getState("", stringItem.getAcceptedDataTypes()));
assertEquals(StringType.valueOf("test"), subscriber.getState("test", stringItem.getAcceptedDataTypes()));
assertEquals(StringType.valueOf("{\"person\"{\"name\":\"me\"}}"),
subscriber.getState("{\"person\"{\"name\":\"me\"}}", stringItem.getAcceptedDataTypes()));
assertEquals(PointType.valueOf("53.3239919,-6.5258807"), subscriber
.getState(PointType.valueOf("53.3239919,-6.5258807").toString(), locationItem.getAcceptedDataTypes()));
}
}