def setUp(self):
        self.d = RPCDispatcher()

        def add(a, b):
            return a + b

        self.add = add

        def kwargstest(a, b, **kwargs):
            if kwargs.get('c', None) is not None:
                return True
            return False

        self.kwargstest = kwargstest

        def testBin():
            return Binary(BINARY_STRING)

        self.testBin = testBin
    def setUp(self):
        self.d = RPCDispatcher()

        def add(a, b):
            return a + b

        self.add = add

        def kwargstest(a, b, **kwargs):
            if kwargs.get('c', None) is not None:
                return True
            return False

        self.kwargstest = kwargstest

        def testBin():
            return Binary(BINARY_STRING)
        self.testBin = testBin
class TestRPCDispatcher(unittest.TestCase):
    def setUp(self):
        self.d = RPCDispatcher()

        def add(a, b):
            return a + b

        self.add = add

        def kwargstest(a, b, **kwargs):
            if kwargs.get('c', None) is not None:
                return True
            return False

        self.kwargstest = kwargstest

        def testBin():
            return Binary(BINARY_STRING)

        self.testBin = testBin

    def test_rpcfault(self):
        try:
            self.d.system_methodhelp('method.DoesNotExist.AtAll')
            self.fail('method not exists fault expected!')
        except Fault:
            pass

        try:
            self.d.system_methodsignature('method.DoesNotExist.AtAll')
            self.fail('method not exists fault expected!')
        except Fault:
            pass

    def test_listmethods(self):
        resp = self.d.system_listmethods()
        self.assertEqual(resp, [
            'system.describe', 'system.listMethods', 'system.methodHelp',
            'system.methodSignature'
        ])

        self.d.register_method(self.add)
        resp = self.d.system_listmethods()
        self.assertEqual(resp, [
            'add', 'system.describe', 'system.listMethods',
            'system.methodHelp', 'system.methodSignature'
        ])

    def test_methodhelp(self):
        resp = self.d.system_methodhelp('system.methodHelp')
        self.assertEqual(resp, 'Returns documentation for a specified method')

    def test_methodsignature(self):
        resp = self.d.system_methodsignature('system.listMethods')
        self.assertEqual(resp, ['array'])

        resp = self.d.system_methodsignature('system.methodSignature')
        self.assertEqual(resp, ['array', 'string'])

    def test_xmlrpc_call(self):
        xml = '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName><params></params></methodCall>'
        expresp = "<?xml version='1.0'?><methodResponse><params><param><value><array><data><value><string>system.describe</string></value><value><string>system.listMethods</string></value><value><string>system.methodHelp</string></value><value><string>system.methodSignature</string></value></data></array></value></param></params></methodResponse>"
        resp = self.d.xmldispatch(xml.encode('utf-8'))
        self.assertEqual(resp.replace('\n', ''), expresp)

    def test_unicode_call(self):
        self.d.register_method(self.add)
        s1 = u'は'
        s2 = u'じめまして'
        xml = u'<?xml version="1.0"?><methodCall><methodName>add</methodName><params><param><value><string>%s</string></value></param><param><value><string>%s</string></value></param></params></methodCall>' % (
            s1, s2)
        resp = self.d.xmldispatch(xml.encode('utf-8'))
        dom = parseString(resp)
        retval = dom.getElementsByTagName('string')[0].firstChild.data
        self.assertEqual(retval, u'はじめまして')

    def test_base64_call(self):
        self.d.register_method(self.testBin)

        xml = '<?xml version="1.0"?><methodCall><methodName>testBin</methodName><params></params></methodCall>'
        resp = self.d.xmldispatch(xml.encode('utf-8'))
        dom = parseString(resp)
        retval = dom.getElementsByTagName('base64')[0].firstChild.data
        self.assertEqual(base64.b64decode(retval), BINARY_STRING)

    def test_jsonrpc_call(self):
        jsontxt = '{"params":[],"method":"system.listMethods","id":1}'
        resp = self.d.jsondispatch(jsontxt.encode('utf-8'))
        jsondict = json.loads(resp)
        self.assertTrue(jsondict['error'] is None)
        self.assertEqual(jsondict['id'], 1)
        self.assertTrue(isinstance(jsondict['result'], list))

    def test_register_method(self):
        self.d.register_method(self.add)

        jsontxt = '{"params":[1,2],"method":"add","id":1}'
        resp = self.d.jsondispatch(jsontxt.encode('utf-8'))
        jsondict = json.loads(resp)
        self.assertTrue(jsondict['error'] is None)
        self.assertEqual(jsondict['id'], 1)
        self.assertEqual(jsondict['result'], 3)

    def test_kwargs(self):
        self.d.register_method(self.kwargstest)

        jsontxt = '{"params":[1,2],"method":"kwargstest","id":1}'
        resp = self.d.jsondispatch(jsontxt.encode('utf-8'))
        jsondict = json.loads(resp)
        self.assertFalse(jsondict['result'])

        resp = self.d.jsondispatch(jsontxt.encode('utf-8'), c=1)
        jsondict = json.loads(resp)
        self.assertTrue(jsondict['result'])
