Ejemplo n.º 1
0
    def test_020(self):
        c = MqttClient("cs:{seq}", connect=4, clean_session=0)
        c.subscribe("/cs/topic1/+", qos=2)
        c.disconnect()

        pub = MqttClient("pub:{seq}", connect=4)
        pubmsgs = {
            "/cs/topic1/q0": [0, env.gen_msg(42)],
            "/cs/topic1/q1": [1, env.gen_msg(42)],
            "/cs/topic1/q2": [2, env.gen_msg(42)],
        }

        for (topic, (qos, msg)) in pubmsgs.iteritems():
            ack = pub.publish(topic, msg, qos=qos)
            if qos == 2:
                pub.pubrel(ack.mid)
        pub.disconnect()

        msgs = env.db.lrange("queue:" + c.clientid(), 0, -1)
        for (topic, qos,
             msgid) in [msgs[i:i + 3] for i in range(0, len(msgs), 3)]:
            content = env.db.get("msg:" + msgid)

            origin = pubmsgs.get(topic, [-1, ""])
            #print topic, origin, qos, content
            if int(qos) != origin[0] or content != origin[1]:
                debug("{0}: {1}, {2}".format(origin, qos, content))
                return False

        return True
Ejemplo n.º 2
0
    def test_021(self):
        c = MqttClient("cs:{seq}", connect=4, clean_session=0)
        c.subscribe("/cs/topic1/+", qos=2)
        c.subscribe("/cs/topic1/q2", qos=1)
        c.disconnect()

        pub = MqttClient("pub:{seq}", connect=4)
        pubmsg = {
            'topic': "/cs/topic1/q2",
            'qos': 2,
            'payload': env.gen_msg(42)
        }
        ack = pub.publish(**pubmsg)
        pub.pubrel(ack.mid)
        pub.disconnect()

        msgs = env.db.lrange("queue:" + c.clientid(), 0, -1)
        if len(msgs) != 2 * 3:
            debug(msgs)
            return False

        for (topic, qos,
             msgid) in [msgs[i:i + 3] for i in range(0, len(msgs), 3)]:
            content = env.db.get("msg:" + msgid)
            if topic != pubmsg['topic'] or content != pubmsg['payload']:
                debug("{0}: {1}, {2}".format(topic, content, pubmsg))
                return False

            if int(qos) not in (1, 2):
                debug("{0}: qos {1}".format(topic, qos))
                return False

        return True
Ejemplo n.º 3
0
    def test_010(self):
        sub = MqttClient("sub:{seq}", connect=4)
        sub.subscribe('a/b', 2)

        pub = MqttClient("pub:{seq}", connect=4)
        msg = gen_msg()
        pub.publish('a/b', payload=msg, qos=2, read_response=False)

        pub.pubrec(pub.get_last_mid())

        # PUBREC
        pub.recv()

        pub.pubrec(pub.get_last_mid())
        pub.puback(pub.get_last_mid())
        pub.pubcomp(pub.get_last_mid())


        # finally send correct PUBREL message
        pub.pubrel(pub.get_last_mid())

        # PUBLISH received by subscriber
        evt = sub.recv()

        sub.pubrel(sub.get_last_mid())
        sub.puback(sub.get_last_mid())
        sub.pubcomp(sub.get_last_mid())

        return True
Ejemplo n.º 4
0
    def test_013(self):
        pub = MqttClient("conformity:{seq}", connect=4)
        sub = MqttClient("sub:{seq}", connect=4)
        sub.subscribe("/test/022/013/+", qos=2)

        pub.publish("/test/022/013/t1", 'hurry', retain=True, qos=1)
        msg = sub.recv()
        if not isinstance(msg, EventPublish) or \
                msg.msg.topic != '/test/022/013/t1' or \
                msg.msg.payload != 'hurry' or\
                msg.msg.qos != 1 or\
                msg.msg.retain:
            debug(msg)
            return False

        # same with empty payload
        pub.publish("/test/022/013/t2", 'up', retain=True, qos=2)
        pub.pubrel(pub.get_last_mid())

        msg = sub.recv()
        if not isinstance(msg, EventPublish) or \
                msg.msg.topic != '/test/022/013/t2' or \
                msg.msg.payload != "up" or\
                msg.msg.qos != 2 or\
                msg.msg.retain:
            debug(msg)
            return False

        return True
