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