예제 #1
0
    def __init__(self, rpc_connection, stream_connection):
        self._types = Types()
        self._rpc_connection = rpc_connection
        self._rpc_connection_lock = threading.Lock()
        self._stream_connection = stream_connection
        self._stream_cache = {}
        self._stream_cache_lock = threading.Lock()
        self._request_type = self._types.as_type('KRPC.Request')
        self._response_type = self._types.as_type('KRPC.Response')

        # Get the services
        services = self._invoke('KRPC', 'GetServices', [], [], [],
                                self._types.as_type('KRPC.Services')).services

        # Set up services
        for service in services:
            setattr(self, snake_case(service.name),
                    create_service(self, service))

        # Set up stream update thread
        if stream_connection is not None:
            self._stream_thread_stop = threading.Event()
            self._stream_thread = threading.Thread(
                target=krpc.stream.update_thread,
                args=(stream_connection, self._stream_thread_stop,
                      self._stream_cache, self._stream_cache_lock))
            self._stream_thread.daemon = True
            self._stream_thread.start()
        else:
            self._stream_thread = None
예제 #2
0
파일: client.py 프로젝트: mkalte666/krpc
    def __init__(self, rpc_connection, stream_connection):
        self._types = Types()
        self._rpc_connection = rpc_connection
        self._rpc_connection_lock = threading.Lock()
        self._stream_connection = stream_connection
        self._stream_manager = StreamManager(self)

        # Get the services
        services = self._invoke('KRPC', 'GetServices', [], [], [],
                                self._types.services_type).services

        # Set up services
        for service in services:
            setattr(self, snake_case(service.name),
                    create_service(self, service))

        # Set up stream update thread
        if stream_connection is not None:
            self._stream_thread_stop = threading.Event()
            self._stream_thread = threading.Thread(
                target=krpc.streammanager.update_thread,
                args=(self._stream_manager, stream_connection,
                      self._stream_thread_stop))
            self._stream_thread.daemon = True
            self._stream_thread.start()
        else:
            self._stream_thread = None
예제 #3
0
 def test_tuple_3_types(self):
     types = Types()
     typ = types.tuple_type(types.float_type, types.uint64_type,
                            types.string_type)
     self.assertTrue(isinstance(typ, TupleType))
     self.assertEqual(typ.python_type, tuple)
     self.check_protobuf_type(Type.TUPLE, '', '', 3, typ.protobuf_type)
     self.check_protobuf_type(Type.FLOAT, '', '', 0,
                              typ.protobuf_type.types[0])
     self.check_protobuf_type(Type.UINT64, '', '', 0,
                              typ.protobuf_type.types[1])
     self.check_protobuf_type(Type.STRING, '', '', 0,
                              typ.protobuf_type.types[2])
     self.assertEqual(3, len(typ.value_types))
     self.assertTrue(isinstance(typ.value_types[0], ValueType))
     self.assertTrue(isinstance(typ.value_types[1], ValueType))
     self.assertTrue(isinstance(typ.value_types[2], ValueType))
     self.assertEqual(float, typ.value_types[0].python_type)
     self.assertEqual(int, typ.value_types[1].python_type)
     self.assertEqual(str, typ.value_types[2].python_type)
     self.check_protobuf_type(Type.FLOAT, '', '', 0,
                              typ.value_types[0].protobuf_type)
     self.check_protobuf_type(Type.UINT64, '', '', 0,
                              typ.value_types[1].protobuf_type)
     self.check_protobuf_type(Type.STRING, '', '', 0,
                              typ.value_types[2].protobuf_type)