Ejemplo n.º 5
0
    def test_203(self):
        pub = MqttClient("conformity-pub:{seq}", connect=4)
        sub = MqttClient("conformity-sub:{seq}", connect=4)

        sub.subscribe("foo/bar", qos=2)
        pub.publish("foo/bar", "wootwoot", qos=2, read_response=False)

        # PUB PUBREC
        evt = pub.recv()
        pub.pubrel(pub.get_last_mid(), read_response=False)

        # subscr: receiving PUBLISH
        evt = sub.recv()
        sub.pubrec(evt.msg.mid, read_response=False)

        # subscr: receiving PUBREL
        evt = sub.recv()

        # sending PUBCOMP with wrong pktid
        sub.forge(
            NC.CMD_PUBCOMP,
            0,
            [('uint16', (evt.mid + 10) % 65535)  # wrong pktid
             ],
            send=True)

        evt = pub.recv()
        # publisher: PUBCOMP never received
        if evt is not None:
            debug(evt)
            return False

        pub.disconnect()
        sub.disconnect()
        return True
Ejemplo n.º 6
0
    def test_232(self):
        pub = MqttClient("conformity-pub:{seq}", connect=4)
        sub = MqttClient("conformity-sub:{seq}", connect=4)

        sub.subscribe("foo/bar", qos=2)
        pub.publish("foo/bar", "grrr", qos=2)  # receive PUBREC as response
        pub.pubrel(pub.get_last_mid(),
                   read_response=False)  # triggers message delivery

        evt = sub.recv()
        if not isinstance(evt, EventPublish) or evt.msg.payload != "grrr":
            debug(evt)
            return False

        ack = sub.unsubscribe("foo/bar")
        if not isinstance(ack, EventUnsuback):
            debug(ack)
            return False

        rel = sub.pubrec(evt.msg.mid)
        if not isinstance(rel, EventPubrel):
            debug(rel)
            return False

        sub.pubcomp(evt.msg.mid)
        comp = pub.recv()
        if not isinstance(comp, EventPubcomp):
            debug(comp)
            return False

        pub.disconnect()
        sub.disconnect()
        return True
Ejemplo n.º 7
0
    def test_013(self):
        pub = MqttClient("conformity:{seq}", connect=4)
        sub = MqttClient("sub:{seq}", connect=4)
        sub.subscribe("/test/022/013/+", qos=2)

        pub.publish("/test/022/013/t1", 'hurry', retain=True, qos=1)
        msg = sub.recv()
        if not isinstance(msg, EventPublish) or \
                msg.msg.topic != '/test/022/013/t1' or \
                msg.msg.payload != 'hurry' or\
                msg.msg.qos != 1 or\
                msg.msg.retain:
            debug(msg)
            return False

        # same with empty payload
        pub.publish("/test/022/013/t2", 'up', retain=True, qos=2)
        pub.pubrel(pub.get_last_mid())

        msg = sub.recv()
        if not isinstance(msg, EventPublish) or \
                msg.msg.topic != '/test/022/013/t2' or \
                msg.msg.payload != "up" or\
                msg.msg.qos != 2 or\
                msg.msg.retain:
            debug(msg)
            return False

        return True
Ejemplo n.º 8
0
    def test_005(self):
        sub = MqttClient("sub:{seq}", connect=4)
        sub.subscribe("foo/bar", qos=2)

        pub = MqttClient("pub:{seq}", connect=4)
        ack = pub.publish("foo/bar", env.gen_msg(42), qos=2)
        pub.pubrel(ack.mid)

        evt = sub.recv()
        if not isinstance(evt, EventPublish):
            debug(evt)
            defer.returnValue(False)
        sub.pubrec(evt.msg.mid)

        # PUBCOMP not send
        sub.destroy(); del sub

        if (yield supervisor.count('wave_msgworkers_sup')) != 1:
            debug("wrong msgworkers count")
            defer.returnValue(False)

        # msg worker is destroyed after 5 secs
        time.sleep(6)
        if (yield supervisor.count('wave_msgworkers_sup')) != 0:
            debug("wrong msgworkers count")
            defer.returnValue(False)

        pub.disconnect()
        defer.returnValue(True)
Ejemplo n.º 9
0
    def test_232(self):
        pub = MqttClient("conformity-pub:{seq}", connect=4)
        sub = MqttClient("conformity-sub:{seq}", connect=4)

        sub.subscribe("foo/bar", qos=2)
        pub.publish("foo/bar", "grrr", qos=2)                # receive PUBREC as response
        pub.pubrel(pub.get_last_mid(), read_response=False) # triggers message delivery

        evt = sub.recv()
        if not isinstance(evt, EventPublish) or evt.msg.payload != "grrr":
            debug(evt)
            return False

        ack = sub.unsubscribe("foo/bar")
        if not isinstance(ack, EventUnsuback):
            debug(ack)
            return False

        rel = sub.pubrec(evt.msg.mid)
        if not isinstance(rel, EventPubrel):
            debug(rel)
            return False

        sub.pubcomp(evt.msg.mid)
        comp = pub.recv()
        if not isinstance(comp, EventPubcomp):
            debug(comp)
            return False

        pub.disconnect(); sub.disconnect()
        return True