class TestRPCDispatcher(unittest.TestCase):
    def setUp(self):
        self.d = RPCDispatcher()

        def add(a, b):
            return a + b

        self.add = add

        def kwargstest(a, b, **kwargs):
            if kwargs.get('c', None) is not None:
                return True
            return False

        self.kwargstest = kwargstest

        def testBin():
            return Binary(BINARY_STRING)
        self.testBin = testBin

    def test_rpcfault(self):
        try:
            self.d.system_methodhelp('method.DoesNotExist.AtAll')
            self.fail('method not exists fault expected!')
        except Fault:
            pass

        try:
            self.d.system_methodsignature('method.DoesNotExist.AtAll')
            self.fail('method not exists fault expected!')
        except Fault:
            pass

    def test_listmethods(self):
        resp = self.d.system_listmethods()
        self.assertEqual(resp, ['system.describe', 'system.listMethods', 'system.methodHelp', 'system.methodSignature', 'system.multicall'])

        self.d.register_method(self.add)
        resp = self.d.system_listmethods()
        self.assertEqual(resp, ['add', 'system.describe', 'system.listMethods', 'system.methodHelp', 'system.methodSignature', 'system.multicall'])

    def test_methodhelp(self):
        resp = self.d.system_methodhelp('system.methodHelp')
        self.assertEqual(resp, 'Returns documentation for a specified method')

    def test_methodsignature(self):
        resp = self.d.system_methodsignature('system.listMethods')
        self.assertEqual(resp, ['array'])

        resp = self.d.system_methodsignature('system.methodSignature')
        self.assertEqual(resp, ['array', 'string'])

    def test_xmlrpc_call(self):
        xml = '<?xml version="1.0"?><methodCall><methodName>system.listMethods</methodName><params></params></methodCall>'
        expresp = "<?xml version='1.0'?><methodResponse><params><param><value><array><data><value><string>system.describe</string></value><value><string>system.listMethods</string></value><value><string>system.methodHelp</string></value><value><string>system.methodSignature</string></value><value><string>system.multicall</string></value></data></array></value></param></params></methodResponse>"
        resp = self.d.xmldispatch(xml.encode('utf-8'))
        self.assertEqual(resp.replace('\n', ''), expresp)

    def test_unicode_call(self):
        self.d.register_method(self.add)
        s1 = u'は'
        s2 = u'じめまして'
        xml = u'<?xml version="1.0"?><methodCall><methodName>add</methodName><params><param><value><string>%s</string></value></param><param><value><string>%s</string></value></param></params></methodCall>' % (s1, s2)
        resp = self.d.xmldispatch(xml.encode('utf-8'))
        dom = parseString(resp)
        retval = dom.getElementsByTagName('string')[0].firstChild.data
        self.assertEqual(retval, u'はじめまして')

    def test_base64_call(self):
        self.d.register_method(self.testBin)

        xml = '<?xml version="1.0"?><methodCall><methodName>testBin</methodName><params></params></methodCall>'
        resp = self.d.xmldispatch(xml.encode('utf-8'))
        dom = parseString(resp)
        retval = dom.getElementsByTagName('base64')[0].firstChild.data
        self.assertEqual(base64.b64decode(retval), BINARY_STRING)

    def test_jsonrpc_call(self):
        jsontxt = '{"params":[],"method":"system.listMethods","id":1}'
        resp = self.d.jsondispatch(jsontxt.encode('utf-8'))
        jsondict = json.loads(resp)
        self.assertTrue('error' not in jsondict)
        self.assertEqual(jsondict['id'], 1)
        self.assertTrue(isinstance(jsondict['result'], list))

    def test_register_method(self):
        self.d.register_method(self.add)

        jsontxt = '{"params":[1,2],"method":"add","id":1}'
        resp = self.d.jsondispatch(jsontxt.encode('utf-8'))
        jsondict = json.loads(resp)
        self.assertTrue('error' not in jsondict)
        self.assertEqual(jsondict['id'], 1)
        self.assertEqual(jsondict['result'], 3)

    def test_kwargs(self):
        self.d.register_method(self.kwargstest)

        jsontxt = '{"params":[1,2],"method":"kwargstest","id":1}'
        resp = self.d.jsondispatch(jsontxt.encode('utf-8'))
        jsondict = json.loads(resp)
        self.assertFalse(jsondict['result'])

        resp = self.d.jsondispatch(jsontxt.encode('utf-8'), c=1)
        jsondict = json.loads(resp)
        self.assertTrue(jsondict['result'])
        
    def test_multicall(self):
        self.d.register_method(self.add)
        class Request:
            content_type = 'text/xml'
        request = Request 
        
        marshalled_list = [
            {'methodName' : 'add', 'params' : (1,2)},
            {'methodName' : 'add', 'params' : (2,3)},
        ]
        xml = dumps((marshalled_list,), 'system.multicall')
        ret = self.d.xmldispatch(xml.encode('utf-8'),request=request)
        out, name = loads(ret)
        self.assertEqual(out[0][0][0],3)
        self.assertEqual(out[0][1][0],5)

        request.content_type = 'json' 
        
        call = {'method':'system.multicall','params':[marshalled_list],'id':1}
        jsontxt = json.dumps(call)
        resp = self.d.jsondispatch(jsontxt.encode('utf-8'),request=request)
        jsondict = json.loads(resp)
        self.assertEqual(jsondict['result'][0], 3)
        self.assertEqual(jsondict['result'][1], 5)