예제 #4
0
 def test_enumeration_types(self):
     types = Types()
     typ = types.enumeration_type('ServiceName', 'EnumName',
                                  'enum documentation')
     self.assertTrue(isinstance(typ, EnumerationType))
     self.assertIsNone(typ.python_type)
     self.check_protobuf_type(Type.ENUMERATION, 'ServiceName', 'EnumName',
                              0, typ.protobuf_type)
     typ.set_values({
         'a': {
             'value': 0,
             'doc': 'doca'
         },
         'b': {
             'value': 42,
             'doc': 'docb'
         },
         'c': {
             'value': 100,
             'doc': 'docc'
         }
     })
     self.assertTrue(issubclass(typ.python_type, Enum))
     self.assertEqual('enum documentation', typ.python_type.__doc__)
     self.assertEqual(0, typ.python_type.a.value)
     self.assertEqual(42, typ.python_type.b.value)
     self.assertEqual(100, typ.python_type.c.value)
     self.assertEqual('doca', typ.python_type.a.__doc__)
     self.assertEqual('docb', typ.python_type.b.__doc__)
     self.assertEqual('docc', typ.python_type.c.__doc__)
     typ2 = types.as_type(typ.protobuf_type)
     self.assertEqual(typ, typ2)
예제 #5
0
def decode_default_value(value, typ):
    value = base64.b64decode(value)
    value = array.array('B', value).tostring()
    # Note: following is a workaround for decoding EnumerationType,
    # as set_values has not been called
    if not isinstance(typ, EnumerationType):
        return Decoder.decode(value, typ)
    return Decoder.decode(value, Types().sint32_type)
예제 #6
0
 def test_value_types(self):
     types = Types()
     for protobuf_typ in PROTOBUF_VALUE_TYPES:
         python_typ = PROTOBUF_TO_PYTHON_VALUE_TYPE[protobuf_typ]
         typ = types.as_type(protobuf_typ)
         self.assertTrue(isinstance(typ, ValueType))
         self.assertEqual(protobuf_typ, typ.protobuf_type)
         self.assertEqual(python_typ, typ.python_type)
     self.assertRaises(ValueError, ValueType, 'invalid')
예제 #7
0
class TestDecoder(unittest.TestCase):

    types = Types()

    def test_decode_message(self):
        typ = krpc.schema.KRPC.Request
        message = '0a0b536572766963654e616d65120d50726f6365647572654e616d65'
        request = Decoder.decode(unhexlify(message),
                                 self.types.as_type('KRPC.Request'))
        self.assertEqual('ServiceName', request.service)
        self.assertEqual('ProcedureName', request.procedure)

    def test_decode_value(self):
        value = Decoder.decode(unhexlify('ac02'), self.types.as_type('int32'))
        self.assertEqual(int(300), value)

    def test_decode_unicode_string(self):
        value = Decoder.decode(unhexlify('03e284a2'),
                               self.types.as_type('string'))
        self.assertEqual(b'\xe2\x84\xa2'.decode('utf-8'), value)

    def test_decode_size_and_position(self):
        message = '1c'
        size, position = Decoder.decode_size_and_position(unhexlify(message))
        self.assertEqual(28, size)
        self.assertEqual(1, position)

    def test_decode_message_delimited(self):
        typ = krpc.schema.KRPC.Request
        message = '1c' + '0a0b536572766963654e616d65120d50726f6365647572654e616d65'
        request = Decoder.decode_delimited(unhexlify(message),
                                           self.types.as_type('KRPC.Request'))
        self.assertEqual('ServiceName', request.service)
        self.assertEqual('ProcedureName', request.procedure)

    def test_decode_value_delimited(self):
        value = Decoder.decode_delimited(unhexlify('02' + 'ac02'),
                                         self.types.as_type('int32'))
        self.assertEqual(300, value)

    def test_decode_class(self):
        typ = self.types.as_type('Class(ServiceName.ClassName)')
        value = Decoder.decode(unhexlify('ac02'), typ)
        self.assertTrue(isinstance(value, typ.python_type))
        self.assertEqual(300, value._object_id)

    def test_decode_class_none(self):
        typ = self.types.as_type('Class(ServiceName.ClassName)')
        value = Decoder.decode(unhexlify('00'), typ)
        self.assertIsNone(value)

    def test_guid(self):
        self.assertEqual(
            '6f271b39-00dd-4de4-9732-f0d3a68838df',
            Decoder.guid(unhexlify('391b276fdd00e44d9732f0d3a68838df')))
