[ https://issues.apache.org/jira/browse/THRIFT-3770?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15231756#comment-15231756 ]
ASF GitHub Bot commented on THRIFT-3770: ---------------------------------------- Github user nsuke commented on a diff in the pull request: https://github.com/apache/thrift/pull/972#discussion_r58987066 --- Diff: test/py/TestAsyncioClient.py --- @@ -0,0 +1,350 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +import asyncio +import os +import ssl +import sys +import time +import unittest +from optparse import OptionParser + +from util import local_libpath + +SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__)) + + +def async_test(f): + def wrapper(*args, **kwargs): + coro = asyncio.coroutine(f) + future = coro(*args, **kwargs) + loop = asyncio.get_event_loop() + loop.run_until_complete(future) + return wrapper + + +class AbstractTest(unittest.TestCase): + @async_test + def setUp(self): + if options.ssl: + ssl_ctx = ssl.create_default_context() + ssl_ctx.check_hostname = False + ssl_ctx.verify_mode = ssl.CERT_NONE + else: + ssl_ctx = None + + if options.trans == 'framed': + self.transport = \ + yield from TAsyncio.TAsyncioFramedTransport.connect( + options.host, options.port, ssl=ssl_ctx) + elif options.trans == 'buffered': + self.transport = \ + yield from TAsyncio.TAsyncioBufferedTransport.connect( + options.host, options.port, ssl=ssl_ctx) + elif options.trans == '': + raise AssertionError('Unknown --transport option: %s' % options.trans) + if options.zlib: + self.transport = TAsyncio.TAsyncioZlibTransport(self.transport, 9) + self.transport.open() + protocol = self.get_protocol(self.transport) + self.client = ThriftTest.Client(protocol) + + def tearDown(self): + self.transport.close() + + @async_test + def testVoid(self): + print('testVoid') + yield from self.client.testVoid() + + @async_test + def testString(self): + print('testString') + self.assertEqual((yield from self.client.testString('Python' * 20)), 'Python' * 20) + self.assertEqual((yield from self.client.testString('')), '') + s1 = u'\b\t\n/\\\\\r{}:パイソン"' + s2 = u"""Afrikaans, Alemannisch, Aragonés, العربية, مصرى, + Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška, + Беларуская, Беларуская (тарашкевіца), Български, Bamanankan, + বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн, + Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg, + Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English, + Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt, + Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego, + Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski, + Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia, + Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa, + ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар, + Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino, + Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa + Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, مازِرونی, Bahasa + Melayu, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, + Norsk (nynorsk), Norsk (bokmål), Nouormand, Diné bizaad, + Occitan, Иронау, Papiamentu, Deitsch, Polski, پنجابی, پښتو, + Norfuk / Pitkern, Português, Runa Simi, Rumantsch, Romani, Română, + Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple + English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk, + Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog, + Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük, + Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文, + Bân-lâm-gú, 粵語""" + self.assertEqual((yield from self.client.testString(s1)), s1) + self.assertEqual((yield from self.client.testString(s2)), s2) + + @async_test + def testBool(self): + print('testBool') + self.assertEqual((yield from self.client.testBool(True)), True) + self.assertEqual((yield from self.client.testBool(False)), False) + + @async_test + def testByte(self): + print('testByte') + self.assertEqual((yield from self.client.testByte(63)), 63) + self.assertEqual((yield from self.client.testByte(-127)), -127) + + @async_test + def testI32(self): + print('testI32') + self.assertEqual((yield from self.client.testI32(-1)), -1) + self.assertEqual((yield from self.client.testI32(0)), 0) + + @async_test + def testI64(self): + print('testI64') + self.assertEqual((yield from self.client.testI64(1)), 1) + self.assertEqual((yield from self.client.testI64(-34359738368)), -34359738368) + + @async_test + def testDouble(self): + print('testDouble') + self.assertEqual((yield from self.client.testDouble(-5.235098235)), -5.235098235) + self.assertEqual((yield from self.client.testDouble(0)), 0) + self.assertEqual((yield from self.client.testDouble(-1)), -1) + self.assertEqual((yield from self.client.testDouble(-0.000341012439638598279)), -0.000341012439638598279) + + @async_test + def testBinary(self): + print('testBinary') + val = bytearray([i for i in range(0, 256)]) + self.assertEqual(bytearray((yield from self.client.testBinary(bytes(val)))), val) + + @async_test + def testStruct(self): + print('testStruct') + x = Xtruct() + x.string_thing = "Zero" + x.byte_thing = 1 + x.i32_thing = -3 + x.i64_thing = -5 + y = yield from self.client.testStruct(x) + self.assertEqual(y, x) + + @async_test + def testNest(self): + print('testNest') + inner = Xtruct(string_thing="Zero", byte_thing=1, i32_thing=-3, i64_thing=-5) + x = Xtruct2(struct_thing=inner, byte_thing=0, i32_thing=0) + y = yield from self.client.testNest(x) + self.assertEqual(y, x) + + @async_test + def testMap(self): + print('testMap') + x = {0: 1, 1: 2, 2: 3, 3: 4, -1: -2} + y = yield from self.client.testMap(x) + self.assertEqual(y, x) + + @async_test + def testSet(self): + print('testSet') + x = set([8, 1, 42]) + y = yield from self.client.testSet(x) + self.assertEqual(y, x) + + @async_test + def testList(self): + print('testList') + x = [1, 4, 9, -42] + y = yield from self.client.testList(x) + self.assertEqual(y, x) + + @async_test + def testEnum(self): + print('testEnum') + x = Numberz.FIVE + y = yield from self.client.testEnum(x) + self.assertEqual(y, x) + + @async_test + def testTypedef(self): + print('testTypedef') + x = 0xffffffffffffff # 7 bytes of 0xff + y = yield from self.client.testTypedef(x) + self.assertEqual(y, x) + + @async_test + def testMapMap(self): + print('testMapMap') + x = { + -4: {-4: -4, -3: -3, -2: -2, -1: -1}, + 4: {4: 4, 3: 3, 2: 2, 1: 1}, + } + y = yield from self.client.testMapMap(42) + self.assertEqual(y, x) + + @async_test + def testMulti(self): + print('testMulti') + xpected = Xtruct(string_thing='Hello2', byte_thing=74, i32_thing=0xff00ff, i64_thing=0xffffffffd0d0) + y = yield from self.client.testMulti(xpected.byte_thing, + xpected.i32_thing, + xpected.i64_thing, + {0: 'abc'}, + Numberz.FIVE, + 0xf0f0f0) + self.assertEqual(y, xpected) + + @async_test + def testException(self): + print('testException') + yield from self.client.testException('Safe') + try: + yield from self.client.testException('Xception') + self.fail("should have gotten exception") + except Xception as x: + self.assertEqual(x.errorCode, 1001) + self.assertEqual(x.message, 'Xception') + # TODO ensure same behavior for repr within generated python variants + # ensure exception's repr method works + # x_repr = repr(x) + # self.assertEqual(x_repr, 'Xception(errorCode=1001, message=\'Xception\')') + + try: + yield from self.client.testException('TException') + self.fail("should have gotten exception") + except TException as x: + pass + + # Should not throw + yield from self.client.testException('success') + + @async_test + def testMultiException(self): + print('testMultiException') + try: + yield from self.client.testMultiException('Xception', 'ignore') + except Xception as ex: + self.assertEqual(ex.errorCode, 1001) + self.assertEqual(ex.message, 'This is an Xception') + + try: + yield from self.client.testMultiException('Xception2', 'ignore') + except Xception2 as ex: + self.assertEqual(ex.errorCode, 2002) + self.assertEqual(ex.struct_thing.string_thing, 'This is an Xception2') + + y = yield from self.client.testMultiException('success', 'foobar') + self.assertEqual(y.string_thing, 'foobar') + + @async_test + def testOneway(self): + print('testOneway') + start = time.time() + yield from self.client.testOneway(1) # type is int, not float + end = time.time() + self.assertTrue(end - start < 3, + "oneway sleep took %f sec" % (end - start)) --- End diff -- It seems rather an issue of original test code, but 3 seconds are way too large for this test to make any sense. Something like 200 ms should be enough. > Support Python 3.4+ asyncio support > ----------------------------------- > > Key: THRIFT-3770 > URL: https://issues.apache.org/jira/browse/THRIFT-3770 > Project: Thrift > Issue Type: Bug > Components: Python - Compiler, Python - Library > Affects Versions: 1.0 > Reporter: Vadim Markovtsev > Priority: Minor > Labels: features > > Currently, Tornado and Twisted async engines are supported in client lib and > the compiler. asyncio is a relatively new engine which is included into > Python 3.4+ standard library. It is gaining popularity fast. -- This message was sent by Atlassian JIRA (v6.3.4#6332)