def handle_message(): """ Example that shows how to handle messages """ print("handle message") msg1 = Message(body="hello world!".encode("utf-8"), header={"h1": "val1"}) msg2 = Message(body="hello world!".encode("utf-8"), header={"h1": "val1"}) assert(msg1 == msg2) msg2 = msg1.serialize() msg2 = deserialize(msg2) assert(msg1 == msg2) msg3 = deserialize('{"body": "hello world!", "header": {"h1": "val1"}}') assert(msg1 == msg3) tmp = msg1.stringify() msg4 = destringify(tmp) assert(msg1 == msg4) msg5 = msg1.jsonify() assert(isinstance(msg5, dict)) msg5 = dejsonify(msg5) assert(msg1 == msg5) print("...handle message OK!")
def get_message(self, element): """ Dequeue the message from the given element and return a :py:class:`messaging.message.Message` object. """ msg = self.get(element) return deserialize(msg)
def __test_dq(self, qtype): """ Dirq base test. """ print("checking %s queue" % qtype) option = {"type": qtype, "path": "%s/%s" % (self.path, qtype), } try: dirq = queue.new(option) except SyntaxError: print(">>>>>>>> Dirq %s not supported in this Python version" % qtype) return False except ImportError: print(">>>>>>>> Dirq %s not installed or not in PYTHONPATH" % qtype) return False path = ["test/compliance", ] counter = 0 for folder in path: content = sorted(os.listdir(folder)) for each in content: if not COMPLIANCE_NAME.match(each): continue filer = open("%s/%s" % (folder, each), 'rb') serialized = EMPTY_BYTES.join(filer.readlines()) filer.close() try: msg = message.deserialize(serialized) except MessageError: error = sys.exc_info()[1] if "decoding supported but not installed" in \ "%s" % error: print("skipping compliance test for %s: %s" % (each, error)) else: raise error md5 = re.split('[.-]', each)[0] msg_md5 = msg.md5() self.assertEqual(md5, msg_md5, "deserialization of %s failed:%s\nresult:%s" % (each, msg, msg_md5)) element = dirq.add_message(msg) msg2 = None if dirq.lock(element): msg2 = dirq.get_message(element) dirq.unlock(element) self.assertEqual(msg, msg2, "messages should be equal:\n%s\n###\n%s" % (msg, msg2)) try: msg3 = dirq.dequeue_message(element) self.assertEqual(msg, msg3, "messages should be equal:\n%s\n###\n%s" % (msg, msg3)) except AttributeError: # "dequeue method not supported by this queue type" pass counter += 1 print("...%s queue ok, checked it with %d files" % (qtype, counter))
def __serialize(self, **kwargs): """ helper """ gen = Generator(**kwargs) msg = gen.message() for option in MESSAGE_CONVERT_OPTIONS: serialized = msg.serialize(option) msg_b = message.deserialize(serialized) self.assertEqual(msg, msg_b, "Error in de/serialization")
def __fullchain(self, **kwargs): """ helper """ gen = Generator(**kwargs) msg_a = gen.message() msg_b = message.deserialize(msg_a.serialize()) self.assertEqual(msg_a.size(), msg_b.size(), "message size not matching") self.assertEqual(msg_a, msg_b, "Error, not the same after serialization") msg_c = msg_a.clone() self.assertEqual(msg_a, msg_c, "Error, not the same after cloning\n%s\n%s\n" % (msg_a, msg_c))
def test_messages_compliance(self): """ Test message compliance. Deserialize messages in test/compliance, and check that their checksum correspond to their filename. This allow to prove interoperability between Perl and Python implementations. """ print("checking message compliance") path = ["test/compliance", ] counter = 0 for folder in path: content = sorted(os.listdir(folder)) for each in content: if not COMPLIANCE_NAME.match(each): continue filer = open("%s/%s" % (folder, each), 'rb') serialized = EMPTY_BYTES.join(filer.readlines()) filer.close() try: msg = message.deserialize(serialized) except MessageError: error = sys.exc_info()[1] if "decoding supported but not installed" in \ "%s" % error: print("skipping compliance test for %s: %s" % (each, error)) else: raise error md5 = re.split('[\.-]', each)[0] msg_md5 = msg.md5() self.assertEqual(md5, msg_md5, "deserialization of %s failed:%s\nresult:%s" % (each, msg, msg_md5)) counter += 1 print("...compliance ok, checked for %s messages" % counter)