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_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_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): 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_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_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_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_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_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_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 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_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_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_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_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_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_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_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_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_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_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): 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_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_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_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_021(self): c = MqttClient("metrics:{seq}", connect=4) d = MqttClient("duck:{seq}", connect=3) c.subscribe('$SYS/#', qos=0) pubs_start = sys_value(c, "$SYS/broker/publish/messages/received", int) d.publish("foo/bar", "") pubs_end = sys_value(c, "$SYS/broker/publish/messages/received", int) if pubs_end != pubs_start+1: debug("{0}, {1}".format(pubs_start, pubs_end)) return False c.disconnect() return True
def test_021(self): c = MqttClient("metrics:{seq}", connect=4) d = MqttClient("duck:{seq}", connect=3) c.subscribe('$SYS/#', qos=0) pubs_start = sys_value(c, "$SYS/broker/publish/messages/received", int) d.publish("foo/bar", "") pubs_end = sys_value(c, "$SYS/broker/publish/messages/received", int) if pubs_end != pubs_start + 1: debug("{0}, {1}".format(pubs_start, pubs_end)) return False c.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_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_100(self): c = MqttClient("conformity:{seq}") sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.connect(('127.0.0.1', 1883)) sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) sock.setblocking(0) except Exception as e: debug(e) return False c._c.sock = sock e = c.subscribe("foo/bar", qos=0) if e is not None: debug(e) return False # socket MUST be disconnected try: e = c.publish("foo", "bar") sock.getpeername() except socket.error as e: return True debug("connection still alive") return False
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_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 _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_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_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_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_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_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_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_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_010(self): c = MqttClient("v311:{seq}", connect=4) evt = c.subscribe("/foo/bar", qos=0) c.disconnect() if not isinstance(evt, EventSuback): debug(evt) return False return True
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_001(self): sub = MqttClient("sub:{seq}", connect=4) suback_evt = sub.subscribe('foo/bar', qos=1) if not isinstance(suback_evt, EventSuback) or \ suback_evt.mid != sub.get_last_mid() or \ suback_evt.granted_qos[0] != 1: debug('failing event: {0}'.format(suback_evt)) return False 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_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
def test_001(self): sub = MqttClient("sub:{seq}", connect=4) sub.subscribe("foo/bar", qos=0) pub = MqttClient("pub:{seq}", connect=4) pub.publish("foo/bar", env.gen_msg(42), qos=2) # PUBREL not sent pub.destroy(); del pub cnt = yield supervisor.count('wave_msgworkers_sup') if cnt != 1: debug("wrong msgworkers count: {0}".format(cnt)) 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) defer.returnValue(True)
def test_022(self): sub = MqttClient("sub:{seq}", connect=4) sub.subscribe('a/b', qos=0) pub = MqttClient("pub:{seq}", connect=4) # published with qos 0 msg = gen_msg() pub.publish('a/b', payload=msg, qos=1) pub.disconnect() e = sub.recv() sub.unsubscribe('a/b') sub.disconnect() if not isinstance(e, EventPublish) or \ e.msg.payload != msg or \ e.msg.qos != 0: debug('failing event: {0}'.format(e)) return False 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_012(self): """ """ v = yield exometer.value('wave.subscriptions') ref_val = v['value'] c = MqttClient("metrics:{seq}", connect=4) c.subscribe('foo/bar', qos=0) v = yield exometer.value('wave.subscriptions') if v['value'] != ref_val+1: debug("{0}, {1}".format(v, ref_val)) defer.returnValue(False) c.unsubscribe('foo/bar') v = yield exometer.value('wave.subscriptions') if v['value'] != ref_val: debug("{0}, {1}".format(v, ref_val)) defer.returnValue(False) c.disconnect() defer.returnValue(True)