예제 #8
0
def update_thread(connection, stop):
    stream_message_type = Types().as_type('KRPC.StreamMessage')
    response_type = Types().as_type('KRPC.Response')

    while True:

        # Read the size and position of the response message
        data = b''
        while True:
            try:
                data += connection.partial_receive(1)
                size,position = Decoder.decode_size_and_position(data)
                break
            except IndexError:
                pass
            except:
                #TODO: is there a better way to catch exceptions when the thread is forcibly stopped (e.g. by CTRL+c)?
                return
            if stop.is_set():
                connection.close()
                return

        # Read and decode the response message
        data = connection.receive(size)
        response = Decoder.decode(data, stream_message_type)

        # Add the data to the cache
        with _stream_cache_lock:
            for response in response.responses:
                id = response.id
                if id not in _stream_cache:
                    continue

                # Check for an error response
                if response.response.has_error:
                    _stream_cache[id].value = RPCError(response.response.error)
                    continue

                # Decode the return value and store it in the cache
                typ = _stream_cache[id].return_type
                value = Decoder.decode(response.response.return_value, typ)
                _stream_cache[id].update(value)
예제 #9
0
 def test_enum_types(self):
     types = Types()
     typ = types.as_type('Enum(ServiceName.EnumName)')
     self.assertTrue(isinstance(typ, EnumType))
     self.assertEqual(None, typ.python_type)
     self.assertTrue('Enum(ServiceName.EnumName)', typ.protobuf_type)
     typ.set_values({'a': 0, 'b': 42, 'c': 100})
     self.assertTrue(issubclass(typ.python_type, Enum))
     self.assertEquals(0, typ.python_type.a.value)
     self.assertEquals(42, typ.python_type.b.value)
     self.assertEquals(100, typ.python_type.c.value)
예제 #10
0
 def test_message_types(self):
     types = Types()
     cases = [(types.procedure_call_type, Type.PROCEDURE_CALL,
               ProcedureCall), (types.stream_type, Type.STREAM, Stream),
              (types.status_type, Type.STATUS, Status),
              (types.services_type, Type.SERVICES, Services)]
     for typ, protobuf_code, python_type in cases:
         self.assertTrue(isinstance(typ, MessageType))
         self.assertEqual(python_type, typ.python_type)
         self.check_protobuf_type(protobuf_code, '', '', 0,
                                  typ.protobuf_type)
예제 #11
0
 def test_message_types(self):
     types = Types()
     typ = types.as_type('KRPC.Request')
     self.assertTrue(isinstance(typ, MessageType))
     self.assertEqual(krpc.schema.KRPC.Request, typ.python_type)
     self.assertEqual('KRPC.Request', typ.protobuf_type)
     self.assertRaises(ValueError, types.as_type, 'KRPC.DoesntExist')
     self.assertRaises(ValueError, MessageType, '')
     self.assertRaises(ValueError, MessageType, 'invalid')
     self.assertRaises(ValueError, MessageType, '.')
     self.assertRaises(ValueError, MessageType, 'foo.bar')
예제 #12
0
파일: nodes.py 프로젝트: thinkyfish/krpc
class Appendable(object):
    def __init__(self):
        self._appended = []

    types = Types()

    def append(self, value):
        self._appended.append(value)

    @property
    def appended(self):
        return '\n\n'.join(self._appended)
예제 #13
0
 def test_list_types(self):
     types = Types()
     typ = types.list_type(types.uint32_type)
     self.assertTrue(isinstance(typ, ListType))
     self.assertEqual(typ.python_type, list)
     self.check_protobuf_type(Type.LIST, '', '', 1, typ.protobuf_type)
     self.check_protobuf_type(Type.UINT32, '', '', 0,
                              typ.protobuf_type.types[0])
     self.assertTrue(isinstance(typ.value_type, ValueType))
     self.assertEqual(int, typ.value_type.python_type)
     self.check_protobuf_type(Type.UINT32, '', '', 0,
                              typ.value_type.protobuf_type)
예제 #14
0
 def test_set_types(self):
     types = Types()
     typ = types.set_type(types.string_type)
     self.assertTrue(isinstance(typ, SetType))
     self.assertEqual(typ.python_type, set)
     self.check_protobuf_type(Type.SET, '', '', 1, typ.protobuf_type)
     self.check_protobuf_type(Type.STRING, '', '', 0,
                              typ.protobuf_type.types[0])
     self.assertTrue(isinstance(typ.value_type, ValueType))
     self.assertEqual(str, typ.value_type.python_type)
     self.check_protobuf_type(Type.STRING, '', '', 0,
                              typ.value_type.protobuf_type)
