blob: 6e044939bbae37942b673ecfe4f9e0f76ca6edb7 [file] [log] [blame]
jfarrell6cdbd982015-06-23 21:58:50 -04001#!/usr/bin/env python
2
Roger Meier50e43492010-10-08 17:46:06 +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
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090022import glob
Nobuaki Sukegawa6f826402016-02-10 19:42:19 +090023import os
24import sys
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090025import time
Nobuaki Sukegawa6f826402016-02-10 19:42:19 +090026
jfarrell6cdbd982015-06-23 21:58:50 -040027basepath = os.path.abspath(os.path.dirname(__file__))
28sys.path.insert(0, os.path.join(basepath, 'gen-py.twisted'))
29sys.path.insert(0, glob.glob(os.path.join(basepath, '../../lib/py/build/lib.*'))[0])
Roger Meier50e43492010-10-08 17:46:06 +000030
Nobuaki Sukegawa6f826402016-02-10 19:42:19 +090031from thrift.Thrift import TApplicationException
32
Roger Meier50e43492010-10-08 17:46:06 +000033from ThriftTest import ThriftTest
James Broadhead79c3f4a2014-08-09 18:21:44 +010034from ThriftTest.ttypes import Xception, Xtruct
Roger Meier50e43492010-10-08 17:46:06 +000035from thrift.transport import TTwisted
36from thrift.protocol import TBinaryProtocol
37
38from twisted.trial import unittest
39from twisted.internet import defer, reactor
40from twisted.internet.protocol import ClientCreator
41
James E. King, IIId7142b72017-09-01 13:00:36 -070042from zope.interface import implementer
Roger Meier50e43492010-10-08 17:46:06 +000043
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +090044
James E. King, IIId7142b72017-09-01 13:00:36 -070045@implementer(ThriftTest.Iface)
Roger Meier50e43492010-10-08 17:46:06 +000046class TestHandler:
Roger Meier50e43492010-10-08 17:46:06 +000047 def __init__(self):
48 self.onewaysQueue = defer.DeferredQueue()
49
50 def testVoid(self):
51 pass
James Broadhead79c3f4a2014-08-09 18:21:44 +010052
Roger Meier50e43492010-10-08 17:46:06 +000053 def testString(self, s):
54 return s
James Broadhead79c3f4a2014-08-09 18:21:44 +010055
Roger Meier50e43492010-10-08 17:46:06 +000056 def testByte(self, b):
57 return b
James Broadhead79c3f4a2014-08-09 18:21:44 +010058
Roger Meier50e43492010-10-08 17:46:06 +000059 def testI16(self, i16):
60 return i16
James Broadhead79c3f4a2014-08-09 18:21:44 +010061
Roger Meier50e43492010-10-08 17:46:06 +000062 def testI32(self, i32):
63 return i32
James Broadhead79c3f4a2014-08-09 18:21:44 +010064
Roger Meier50e43492010-10-08 17:46:06 +000065 def testI64(self, i64):
66 return i64
James Broadhead79c3f4a2014-08-09 18:21:44 +010067
Roger Meier50e43492010-10-08 17:46:06 +000068 def testDouble(self, dub):
69 return dub
James Broadhead79c3f4a2014-08-09 18:21:44 +010070
Jens Geyer8bcfdd92014-12-14 03:14:26 +010071 def testBinary(self, thing):
72 return thing
73
Roger Meier50e43492010-10-08 17:46:06 +000074 def testStruct(self, thing):
75 return thing
James Broadhead79c3f4a2014-08-09 18:21:44 +010076
Roger Meier50e43492010-10-08 17:46:06 +000077 def testException(self, s):
78 if s == 'Xception':
Elvis Pranskevichus9c439622019-12-11 16:47:52 -050079 raise Xception(1001, s)
Roger Meier50e43492010-10-08 17:46:06 +000080 elif s == "throw_undeclared":
81 raise ValueError("foo")
James Broadhead79c3f4a2014-08-09 18:21:44 +010082
Roger Meier50e43492010-10-08 17:46:06 +000083 def testOneway(self, seconds):
84 def fireOneway(t):
85 self.onewaysQueue.put((t, time.time(), seconds))
86 reactor.callLater(seconds, fireOneway, time.time())
Nobuaki Sukegawa6f826402016-02-10 19:42:19 +090087 raise Exception('')
James Broadhead79c3f4a2014-08-09 18:21:44 +010088
Roger Meier50e43492010-10-08 17:46:06 +000089 def testNest(self, thing):
90 return thing
James Broadhead79c3f4a2014-08-09 18:21:44 +010091
Roger Meier50e43492010-10-08 17:46:06 +000092 def testMap(self, thing):
93 return thing
James Broadhead79c3f4a2014-08-09 18:21:44 +010094
Roger Meier50e43492010-10-08 17:46:06 +000095 def testSet(self, thing):
96 return thing
James Broadhead79c3f4a2014-08-09 18:21:44 +010097
Roger Meier50e43492010-10-08 17:46:06 +000098 def testList(self, thing):
99 return thing
James Broadhead79c3f4a2014-08-09 18:21:44 +0100100
Roger Meier50e43492010-10-08 17:46:06 +0000101 def testEnum(self, thing):
102 return thing
James Broadhead79c3f4a2014-08-09 18:21:44 +0100103
Roger Meier50e43492010-10-08 17:46:06 +0000104 def testTypedef(self, thing):
105 return thing
106
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900107
Roger Meier50e43492010-10-08 17:46:06 +0000108class ThriftTestCase(unittest.TestCase):
109
110 @defer.inlineCallbacks
111 def setUp(self):
112 self.handler = TestHandler()
113 self.processor = ThriftTest.Processor(self.handler)
114 self.pfactory = TBinaryProtocol.TBinaryProtocolFactory()
115
Nobuaki Sukegawad479e232016-02-28 11:28:19 +0900116 self.server = reactor.listenTCP(
117 0, TTwisted.ThriftServerFactory(self.processor, self.pfactory), interface="127.0.0.1")
Roger Meier50e43492010-10-08 17:46:06 +0000118
119 self.portNo = self.server.getHost().port
120
121 self.txclient = yield ClientCreator(reactor,
Nobuaki Sukegawa10308cb2016-02-03 01:57:03 +0900122 TTwisted.ThriftClientProtocol,
123 ThriftTest.Client,
124 self.pfactory).connectTCP("127.0.0.1", self.portNo)
Roger Meier50e43492010-10-08 17:46:06 +0000125 self.client = self.txclient.client
126
127 @defer.inlineCallbacks
128 def tearDown(self):
129 yield self.server.stopListening()
130 self.txclient.transport.loseConnection()
131
132 @defer.inlineCallbacks
133 def testVoid(self):
134 self.assertEquals((yield self.client.testVoid()), None)
135
136 @defer.inlineCallbacks
137 def testString(self):
138 self.assertEquals((yield self.client.testString('Python')), 'Python')
James Broadhead79c3f4a2014-08-09 18:21:44 +0100139
Roger Meier50e43492010-10-08 17:46:06 +0000140 @defer.inlineCallbacks
141 def testByte(self):
142 self.assertEquals((yield self.client.testByte(63)), 63)
143
144 @defer.inlineCallbacks
145 def testI32(self):
146 self.assertEquals((yield self.client.testI32(-1)), -1)
147 self.assertEquals((yield self.client.testI32(0)), 0)
148
149 @defer.inlineCallbacks
150 def testI64(self):
151 self.assertEquals((yield self.client.testI64(-34359738368)), -34359738368)
152
153 @defer.inlineCallbacks
154 def testDouble(self):
155 self.assertEquals((yield self.client.testDouble(-5.235098235)), -5.235098235)
156
jfarrell6cdbd982015-06-23 21:58:50 -0400157 # TODO: def testBinary(self) ...
158
James Broadhead79c3f4a2014-08-09 18:21:44 +0100159 @defer.inlineCallbacks
Roger Meier50e43492010-10-08 17:46:06 +0000160 def testStruct(self):
161 x = Xtruct()
162 x.string_thing = "Zero"
163 x.byte_thing = 1
164 x.i32_thing = -3
165 x.i64_thing = -5
166 y = yield self.client.testStruct(x)
James Broadhead79c3f4a2014-08-09 18:21:44 +0100167
Roger Meier50e43492010-10-08 17:46:06 +0000168 self.assertEquals(y.string_thing, "Zero")
169 self.assertEquals(y.byte_thing, 1)
170 self.assertEquals(y.i32_thing, -3)
171 self.assertEquals(y.i64_thing, -5)
James Broadhead79c3f4a2014-08-09 18:21:44 +0100172
Roger Meier50e43492010-10-08 17:46:06 +0000173 @defer.inlineCallbacks
174 def testException(self):
Roger Meier50e43492010-10-08 17:46:06 +0000175 try:
176 yield self.client.testException('Xception')
177 self.fail("should have gotten exception")
Nobuaki Sukegawa760511f2015-11-06 21:24:16 +0900178 except Xception as x:
Roger Meier50e43492010-10-08 17:46:06 +0000179 self.assertEquals(x.errorCode, 1001)
180 self.assertEquals(x.message, 'Xception')
181
182 try:
183 yield self.client.testException("throw_undeclared")
Nobuaki Sukegawa6f826402016-02-10 19:42:19 +0900184 self.fail("should have gotten exception")
185 except TApplicationException:
Roger Meier50e43492010-10-08 17:46:06 +0000186 pass
James Broadhead79c3f4a2014-08-09 18:21:44 +0100187
Nobuaki Sukegawa6f826402016-02-10 19:42:19 +0900188 yield self.client.testException('Safe')
189
Roger Meier50e43492010-10-08 17:46:06 +0000190 @defer.inlineCallbacks
191 def testOneway(self):
James Broadhead79c3f4a2014-08-09 18:21:44 +0100192 yield self.client.testOneway(1)
Roger Meier50e43492010-10-08 17:46:06 +0000193 start, end, seconds = yield self.handler.onewaysQueue.get()
James Broadhead79c3f4a2014-08-09 18:21:44 +0100194 self.assertAlmostEquals(seconds, (end - start), places=1)
Nobuaki Sukegawa6f826402016-02-10 19:42:19 +0900195 self.assertEquals((yield self.client.testI32(-1)), -1)