blob: 32d1c2e57580f8f98672553594a7a7062ac837aa [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
24import sys
Roger Meierd52edba2014-08-07 17:03:47 +020025import os
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
43from thrift.protocol import TBinaryProtocol
Roger Meierd52edba2014-08-07 17:03:47 +020044from thrift.transport.TTransport import TTransportException
Chris Piro20c81ad2013-03-07 11:32:48 -050045
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):
58 return s
Chris Piro20c81ad2013-03-07 11:32:48 -050059
Roger Meierd52edba2014-08-07 17:03:47 +020060 def testByte(self, b):
61 return b
Chris Piro20c81ad2013-03-07 11:32:48 -050062
Roger Meierd52edba2014-08-07 17:03:47 +020063 def testI16(self, i16):
64 return i16
Chris Piro20c81ad2013-03-07 11:32:48 -050065
Roger Meierd52edba2014-08-07 17:03:47 +020066 def testI32(self, i32):
67 return i32
Chris Piro20c81ad2013-03-07 11:32:48 -050068
Roger Meierd52edba2014-08-07 17:03:47 +020069 def testI64(self, i64):
70 return i64
Chris Piro20c81ad2013-03-07 11:32:48 -050071
Roger Meierd52edba2014-08-07 17:03:47 +020072 def testDouble(self, dub):
73 return dub
Chris Piro20c81ad2013-03-07 11:32:48 -050074
Jens Geyer8bcfdd92014-12-14 03:14:26 +010075 def testBinary(self, thing):
76 return thing
77
Roger Meierd52edba2014-08-07 17:03:47 +020078 def testStruct(self, thing):
79 return thing
Chris Piro20c81ad2013-03-07 11:32:48 -050080
Roger Meierd52edba2014-08-07 17:03:47 +020081 def testException(self, s):
Chris Piro20c81ad2013-03-07 11:32:48 -050082 if s == 'Xception':
83 x = Xception()
84 x.errorCode = 1001
85 x.message = s
86 raise x
87 elif s == 'throw_undeclared':
88 raise ValueError("foo")
Chris Piro20c81ad2013-03-07 11:32:48 -050089
Roger Meierd52edba2014-08-07 17:03:47 +020090 def testOneway(self, seconds):
Chris Piro20c81ad2013-03-07 11:32:48 -050091 start = time.time()
Roger Meierd52edba2014-08-07 17:03:47 +020092
Chris Piro20c81ad2013-03-07 11:32:48 -050093 def fire_oneway():
94 end = time.time()
95 self.test_instance.stop((start, end, seconds))
96
Roger Meierd52edba2014-08-07 17:03:47 +020097 self.test_instance.io_loop.add_timeout(
Chris Piro20c81ad2013-03-07 11:32:48 -050098 datetime.timedelta(seconds=seconds),
99 fire_oneway)
100
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
190 def test_oneway(self):
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900191 self.client.testOneway(0)
Chris Piro20c81ad2013-03-07 11:32:48 -0500192 start, end, seconds = self.wait(timeout=1)
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900193 self.assertAlmostEqual(seconds, (end - start), places=3)
Chris Piro20c81ad2013-03-07 11:32:48 -0500194
Roger Meierd52edba2014-08-07 17:03:47 +0200195 @gen_test
196 def test_map(self):
197 """
198 TestHandler.testMap is a coroutine, this test checks if gen.Return() from a coroutine works.
199 """
200 expected = {1: 1}
201 res = yield self.client.testMap(expected)
202 self.assertEqual(res, expected)
203
204 @gen_test
205 def test_exception(self):
206 yield self.client.testException('Safe')
207
208 try:
209 yield self.client.testException('Xception')
210 except Xception as ex:
211 self.assertEqual(ex.errorCode, 1001)
212 self.assertEqual(ex.message, 'Xception')
213 else:
214 self.fail("should have gotten exception")
215 try:
216 yield self.client.testException('throw_undeclared')
217 except TTransportException as ex:
218 pass
219 else:
220 self.fail("should have gotten exception")
221
Chris Piro20c81ad2013-03-07 11:32:48 -0500222
223def suite():
224 suite = unittest.TestSuite()
225 loader = unittest.TestLoader()
226 suite.addTest(loader.loadTestsFromTestCase(ThriftTestCase))
227 return suite
228
229
230if __name__ == '__main__':
231 unittest.TestProgram(defaultTest='suite',
232 testRunner=unittest.TextTestRunner(verbosity=1))