Ejemplo n.º 10
0
    def test_203(self):
        pub = MqttClient("conformity-pub:{seq}", connect=4)
        sub = MqttClient("conformity-sub:{seq}", connect=4)

        sub.subscribe("foo/bar", qos=2)
        pub.publish("foo/bar", "wootwoot", qos=2, read_response=False)

        # PUB PUBREC
        evt = pub.recv()
        pub.pubrel(pub.get_last_mid(), read_response=False)

        # subscr: receiving PUBLISH
        evt = sub.recv()
        sub.pubrec(evt.msg.mid, read_response=False)

        # subscr: receiving PUBREL
        evt = sub.recv()

        # sending PUBCOMP with wrong pktid
        sub.forge(NC.CMD_PUBCOMP, 0, [
            ('uint16', (evt.mid+10)%65535) # wrong pktid
        ], send=True)


        evt = pub.recv()
        # publisher: PUBCOMP never received
        if evt is not None:
            debug(evt)
            return False

        pub.disconnect(); sub.disconnect()
        return True
Ejemplo n.º 11
0
    def test_022(self):
        c = MqttClient("cs:{seq}", connect=4, clean_session=0)
        c.subscribe("/cs/topic1/+", qos=0)
        c.disconnect()

        pub = MqttClient("pub:{seq}", connect=4)
        pubmsg = {
            'topic': "/cs/topic1/q2",
            'qos': 2,
            'payload': env.gen_msg(42)
        }
        ack = pub.publish(**pubmsg)
        pub.pubrel(ack.mid)
        pub.disconnect()

        c2 = MqttClient(client_id=c.client_id,
                        connect=4,
                        clean_session=0,
                        read_connack=False)

        #NOTE: response order is not guaranteed
        acked = False
        pubevt = False
        while True:
            evt = c2.recv()
            #print evt
            if isinstance(evt, EventConnack):
                if evt.session_present != 1:
                    debug("{0}: session not present".format(evt))
                    return False

                acked = True
                continue

            if isinstance(evt, EventPublish) and\
                    evt.msg.topic   == pubmsg['topic'] and\
                    evt.msg.payload == pubmsg['payload'] and\
                    evt.msg.qos     == 0:
                pubevt = evt
                continue

            if evt != None:
                debug(evt)
                return False
            break

        c2.disconnect()
        return True
Ejemplo n.º 12
0
    def test_004(self):
        sub = MqttClient("sub:{seq}", connect=4)
        sub.subscribe('a/b', 2)

        pub = MqttClient("pub:{seq}", connect=4)
        msg = gen_msg()
        pub.publish('a/b', payload=msg, qos=2, read_response=False)

        msgid = pub.get_last_mid()

        # PUBREC
        e = pub.recv()
        # validating [MQTT-2.3.1-6]
        if not isinstance(e, EventPubrec) or e.mid != msgid:
            debug('failing event (PUBREC waited): {0}'.format(e))
            return False

        pub.pubrel(msgid, read_response=False)

        # subscriber ready to receive msg
        e = sub.recv()
        if not isinstance(e, EventPublish) or e.msg.qos != 2 or e.msg.payload != msg:
            debug('failing event (PUBLISH waited): {0}'.format(e))
            return False

        # subscriber: send PUBREC after having received PUBLISH message
        sub.pubrec(e.msg.mid, read_response=False)
        e2 = sub.recv()
        # validating [MQTT-2.3.1-6]
        if not isinstance(e2, EventPubrel) or e2.mid != e.msg.mid:
            debug('failing event (PUBREL waited): {0}'.format(e))
            return False

        sub.pubcomp(e.msg.mid)

        #
        pubcomp_evt = pub.recv()
        # validating [MQTT-2.3.1-6]
        if not isinstance(pubcomp_evt, EventPubcomp) or pubcomp_evt.mid != msgid:
            debug('failing event (PUBCOMP waited): {0}'.format(e))
            return False


        sub.unsubscribe('a/b')
        sub.disconnect(); pub.disconnect()

        return True
