Package org.openhab.binding.mqtt.internal

Source Code of org.openhab.binding.mqtt.internal.MqttMessagePublisherTest

/**
* Copyright (c) 2010-2014, openHAB.org and others.
*
* 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.assertEquals;
import static org.junit.Assert.fail;

import java.util.ArrayList;
import java.util.List;

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.types.DecimalType;
import org.openhab.core.library.types.HSBType;
import org.openhab.core.library.types.OnOffType;
import org.openhab.core.library.types.OpenClosedType;
import org.openhab.core.library.types.PercentType;
import org.openhab.core.library.types.StringType;
import org.openhab.core.library.types.UpDownType;
import org.openhab.core.transform.TransformationService;
import org.openhab.core.types.Command;
import org.openhab.core.types.State;
import org.openhab.io.transport.mqtt.MqttSenderChannel;
import org.openhab.model.item.binding.BindingConfigParseException;

/**
* @author Davy Vanherbergen
* @since 1.3.0
*/
@RunWith(MockitoJUnitRunner.class)
public class MqttMessagePublisherTest {

  @Mock
  private TransformationService transformer;

  private void validateConfig(String configString, String broker,
      String topic, MessageType type, String trigger,
      String transformString) throws BindingConfigParseException {

    MqttMessagePublisher publisher = new MqttMessagePublisher(configString);
    if (publisher.getTransformationServiceName() != null) {
      publisher.setTransformationService(transformer);
    }

    assertEquals(broker, publisher.getBroker());
    assertEquals(topic, publisher.getTopic());
    assertEquals(type, publisher.getMessageType());
    assertEquals(trigger, publisher.getTrigger());
    assertEquals(transformString, publisher.getTransformationRule());

  }

  private void validateBadConfig(String configString) {
    try {
      new MqttMessagePublisher(configString);
      fail("Missing exception..");
    } catch (BindingConfigParseException e) {
      return;
    }
  }

  @Test
  public void canParseValidConfigurations()
      throws BindingConfigParseException {

    validateConfig("mybroker:/mytopic:command:ON:1", "mybroker",
        "/mytopic", MessageType.COMMAND, "ON", "1");

    validateConfig("mybroker1:/a/long/topic/goes/here:command:ON:default",
        "mybroker1", "/a/long/topic/goes/here", MessageType.COMMAND,
        "ON", "default");

    validateConfig(
        "mybroker1:/wildcard/not/topic:command:ON:xslt(myfile.xslt)",
        "mybroker1", "/wildcard/not/topic", MessageType.COMMAND, "ON",
        "xslt(myfile.xslt)");

    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)");

