/* * Copyright 2014 dc-square GmbH * * 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 com.hivemq.spi.topic; import com.hivemq.spi.message.QoS; import com.hivemq.spi.topic.MqttTopicPermission.ACTIVITY; import com.hivemq.spi.topic.MqttTopicPermission.QOS; import org.apache.commons.lang3.StringUtils; import org.junit.Test; import static com.hivemq.spi.topic.MqttTopicPermission.RETAIN; import static com.hivemq.spi.topic.MqttTopicPermission.TYPE; import static org.junit.Assert.*; /** * @author Dominik Obermaier */ public class MqttTopicPermissionTest { @Test public void testQualityOfService() throws Exception { final MqttTopicPermission all = new MqttTopicPermission("testtopic", TYPE.ALLOW, QOS.ALL); assertTrue(all.implies(all)); final MqttTopicPermission one = new MqttTopicPermission("testtopic", TYPE.ALLOW, QOS.ONE); assertTrue(one.implies(one)); assertTrue(all.implies(one)); assertFalse(one.implies(all)); final MqttTopicPermission two = new MqttTopicPermission("testtopic", TYPE.ALLOW, QOS.TWO); assertTrue(two.implies(two)); assertTrue(all.implies(two)); assertFalse(two.implies(all)); assertFalse(two.implies(one)); assertFalse(one.implies(two)); final MqttTopicPermission zero = new MqttTopicPermission("testtopic", TYPE.ALLOW, QOS.ZERO); assertTrue(zero.implies(zero)); assertTrue(all.implies(zero)); assertFalse(zero.implies(all)); assertFalse(one.implies(zero)); assertFalse(zero.implies(one)); assertFalse(two.implies(zero)); assertFalse(zero.implies(two)); final MqttTopicPermission one_two = new MqttTopicPermission("testtopic", TYPE.ALLOW, QOS.ONE_TWO); assertTrue(one_two.implies(one_two)); assertTrue(all.implies(one_two)); assertFalse(one_two.implies(all)); assertTrue(one_two.implies(one)); assertFalse(one.implies(one_two)); assertTrue(one_two.implies(two)); assertFalse(two.implies(one_two)); assertFalse(one_two.implies(zero)); assertFalse(zero.implies(one_two)); final MqttTopicPermission zero_one = new MqttTopicPermission("testtopic", TYPE.ALLOW, QOS.ZERO_ONE); assertTrue(zero_one.implies(zero_one)); assertTrue(all.implies(zero_one)); assertFalse(zero_one.implies(all)); assertTrue(zero_one.implies(one)); assertFalse(one.implies(zero_one)); assertFalse(zero_one.implies(two)); assertFalse(two.implies(zero_one)); assertTrue(zero_one.implies(zero)); assertFalse(zero.implies(zero_one)); assertFalse(zero_one.implies(one_two)); assertFalse(one_two.implies(zero_one)); final MqttTopicPermission zero_two = new MqttTopicPermission("testtopic", TYPE.ALLOW, QOS.ZERO_TWO); assertTrue(zero_two.implies(zero_two)); assertFalse(zero_two.implies(one)); assertFalse(one.implies(zero_two)); assertTrue(zero_two.implies(two)); assertFalse(two.implies(zero_two)); assertTrue(zero_two.implies(zero)); assertFalse(zero.implies(zero_two)); assertFalse(zero_two.implies(zero_one)); assertFalse(zero_one.implies(zero_two)); assertFalse(zero_two.implies(one_two)); assertFalse(one_two.implies(zero_two)); } @Test public void testAllowedActivity() { final MqttTopicPermission p1 = new MqttTopicPermission("testtopic", TYPE.ALLOW, ACTIVITY.ALL); assertTrue(p1.implies(p1)); final MqttTopicPermission p2 = new MqttTopicPermission("testtopic", TYPE.ALLOW, ACTIVITY.ALL); assertTrue(p2.implies(p2)); assertTrue(p1.implies(p2)); assertTrue(p2.implies(p1)); final MqttTopicPermission p3 = new MqttTopicPermission("testtopic", TYPE.ALLOW, ACTIVITY.PUBLISH); assertTrue(p3.implies(p3)); assertTrue(p1.implies(p3)); assertFalse(p3.implies(p1)); final MqttTopicPermission p4 = new MqttTopicPermission("testtopic", TYPE.ALLOW, ACTIVITY.SUBSCRIBE); assertTrue(p4.implies(p4)); assertTrue(p1.implies(p4)); assertFalse(p4.implies(p1)); assertFalse(p4.implies(p3)); assertFalse(p3.implies(p4)); } @Test public void testTopicImplicity() { final MqttTopicPermission t1 = new MqttTopicPermission("testtopic", TYPE.ALLOW); assertTrue(t1.implies(t1)); //Has nothing to do with t1 final MqttTopicPermission t2 = new MqttTopicPermission("testtopic1", TYPE.ALLOW); assertTrue(t2.implies(t2)); assertFalse(t2.implies(t1)); assertFalse(t1.implies(t2)); //test subtopic without wildcards final MqttTopicPermission t3 = new MqttTopicPermission("testtopic/subtopic", TYPE.ALLOW); assertTrue(t3.implies(t3)); assertFalse(t1.implies(t3)); assertFalse(t3.implies(t1)); assertFalse(t2.implies(t3)); assertFalse(t3.implies(t2)); //Test wildcard final MqttTopicPermission t4 = new MqttTopicPermission("testtopic/#", TYPE.ALLOW); assertTrue(t4.implies(t4)); assertTrue(t4.implies(t1)); assertFalse(t1.implies(t4)); assertTrue(t4.implies(t3)); assertFalse(t3.implies(t4)); final MqttTopicPermission t5 = new MqttTopicPermission("testtopic/+", TYPE.ALLOW); assertTrue(t5.implies(t5)); assertFalse(t5.implies(t1)); assertFalse(t1.implies(t5)); assertTrue(t5.implies(t3)); assertFalse(t3.implies(t5)); final MqttTopicPermission t6 = new MqttTopicPermission("testtopic/subtopic/again", TYPE.ALLOW); assertFalse(t5.implies(t6)); assertFalse(t6.implies(t5)); assertTrue(t4.implies(t6)); assertFalse(t6.implies(t4)); final MqttTopicPermission t7 = new MqttTopicPermission("#", TYPE.ALLOW); assertTrue(t7.implies(t7)); assertTrue(t7.implies(t6)); assertFalse(t6.implies(t7)); assertTrue(t7.implies(t5)); assertFalse(t5.implies(t7)); assertTrue(t7.implies(t4)); assertFalse(t4.implies(t7)); } @Test public void test_implies_retained() throws Exception { final MqttTopicPermission test1 = new MqttTopicPermission("test1", TYPE.ALLOW, QOS.ALL, ACTIVITY.PUBLISH, RETAIN.NOT_RETAINED); final MqttTopicPermission test2 = new MqttTopicPermission("test2", TYPE.ALLOW, QOS.ALL, ACTIVITY.PUBLISH, RETAIN.RETAINED); final MqttTopicPermission test3 = new MqttTopicPermission("test3", TYPE.ALLOW, QOS.ALL, ACTIVITY.PUBLISH, RETAIN.ALL); final MqttTopicPermission test4 = new MqttTopicPermission("test4", TYPE.ALLOW, QOS.ALL, ACTIVITY.PUBLISH, null); assertTrue(test1.implies("test1", split("test1"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, RETAIN.NOT_RETAINED)); assertFalse(test1.implies("test1", split("test1"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, RETAIN.RETAINED)); assertFalse(test2.implies("test2", split("test2"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, RETAIN.NOT_RETAINED)); assertTrue(test2.implies("test2", split("test2"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, RETAIN.RETAINED)); assertTrue(test3.implies("test3", split("test3"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, RETAIN.NOT_RETAINED)); assertTrue(test3.implies("test3", split("test4"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, RETAIN.RETAINED)); assertFalse(test4.implies("test4", split("test4"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, RETAIN.NOT_RETAINED)); assertFalse(test4.implies("test4", split("test4"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, RETAIN.RETAINED)); assertFalse(test3.implies("test3", split("test3"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, null)); assertFalse(test3.implies("test3", split("test3"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, null)); } @Test public void test_implies_retained_bool() throws Exception { final MqttTopicPermission test1 = new MqttTopicPermission("test1", TYPE.ALLOW, QOS.ALL, ACTIVITY.PUBLISH, RETAIN.NOT_RETAINED); final MqttTopicPermission test2 = new MqttTopicPermission("test2", TYPE.ALLOW, QOS.ALL, ACTIVITY.PUBLISH, RETAIN.RETAINED); final MqttTopicPermission test3 = new MqttTopicPermission("test3", TYPE.ALLOW, QOS.ALL, ACTIVITY.PUBLISH, RETAIN.ALL); final MqttTopicPermission test4 = new MqttTopicPermission("test4", TYPE.ALLOW, QOS.ALL, ACTIVITY.PUBLISH, null); assertTrue(test1.implies("test1", split("test1"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, false)); assertFalse(test1.implies("test1", split("test1"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, true)); assertFalse(test2.implies("test2", split("test2"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, false)); assertTrue(test2.implies("test2", split("test2"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, true)); assertTrue(test3.implies("test3", split("test3"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, false)); assertTrue(test3.implies("test3", split("test4"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, true)); assertFalse(test4.implies("test4", split("test4"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, false)); assertFalse(test4.implies("test4", split("test4"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, true)); assertFalse(test3.implies("test3", split("test3"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, null)); assertFalse(test3.implies("test3", split("test3"), QoS.EXACTLY_ONCE, ACTIVITY.PUBLISH, null)); } @Test public void test_no_mqtt_topic_permission() throws Exception { final MqttTopicPermission mqttTopicPermission = new MqttTopicPermission("test", TYPE.ALLOW); assertFalse(mqttTopicPermission.implies(null)); } @Test public void test_allowed_qos_at_most_once() throws Exception { assertEquals(QOS.from(QoS.AT_MOST_ONCE), QOS.ZERO); } @Test public void test_allowed_qos_exactly_once() throws Exception { assertEquals(QOS.from(QoS.EXACTLY_ONCE), QOS.TWO); } @Test public void test_allowed_qos_at_least_once() throws Exception { assertEquals(QOS.from(QoS.AT_LEAST_ONCE), QOS.ONE); } @Test public void test_implies_params_null() throws Exception { final MqttTopicPermission t1 = new MqttTopicPermission("#", TYPE.ALLOW, QOS.ALL, ACTIVITY.ALL); assertFalse(t1.implies(null, new String[1], QoS.AT_LEAST_ONCE, ACTIVITY.PUBLISH)); //hack for Qos to be null assertFalse(t1.implies("test", new String[1], QoS.valueOf(4), ACTIVITY.PUBLISH)); assertFalse(t1.implies("test", new String[1], QoS.AT_LEAST_ONCE, null)); } @Test public void test_constructors() throws Exception { final MqttTopicPermission test = new MqttTopicPermission("test", TYPE.ALLOW); assertEquals("test", test.getTopic()); assertEquals(TYPE.ALLOW, test.getType()); assertEquals(QOS.ALL, test.getQos()); assertEquals(ACTIVITY.ALL, test.getActivity()); assertEquals(RETAIN.ALL, test.getPublishRetain()); final MqttTopicPermission test2 = new MqttTopicPermission("test2", TYPE.DENY, ACTIVITY.PUBLISH); assertEquals("test2", test2.getTopic()); assertEquals(TYPE.DENY, test2.getType()); assertEquals(QOS.ALL, test2.getQos()); assertEquals(ACTIVITY.PUBLISH, test2.getActivity()); assertEquals(RETAIN.ALL, test2.getPublishRetain()); final MqttTopicPermission test3 = new MqttTopicPermission("test3", TYPE.ALLOW, QOS.ONE, ACTIVITY.SUBSCRIBE); assertEquals("test3", test3.getTopic()); assertEquals(TYPE.ALLOW, test3.getType()); assertEquals(QOS.ONE, test3.getQos()); assertEquals(ACTIVITY.SUBSCRIBE, test3.getActivity()); assertEquals(RETAIN.ALL, test3.getPublishRetain()); final MqttTopicPermission test4 = new MqttTopicPermission("test4", TYPE.DENY, QOS.ZERO_ONE, ACTIVITY.SUBSCRIBE, RETAIN.RETAINED); assertEquals("test4", test4.getTopic()); assertEquals(TYPE.DENY, test4.getType()); assertEquals(QOS.ZERO_ONE, test4.getQos()); assertEquals(ACTIVITY.SUBSCRIBE, test4.getActivity()); assertEquals(RETAIN.RETAINED, test4.getPublishRetain()); } private String[] split(final String topic) { return StringUtils.splitPreserveAllTokens(topic, "/"); } }