예제 #15
0
 def test_class_types(self):
     types = Types()
     typ = types.as_type('Class(ServiceName.ClassName)')
     self.assertTrue(isinstance(typ, ClassType))
     self.assertTrue(issubclass(typ.python_type, ClassBase))
     self.assertTrue('Class(ServiceName.ClassName)', typ.protobuf_type)
     instance = typ.python_type(42)
     self.assertEqual(42, instance._object_id)
     self.assertEqual('ServiceName', instance._service_name)
     self.assertEqual('ClassName', instance._class_name)
     typ2 = types.as_type('Class(ServiceName.ClassName)')
     self.assertEqual(typ, typ2)
예제 #16
0
 def test_tuple_1_types(self):
     types = Types()
     typ = types.tuple_type(types.bool_type)
     self.assertTrue(isinstance(typ, TupleType))
     self.assertEqual(typ.python_type, tuple)
     self.check_protobuf_type(Type.TUPLE, '', '', 1, typ.protobuf_type)
     self.check_protobuf_type(Type.BOOL, '', '', 0,
                              typ.protobuf_type.types[0])
     self.assertEqual(1, len(typ.value_types))
     self.assertTrue(isinstance(typ.value_types[0], ValueType))
     self.assertEqual(bool, typ.value_types[0].python_type)
     self.check_protobuf_type(Type.BOOL, '', '', 0,
                              typ.value_types[0].protobuf_type)
예제 #17
0
class TestEncoder(unittest.TestCase):
    types = Types()

    def test_encode_message(self):
        call = self.types.procedure_call_type.python_type()
        call.service = 'ServiceName'
        call.procedure = 'ProcedureName'
        data = Encoder.encode(call, self.types.procedure_call_type)
        expected = '0a0b536572766963654e616d65120d50726f6365647572654e616d65'
        self.assertEqual(expected, hexlify(data))

    def test_encode_value(self):
        data = Encoder.encode(300, self.types.uint32_type)
        self.assertEqual('ac02', hexlify(data))

    def test_encode_unicode_string(self):
        data = Encoder.encode(b'\xe2\x84\xa2'.decode('utf-8'),
                              self.types.string_type)
        self.assertEqual('03e284a2', hexlify(data))

    def test_encode_message_with_size(self):
        call = self.types.procedure_call_type.python_type()
        call.service = 'ServiceName'
        call.procedure = 'ProcedureName'
        data = Encoder.encode_message_with_size(call)
        expected = '1c' + \
                   '0a0b536572766963654e616d6512' + \
                   '0d50726f6365647572654e616d65'
        self.assertEqual(expected, hexlify(data))

    def test_encode_class(self):
        typ = self.types.class_type('ServiceName', 'ClassName')
        class_type = typ.python_type
        self.assertTrue(issubclass(class_type, ClassBase))
        value = class_type(300)
        self.assertEqual(300, value._object_id)
        data = Encoder.encode(value, typ)
        self.assertEqual('ac02', hexlify(data))

    def test_encode_class_none(self):
        typ = self.types.class_type('ServiceName', 'ClassName')
        value = None
        data = Encoder.encode(value, typ)
        self.assertEqual('00', hexlify(data))

    def test_encode_tuple_wrong_arity(self):
        typ = self.types.tuple_type(self.types.uint32_type,
                                    self.types.uint32_type,
                                    self.types.uint32_type)
        value = (0, 1)
        self.assertRaises(EncodingError, Encoder.encode, value, typ)
예제 #18
0
 def test_get_return_type(self):
     types = Types()
     self.assertEqual('float',
                      types.get_return_type('float', []).protobuf_type)
     self.assertEqual('int32',
                      types.get_return_type('int32', []).protobuf_type)
     self.assertEqual(
         'KRPC.Response',
         types.get_return_type('KRPC.Response', []).protobuf_type)
     self.assertEqual(
         'Class(ServiceName.ClassName)',
         types.get_return_type(
             'uint64',
             ['ReturnType.Class(ServiceName.ClassName)']).protobuf_type)
