def test_Message(self): try: from cStringIO import StringIO except ImportError: from io import StringIO from genpy import Message, SerializationError self.assert_(isinstance(Message(), Message)) m = Message() b = StringIO() m.serialize(b) m.deserialize('') # test args/keywords constructor try: Message(1, 2, 3, one=1, two=2, three=3) self.fail("Message should not allow *args and **kwds") except TypeError: pass try: Message()._get_types() self.fail("_get_types() should not be callable on abstract Message instance") except: pass # test Empty message class M1(Message): __slots__ = [] _slot_types=[] def __init__(self, *args, **kwds): super(M1, self).__init__(*args, **kwds) def _get_types(self): return [] # - test __str__ on empty self.assertEquals('', str(M1())) # - should not fail on default constructor M1()._check_types() # - must fail if provided an exception try: M1()._check_types(Exception("test")) self.fail("_check_types must fail if explicitly provided an exception") except SerializationError: pass # Test simple message with two fields class M2(Message): __slots__ = ['a', 'b'] _slot_types=['int32', 'int32'] def _get_types(self): return ['int32', 'int32'] def __init__(self, *args, **kwds): super(M2, self).__init__(*args, **kwds) self.assertEquals('a: 1\nb: 2', str(M2(1, 2))) # - test check types with two int type M2(1, 2)._check_types() M2(a=1, b=2)._check_types() invalid = [M2(a=1), M2('1', '2'), M2(1, '2'), M2(1., 2.), M2(None, 2)] for m in invalid: try: m._check_types() self.fail("check_types for %s should have failed"%m) except SerializationError: pass valid = [ ((), {}, M1), ((), {}, M2), ((1, 2), {}, M2), ((), {'a': 1, 'b': 2}, M2), ((), {'a': 1}, M2),((), {'b': 2}, M2), ] invalid = [ ((1,), {}, M1), ((), {'one': 1}, M1), ((1), {}, M2),((1, 2, 3), {}, M2), ((), {'c': 1}, M2),((), {'a': 1, 'b': 2, 'c': 1}, M2), ] for args, kwds, cls in valid: cls(*args, **kwds) val = time.time() val2 = time.time() self.assertEquals(val, M2(val, 2).a) self.assertEquals(val, M2(1, val).b) self.assertEquals(val, M2(a=val).a) self.assertEquals(None, M2(a=val).b) self.assertEquals(None, M2(b=val).a) self.assertEquals(val, M2(b=val).b) self.assertEquals(val, M2(a=val, b=val2).a) self.assertEquals(val2, M2(a=val, b=val2).b) for args, kwds, cls in invalid: try: cls(*args, **kwds) self.fail("Message should have failed for cls[%s] *args[%s] and **kwds[%s]"%(cls, args, kwds)) except: pass
def to_serialized_str(msg: Message) -> str: buff = BytesIO() msg.serialize(buff) data = buff.getvalue() return base64.encodebytes(data).decode('ascii')