blob: cc9185cfe7e69ef2eccab8d9285c799326fb5eef [file] [log] [blame]
Mark Slee57cc25e2007-02-28 21:43:54 +00001#!/usr/bin/env python
Nobuaki Sukegawa64b8f6c2015-10-10 02:12:48 +09002# -*- coding: utf-8 -*-
David Reissea2cba82009-03-30 21:35:00 +00003#
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
Jens Geyerd629ea02015-09-23 21:16:50 +020022import os
23import sys
Mark Slee57cc25e2007-02-28 21:43:54 +000024import time
Jens Geyerd629ea02015-09-23 21:16:50 +020025import unittest
Mark Slee57cc25e2007-02-28 21:43:54 +000026
James E. King III84d9cd22019-01-31 11:47:58 -050027from optparse import OptionParser
Nobuaki Sukegawa7af189a2016-02-11 16:21:01 +090028from util import local_libpath
29
James E. King III84d9cd22019-01-31 11:47:58 -050030sys.path.insert(0, local_libpath())
31
32from thrift.protocol import TProtocolDecorator
33from thrift.protocol import TProtocol
34
Nobuaki Sukegawaa185d7e2015-11-06 21:24:24 +090035SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
Roger Meierf4eec7a2011-09-11 18:16:21 +000036
Jens Geyerd629ea02015-09-23 21:16:50 +020037
Mark Slee5299a952007-10-05 00:13:24 +000038class AbstractTest(unittest.TestCase):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090039 def setUp(self):
James E. King III6f8c99e2018-03-24 16:32:02 -040040 if options.trans == 'http':
41 uri = '{0}://{1}:{2}{3}'.format(('https' if options.ssl else 'http'),
42 options.host,
43 options.port,
44 (options.http_path if options.http_path else '/'))
45 if options.ssl:
46 __cafile = os.path.join(os.path.dirname(SCRIPT_DIR), "keys", "CA.pem")
47 __certfile = os.path.join(os.path.dirname(SCRIPT_DIR), "keys", "client.crt")
48 __keyfile = os.path.join(os.path.dirname(SCRIPT_DIR), "keys", "client.key")
49 self.transport = THttpClient.THttpClient(uri, cafile=__cafile, cert_file=__certfile, key_file=__keyfile)
50 else:
51 self.transport = THttpClient.THttpClient(uri)
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090052 else:
53 if options.ssl:
54 from thrift.transport import TSSLSocket
55 socket = TSSLSocket.TSSLSocket(options.host, options.port, validate=False)
56 else:
57 socket = TSocket.TSocket(options.host, options.port)
58 # frame or buffer depending upon args
59 self.transport = TTransport.TBufferedTransport(socket)
60 if options.trans == 'framed':
61 self.transport = TTransport.TFramedTransport(socket)
62 elif options.trans == 'buffered':
63 self.transport = TTransport.TBufferedTransport(socket)
64 elif options.trans == '':
65 raise AssertionError('Unknown --transport option: %s' % options.trans)
66 if options.zlib:
67 self.transport = TZlibTransport.TZlibTransport(self.transport, 9)
68 self.transport.open()
69 protocol = self.get_protocol(self.transport)
70 self.client = ThriftTest.Client(protocol)
James E. King III20685442018-04-10 10:30:51 -040071 # for multiplexed services:
72 protocol2 = self.get_protocol2(self.transport)
73 self.client2 = SecondService.Client(protocol2) if protocol2 is not None else None
David Reiss0c90f6f2008-02-06 22:18:40 +000074
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090075 def tearDown(self):
76 self.transport.close()
Mark Sleefc89d392006-09-04 00:04:39 +000077
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090078 def testVoid(self):
79 print('testVoid')
80 self.client.testVoid()
David Reiss0c90f6f2008-02-06 22:18:40 +000081
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090082 def testString(self):
83 print('testString')
84 self.assertEqual(self.client.testString('Python' * 20), 'Python' * 20)
85 self.assertEqual(self.client.testString(''), '')
86 s1 = u'\b\t\n/\\\\\r{}:パイソン"'
87 s2 = u"""Afrikaans, Alemannisch, Aragonés, العربية, مصرى,
Nobuaki Sukegawa64b8f6c2015-10-10 02:12:48 +090088 Asturianu, Aymar aru, Azərbaycan, Башҡорт, Boarisch, Žemaitėška,
89 Беларуская, Беларуская (тарашкевіца), Български, Bamanankan,
90 বাংলা, Brezhoneg, Bosanski, Català, Mìng-dĕ̤ng-ngṳ̄, Нохчийн,
91 Cebuano, ᏣᎳᎩ, Česky, Словѣ́ньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ, Чӑвашла, Cymraeg,
92 Dansk, Zazaki, ދިވެހިބަސް, Ελληνικά, Emiliàn e rumagnòl, English,
93 Esperanto, Español, Eesti, Euskara, فارسی, Suomi, Võro, Føroyskt,
94 Français, Arpetan, Furlan, Frysk, Gaeilge, 贛語, Gàidhlig, Galego,
95 Avañe'ẽ, ગુજરાતી, Gaelg, עברית, हिन्दी, Fiji Hindi, Hrvatski,
96 Kreyòl ayisyen, Magyar, Հայերեն, Interlingua, Bahasa Indonesia,
97 Ilokano, Ido, Íslenska, Italiano, 日本語, Lojban, Basa Jawa,
98 ქართული, Kongo, Kalaallisut, ಕನ್ನಡ, 한국어, Къарачай-Малкъар,
99 Ripoarisch, Kurdî, Коми, Kernewek, Кыргызча, Latina, Ladino,
100 Lëtzebuergesch, Limburgs, Lingála, ລາວ, Lietuvių, Latviešu, Basa
101 Banyumasan, Malagasy, Македонски, മലയാളം, मराठी, مازِرونی, Bahasa
102 Melayu, Nnapulitano, Nedersaksisch, नेपाल भाषा, Nederlands, ‪
103 Norsk (nynorsk)‬, ‪Norsk (bokmål)‬, Nouormand, Diné bizaad,
104 Occitan, Иронау, Papiamentu, Deitsch, Polski, پنجابی, پښتو,
105 Norfuk / Pitkern, Português, Runa Simi, Rumantsch, Romani, Română,
106 Русский, Саха тыла, Sardu, Sicilianu, Scots, Sámegiella, Simple
107 English, Slovenčina, Slovenščina, Српски / Srpski, Seeltersk,
108 Svenska, Kiswahili, தமிழ், తెలుగు, Тоҷикӣ, ไทย, Türkmençe, Tagalog,
109 Türkçe, Татарча/Tatarça, Українська, اردو, Tiếng Việt, Volapük,
110 Walon, Winaray, 吴语, isiXhosa, ייִדיש, Yorùbá, Zeêuws, 中文,
111 Bân-lâm-gú, 粵語"""
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900112 if sys.version_info[0] == 2 and os.environ.get('THRIFT_TEST_PY_NO_UTF8STRINGS'):
113 s1 = s1.encode('utf8')
114 s2 = s2.encode('utf8')
115 self.assertEqual(self.client.testString(s1), s1)
116 self.assertEqual(self.client.testString(s2), s2)
Mark Sleec9676562006-09-05 17:34:52 +0000117
James E. King III20685442018-04-10 10:30:51 -0400118 def testMultiplexed(self):
119 if self.client2 is not None:
120 print('testMultiplexed')
121 self.assertEqual(self.client2.secondtestString('foobar'), 'testString("foobar")')
122
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900123 def testBool(self):
124 print('testBool')
125 self.assertEqual(self.client.testBool(True), True)
126 self.assertEqual(self.client.testBool(False), False)
Nobuaki Sukegawaa649e742015-09-21 13:53:25 +0900127
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900128 def testByte(self):
129 print('testByte')
130 self.assertEqual(self.client.testByte(63), 63)
131 self.assertEqual(self.client.testByte(-127), -127)
Mark Sleec98d0502006-09-06 02:42:25 +0000132
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900133 def testI32(self):
134 print('testI32')
135 self.assertEqual(self.client.testI32(-1), -1)
136 self.assertEqual(self.client.testI32(0), 0)
Mark Sleec9676562006-09-05 17:34:52 +0000137
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900138 def testI64(self):
139 print('testI64')
140 self.assertEqual(self.client.testI64(1), 1)
141 self.assertEqual(self.client.testI64(-34359738368), -34359738368)
Mark Sleec98d0502006-09-06 02:42:25 +0000142
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900143 def testDouble(self):
144 print('testDouble')
145 self.assertEqual(self.client.testDouble(-5.235098235), -5.235098235)
146 self.assertEqual(self.client.testDouble(0), 0)
147 self.assertEqual(self.client.testDouble(-1), -1)
148 self.assertEqual(self.client.testDouble(-0.000341012439638598279), -0.000341012439638598279)
Mark Sleec9676562006-09-05 17:34:52 +0000149
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900150 def testBinary(self):
151 print('testBinary')
152 val = bytearray([i for i in range(0, 256)])
153 self.assertEqual(bytearray(self.client.testBinary(bytes(val))), val)
Jens Geyerd629ea02015-09-23 21:16:50 +0200154
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900155 def testStruct(self):
156 print('testStruct')
157 x = Xtruct()
158 x.string_thing = "Zero"
159 x.byte_thing = 1
160 x.i32_thing = -3
161 x.i64_thing = -5
162 y = self.client.testStruct(x)
163 self.assertEqual(y, x)
Mark Sleefc89d392006-09-04 00:04:39 +0000164
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900165 def testNest(self):
166 print('testNest')
167 inner = Xtruct(string_thing="Zero", byte_thing=1, i32_thing=-3, i64_thing=-5)
168 x = Xtruct2(struct_thing=inner, byte_thing=0, i32_thing=0)
169 y = self.client.testNest(x)
170 self.assertEqual(y, x)
Bryan Duxbury59d4efd2011-03-21 17:38:22 +0000171
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900172 def testMap(self):
173 print('testMap')
174 x = {0: 1, 1: 2, 2: 3, 3: 4, -1: -2}
175 y = self.client.testMap(x)
176 self.assertEqual(y, x)
Bryan Duxbury59d4efd2011-03-21 17:38:22 +0000177
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900178 def testSet(self):
179 print('testSet')
180 x = set([8, 1, 42])
181 y = self.client.testSet(x)
182 self.assertEqual(y, x)
Bryan Duxbury59d4efd2011-03-21 17:38:22 +0000183
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900184 def testList(self):
185 print('testList')
186 x = [1, 4, 9, -42]
187 y = self.client.testList(x)
188 self.assertEqual(y, x)
Bryan Duxbury59d4efd2011-03-21 17:38:22 +0000189
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900190 def testEnum(self):
191 print('testEnum')
192 x = Numberz.FIVE
193 y = self.client.testEnum(x)
194 self.assertEqual(y, x)
Bryan Duxbury59d4efd2011-03-21 17:38:22 +0000195
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900196 def testTypedef(self):
197 print('testTypedef')
198 x = 0xffffffffffffff # 7 bytes of 0xff
199 y = self.client.testTypedef(x)
200 self.assertEqual(y, x)
Bryan Duxbury59d4efd2011-03-21 17:38:22 +0000201
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900202 def testMapMap(self):
203 print('testMapMap')
204 x = {
205 -4: {-4: -4, -3: -3, -2: -2, -1: -1},
206 4: {4: 4, 3: 3, 2: 2, 1: 1},
207 }
208 y = self.client.testMapMap(42)
209 self.assertEqual(y, x)
Bryan Duxbury59d4efd2011-03-21 17:38:22 +0000210
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900211 def testMulti(self):
212 print('testMulti')
213 xpected = Xtruct(string_thing='Hello2', byte_thing=74, i32_thing=0xff00ff, i64_thing=0xffffffffd0d0)
214 y = self.client.testMulti(xpected.byte_thing,
215 xpected.i32_thing,
216 xpected.i64_thing,
217 {0: 'abc'},
218 Numberz.FIVE,
219 0xf0f0f0)
220 self.assertEqual(y, xpected)
Mark Sleec9676562006-09-05 17:34:52 +0000221
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900222 def testException(self):
223 print('testException')
224 self.client.testException('Safe')
225 try:
226 self.client.testException('Xception')
227 self.fail("should have gotten exception")
228 except Xception as x:
229 self.assertEqual(x.errorCode, 1001)
230 self.assertEqual(x.message, 'Xception')
231 # TODO ensure same behavior for repr within generated python variants
232 # ensure exception's repr method works
233 # x_repr = repr(x)
234 # self.assertEqual(x_repr, 'Xception(errorCode=1001, message=\'Xception\')')
Mark Sleec9676562006-09-05 17:34:52 +0000235
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900236 try:
237 self.client.testException('TException')
238 self.fail("should have gotten exception")
239 except TException as x:
240 pass
David Reissbcaa2ad2008-06-10 22:55:26 +0000241
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900242 # Should not throw
243 self.client.testException('success')
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900244
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900245 def testMultiException(self):
246 print('testMultiException')
247 try:
248 self.client.testMultiException('Xception', 'ignore')
249 except Xception as ex:
250 self.assertEqual(ex.errorCode, 1001)
251 self.assertEqual(ex.message, 'This is an Xception')
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900252
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900253 try:
254 self.client.testMultiException('Xception2', 'ignore')
255 except Xception2 as ex:
256 self.assertEqual(ex.errorCode, 2002)
257 self.assertEqual(ex.struct_thing.string_thing, 'This is an Xception2')
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900258
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900259 y = self.client.testMultiException('success', 'foobar')
260 self.assertEqual(y.string_thing, 'foobar')
Nobuaki Sukegawa01ede042015-09-29 02:16:53 +0900261
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900262 def testOneway(self):
263 print('testOneway')
264 start = time.time()
265 self.client.testOneway(1) # type is int, not float
266 end = time.time()
267 self.assertTrue(end - start < 3,
268 "oneway sleep took %f sec" % (end - start))
Roger Meier76150722014-05-31 22:22:07 +0200269
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900270 def testOnewayThenNormal(self):
271 print('testOnewayThenNormal')
272 self.client.testOneway(1) # type is int, not float
273 self.assertEqual(self.client.testString('Python'), 'Python')
David Reissdb893b62008-02-18 02:11:48 +0000274
Roger Meier879cab22014-05-03 17:51:21 +0200275
James E. King III84d9cd22019-01-31 11:47:58 -0500276# LAST_SEQID is a global because we have one transport and multiple protocols
277# running on it (when multiplexec)
278LAST_SEQID = None
279
280class TPedanticSequenceIdProtocolWrapper(TProtocolDecorator.TProtocolDecorator):
281 """
282 Wraps any protocol with sequence ID checking: looks for outbound
283 uniqueness as well as request/response alignment.
284 """
285 def __init__(self, protocol):
286 # TProtocolDecorator.__new__ does all the heavy lifting
287 pass
288
289 def writeMessageBegin(self, name, type, seqid):
290 global LAST_SEQID
291 if LAST_SEQID and LAST_SEQID == seqid:
292 raise TProtocol.TProtocolException(INVALID_DATA,
293 "Python client reused sequence ID {0}".format(seqid))
294 LAST_SEQID = seqid
295 super(TPedanticSequenceIdProtocolWrapper, self).writeMessageBegin(
296 name, type, seqid)
297
298 def readMessageBegin(self):
299 global LAST_SEQID
300 (name, type, seqid) =\
301 super(TPedanticSequenceIdProtocolWrapper, self).readMessageBegin()
302 if LAST_SEQID != seqid:
303 raise TProtocol.TProtocolException(INVALID_DATA,
304 "We sent seqid {0} and server returned seqid {1}".format(
305 self.last, seqid))
306 return (name, type, seqid)
307
308
309def make_pedantic(proto):
310 """ Wrap a protocol in the pedantic sequence ID wrapper. """
311 return TPedanticSequenceIdProtocolWrapper(proto)
312
James E. King III20685442018-04-10 10:30:51 -0400313class MultiplexedOptionalTest(AbstractTest):
314 def get_protocol2(self, transport):
315 return None
316
317
318class BinaryTest(MultiplexedOptionalTest):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900319 def get_protocol(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500320 return make_pedantic(TBinaryProtocol.TBinaryProtocolFactory().getProtocol(transport))
Mark Sleefc89d392006-09-04 00:04:39 +0000321
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900322
James E. King III20685442018-04-10 10:30:51 -0400323class MultiplexedBinaryTest(MultiplexedOptionalTest):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900324 def get_protocol(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500325 wrapped_proto = make_pedantic(TBinaryProtocol.TBinaryProtocolFactory().getProtocol(transport))
James E. King III20685442018-04-10 10:30:51 -0400326 return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "ThriftTest")
327
328 def get_protocol2(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500329 wrapped_proto = make_pedantic(TBinaryProtocol.TBinaryProtocolFactory().getProtocol(transport))
James E. King III20685442018-04-10 10:30:51 -0400330 return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "SecondService")
Bryan Duxbury59d4efd2011-03-21 17:38:22 +0000331
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900332
James E. King III20685442018-04-10 10:30:51 -0400333class AcceleratedBinaryTest(MultiplexedOptionalTest):
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900334 def get_protocol(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500335 return make_pedantic(TBinaryProtocol.TBinaryProtocolAcceleratedFactory(fallback=False).getProtocol(transport))
Mark Sleea3302652006-10-25 19:03:32 +0000336
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900337
James E. King III20685442018-04-10 10:30:51 -0400338class MultiplexedAcceleratedBinaryTest(MultiplexedOptionalTest):
339 def get_protocol(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500340 wrapped_proto = make_pedantic(TBinaryProtocol.TBinaryProtocolAcceleratedFactory(fallback=False).getProtocol(transport))
James E. King III20685442018-04-10 10:30:51 -0400341 return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "ThriftTest")
342
343 def get_protocol2(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500344 wrapped_proto = make_pedantic(TBinaryProtocol.TBinaryProtocolAcceleratedFactory(fallback=False).getProtocol(transport))
James E. King III20685442018-04-10 10:30:51 -0400345 return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "SecondService")
346
347
348class CompactTest(MultiplexedOptionalTest):
349 def get_protocol(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500350 return make_pedantic(TCompactProtocol.TCompactProtocolFactory().getProtocol(transport))
James E. King III20685442018-04-10 10:30:51 -0400351
352
353class MultiplexedCompactTest(MultiplexedOptionalTest):
354 def get_protocol(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500355 wrapped_proto = make_pedantic(TCompactProtocol.TCompactProtocolFactory().getProtocol(transport))
James E. King III20685442018-04-10 10:30:51 -0400356 return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "ThriftTest")
357
358 def get_protocol2(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500359 wrapped_proto = make_pedantic(TCompactProtocol.TCompactProtocolFactory().getProtocol(transport))
James E. King III20685442018-04-10 10:30:51 -0400360 return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "SecondService")
361
362
363class AcceleratedCompactTest(MultiplexedOptionalTest):
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +0900364 def get_protocol(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500365 return make_pedantic(TCompactProtocol.TCompactProtocolAcceleratedFactory(fallback=False).getProtocol(transport))
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +0900366
367
James E. King III20685442018-04-10 10:30:51 -0400368class MultiplexedAcceleratedCompactTest(MultiplexedOptionalTest):
369 def get_protocol(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500370 wrapped_proto = make_pedantic(TCompactProtocol.TCompactProtocolAcceleratedFactory(fallback=False).getProtocol(transport))
James E. King III20685442018-04-10 10:30:51 -0400371 return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "ThriftTest")
372
373 def get_protocol2(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500374 wrapped_proto = make_pedantic(TCompactProtocol.TCompactProtocolAcceleratedFactory(fallback=False).getProtocol(transport))
James E. King III20685442018-04-10 10:30:51 -0400375 return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "SecondService")
376
377
378class JSONTest(MultiplexedOptionalTest):
379 def get_protocol(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500380 return make_pedantic(TJSONProtocol.TJSONProtocolFactory().getProtocol(transport))
James E. King III20685442018-04-10 10:30:51 -0400381
382
383class MultiplexedJSONTest(MultiplexedOptionalTest):
384 def get_protocol(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500385 wrapped_proto = make_pedantic(TJSONProtocol.TJSONProtocolFactory().getProtocol(transport))
James E. King III20685442018-04-10 10:30:51 -0400386 return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "ThriftTest")
387
388 def get_protocol2(self, transport):
James E. King III84d9cd22019-01-31 11:47:58 -0500389 wrapped_proto = make_pedantic(TJSONProtocol.TJSONProtocolFactory().getProtocol(transport))
James E. King III20685442018-04-10 10:30:51 -0400390 return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "SecondService")
391
392
Neil Williams66a44c52018-08-13 16:12:24 -0700393class HeaderTest(MultiplexedOptionalTest):
394 def get_protocol(self, transport):
395 factory = THeaderProtocol.THeaderProtocolFactory()
James E. King III84d9cd22019-01-31 11:47:58 -0500396 return make_pedantic(factory.getProtocol(transport))
Neil Williams66a44c52018-08-13 16:12:24 -0700397
398
David Reiss9ff3b9d2008-02-15 01:10:23 +0000399def suite():
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900400 suite = unittest.TestSuite()
401 loader = unittest.TestLoader()
402 if options.proto == 'binary': # look for --proto on cmdline
James E. King III20685442018-04-10 10:30:51 -0400403 suite.addTest(loader.loadTestsFromTestCase(BinaryTest))
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900404 elif options.proto == 'accel':
405 suite.addTest(loader.loadTestsFromTestCase(AcceleratedBinaryTest))
Nobuaki Sukegawa6525f6a2016-02-11 13:58:39 +0900406 elif options.proto == 'accelc':
407 suite.addTest(loader.loadTestsFromTestCase(AcceleratedCompactTest))
James E. King III20685442018-04-10 10:30:51 -0400408 elif options.proto == 'compact':
409 suite.addTest(loader.loadTestsFromTestCase(CompactTest))
Neil Williams66a44c52018-08-13 16:12:24 -0700410 elif options.proto == 'header':
411 suite.addTest(loader.loadTestsFromTestCase(HeaderTest))
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900412 elif options.proto == 'json':
413 suite.addTest(loader.loadTestsFromTestCase(JSONTest))
James E. King III20685442018-04-10 10:30:51 -0400414 elif options.proto == 'multi':
415 suite.addTest(loader.loadTestsFromTestCase(MultiplexedBinaryTest))
416 elif options.proto == 'multia':
417 suite.addTest(loader.loadTestsFromTestCase(MultiplexedAcceleratedBinaryTest))
418 elif options.proto == 'multiac':
419 suite.addTest(loader.loadTestsFromTestCase(MultiplexedAcceleratedCompactTest))
420 elif options.proto == 'multic':
421 suite.addTest(loader.loadTestsFromTestCase(MultiplexedCompactTest))
422 elif options.proto == 'multij':
423 suite.addTest(loader.loadTestsFromTestCase(MultiplexedJSONTest))
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900424 else:
425 raise AssertionError('Unknown protocol given with --protocol: %s' % options.proto)
426 return suite
Mark Slee5299a952007-10-05 00:13:24 +0000427
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900428
David Reiss74421272008-11-07 23:09:31 +0000429class OwnArgsTestProgram(unittest.TestProgram):
430 def parseArgs(self, argv):
431 if args:
432 self.testNames = args
433 else:
Nobuaki Sukegawaa185d7e2015-11-06 21:24:24 +0900434 self.testNames = ([self.defaultTest])
David Reiss74421272008-11-07 23:09:31 +0000435 self.createTests()
436
James E. King, III0ad20bd2017-09-30 15:44:16 -0700437
David Reiss9ff3b9d2008-02-15 01:10:23 +0000438if __name__ == "__main__":
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900439 parser = OptionParser()
440 parser.add_option('--libpydir', type='string', dest='libpydir',
441 help='include this directory in sys.path for locating library code')
442 parser.add_option('--genpydir', type='string', dest='genpydir',
443 help='include this directory in sys.path for locating generated code')
444 parser.add_option("--port", type="int", dest="port",
445 help="connect to server at port")
446 parser.add_option("--host", type="string", dest="host",
447 help="connect to server")
448 parser.add_option("--zlib", action="store_true", dest="zlib",
449 help="use zlib wrapper for compressed transport")
450 parser.add_option("--ssl", action="store_true", dest="ssl",
451 help="use SSL for encrypted transport")
452 parser.add_option("--http", dest="http_path",
453 help="Use the HTTP transport with the specified path")
454 parser.add_option('-v', '--verbose', action="store_const",
455 dest="verbose", const=2,
456 help="verbose output")
457 parser.add_option('-q', '--quiet', action="store_const",
458 dest="verbose", const=0,
459 help="minimal output")
460 parser.add_option('--protocol', dest="proto", type="string",
Neil Williams66a44c52018-08-13 16:12:24 -0700461 help="protocol to use, one of: accel, accelc, binary, compact, header, json, multi, multia, multiac, multic, multij")
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900462 parser.add_option('--transport', dest="trans", type="string",
James E. King III6f8c99e2018-03-24 16:32:02 -0400463 help="transport to use, one of: buffered, framed, http")
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900464 parser.set_defaults(framed=False, http_path=None, verbose=1, host='localhost', port=9090, proto='binary')
465 options, args = parser.parse_args()
Nobuaki Sukegawaa185d7e2015-11-06 21:24:24 +0900466
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900467 if options.genpydir:
468 sys.path.insert(0, os.path.join(SCRIPT_DIR, options.genpydir))
Nobuaki Sukegawaa185d7e2015-11-06 21:24:24 +0900469
James E. King III6f8c99e2018-03-24 16:32:02 -0400470 if options.http_path:
471 options.trans = 'http'
472
James E. King III20685442018-04-10 10:30:51 -0400473 from ThriftTest import SecondService
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900474 from ThriftTest import ThriftTest
475 from ThriftTest.ttypes import Xtruct, Xtruct2, Numberz, Xception, Xception2
476 from thrift.Thrift import TException
477 from thrift.transport import TTransport
478 from thrift.transport import TSocket
479 from thrift.transport import THttpClient
480 from thrift.transport import TZlibTransport
481 from thrift.protocol import TBinaryProtocol
482 from thrift.protocol import TCompactProtocol
Neil Williams66a44c52018-08-13 16:12:24 -0700483 from thrift.protocol import THeaderProtocol
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900484 from thrift.protocol import TJSONProtocol
James E. King III20685442018-04-10 10:30:51 -0400485 from thrift.protocol import TMultiplexedProtocol
Nobuaki Sukegawaa185d7e2015-11-06 21:24:24 +0900486
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900487 OwnArgsTestProgram(defaultTest="suite", testRunner=unittest.TextTestRunner(verbosity=1))