예제 #19
0
 def test_list_types(self):
     types = Types()
     typ = types.as_type('List(int32)')
     self.assertTrue(isinstance(typ, ListType))
     self.assertEqual(typ.python_type, list)
     self.assertEqual('List(int32)', typ.protobuf_type)
     self.assertTrue(isinstance(typ.value_type, ValueType))
     self.assertEqual('int32', typ.value_type.protobuf_type)
     self.assertEqual(int, typ.value_type.python_type)
     self.assertRaises(ValueError, types.as_type, 'List')
     self.assertRaises(ValueError, types.as_type, 'List(')
     self.assertRaises(ValueError, types.as_type, 'List()')
     self.assertRaises(ValueError, types.as_type, 'List(foo')
     self.assertRaises(ValueError, types.as_type, 'List(int32,string)')
예제 #20
0
 def test_class_types(self):
     types = Types()
     typ = types.class_type('ServiceName', 'ClassName',
                            'class documentation')
     self.assertTrue(isinstance(typ, ClassType))
     self.assertTrue(issubclass(typ.python_type, ClassBase))
     self.assertEqual('class documentation', typ.python_type.__doc__)
     self.check_protobuf_type(Type.CLASS, 'ServiceName', 'ClassName', 0,
                              typ.protobuf_type)
     instance = typ.python_type(42)
     self.assertEqual(42, instance._object_id)
     self.assertEqual('ServiceName', instance._service_name)
     self.assertEqual('ClassName', instance._class_name)
     typ2 = types.as_type(typ.protobuf_type)
     self.assertEqual(typ, typ2)
예제 #21
0
 def test_set_types(self):
     types = Types()
     typ = types.as_type('Set(string)')
     self.assertTrue(isinstance(typ, SetType))
     self.assertEqual(typ.python_type, set)
     self.assertEqual('Set(string)', typ.protobuf_type)
     self.assertTrue(isinstance(typ.value_type, ValueType))
     self.assertEqual('string', typ.value_type.protobuf_type)
     self.assertEqual(str, typ.value_type.python_type)
     self.assertRaises(ValueError, types.as_type, 'Set')
     self.assertRaises(ValueError, types.as_type, 'Set(')
     self.assertRaises(ValueError, types.as_type, 'Set()')
     self.assertRaises(ValueError, types.as_type, 'Set(string,)')
     self.assertRaises(ValueError, types.as_type, 'Set(,)')
     self.assertRaises(ValueError, types.as_type, 'Set(,string)')
     self.assertRaises(ValueError, types.as_type, 'Set(int,string))')
예제 #22
0
 def test_value_types(self):
     types = Types()
     cases = [(types.double_type, Type.DOUBLE, float),
              (types.float_type, Type.FLOAT, float),
              (types.sint32_type, Type.SINT32, int),
              (types.sint64_type, Type.SINT64, int),
              (types.uint32_type, Type.UINT32, int),
              (types.uint64_type, Type.UINT64, int),
              (types.bool_type, Type.BOOL, bool),
              (types.string_type, Type.STRING, str),
              (types.bytes_type, Type.BYTES, bytes)]
     for typ, protobuf_code, python_type in cases:
         self.assertTrue(isinstance(typ, ValueType))
         self.check_protobuf_type(protobuf_code, '', '', 0,
                                  typ.protobuf_type)
         self.assertEqual(python_type, typ.python_type)