Ejemplo n.º 13
0
    def test_006(self):
        sub = MqttClient("sub:{seq}", connect=4)
        sub.subscribe('a/b', qos=1)

        pub = MqttClient("pub:{seq}", connect=4)
        msg = gen_msg()
        pub.publish('a/b', payload=msg, qos=1)
        pub.recv()

        e = sub.recv()
        if not isinstance(e, EventPublish) or \
                e.msg.payload != msg or \
                e.msg.qos     != 1:
            debug('failing event: {0}'.format(e))
            return False

        # send PUBREL (! ERROR: not a QOS 2 message)
        sub.pubrec(e.msg.mid)

        puback_evt = pub.recv()
        if not puback_evt is None:
            debug('failing event: {0}'.format(puback_evt))
            return False

        # unexpected PUBREL
        sub.pubrel(e.msg.mid)
        puback_evt = pub.recv()
        if not puback_evt is None:
            debug('failing event: {0}'.format(puback_evt))
            return False

        # unexpected PUBCOMP
        sub.pubcomp(e.msg.mid)
        puback_evt = pub.recv()
        if not puback_evt is None:
            debug('failing event: {0}'.format(puback_evt))
            return False

        sub.unsubscribe('a/b')

        sub.disconnect()
        pub.disconnect()
        return True
Ejemplo n.º 14
0
    def test_024(self):
        c = MqttClient("cs:{seq}", connect=4, clean_session=0)
        if c.connack().session_present != 0:
            debug("session present")
            return False
        c.subscribe("/cs/topic1/+", qos=0)
        c.disconnect()

        pub = MqttClient("pub:{seq}", connect=4)
        pubmsg = {
            'topic': "/cs/topic1/q2",
            'qos': 2,
            'payload': env.gen_msg(42)
        }
        ack = pub.publish(**pubmsg)
        pub.pubrel(ack.mid)

        # clean_session = 1 => offline subscriptions & published messages dropped
        c2 = MqttClient(client_id=c.client_id, connect=4, clean_session=1)
        if c2.connack().session_present != 0:
            debug("session present")
            return False

        evt = c2.recv()
        if evt is not None:
            debug(evt)
            return False

        pub.publish("/cs/topic1/qz", env.gen_msg(42), qos=0)
        pub.disconnect()

        evt = c2.recv()
        if evt is not None:
            debug(evt)
            return False

        c2.disconnect()
        return True
Ejemplo n.º 15
0
    def test_010(self):
        sub = MqttClient("sub:{seq}", connect=4, clean_session=0)
        sub.subscribe("foo/+", qos=2)
        sub.disconnect()

        if (yield supervisor.count('wave_msgworkers_sup')) != 0:
            debug("wrong msgworkers count")
            defer.returnValue(False)

        pub = MqttClient("pub:{seq}", connect=4)
        rec = pub.publish("foo/bar", env.gen_msg(42), qos=2)
        ack = pub.pubrel(rec.mid)
        print ack
        if not isinstance(ack, EventPubcomp):
            debug(ack)
            defer.returnValue(False)

        # msg is published to offline storage, msg worker should exit immediately
        if (yield supervisor.count('wave_msgworkers_sup')) != 0:
            debug("wrong msgworkers count")
            defer.returnValue(False)

        defer.returnValue(True)
Ejemplo n.º 16
0
    def test_023(self):
        c = MqttClient("cs:{seq}", connect=4, clean_session=0)
        if c.connack().session_present != 0:
            debug("session present")
            return False
        c.subscribe("/cs/topic1/+", qos=2)
        c.disconnect()

        pub = MqttClient("pub:{seq}", connect=4)
        pubmsgs = {
            "/cs/topic1/q0": [0, env.gen_msg(42)],
            "/cs/topic1/q1": [1, env.gen_msg(42)],
            "/cs/topic1/q2": [2, env.gen_msg(42)],
        }

        pubmsg = {
            'topic': "/cs/topic1/q2",
            'qos': 2,
            'payload': env.gen_msg(42)
        }
        for (topic, (qos, msg)) in pubmsgs.iteritems():
            ack = pub.publish(topic, msg, qos=qos)
            if qos == 2:
                pub.pubrel(ack.mid)
        pub.disconnect()

        c2 = MqttClient(client_id=c.client_id,
                        connect=4,
                        clean_session=0,
                        read_connack=False)

        #NOTE: response order is not guaranteed
        acked = False
        pubcnt = 0
        while True:
            evt = c2.recv()
            #print evt
            if isinstance(evt, EventConnack):
                if evt.session_present != 1:
                    debug("{0}: session not present".format(evt))
                    return False

                acked = True
                continue

            if isinstance(evt, EventPublish):
                orig = pubmsgs.get(evt.msg.topic, [None, None])
                if evt.msg.payload == orig[1] and evt.msg.qos == orig[0]:
                    pubcnt += 1
                    continue

            if evt != None:
                debug(evt)
                return False
            break

        if not acked:
            debug("not acked")
            return False
        if pubcnt != 3:
            debug("not all messages received: {0}".format(pubcnt))
            return False

        c2.disconnect()
        return True