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_231(self): pub = MqttClient("conformity-pub:{seq}", connect=4) sub = MqttClient("conformity-sub:{seq}", connect=4) sub.subscribe("foo/bar", qos=1) pub.publish("foo/bar", "grrr", qos=1) 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 sub.puback(evt.msg.mid) ack2 = pub.recv() if not isinstance(ack2, EventPuback): debug(ack2) 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_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_231(self): pub = MqttClient("conformity-pub:{seq}", connect=4) sub = MqttClient("conformity-sub:{seq}", connect=4) sub.subscribe("foo/bar", qos=1) pub.publish("foo/bar", "grrr", qos=1) 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 sub.puback(evt.msg.mid) ack2 = pub.recv() if not isinstance(ack2, EventPuback): debug(ack2) 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_202(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() # sending PUBREL with wrong pktid pub.forge(NC.CMD_PUBREL, 2, [ ('uint16', (evt.mid+10)%65535) # wrong pktid ], send=True) # subscriber: PUBLISH never received evt = sub.recv() if evt is not None: debug(evt) return False evt = pub.recv() # publisher: PUBCOMP never received if evt is not None: debug(evt) return False pub.disconnect(); sub.disconnect() return True
def test_003(self): sub = MqttClient("sub:{seq}", connect=4) sub.subscribe('a/b', qos=2) pub = MqttClient("pub:{seq}", connect=4) msg = gen_msg() pub.publish('a/b', payload=msg, qos=1) e = sub.recv() if not isinstance(e, EventPublish) or \ e.msg.payload != msg or \ e.msg.qos != 1: debug('received event (supposely publish): {0}'.format(e)) return False # send PUBACK sub.puback(e.msg.mid) e2 = pub.recv() if not isinstance(e2, EventPuback) or \ e2.mid != pub.get_last_mid(): debug('received event (supposely puback): {0}'.format(e2)) return False sub.unsubscribe('a/b') sub.disconnect(); pub.disconnect() return True
def test_003(self): monitor = MqttClient("monitor:{seq}", connect=4) # NOTE: '/' prefix skips $ messages # TODO: remove it when '$' filter will be impl. monitor.subscribe("/#", qos=0) client = MqttClient("rabbit:{seq}", keepalive=2) will = {'topic': '/node/disconnect', 'message': client.clientid()} client.connect(version=4, will=will) time.sleep(1) client.send_pingreq() evt = monitor.recv() if monitor.recv() != None: debug(evt) return False time.sleep(4) evt = monitor.recv() if not isinstance(evt, EventPublish) or evt.msg.topic != will['topic'] or \ evt.msg.payload != will['message']: debug(evt) return False monitor.disconnect() return True
def test_200(self): pub = MqttClient("conformity-pub:{seq}", connect=4) sub = MqttClient("conformity-sub:{seq}", connect=4) sub.subscribe("foo/bar", qos=1) pub.publish("foo/bar", "wootwoot", qos=1) # reading PUBLISH evt = sub.recv() # sending PUBACK with wrong pktid sub.forge( NC.CMD_PUBACK, 0, [('uint16', (evt.msg.mid + 10) % 65535) # wrong pktid ], send=True) evt = pub.recv() # PUBACK from server is never received if evt is not None: debug(evt) return False pub.disconnect() sub.disconnect() return True
def test_012(self): pub = MqttClient("conformity:{seq}", connect=4) sub = MqttClient("sub:{seq}", connect=4) sub.subscribe("/retain/+", qos=0) pub.publish("/retain/delivered", 'waze', retain=True) msg = sub.recv() if not isinstance(msg, EventPublish) or \ msg.msg.topic != '/retain/delivered' or \ msg.msg.payload != 'waze' or\ msg.msg.retain: debug(msg) return False # same with empty payload pub.publish("/retain/empty", '', retain=True) msg = sub.recv() if not isinstance(msg, EventPublish) or \ msg.msg.topic != '/retain/empty' or \ msg.msg.payload != None or\ msg.msg.retain: debug(msg) 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_003(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 PUBACK sub.puback(e.msg.mid) puback_evt = pub.recv() # PUBACK mid == PUBLISH mid # validating [MQTT-2.3.1-6] if not isinstance(puback_evt, EventPuback) or \ puback_evt.mid != pub.get_last_mid(): debug('failing event: {0}'.format(puback_evt)) return False sub.unsubscribe('a/b') sub.disconnect(); pub.disconnect() return True
def test_012(self): pub = MqttClient("conformity:{seq}", connect=4) sub = MqttClient("sub:{seq}", connect=4) sub.subscribe("/retain/+", qos=0) pub.publish("/retain/delivered", 'waze', retain=True) msg = sub.recv() if not isinstance(msg, EventPublish) or \ msg.msg.topic != '/retain/delivered' or \ msg.msg.payload != 'waze' or\ msg.msg.retain: debug(msg) return False # same with empty payload pub.publish("/retain/empty", '', retain=True) msg = sub.recv() if not isinstance(msg, EventPublish) or \ msg.msg.topic != '/retain/empty' or \ msg.msg.payload != None or\ msg.msg.retain: debug(msg) 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_020(self): metrics = [ '$SYS/broker/uptime', '$SYS/broker/version', '$SYS/broker/clients/total', '$SYS/broker/clients/connected', '$SYS/broker/clients/disconnected', '$SYS/broker/messages/sent', '$SYS/broker/messages/received', '$SYS/broker/messages/inflight', '$SYS/broker/messages/stored', '$SYS/broker/publish/messages/sent', '$SYS/broker/publish/messages/sent/qos 0', '$SYS/broker/publish/messages/sent/qos 1', '$SYS/broker/publish/messages/sent/qos 2', '$SYS/broker/publish/messages/received', '$SYS/broker/publish/messages/received/qos 0', '$SYS/broker/publish/messages/received/qos 1', '$SYS/broker/publish/messages/received/qos 2', '$SYS/broker/retained messages/count', '$SYS/broker/subscriptions/count', ] c = MqttClient("metrics:{seq}", connect=4) c.subscribe('$SYS/#', qos=0) while True: evt = c.recv() if evt is not None and isinstance(evt, EventPublish): break stats = {evt.msg.topic: evt.msg.payload} while True: evt = c.recv() if evt is None: break if isinstance(evt, EventPingResp): continue stats[evt.msg.topic] = evt.msg.payload #pprint(stats) for topic in metrics: if topic not in stats: debug("{0} metric not in $SYS".format(topic)) return False del stats[topic] if len(stats) > 0: debug("extra $SYS metrics: {0}".format(stats)) c.disconnect() return True
def test_021(self): retain = MqttClient("retain:{seq}", connect=4) sub = MqttClient("subscriber:{seq}", connect=4) topic = "/woot/wo/ot" msg = "expression of simplistic ecstasy" retain.publish(topic, msg, retain=True) # wildcard match topic sub.subscribe("/woot/+/ot", qos=0, read_response=False) acked = False pubevt = None while True: evt = sub.recv() if isinstance(evt, EventSuback): acked = True continue # receiving retained message if isinstance(evt, EventPublish) and\ evt.msg.topic == topic and\ evt.msg.payload == msg and\ evt.msg.retain: pubevt = evt continue break if not acked: debug("not acked") return False if pubevt is None: debug("message not received") return False # MUST NOT match topic = "/scri/b/b/le" msg = "hundrerd dollar bill" retain.publish(topic, msg, retain=True) sub.subscribe("/scri/*/le", qos=0) evt = sub.recv() if evt is not None: debug(evt) return False return True
def test_030(self): retain = MqttClient("retain:{seq}", connect=4) sub = MqttClient("subscr:{seq}", connect=4) msg = {'topic': "baby/ma/ma", 'payload': "The mother of your child(ren)", 'retain': True, 'qos': 1} retain.publish(**msg) sub.subscribe("baby/ma/+", qos=1, read_response=False) pubevt = None while True: evt = sub.recv() if isinstance(evt, EventSuback): continue if isinstance(evt, EventPublish) and\ evt.msg.qos == 1 and\ evt.msg.retain and\ evt.msg.topic == msg['topic'] and\ evt.msg.payload == msg['payload']: pubevt = evt; continue break if pubevt is None: debug("message not received") return False sub.puback(mid=pubevt.msg.mid) retain.disconnect(); sub.disconnect() return True
def test_022(self): retain = MqttClient("retain:{seq}", connect=4) sub = MqttClient("subscriber:{seq}", connect=4) topic = "/woot/wo/ot"; msg = "expression of simplistic ecstasy" retain.publish(topic, msg, retain=True) # wildcard match topic sub.subscribe("/woot/#", qos=0, read_response=False) acked = False; pubevt = None while True: evt = sub.recv() if isinstance(evt, EventSuback): acked = True; continue # receiving retained message if isinstance(evt, EventPublish) and\ evt.msg.topic == topic and\ evt.msg.payload == msg and\ evt.msg.retain: pubevt = evt; continue break if not acked: debug("not acked") return False if pubevt is None: debug("message not received") return False retain.disconnect(); sub.disconnect() return True
def test_251(self): tfs = [ ("+", True), ("/+", True), ("+/", True), ("+/foo", True), ("/foo/+", True), ("/foo/+/", True), ("/foo/+/bar", True), ("+/foo/bar", True), ("foo+", False), ("foo+/bar", False), ("+foo/bar", False), ("foo/+bar", False), # ~ ("++", False), ("foo/++/bar", False), ] for (tf, isvalid) in tfs: sub = MqttClient("conformity:{seq}", connect=4) sub.subscribe(tf, qos=0, read_response=False) ack = sub.recv() if (isvalid and not isinstance(ack, EventSuback)) or \ (not isvalid and (ack is not None or sub.conn_is_alive())): debug("{0}: {1} ({2})".format(tf, ack, sub.conn_is_alive())) return False sub.disconnect() return True
def test_012(self): monitor = MqttClient("monitor:{seq}", connect=4) # NOTE: '/' prefix skips $ messages # TODO: remove it when '$' filter will be impl. monitor.subscribe("/#", qos=2) client = MqttClient("rabbit:{seq}") # no keepalive will = { 'topic': '/node/disconnect', 'message': client.clientid(), 'retain': True } client.connect(version=4, will=will) client.socket_close() evt = monitor.recv() if not isinstance(evt, EventPublish) or evt.msg.topic != will['topic'] or \ evt.msg.payload != will['message'] or \ evt.msg.qos != 0: debug(evt) return False if not evt.msg.retain: debug("evt remain flag set") return False monitor.disconnect() return True
def test_251(self): tfs = [ ("+" , True), ("/+" , True), ("+/" , True), ("+/foo" , True), ("/foo/+" , True), ("/foo/+/" , True), ("/foo/+/bar", True), ("+/foo/bar" , True), ("foo+" , False), ("foo+/bar" , False), ("+foo/bar" , False), ("foo/+bar" , False), # ~ ("++" , False), ("foo/++/bar", False), ] for (tf, isvalid) in tfs: sub = MqttClient("conformity:{seq}", connect=4) sub.subscribe(tf, qos=0, read_response=False) ack = sub.recv() if (isvalid and not isinstance(ack, EventSuback)) or \ (not isvalid and (ack is not None or sub.conn_is_alive())): debug("{0}: {1} ({2})".format(tf, ack, sub.conn_is_alive())) return False sub.disconnect() return True
def test_020(self): retain = MqttClient("retain:{seq}", connect=4) sub = MqttClient("subscriber:{seq}", connect=4) topic = "/woot/wo/ot" msg = "expression of simplistic ecstasy" retain.publish(topic, msg, retain=True) # exact match topic sub.subscribe("/woot/wo/ot", qos=0, read_response=False) while True: evt = sub.recv() if isinstance(evt, EventSuback): acked = True continue # receiving retained message if isinstance(evt, EventPublish) and\ evt.msg.topic == topic and\ evt.msg.payload == msg and\ evt.msg.retain: pubevt = evt continue break if not acked: debug("not acked") return False if pubevt is None: debug("message not received") return False return True
def test_008(self): client = MqttClient("rabbit:{seq}", raw_connect=True) client.forge(NC.CMD_CONNECT, 0, [ ('string', 'MQTT'), ('byte' , 4), # protocol level ('byte' , 28), # will=1, will-qos=3 ('uint16', 60), # keepalive ], send=True) if client.conn_is_alive(): debug("connection still alive") return False client = MqttClient("rabbit:{seq}", raw_connect=True) client.forge(NC.CMD_CONNECT, 0, [ ('string', 'MQTT'), ('byte' , 4), # protocol level ('byte' , 12), # will=1, will-qos=1 ('uint16', 60), # keepalive ('string', client._c.client_id), # clientid ('string', '/foo/bar'),# will topic ('uint16', 0), # will payload len ('bytes' , ''), # will payload ], send=True) evt = client.recv() if not isinstance(evt, EventConnack): debug(evt) return False client.disconnect() return True
def test_110(self): sub = MqttClient("unisub:{seq}", connect=4) pub = MqttClient("unipub:{seq}", connect=4) evt = sub.subscribe(u"ᛋᚳᛖᚪᛚ/+/ᚦᛖᚪᚻ", qos=0) if not isinstance(evt, EventSuback) or \ evt.mid != sub.get_last_mid(): debug(evt) return False topic = u"ᛋᚳᛖᚪᛚ/䑓/ᚦᛖᚪᚻ" content = u"На берегу пустынных волн" evt = pub.publish(topic, payload=content, qos=0) evt = sub.recv() if not isinstance(evt, EventPublish) or\ evt.msg.topic != topic: debug(evt) return false content2 = evt.msg.payload.decode('utf8') if content2 != content: debugt("payload differs: {0} != {1}".format(content, content2)) return False sub.disconnect() pub.disconnect() return True
def test_012(self): pub = MqttClient("publisher:{seq}", connect=4) c = MqttClient("cs:{seq}", connect=4, clean_session=0) if c.connack().session_present != 0: debug("session present") return False c.subscribe("/cs/qos-0", qos=0) c.disconnect() # reconnect w/ same clientid time.sleep(.5) c2 = MqttClient(client_id=c.client_id, connect=4, clean_session=0) if c2.connack().session_present != 1: debug("session not present") return False pub.publish("/cs/qos-0", "", qos=1) evt = c2.recv() if not isinstance(evt, EventPublish) or\ evt.msg.topic != '/cs/qos-0' or\ evt.msg.qos != 0: debug(evt) return False return True
def test_002(self): sub = MqttClient("sub:{seq}", connect=4) sub.subscribe("foo/bar", qos=1) pub = MqttClient("pub:{seq}", connect=4) pub.publish("foo/bar", env.gen_msg(42), qos=1) evt = sub.recv() if not isinstance(evt, EventPublish): debug(evt) defer.returnValue(False) # PUBACK 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 _pubsub(self, pubtopic, subtopic, match): msg = gen_msg() sub = MqttClient("sub:{seq}", connect=4) suback_evt = sub.subscribe(subtopic, 0) if not isinstance(suback_evt, EventSuback) or \ suback_evt.mid != sub.get_last_mid() or \ suback_evt.granted_qos[0] != 0: if match: debug("failed to subscribe: {0}".format(suback_evt)) return False pub = MqttClient("pub:{seq}", connect=4) pub.publish(pubtopic, msg) pub.disconnect() e = sub.recv() unsuback_evt = sub.unsubscribe(subtopic) if not isinstance(unsuback_evt, EventUnsuback) or \ unsuback_evt.mid != sub.get_last_mid(): if match: debug("failed to unsubscribe: {0}".format(unsuback_evt)) return False sub.disconnect() #print e, e.msg.topic, e.msg.payload if not isinstance(e, EventPublish) or \ e.msg.topic != pubtopic or \ e.msg.payload != msg: if match: debug("invalid received msg: {0}".format(e)) return False 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_261(self): pub = MqttClient("conformity:{seq}", connect=4) sub = MqttClient("test:{seq}", connect=4) sub.subscribe("/foo/bar", qos=0) pub.forge( NC.CMD_PUBLISH, 2, [ ('string', '/foo/bar'), # topic ('uint16', 42), # identifier ], send=True) ack = pub.recv() if not isinstance(ack, EventPuback): debug(ack) return False # ensure message has been delivered evt = sub.recv() if not isinstance(evt, EventPublish) or evt.msg.topic != '/foo/bar': debug(evt) return False # sending again same packet (same id) with dup=1 pub.forge( NC.CMD_PUBLISH, 10, [ ('string', '/foo/bar'), # topic ('uint16', 42), # identifier ], send=True) ack = pub.recv() if not isinstance(ack, EventPuback): debug(ack) return False # ensure message has been delivered evt = sub.recv() if not isinstance(evt, EventPublish) or evt.msg.topic != '/foo/bar': debug(evt) return False return True
def test_262(self): pub = MqttClient("conformity:{seq}", connect=4) sub = MqttClient("test:{seq}", connect=4) sub.subscribe("/foo/bar", qos=1) pub.forge( NC.CMD_PUBLISH, 2, [ ('string', '/foo/bar'), # topic ('uint16', 42), # identifier ], send=True) ack = pub.recv() if ack is not None: debug(ack) return False evt = sub.recv() if not isinstance(evt, EventPublish) or evt.msg.topic != '/foo/bar': debug(evt) return False ## reemit message with dup=1 (same msgid) ## message must be discarded as previous on is still inflight pub.forge( NC.CMD_PUBLISH, 2, [ ('string', '/foo/bar'), # topic ('uint16', 42), # identifier ], send=True) ack = pub.recv() if ack is not None: debug(ack) return False evt = sub.recv() if evt is not None: debug(evt) return False return True
def test_030(self): sub = MqttClient("sub:{seq}", connect=4) sub.subscribe("foo/bar", qos=1) pub = MqttClient("pub:{seq}", connect=4) msg = gen_msg() pub.publish("foo/bar", payload=msg, qos=1) e1 = sub.recv() msg2 = gen_msg() pub.publish("foo/bar", payload=msg2, qos=1) e2 = sub.recv() if e2.msg.mid != e1.msg.mid + 1: debug('failing event: {0}'.format(e2)) return False return True
def test_240(self): pub = MqttClient("conformity-pub:{seq}", connect=4) pub.publish("foo/bar", "", qos=2, read_response=False); mid1 = pub.get_last_mid() pub.publish("bar/baz", "", qos=2, read_response=False); mid2 = pub.get_last_mid() evt = pub.recv() if not isinstance(evt, EventPubrec) or evt.mid != mid1: debug(evt) return False evt = pub.recv() if not isinstance(evt, EventPubrec) or evt.mid != mid2: debug(evt) return False pub.disconnect() return True
def test_023(self): retain = MqttClient("retain:{seq}", connect=4) sub = MqttClient("subscr:{seq}", connect=4) # matching topics rs = { # match "dead/bea/t k/id/s": { 'topic': "dead/bea/t k/id/s", 'payload': "children that just aren't worth supporting", 'retain': True }, # match "dead/abe/t k/id/s": { 'topic': "dead/abe/t k/id/s", 'payload': "just children that aren't supporting worth", 'retain': True }, } for args in rs.values(): retain.publish(**args) # no match nors = { 'topic': "dead/be/a/t k/ids", 'payload': "children that just aren't worth supporting", 'retain': True } retain.publish(**nors) #NOTE: we must receive BOTH rs message, but NOT nors one #NOTE: PUBLISH messages MAY arrived BEFORE PUBACK sub.subscribe("dead/+/t k/#", qos=0, read_response=False) count = 0 while True: evt = sub.recv() if evt is None: break if isinstance(evt, EventSuback): continue if not isinstance(evt, EventPublish) or\ not evt.msg.retain or\ evt.msg.topic not in rs: debug(evt) return False count += 1 if count != len(rs): debug("not received enough messages") return False retain.disconnect() sub.disconnect() return True
def test_003(self): c = MqttClient("cs:{seq}", raw_connect=True) c.forge( NC.CMD_CONNECT, 0, [ ('string', 'MQTT'), ('byte', 4), # protocol level ('byte', 2), # cleansession 1 ('uint16', 60), # keepalive ('string', ''), # 0-length client-if ], send=True) ack = c.recv() if not isinstance(ack, EventConnack) or\ ack.ret_code != 0 or\ ack.session_present != 0: debug(ack) return False c2 = MqttClient("cs:{seq}", raw_connect=True) c2.forge( NC.CMD_CONNECT, 0, [ ('string', 'MQTT'), ('byte', 4), # protocol level ('byte', 2), # cleansession 1 ('uint16', 60), # keepalive ('string', ''), # 0-length client-if ], send=True) ack = c2.recv() if not isinstance(ack, EventConnack) or\ ack.ret_code != 0 or\ ack.session_present != 0: debug(ack) return False return True
def test_240(self): pub = MqttClient("conformity-pub:{seq}", connect=4) pub.publish("foo/bar", "", qos=2, read_response=False) mid1 = pub.get_last_mid() pub.publish("bar/baz", "", qos=2, read_response=False) mid2 = pub.get_last_mid() evt = pub.recv() if not isinstance(evt, EventPubrec) or evt.mid != mid1: debug(evt) return False evt = pub.recv() if not isinstance(evt, EventPubrec) or evt.mid != mid2: debug(evt) return False pub.disconnect() return True
def test_230(self): pub = MqttClient("conformity-pub:{seq}", connect=4) sub = MqttClient("conformity-sub:{seq}", connect=4) sub.subscribe("foo/bar", qos=0) pub.publish("foo/bar", "grrr", qos=0) evt = sub.recv() if not isinstance(evt, EventPublish) or evt.msg.payload != "grrr": debug(evt) return False sub.unsubscribe("foo/bar") pub.publish("foo/bar", "grrr bis", qos=0) evt = sub.recv() if evt is not None: debug(evt) return False pub.disconnect(); sub.disconnect() return True
def test_261(self): pub = MqttClient("conformity:{seq}", connect=4) sub = MqttClient("test:{seq}", connect=4) sub.subscribe("/foo/bar", qos=0) pub.forge(NC.CMD_PUBLISH, 2, [ ('string', '/foo/bar'), # topic ('uint16', 42), # identifier ], send=True) ack = pub.recv() if not isinstance(ack, EventPuback): debug(ack) return False # ensure message has been delivered evt = sub.recv() if not isinstance(evt, EventPublish) or evt.msg.topic != '/foo/bar': debug(evt) return False # sending again same packet (same id) with dup=1 pub.forge(NC.CMD_PUBLISH, 10, [ ('string', '/foo/bar'), # topic ('uint16', 42), # identifier ], send=True) ack = pub.recv() if not isinstance(ack, EventPuback): debug(ack) return False # ensure message has been delivered evt = sub.recv() if not isinstance(evt, EventPublish) or evt.msg.topic != '/foo/bar': debug(evt) return False return True
def test_253(self): sub = MqttClient("conformity:{seq}", connect=4) sub.subscribe("+/bar", qos=0) pub = MqttClient("pub:{seq}", connect=4) pub.publish("foo/bar", "test1") evt = sub.recv() if not isinstance(evt, EventPublish) or\ evt.msg.topic != 'foo/bar' or\ evt.msg.payload != 'test1': debug(evt) return False pub.publish("$SYS/bar", "test2") evt = sub.recv() if evt is not None: debug(evt) return False pub.disconnect(); sub.disconnect() return True
def test_262(self): pub = MqttClient("conformity:{seq}", connect=4) sub = MqttClient("test:{seq}", connect=4) sub.subscribe("/foo/bar", qos=1) pub.forge(NC.CMD_PUBLISH, 2, [ ('string', '/foo/bar'), # topic ('uint16', 42), # identifier ], send=True) ack = pub.recv() if ack is not None: debug(ack) return False evt = sub.recv() if not isinstance(evt, EventPublish) or evt.msg.topic != '/foo/bar': debug(evt) return False ## reemit message with dup=1 (same msgid) ## message must be discarded as previous on is still inflight pub.forge(NC.CMD_PUBLISH, 2, [ ('string', '/foo/bar'), # topic ('uint16', 42), # identifier ], send=True) ack = pub.recv() if ack is not None: debug(ack) return False evt = sub.recv() if evt is not None: debug(evt) return False return True
def test_003(self): sub = MqttClient("sub:{seq}", connect=4) sub.subscribe("foo/bar", qos=1) sub2 = MqttClient("sub:{seq}", connect=4) sub2.subscribe("foo/+", qos=1) pub = MqttClient("pub:{seq}", connect=4) pub.publish("foo/bar", env.gen_msg(42), qos=1) evt1 = sub.recv() evt2 = sub2.recv() sub.destroy(); del sub if (yield supervisor.count('wave_msgworkers_sup')) != 1: debug("wrong msgworkers count") defer.returnValue(False) # sub removed, sub2 still alive time.sleep(6) if (yield supervisor.count('wave_msgworkers_sup')) != 1: debug("wrong msgworkers count") defer.returnValue(False) # sub2 still alive time.sleep(6) if (yield supervisor.count('wave_msgworkers_sup')) != 1: debug("wrong msgworkers count") defer.returnValue(False) # msg worker is destroyed after 5 secs sub2.puback(evt2.msg.mid) if (yield supervisor.count('wave_msgworkers_sup')) != 0: debug("wrong msgworkers count") defer.returnValue(False) pub.disconnect() defer.returnValue(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_023(self): retain = MqttClient("retain:{seq}", connect=4) sub = MqttClient("subscr:{seq}", connect=4) # matching topics rs = { # match "dead/bea/t k/id/s": { 'topic' : "dead/bea/t k/id/s", 'payload': "children that just aren't worth supporting", 'retain' : True}, # match "dead/abe/t k/id/s": { 'topic' : "dead/abe/t k/id/s", 'payload': "just children that aren't supporting worth", 'retain' : True}, } for args in rs.values(): retain.publish(**args) # no match nors = {'topic': "dead/be/a/t k/ids", 'payload': "children that just aren't worth supporting", 'retain': True} retain.publish(**nors) #NOTE: we must receive BOTH rs message, but NOT nors one #NOTE: PUBLISH messages MAY arrived BEFORE PUBACK sub.subscribe("dead/+/t k/#", qos=0, read_response=False) count = 0 while True: evt = sub.recv() if evt is None: break if isinstance(evt, EventSuback): continue if not isinstance(evt, EventPublish) or\ not evt.msg.retain or\ evt.msg.topic not in rs: debug(evt) return False count += 1 if count != len(rs): debug("not received enough messages") return False retain.disconnect(); sub.disconnect() return True
def test_253(self): sub = MqttClient("conformity:{seq}", connect=4) sub.subscribe("+/bar", qos=0) pub = MqttClient("pub:{seq}", connect=4) pub.publish("foo/bar", "test1") evt = sub.recv() if not isinstance(evt, EventPublish) or\ evt.msg.topic != 'foo/bar' or\ evt.msg.payload != 'test1': debug(evt) return False pub.publish("$SYS/bar", "test2") evt = sub.recv() if evt is not None: debug(evt) return False pub.disconnect() sub.disconnect() return True
def test_230(self): pub = MqttClient("conformity-pub:{seq}", connect=4) sub = MqttClient("conformity-sub:{seq}", connect=4) sub.subscribe("foo/bar", qos=0) pub.publish("foo/bar", "grrr", qos=0) evt = sub.recv() if not isinstance(evt, EventPublish) or evt.msg.payload != "grrr": debug(evt) return False sub.unsubscribe("foo/bar") pub.publish("foo/bar", "grrr bis", qos=0) evt = sub.recv() if evt is not None: debug(evt) return False pub.disconnect() sub.disconnect() return True
def test_200(self): pub = MqttClient("conformity-pub:{seq}", connect=4) sub = MqttClient("conformity-sub:{seq}", connect=4) sub.subscribe("foo/bar", qos=1) pub.publish("foo/bar", "wootwoot", qos=1) # reading PUBLISH evt = sub.recv() # sending PUBACK with wrong pktid sub.forge(NC.CMD_PUBACK, 0, [ ('uint16', (evt.msg.mid+10)%65535) # wrong pktid ], send=True) evt = pub.recv() # PUBACK from server is never received if evt is not None: debug(evt) return False pub.disconnect(); sub.disconnect() return True
def test_030(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/waz", 'qos': 0, 'payload': env.gen_msg(42) } ack = pub.publish(**pubmsg) c2 = MqttClient(client_id=c.client_id, connect=4, clean_session=0) evt = c2.connack() if not isinstance(evt, EventConnack): debug(evt) return False c2.recv() c2.disconnect() pub.disconnect() return True
def test_031(self): sub = MqttClient("sub:{seq}", connect=4) ack = sub.subscribe_multi([('foo/+', 1), ('foo/#', 1)]) debug("subscribe_multi response: {0}".format(ack)) pub = MqttClient("pub:{seq}", connect=4) pub.publish("foo/bar", gen_msg(42), qos=1) evt = sub.recv() if not isinstance(evt, EventPublish) or\ evt.msg.topic != 'foo/bar' or\ evt.msg.qos != 1: debug('failing event: {0}'.format(evt)) return False sub.puback(evt.msg.mid, read_response=False) evt = pub.recv() if evt is not None: debug('failing event: {0}'.format(evt)) return False # receive 2d publish evt = sub.recv() if not isinstance(evt, EventPublish) or\ evt.msg.topic != 'foo/bar' or\ evt.msg.qos != 1: debug('failing event: {0}'.format(evt)) return False sub.puback(evt.msg.mid) evt = pub.recv() if not isinstance(evt, EventPuback): debug('failing event: {0}'.format(evt)) return False return True
def test_020(self): ws = MqttClient("ws:{seq}", port=1884, websocket=True, connect=4) tcp = MqttClient("tcp:{seq}", connect=4) tcp.subscribe("foo/bar", qos=0) ws.publish("foo/bar", "baz", qos=0) evt = tcp.recv() if not isinstance(evt, EventPublish) or\ evt.msg.topic != "foo/bar" or\ evt.msg.payload != "baz": debug(evt) return False ws.disconnect(); tcp.disconnect() return True
def test_001(self): monitor = MqttClient("monitor:{seq}", connect=4) # NOTE: '/' prefix skips $ messages # TODO: remove it when '$' filter will be impl. monitor.subscribe("/#", qos=0) client = MqttClient("rabbit:{seq}", connect=4) # close socket without disconnection client.socket_close() evt = monitor.recv() if evt != None: debug(evt) return False monitor.disconnect() return True
def test_254(self): yield app.set_metrics(enabled=True) sub = MqttClient("conformity:{seq}", connect=4) sub.subscribe("$SYS/broker/uptime", qos=0) # $SYS stats are published each 10 seconds by default time.sleep(12) retval = True evt = sub.recv() if not isinstance(evt, EventPublish) or\ evt.msg.topic != '$SYS/broker/uptime': debug(evt) retval=False sub.disconnect() yield app.set_metrics(enabled=False) defer.returnValue(retval)
def test_005(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) # destoying socket pub.destroy(); del pub 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 sub.disconnect() return True
def test_002(self): monitor = MqttClient("monitor:{seq}", connect=4) # NOTE: '/' prefix skips $ messages # TODO: remove it when '$' filter will be impl. monitor.subscribe("/#", qos=0) client = MqttClient("rabbit:{seq}") will = {'topic': '/node/disconnect', 'message': client.clientid()} client.connect(version=4, will=will) # close socket without disconnection client.socket_close() evt = monitor.recv() if not isinstance(evt, EventPublish) or evt.msg.topic != will['topic'] or \ evt.msg.payload != will['message']: debug(evt) return False monitor.disconnect() return True