예제 #23
0
    def test_coerce_to(self):
        types = Types()
        cases = [
            (42.0, 42, 'double'),
            (42.0, 42, 'float'),
            (42, 42.0, 'int32'),
            (42, 42L, 'int32'),
            (42L, 42.0, 'int64'),
            (42L, 42, 'int64'),
            (42, 42.0, 'uint32'),
            (42, 42L, 'uint32'),
            (42L, 42.0, 'uint64'),
            (42L, 42, 'uint64'),
            (list(), tuple(), 'List(string)'),
            ((0, 1, 2), [0, 1, 2], 'Tuple(int32,int32,int32)'),
            ([0, 1, 2], (0, 1, 2), 'List(int32)'),
        ]
        for expected, value, typ in cases:
            coerced_value = types.coerce_to(value, types.as_type(typ))
            self.assertEqual(expected, coerced_value)
            self.assertEqual(type(expected), type(coerced_value))

        strings = [
            u'foo', u'\xe2\x84\xa2',
            u'Mystery Goo\xe2\x84\xa2 Containment Unit'
        ]
        for string in strings:
            self.assertEqual(string,
                             types.coerce_to(string, types.as_type('string')))

        self.assertEqual(['foo', 'bar'],
                         types.coerce_to(['foo', 'bar'],
                                         types.as_type('List(string)')))

        self.assertRaises(ValueError, types.coerce_to, None,
                          types.as_type('float'))
        self.assertRaises(ValueError, types.coerce_to, '',
                          types.as_type('float'))
        self.assertRaises(ValueError, types.coerce_to, True,
                          types.as_type('float'))

        self.assertRaises(ValueError, types.coerce_to, list(),
                          types.as_type('Tuple(int32)'))
        self.assertRaises(ValueError, types.coerce_to, ['foo', 2],
                          types.as_type('Tuple(string)'))
        self.assertRaises(ValueError, types.coerce_to, [1],
                          types.as_type('Tuple(string)'))
예제 #24
0
 def test_dictionary_types(self):
     types = Types()
     typ = types.dictionary_type(types.string_type, types.uint32_type)
     self.assertTrue(isinstance(typ, DictionaryType))
     self.assertEqual(typ.python_type, dict)
     self.check_protobuf_type(Type.DICTIONARY, '', '', 2, typ.protobuf_type)
     self.check_protobuf_type(Type.STRING, '', '', 0,
                              typ.protobuf_type.types[0])
     self.check_protobuf_type(Type.UINT32, '', '', 0,
                              typ.protobuf_type.types[1])
     self.assertTrue(isinstance(typ.key_type, ValueType))
     self.assertEqual(str, typ.key_type.python_type)
     self.check_protobuf_type(Type.STRING, '', '', 0,
                              typ.key_type.protobuf_type)
     self.assertTrue(isinstance(typ.value_type, ValueType))
     self.assertEqual(int, typ.value_type.python_type)
     self.check_protobuf_type(Type.UINT32, '', '', 0,
                              typ.value_type.protobuf_type)
예제 #25
0
 def test_tuple_types(self):
     types = Types()
     typ = types.as_type('Tuple(bool)')
     self.assertTrue(isinstance(typ, TupleType))
     self.assertEqual(typ.python_type, tuple)
     self.assertEqual('Tuple(bool)', typ.protobuf_type)
     self.assertEqual(1, len(typ.value_types))
     self.assertTrue(isinstance(typ.value_types[0], ValueType))
     self.assertEqual('bool', typ.value_types[0].protobuf_type)
     self.assertEqual(bool, typ.value_types[0].python_type)
     typ = types.as_type('Tuple(int32,string)')
     self.assertTrue(isinstance(typ, TupleType))
     self.assertEqual(typ.python_type, tuple)
     self.assertEqual('Tuple(int32,string)', typ.protobuf_type)
     self.assertEqual(2, len(typ.value_types))
     self.assertTrue(isinstance(typ.value_types[0], ValueType))
     self.assertTrue(isinstance(typ.value_types[1], ValueType))
     self.assertEqual('int32', typ.value_types[0].protobuf_type)
     self.assertEqual('string', typ.value_types[1].protobuf_type)
     self.assertEqual(int, typ.value_types[0].python_type)
     self.assertEqual(str, typ.value_types[1].python_type)
     typ = types.as_type('Tuple(float,int64,string)')
     self.assertTrue(isinstance(typ, TupleType))
     self.assertEqual(typ.python_type, tuple)
     self.assertEqual('Tuple(float,int64,string)', typ.protobuf_type)
     self.assertEqual(3, len(typ.value_types))
     self.assertTrue(isinstance(typ.value_types[0], ValueType))
     self.assertTrue(isinstance(typ.value_types[1], ValueType))
     self.assertTrue(isinstance(typ.value_types[2], ValueType))
     self.assertEqual('float', typ.value_types[0].protobuf_type)
     self.assertEqual('int64', typ.value_types[1].protobuf_type)
     self.assertEqual('string', typ.value_types[2].protobuf_type)
     self.assertEqual(float, typ.value_types[0].python_type)
     self.assertEqual(long, typ.value_types[1].python_type)
     self.assertEqual(str, typ.value_types[2].python_type)
     self.assertRaises(ValueError, types.as_type, 'Tuple')
     self.assertRaises(ValueError, types.as_type, 'Tuple(')
     self.assertRaises(ValueError, types.as_type, 'Tuple()')
     self.assertRaises(ValueError, types.as_type, 'Tuple(foo')
     self.assertRaises(ValueError, types.as_type, 'Tuple(string,)')
     self.assertRaises(ValueError, types.as_type, 'Tuple(,)')
     self.assertRaises(ValueError, types.as_type, 'Tuple(,string)')
     self.assertRaises(ValueError, types.as_type, 'Tuple(int,string))')
