blob: 447fde61b7e81921260d506ff1fb1a0c4cd7e2ac [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':
85 x = Xception()
86 x.errorCode = 1001
87 x.message = s
88 raise x
89 elif s == 'throw_undeclared':
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +090090 raise ValueError('testing undeclared exception')
Chris Piro20c81ad2013-03-07 11:32:48 -050091
Roger Meierd52edba2014-08-07 17:03:47 +020092 def testOneway(self, seconds):
Chris Piro20c81ad2013-03-07 11:32:48 -050093 start = time.time()
Roger Meierd52edba2014-08-07 17:03:47 +020094
Chris Piro20c81ad2013-03-07 11:32:48 -050095 def fire_oneway():
96 end = time.time()
97 self.test_instance.stop((start, end, seconds))
98
Roger Meierd52edba2014-08-07 17:03:47 +020099 self.test_instance.io_loop.add_timeout(
Chris Piro20c81ad2013-03-07 11:32:48 -0500100 datetime.timedelta(seconds=seconds),
101 fire_oneway)
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +0900102 raise Exception('testing exception in oneway method')
Chris Piro20c81ad2013-03-07 11:32:48 -0500103
Roger Meierd52edba2014-08-07 17:03:47 +0200104 def testNest(self, thing):
105 return thing
Chris Piro20c81ad2013-03-07 11:32:48 -0500106
Roger Meierd52edba2014-08-07 17:03:47 +0200107 @gen.coroutine
108 def testMap(self, thing):
109 yield gen.moment
110 raise gen.Return(thing)
Chris Piro20c81ad2013-03-07 11:32:48 -0500111
Roger Meierd52edba2014-08-07 17:03:47 +0200112 def testSet(self, thing):
113 return thing
Chris Piro20c81ad2013-03-07 11:32:48 -0500114
Roger Meierd52edba2014-08-07 17:03:47 +0200115 def testList(self, thing):
116 return thing
Chris Piro20c81ad2013-03-07 11:32:48 -0500117
Roger Meierd52edba2014-08-07 17:03:47 +0200118 def testEnum(self, thing):
119 return thing
Chris Piro20c81ad2013-03-07 11:32:48 -0500120
Roger Meierd52edba2014-08-07 17:03:47 +0200121 def testTypedef(self, thing):
122 return thing
Chris Piro20c81ad2013-03-07 11:32:48 -0500123
124
125class ThriftTestCase(AsyncTestCase):
Chris Piro20c81ad2013-03-07 11:32:48 -0500126 def setUp(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200127 super(ThriftTestCase, self).setUp()
128
Chris Piro20c81ad2013-03-07 11:32:48 -0500129 self.port = get_unused_port()
Chris Piro20c81ad2013-03-07 11:32:48 -0500130
131 # server
132 self.handler = TestHandler(self)
133 self.processor = ThriftTest.Processor(self.handler)
134 self.pfactory = TBinaryProtocol.TBinaryProtocolFactory()
135
Roger Meierd52edba2014-08-07 17:03:47 +0200136 self.server = TTornado.TTornadoServer(self.processor, self.pfactory, io_loop=self.io_loop)
Chris Piro20c81ad2013-03-07 11:32:48 -0500137 self.server.bind(self.port)
138 self.server.start(1)
139
140 # client
Roger Meierd52edba2014-08-07 17:03:47 +0200141 transport = TTornado.TTornadoStreamTransport('localhost', self.port, io_loop=self.io_loop)
Chris Piro20c81ad2013-03-07 11:32:48 -0500142 pfactory = TBinaryProtocol.TBinaryProtocolFactory()
Roger Meierd52edba2014-08-07 17:03:47 +0200143 self.io_loop.run_sync(transport.open)
Chris Piro20c81ad2013-03-07 11:32:48 -0500144 self.client = ThriftTest.Client(transport, pfactory)
Chris Piro20c81ad2013-03-07 11:32:48 -0500145
Roger Meierd52edba2014-08-07 17:03:47 +0200146 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500147 def test_void(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200148 v = yield self.client.testVoid()
149 self.assertEqual(v, None)
Chris Piro20c81ad2013-03-07 11:32:48 -0500150
Roger Meierd52edba2014-08-07 17:03:47 +0200151 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500152 def test_string(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200153 v = yield self.client.testString('Python')
154 self.assertEqual(v, 'Python')
Chris Piro20c81ad2013-03-07 11:32:48 -0500155
Roger Meierd52edba2014-08-07 17:03:47 +0200156 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500157 def test_byte(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200158 v = yield self.client.testByte(63)
159 self.assertEqual(v, 63)
Chris Piro20c81ad2013-03-07 11:32:48 -0500160
Roger Meierd52edba2014-08-07 17:03:47 +0200161 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500162 def test_i32(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200163 v = yield self.client.testI32(-1)
164 self.assertEqual(v, -1)
Chris Piro20c81ad2013-03-07 11:32:48 -0500165
Roger Meierd52edba2014-08-07 17:03:47 +0200166 v = yield self.client.testI32(0)
167 self.assertEqual(v, 0)
Chris Piro20c81ad2013-03-07 11:32:48 -0500168
Roger Meierd52edba2014-08-07 17:03:47 +0200169 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500170 def test_i64(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200171 v = yield self.client.testI64(-34359738368)
172 self.assertEqual(v, -34359738368)
Chris Piro20c81ad2013-03-07 11:32:48 -0500173
Roger Meierd52edba2014-08-07 17:03:47 +0200174 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500175 def test_double(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200176 v = yield self.client.testDouble(-5.235098235)
177 self.assertEqual(v, -5.235098235)
Chris Piro20c81ad2013-03-07 11:32:48 -0500178
Roger Meierd52edba2014-08-07 17:03:47 +0200179 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500180 def test_struct(self):
181 x = Xtruct()
182 x.string_thing = "Zero"
183 x.byte_thing = 1
184 x.i32_thing = -3
185 x.i64_thing = -5
Roger Meierd52edba2014-08-07 17:03:47 +0200186 y = yield self.client.testStruct(x)
Chris Piro20c81ad2013-03-07 11:32:48 -0500187
Roger Meierd52edba2014-08-07 17:03:47 +0200188 self.assertEqual(y.string_thing, "Zero")
189 self.assertEqual(y.byte_thing, 1)
190 self.assertEqual(y.i32_thing, -3)
191 self.assertEqual(y.i64_thing, -5)
Chris Piro20c81ad2013-03-07 11:32:48 -0500192
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +0900193 @gen_test
Chris Piro20c81ad2013-03-07 11:32:48 -0500194 def test_oneway(self):
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +0900195 self.client.testOneway(1)
196 v = yield self.client.testI32(-1)
197 self.assertEqual(v, -1)
Chris Piro20c81ad2013-03-07 11:32:48 -0500198
Roger Meierd52edba2014-08-07 17:03:47 +0200199 @gen_test
200 def test_map(self):
201 """
202 TestHandler.testMap is a coroutine, this test checks if gen.Return() from a coroutine works.
203 """
204 expected = {1: 1}
205 res = yield self.client.testMap(expected)
206 self.assertEqual(res, expected)
207
208 @gen_test
209 def test_exception(self):
Roger Meierd52edba2014-08-07 17:03:47 +0200210 try:
211 yield self.client.testException('Xception')
212 except Xception as ex:
213 self.assertEqual(ex.errorCode, 1001)
214 self.assertEqual(ex.message, 'Xception')
215 else:
216 self.fail("should have gotten exception")
217 try:
218 yield self.client.testException('throw_undeclared')
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +0900219 except TApplicationException:
Roger Meierd52edba2014-08-07 17:03:47 +0200220 pass
221 else:
222 self.fail("should have gotten exception")
223
Nobuaki Sukegawa66c3dbf2016-02-10 19:37:26 +0900224 yield self.client.testException('Safe')
225
Chris Piro20c81ad2013-03-07 11:32:48 -0500226
227def suite():
228 suite = unittest.TestSuite()
229 loader = unittest.TestLoader()
230 suite.addTest(loader.loadTestsFromTestCase(ThriftTestCase))
231 return suite
232
233
234if __name__ == '__main__':
235 unittest.TestProgram(defaultTest='suite',
236 testRunner=unittest.TextTestRunner(verbosity=1))