    String jsonMessage = "{\"message\"\\: \"command\",\"origin\"\\: \"openhab\",\"data\"\\: {\"lamp1\"\\: \"ON\"}} ";
    String jsonMessageNoEsc = "{\"message\": \"command\",\"origin\": \"openhab\",\"data\": {\"lamp1\": \"ON\"}}";
    validateConfig("testbroker:/mytopic:state:OFF:" + jsonMessage + "",
        "testbroker", "/mytopic", MessageType.STATE, "OFF",
        jsonMessageNoEsc);

  }

  @Test
  public void canDetectInvalidConfigurations() {
    validateBadConfig(":/mytopic:command:ON:1");
    validateBadConfig("mybroker::command:ON:1:99");
    validateBadConfig("mybroker:/mytopic:command:ON:");
    validateBadConfig("mybroker:command:ON:1");
    validateBadConfig("mybroker:/mytopic:command2:ON:1");
    validateBadConfig("mybroker:/test:/mytopic:command:ON:1");
    validateBadConfig(null);
    validateBadConfig("");
    validateBadConfig(" mybroker ; /mytopic : command : * : file(/tmp/myfile.txt)");

  }

  private void testStateSupport(String configString, State state,
      boolean expectedStateSupport) throws BindingConfigParseException {
    MqttMessagePublisher publisher = new MqttMessagePublisher(configString);
    assertEquals(expectedStateSupport, publisher.supportsState(state));
  }

  private void testCommandSupport(String configString, Command command,
      boolean expectedStateSupport) throws BindingConfigParseException {
    MqttMessagePublisher publisher = new MqttMessagePublisher(configString);
    assertEquals(expectedStateSupport, publisher.supportsCommand(command));
  }

  @Test
  public void canDetectSupportForStates() throws BindingConfigParseException {
    testStateSupport("broker:/topic:state:OFF:0", OnOffType.OFF, true);
    testStateSupport("broker:/topic:state:OFF:0", OnOffType.ON, false);
    testStateSupport("broker:/topic:state:*:0", OnOffType.OFF, true);
    testStateSupport("broker:/topic:state:off:0", OnOffType.OFF, true);
    testStateSupport("broker:/topic:stAte:100:0",
        DecimalType.valueOf("100"), true);
    testStateSupport("broker:/topic:state:100:0",
        DecimalType.valueOf("99"), false);
    testStateSupport("broker:/topic:state:20:0", PercentType.HUNDRED, false);
    testStateSupport("broker:/topic:state:100:0", PercentType.HUNDRED, true);
    testStateSupport("broker:/topic:state:100:0", PercentType.ZERO, false);
    testStateSupport("broker:/topic:state:0:0", PercentType.ZERO, true);
    testStateSupport("broker:/topic:state:CLOSED:0", OpenClosedType.CLOSED,
        true);
    testStateSupport("broker:/topic:state:OPEN:0", OpenClosedType.CLOSED,
        false);
    testStateSupport("broker:/topic:command:*:0", OpenClosedType.CLOSED,
        false);
    testStateSupport("broker:/topic:command:CLOSED:0",
        OpenClosedType.CLOSED, false);
    testStateSupport("broker:/topic:state:240.0,100.0,100.0:0",
        HSBType.BLUE, true);
  }

  @Test
  public void canDetectSupportForCommands()
      throws BindingConfigParseException {
    testCommandSupport("broker:/topic:command:OFF:0", OnOffType.OFF, true);
    testCommandSupport("broker:/topic:command:OFF:0", OnOffType.ON, false);
    testCommandSupport("broker:/topic:command:*:0", OnOffType.OFF, true);
    testCommandSupport("broker:/topic:command:off:0", OnOffType.OFF, true);
    testCommandSupport("broker:/topic:commAnd:100:0",
        DecimalType.valueOf("100"), true);
    testCommandSupport("broker:/topic:command:100:0",
        DecimalType.valueOf("99"), false);
    testCommandSupport("broker:/topic:command:20:0", PercentType.HUNDRED,
        false);
    testCommandSupport("broker:/topic:command:100:0", PercentType.HUNDRED,
        true);
    testCommandSupport("broker:/topic:command:100:0", PercentType.ZERO,
        false);
    testCommandSupport("broker:/topic:command:5:0", PercentType.ZERO, false);
    testCommandSupport("broker:/topic:command:CLOSED:0",
        OpenClosedType.CLOSED, true);
    testCommandSupport("broker:/topic:command:OPEN:0",
        OpenClosedType.CLOSED, false);
    testCommandSupport("broker:/topic:state:*:0", OpenClosedType.CLOSED,
        false);
    testCommandSupport("broker:/topic:state:CLOSED:0",
        OpenClosedType.CLOSED, false);
    System.out.println(HSBType.BLUE);
    testCommandSupport("broker:/topic:command:240.0,100.0,100.0:0",
        HSBType.BLUE, true);
  }

  @Test
  public void canCreateMessageFromCommandOrStateWithStaticTransformation()
      throws Exception {

    assertEquals("test", getPublishedMessage("broker:/topic:command:*:test", "dummy"));
    assertEquals("test", getPublishedMessage("broker:/topic:state:*:test", "dummy"));

    assertEquals("eisen",
      getPublishedMessage("broker:/topic:state:*:eisen", OnOffType.ON.toString()));
    assertEquals("funk",
      getPublishedMessage("broker:/topic:state:*:funk", OnOffType.ON.toString()));

    assertEquals(
        "{\"person\"{\"name\":\"me\"}}",
        getPublishedMessage(
            "broker:/topic:state:*:{\"person\"{\"name\"\\:\"me\"}}",
            OnOffType.ON.toString()));
    assertEquals(
        "ON",
        getPublishedMessage("broker:/topic:command:*:default",
            OnOffType.ON.toString()));
    assertEquals(
        "OFF",
        getPublishedMessage("broker:/topic:command:*:default",
            OnOffType.OFF.toString()));
    assertEquals(
        "UP",
        getPublishedMessage("broker:/topic:command:*:default",
            UpDownType.UP.toString()));
    assertEquals(
        "100",
        getPublishedMessage("broker:/topic:command:*:default",
            PercentType.HUNDRED.toString()));
    assertEquals(
        "80,81,82",
        getPublishedMessage("broker:/topic:command:*:default", HSBType
            .valueOf("80,81,82").toString()));
    assertEquals(
        "0",
        getPublishedMessage("broker:/topic:command:*:default",
            DecimalType.ZERO.toString()));
    assertEquals(
        "ahah",
        getPublishedMessage("broker:/topic:command:*:default",
            StringType.valueOf("ahah").toString()));
  }

  private String getPublishedMessage(String configString, String message) throws BindingConfigParseException {

    final List<String> sentMessage = new ArrayList<String>();
    MqttMessagePublisher publisher = new MqttMessagePublisher(configString);

    publisher.setSenderChannel(new MqttSenderChannel() {
      @Override
      public void publish(String topic, byte[] message) {
        sentMessage.add(new String(message));
      }
    });
    publisher.publish(publisher.getTopic(), message.getBytes());
    return sentMessage.get(0);
  }
 
}
TOP

Related Classes of org.openhab.binding.mqtt.internal.MqttMessagePublisherTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.