예제 #26
0
 def test_tuple_2_types(self):
     types = Types()
     typ = types.tuple_type(types.uint32_type, types.string_type)
     self.assertTrue(isinstance(typ, TupleType))
     self.assertEqual(typ.python_type, tuple)
     self.check_protobuf_type(Type.TUPLE, '', '', 2, typ.protobuf_type)
     self.check_protobuf_type(Type.UINT32, '', '', 0,
                              typ.protobuf_type.types[0])
     self.check_protobuf_type(Type.STRING, '', '', 0,
                              typ.protobuf_type.types[1])
     self.assertEqual(2, len(typ.value_types))
     self.assertTrue(isinstance(typ.value_types[0], ValueType))
     self.assertTrue(isinstance(typ.value_types[1], ValueType))
     self.assertEqual(int, typ.value_types[0].python_type)
     self.assertEqual(str, typ.value_types[1].python_type)
     self.check_protobuf_type(Type.UINT32, '', '', 0,
                              typ.value_types[0].protobuf_type)
     self.check_protobuf_type(Type.STRING, '', '', 0,
                              typ.value_types[1].protobuf_type)
예제 #27
0
 def test_dictionary_types(self):
     types = Types()
     typ = types.as_type('Dictionary(string,int32)')
     self.assertTrue(isinstance(typ, DictionaryType))
     self.assertEqual(typ.python_type, dict)
     self.assertEqual('Dictionary(string,int32)', typ.protobuf_type)
     self.assertTrue(isinstance(typ.key_type, ValueType))
     self.assertEqual('string', typ.key_type.protobuf_type)
     self.assertEqual(str, typ.key_type.python_type)
     self.assertTrue(isinstance(typ.value_type, ValueType))
     self.assertEqual('int32', typ.value_type.protobuf_type)
     self.assertEqual(int, typ.value_type.python_type)
     self.assertRaises(ValueError, types.as_type, 'Dictionary')
     self.assertRaises(ValueError, types.as_type, 'Dictionary(')
     self.assertRaises(ValueError, types.as_type, 'Dictionary()')
     self.assertRaises(ValueError, types.as_type, 'Dictionary(foo')
     self.assertRaises(ValueError, types.as_type, 'Dictionary(string)')
     self.assertRaises(ValueError, types.as_type, 'Dictionary(string,)')
     self.assertRaises(ValueError, types.as_type, 'Dictionary(,)')
     self.assertRaises(ValueError, types.as_type, 'Dictionary(,string)')
     self.assertRaises(ValueError, types.as_type, 'Dictionary(int,string))')
