[ 
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)

Reply via email to