blob: 0ee0a9b85a088ddc9c3a5852c0d0806f7f8488e0 [file] [log] [blame]
Chris Piro20c81ad2013-03-07 11:32:48 -05001#!/usr/bin/env python
2
3#
4# Licensed to the Apache Software Foundation (ASF) under one
5# or more contributor license agreements. See the NOTICE file
6# distributed with this work for additional information
7# regarding copyright ownership. The ASF licenses this file
8# to you under the Apache License, Version 2.0 (the
9# "License"); you may not use this file except in compliance
10# with the License. You may obtain a copy of the License at
11#
12# http://www.apache.org/licenses/LICENSE-2.0
13#
14# Unless required by applicable law or agreed to in writing,
15# software distributed under the License is distributed on an
16# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17# KIND, either express or implied. See the License for the
18# specific language governing permissions and limitations
19# under the License.
20#
21
22import datetime
23import glob
Roger Meierd52edba2014-08-07 17:03:47 +020024import os
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +090025import sys
Chris Piro20c81ad2013-03-07 11:32:48 -050026import time
27import unittest
28
Roger Meierd52edba2014-08-07 17:03:47 +020029basepath = os.path.abspath(os.path.dirname(__file__))
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090030sys.path.insert(0, basepath + '/gen-py.tornado')
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +090031sys.path.insert(0, glob.glob(os.path.join(basepath, '../../lib/py/build/lib*'))[0])
Chris Piro20c81ad2013-03-07 11:32:48 -050032
33try:
34 __import__('tornado')
35except ImportError:
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +090036 print("module `tornado` not found, skipping test")
Chris Piro20c81ad2013-03-07 11:32:48 -050037 sys.exit(0)
38
Roger Meierd52edba2014-08-07 17:03:47 +020039from tornado import gen
40from tornado.testing import AsyncTestCase, get_unused_port, gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -050041
42from thrift import TTornado
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +090043from thrift.Thrift import TApplicationException
Chris Piro20c81ad2013-03-07 11:32:48 -050044from thrift.protocol import TBinaryProtocol
45
46from ThriftTest import ThriftTest
Nobuaki Sukegawad479e232016-02-28 11:28:19 +090047from ThriftTest.ttypes import Xception, Xtruct
Chris Piro20c81ad2013-03-07 11:32:48 -050048
49
50class TestHandler(object):
51 def __init__(self, test_instance):
52 self.test_instance = test_instance
53
Roger Meierd52edba2014-08-07 17:03:47 +020054 def testVoid(self):
55 pass
Chris Piro20c81ad2013-03-07 11:32:48 -050056
Roger Meierd52edba2014-08-07 17:03:47 +020057 def testString(self, s):
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +090058 if s == 'unexpected_error':
59 raise Exception(s)
Roger Meierd52edba2014-08-07 17:03:47 +020060 return s
Chris Piro20c81ad2013-03-07 11:32:48 -050061
Roger Meierd52edba2014-08-07 17:03:47 +020062 def testByte(self, b):
63 return b
Chris Piro20c81ad2013-03-07 11:32:48 -050064
Roger Meierd52edba2014-08-07 17:03:47 +020065 def testI16(self, i16):
66 return i16
Chris Piro20c81ad2013-03-07 11:32:48 -050067
Roger Meierd52edba2014-08-07 17:03:47 +020068 def testI32(self, i32):
69 return i32
Chris Piro20c81ad2013-03-07 11:32:48 -050070
Roger Meierd52edba2014-08-07 17:03:47 +020071 def testI64(self, i64):
72 return i64
Chris Piro20c81ad2013-03-07 11:32:48 -050073
Roger Meierd52edba2014-08-07 17:03:47 +020074 def testDouble(self, dub):
75 return dub
Chris Piro20c81ad2013-03-07 11:32:48 -050076
Jens Geyer8bcfdd92014-12-14 03:14:26 +010077 def testBinary(self, thing):
78 return thing
79
Roger Meierd52edba2014-08-07 17:03:47 +020080 def testStruct(self, thing):
81 return thing
Chris Piro20c81ad2013-03-07 11:32:48 -050082
Roger Meierd52edba2014-08-07 17:03:47 +020083 def testException(self, s):
Chris Piro20c81ad2013-03-07 11:32:48 -050084 if s == 'Xception':
Elvis Pranskevichus9c439622019-12-11 16:47:52 -050085 raise Xception(1001, s)
Chris Piro20c81ad2013-03-07 11:32:48 -050086 elif s == 'throw_undeclared':
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +090087 raise ValueError('testing undeclared exception')
Chris Piro20c81ad2013-03-07 11:32:48 -050088
Roger Meierd52edba2014-08-07 17:03:47 +020089 def testOneway(self, seconds):
Chris Piro20c81ad2013-03-07 11:32:48 -050090 start = time.time()
Roger Meierd52edba2014-08-07 17:03:47 +020091
Chris Piro20c81ad2013-03-07 11:32:48 -050092 def fire_oneway():
93 end = time.time()
94 self.test_instance.stop((start, end, seconds))
95
Roger Meierd52edba2014-08-07 17:03:47 +020096 self.test_instance.io_loop.add_timeout(
Chris Piro20c81ad2013-03-07 11:32:48 -050097 datetime.timedelta(seconds=seconds),
98 fire_oneway)
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +090099 raise Exception('testing exception in oneway method')
Chris Piro20c81ad2013-03-07 11:32:48 -0500100
Roger Meierd52edba2014-08-07 17:03:47 +0200101 def testNest(self, thing):
102 return thing
Chris Piro20c81ad2013-03-07 11:32:48 -0500103
Roger Meierd52edba2014-08-07 17:03:47 +0200104 @gen.coroutine
105 def testMap(self, thing):
106 yield gen.moment
107 raise gen.Return(thing)
Chris Piro20c81ad2013-03-07 11:32:48 -0500108
Roger Meierd52edba2014-08-07 17:03:47 +0200109 def testSet(self, thing):
110 return thing
Chris Piro20c81ad2013-03-07 11:32:48 -0500111
Roger Meierd52edba2014-08-07 17:03:47 +0200112 def testList(self, thing):
113 return thing
Chris Piro20c81ad2013-03-07 11:32:48 -0500114
Roger Meierd52edba2014-08-07 17:03:47 +0200115 def testEnum(self, thing):
116 return thing
Chris Piro20c81ad2013-03-07 11:32:48 -0500117
Roger Meierd52edba2014-08-07 17:03:47 +0200118 def testTypedef(self, thing):
119 return thing
Chris Piro20c81ad2013-03-07 11:32:48 -0500120
121
122class ThriftTestCase(AsyncTestCase):
Chris Piro20c81ad2013-03-07 11:32:48 -0500123 def setUp(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200124 super(ThriftTestCase, self).setUp()
125
Chris Piro20c81ad2013-03-07 11:32:48 -0500126 self.port = get_unused_port()
Chris Piro20c81ad2013-03-07 11:32:48 -0500127
128 # server
129 self.handler = TestHandler(self)
130 self.processor = ThriftTest.Processor(self.handler)
131 self.pfactory = TBinaryProtocol.TBinaryProtocolFactory()
132
Roger Meierd52edba2014-08-07 17:03:47 +0200133 self.server = TTornado.TTornadoServer(self.processor, self.pfactory, io_loop=self.io_loop)
Chris Piro20c81ad2013-03-07 11:32:48 -0500134 self.server.bind(self.port)
135 self.server.start(1)
136
137 # client
Roger Meierd52edba2014-08-07 17:03:47 +0200138 transport = TTornado.TTornadoStreamTransport('localhost', self.port, io_loop=self.io_loop)
Chris Piro20c81ad2013-03-07 11:32:48 -0500139 pfactory = TBinaryProtocol.TBinaryProtocolFactory()
Roger Meierd52edba2014-08-07 17:03:47 +0200140 self.io_loop.run_sync(transport.open)
Chris Piro20c81ad2013-03-07 11:32:48 -0500141 self.client = ThriftTest.Client(transport, pfactory)
Chris Piro20c81ad2013-03-07 11:32:48 -0500142
Roger Meierd52edba2014-08-07 17:03:47 +0200143 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500144 def test_void(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200145 v = yield self.client.testVoid()
146 self.assertEqual(v, None)
Chris Piro20c81ad2013-03-07 11:32:48 -0500147
Roger Meierd52edba2014-08-07 17:03:47 +0200148 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500149 def test_string(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200150 v = yield self.client.testString('Python')
151 self.assertEqual(v, 'Python')
Chris Piro20c81ad2013-03-07 11:32:48 -0500152
Roger Meierd52edba2014-08-07 17:03:47 +0200153 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500154 def test_byte(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200155 v = yield self.client.testByte(63)
156 self.assertEqual(v, 63)
Chris Piro20c81ad2013-03-07 11:32:48 -0500157
Roger Meierd52edba2014-08-07 17:03:47 +0200158 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500159 def test_i32(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200160 v = yield self.client.testI32(-1)
161 self.assertEqual(v, -1)
Chris Piro20c81ad2013-03-07 11:32:48 -0500162
Roger Meierd52edba2014-08-07 17:03:47 +0200163 v = yield self.client.testI32(0)
164 self.assertEqual(v, 0)
Chris Piro20c81ad2013-03-07 11:32:48 -0500165
Roger Meierd52edba2014-08-07 17:03:47 +0200166 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500167 def test_i64(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200168 v = yield self.client.testI64(-34359738368)
169 self.assertEqual(v, -34359738368)
Chris Piro20c81ad2013-03-07 11:32:48 -0500170
Roger Meierd52edba2014-08-07 17:03:47 +0200171 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500172 def test_double(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200173 v = yield self.client.testDouble(-5.235098235)
174 self.assertEqual(v, -5.235098235)
Chris Piro20c81ad2013-03-07 11:32:48 -0500175
Roger Meierd52edba2014-08-07 17:03:47 +0200176 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500177 def test_struct(self):
178 x = Xtruct()
179 x.string_thing = "Zero"
180 x.byte_thing = 1
181 x.i32_thing = -3
182 x.i64_thing = -5
Roger Meierd52edba2014-08-07 17:03:47 +0200183 y = yield self.client.testStruct(x)
Chris Piro20c81ad2013-03-07 11:32:48 -0500184
Roger Meierd52edba2014-08-07 17:03:47 +0200185 self.assertEqual(y.string_thing, "Zero")
186 self.assertEqual(y.byte_thing, 1)
187 self.assertEqual(y.i32_thing, -3)
188 self.assertEqual(y.i64_thing, -5)
Chris Piro20c81ad2013-03-07 11:32:48 -0500189
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +0900190 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500191 def test_oneway(self):
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +0900192 self.client.testOneway(1)
193 v = yield self.client.testI32(-1)
194 self.assertEqual(v, -1)
Chris Piro20c81ad2013-03-07 11:32:48 -0500195
Roger Meierd52edba2014-08-07 17:03:47 +0200196 @gen_test
197 def test_map(self):
198 """
199 TestHandler.testMap is a coroutine, this test checks if gen.Return() from a coroutine works.
200 """
201 expected = {1: 1}
202 res = yield self.client.testMap(expected)
203 self.assertEqual(res, expected)
204
205 @gen_test
206 def test_exception(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200207 try:
208 yield self.client.testException('Xception')
209 except Xception as ex:
210 self.assertEqual(ex.errorCode, 1001)
211 self.assertEqual(ex.message, 'Xception')
212 else:
213 self.fail("should have gotten exception")
214 try:
215 yield self.client.testException('throw_undeclared')
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +0900216 except TApplicationException:
Roger Meierd52edba2014-08-07 17:03:47 +0200217 pass
218 else:
219 self.fail("should have gotten exception")
220
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +0900221 yield self.client.testException('Safe')
222
Chris Piro20c81ad2013-03-07 11:32:48 -0500223
224def suite():
225 suite = unittest.TestSuite()
226 loader = unittest.TestLoader()
227 suite.addTest(loader.loadTestsFromTestCase(ThriftTestCase))
228 return suite
229
230
231if __name__ == '__main__':
232 unittest.TestProgram(defaultTest='suite',
233 testRunner=unittest.TextTestRunner(verbosity=1))