예제 #28
0
    def __init__(self, rpc_connection, stream_connection):
        self._types = Types()
        self._rpc_connection = rpc_connection
        self._rpc_connection_lock = threading.Lock()
        self._stream_connection = stream_connection
        self._request_type = self._types.as_type('KRPC.Request')
        self._response_type = self._types.as_type('KRPC.Response')

        # Set up the main KRPC service
        self.krpc = KRPC(self)

        services = self.krpc.get_services().services

        # Create class types
        #TODO: is this needed?!?
        #for service in services:
        #    for procedure in service.procedures:
        #        try:
        #            name = Attributes.get_class_name(procedure.attributes)
        #            self._types.as_type('Class(' + service.name + '.' + name + ')')
        #        except ValueError:
        #            pass

        # Set up services
        for service in services:
            if service.name != 'KRPC':
                setattr(self, _to_snake_case(service.name),
                        create_service(self, service))

        # Set up stream update thread
        if stream_connection is not None:
            self._stream_thread_stop = threading.Event()
            self._stream_thread = threading.Thread(
                target=krpc.stream.update_thread,
                args=(stream_connection, self._stream_thread_stop))
            self._stream_thread.daemon = True
            self._stream_thread.start()
        else:
            self._stream_thread = None
예제 #29
0
    def test_coerce_to(self):
        types = Types()
        cases = [
            (42.0, 42, 'double'),
            (42.0, 42, 'float'),
            (42, 42.0, 'int32'),
            (42, 42L, 'int32'),
            (42L, 42.0, 'int64'),
            (42L, 42, 'int64'),
            (42, 42.0, 'uint32'),
            (42, 42L, 'uint32'),
            (42L, 42.0, 'uint64'),
            (42L, 42, 'uint64'),
            (list(), tuple(), 'List(string)'),
            ((0, 1, 2), [0, 1, 2], 'Tuple(int32,int32,int32)'),
            ([0, 1, 2], (0, 1, 2), 'List(int32)'),
        ]
        for expected, value, typ in cases:
            coerced_value = types.coerce_to(value, types.as_type(typ))
            self.assertEqual(expected, coerced_value)
            self.assertEqual(type(expected), type(coerced_value))

        self.assertEqual(['foo', 'bar'],
                         types.coerce_to(['foo', 'bar'],
                                         types.as_type('List(string)')))

        self.assertRaises(ValueError, types.coerce_to, None,
                          types.as_type('float'))
        self.assertRaises(ValueError, types.coerce_to, '',
                          types.as_type('float'))
        self.assertRaises(ValueError, types.coerce_to, True,
                          types.as_type('float'))

        self.assertRaises(ValueError, types.coerce_to, list(),
                          types.as_type('Tuple(int32)'))
        self.assertRaises(ValueError, types.coerce_to, ["foo", 2],
                          types.as_type('Tuple(string)'))
        self.assertRaises(ValueError, types.coerce_to, [1],
                          types.as_type('Tuple(string)'))
예제 #30
0
class TestDecoder(unittest.TestCase):
    types = Types()

    def test_guid(self):
        self.assertEqual(
            '6f271b39-00dd-4de4-9732-f0d3a68838df',
            Decoder.guid(unhexlify('391b276fdd00e44d9732f0d3a68838df')))

    def test_decode_value(self):
        value = Decoder.decode(unhexlify('ac02'), self.types.uint32_type)
        self.assertEqual(int(300), value)

    def test_decode_unicode_string(self):
        value = Decoder.decode(unhexlify('03e284a2'), self.types.string_type)
        self.assertEqual(b'\xe2\x84\xa2'.decode('utf-8'), value)

    def test_message_size(self):
        message = '1c'
        size = Decoder.decode_message_size(unhexlify(message))
        self.assertEqual(28, size)

    def test_decode_message(self):
        message = '0a0b536572766963654e616d65120d50726f6365647572654e616d65'
        call = Decoder.decode(unhexlify(message),
                              self.types.procedure_call_type)
        self.assertEqual('ServiceName', call.service)
        self.assertEqual('ProcedureName', call.procedure)

    def test_decode_class(self):
        typ = self.types.class_type('ServiceName', 'ClassName')
        value = Decoder.decode(unhexlify('ac02'), typ)
        self.assertTrue(isinstance(value, typ.python_type))
        self.assertEqual(300, value._object_id)

    def test_decode_class_none(self):
        typ = self.types.class_type('ServiceName', 'ClassName')
        value = Decoder.decode(unhexlify('00'), typ)
        self.assertIsNone(value)