| Mark Slee | 57cc25e | 2007-02-28 21:43:54 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python | 
| Mark Slee | fc89d39 | 2006-09-04 00:04:39 +0000 | [diff] [blame] | 2 |  | 
| David Reiss | ea2cba8 | 2009-03-30 21:35:00 +0000 | [diff] [blame] | 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 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 22 | import sys, glob | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 23 | sys.path.insert(0, glob.glob('../../lib/py/build/lib.*')[0]) | 
| Mark Slee | fc89d39 | 2006-09-04 00:04:39 +0000 | [diff] [blame] | 24 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 25 | import unittest | 
| Mark Slee | 57cc25e | 2007-02-28 21:43:54 +0000 | [diff] [blame] | 26 | import time | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 27 | from optparse import OptionParser | 
| Mark Slee | 57cc25e | 2007-02-28 21:43:54 +0000 | [diff] [blame] | 28 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 29 | parser = OptionParser() | 
| Roger Meier | f4eec7a | 2011-09-11 18:16:21 +0000 | [diff] [blame] | 30 | parser.add_option('--genpydir', type='string', dest='genpydir', | 
 | 31 |                   default='gen-py', | 
 | 32 |                   help='include this local directory in sys.path for locating generated code') | 
| David Reiss | 7442127 | 2008-11-07 23:09:31 +0000 | [diff] [blame] | 33 | parser.add_option("--port", type="int", dest="port", | 
 | 34 |     help="connect to server at port") | 
 | 35 | parser.add_option("--host", type="string", dest="host", | 
 | 36 |     help="connect to server") | 
| Bryan Duxbury | 1606659 | 2011-03-22 18:06:04 +0000 | [diff] [blame] | 37 | parser.add_option("--zlib", action="store_true", dest="zlib", | 
 | 38 |     help="use zlib wrapper for compressed transport") | 
 | 39 | parser.add_option("--ssl", action="store_true", dest="ssl", | 
 | 40 |     help="use SSL for encrypted transport") | 
| David Reiss | 7442127 | 2008-11-07 23:09:31 +0000 | [diff] [blame] | 41 | parser.add_option("--framed", action="store_true", dest="framed", | 
 | 42 |     help="use framed transport") | 
| David Reiss | f78ec2b | 2009-01-31 21:59:32 +0000 | [diff] [blame] | 43 | parser.add_option("--http", dest="http_path", | 
 | 44 |     help="Use the HTTP transport with the specified path") | 
| David Reiss | 7442127 | 2008-11-07 23:09:31 +0000 | [diff] [blame] | 45 | parser.add_option('-v', '--verbose', action="store_const",  | 
 | 46 |     dest="verbose", const=2, | 
 | 47 |     help="verbose output") | 
 | 48 | parser.add_option('-q', '--quiet', action="store_const",  | 
 | 49 |     dest="verbose", const=0, | 
 | 50 |     help="minimal output") | 
| Bryan Duxbury | 59d4efd | 2011-03-21 17:38:22 +0000 | [diff] [blame] | 51 | parser.add_option('--proto',  dest="proto", type="string", | 
 | 52 |     help="protocol to use, one of: accel, binary, compact") | 
 | 53 | parser.set_defaults(framed=False, http_path=None, verbose=1, host='localhost', port=9090, proto='binary') | 
| David Reiss | 7442127 | 2008-11-07 23:09:31 +0000 | [diff] [blame] | 54 | options, args = parser.parse_args() | 
| Mark Slee | a330265 | 2006-10-25 19:03:32 +0000 | [diff] [blame] | 55 |  | 
| Roger Meier | f4eec7a | 2011-09-11 18:16:21 +0000 | [diff] [blame] | 56 | sys.path.insert(0, options.genpydir) | 
 | 57 |  | 
 | 58 | from ThriftTest import ThriftTest | 
 | 59 | from ThriftTest.ttypes import * | 
 | 60 | from thrift.transport import TTransport | 
 | 61 | from thrift.transport import TSocket | 
 | 62 | from thrift.transport import THttpClient | 
 | 63 | from thrift.transport import TZlibTransport | 
 | 64 | from thrift.protocol import TBinaryProtocol | 
 | 65 | from thrift.protocol import TCompactProtocol | 
 | 66 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 67 | class AbstractTest(unittest.TestCase): | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 68 |   def setUp(self): | 
| David Reiss | f78ec2b | 2009-01-31 21:59:32 +0000 | [diff] [blame] | 69 |     if options.http_path: | 
| Bryan Duxbury | 1606659 | 2011-03-22 18:06:04 +0000 | [diff] [blame] | 70 |       self.transport = THttpClient.THttpClient(options.host, port=options.port, path=options.http_path) | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 71 |     else: | 
| Bryan Duxbury | 1606659 | 2011-03-22 18:06:04 +0000 | [diff] [blame] | 72 |       if options.ssl: | 
 | 73 |         from thrift.transport import TSSLSocket | 
 | 74 |         socket = TSSLSocket.TSSLSocket(options.host, options.port, validate=False) | 
 | 75 |       else: | 
 | 76 |         socket = TSocket.TSocket(options.host, options.port) | 
| David Reiss | f78ec2b | 2009-01-31 21:59:32 +0000 | [diff] [blame] | 77 |       # frame or buffer depending upon args | 
 | 78 |       if options.framed: | 
 | 79 |         self.transport = TTransport.TFramedTransport(socket) | 
 | 80 |       else: | 
 | 81 |         self.transport = TTransport.TBufferedTransport(socket) | 
| Bryan Duxbury | 1606659 | 2011-03-22 18:06:04 +0000 | [diff] [blame] | 82 |       if options.zlib: | 
 | 83 |         self.transport = TZlibTransport.TZlibTransport(self.transport, 9) | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 84 |     self.transport.open() | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 85 |     protocol = self.protocol_factory.getProtocol(self.transport) | 
 | 86 |     self.client = ThriftTest.Client(protocol) | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 87 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 88 |   def tearDown(self): | 
 | 89 |     # Close! | 
 | 90 |     self.transport.close() | 
| Mark Slee | fc89d39 | 2006-09-04 00:04:39 +0000 | [diff] [blame] | 91 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 92 |   def testVoid(self): | 
 | 93 |     self.client.testVoid() | 
| David Reiss | 0c90f6f | 2008-02-06 22:18:40 +0000 | [diff] [blame] | 94 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 95 |   def testString(self): | 
| Bryan Duxbury | 1606659 | 2011-03-22 18:06:04 +0000 | [diff] [blame] | 96 |     self.assertEqual(self.client.testString('Python' * 20), 'Python' * 20) | 
| Bryan Duxbury | 59d4efd | 2011-03-21 17:38:22 +0000 | [diff] [blame] | 97 |     self.assertEqual(self.client.testString(''), '') | 
| Mark Slee | c967656 | 2006-09-05 17:34:52 +0000 | [diff] [blame] | 98 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 99 |   def testByte(self): | 
 | 100 |     self.assertEqual(self.client.testByte(63), 63) | 
| Bryan Duxbury | 59d4efd | 2011-03-21 17:38:22 +0000 | [diff] [blame] | 101 |     self.assertEqual(self.client.testByte(-127), -127) | 
| Mark Slee | c98d050 | 2006-09-06 02:42:25 +0000 | [diff] [blame] | 102 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 103 |   def testI32(self): | 
 | 104 |     self.assertEqual(self.client.testI32(-1), -1) | 
 | 105 |     self.assertEqual(self.client.testI32(0), 0) | 
| Mark Slee | c967656 | 2006-09-05 17:34:52 +0000 | [diff] [blame] | 106 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 107 |   def testI64(self): | 
| Bryan Duxbury | 59d4efd | 2011-03-21 17:38:22 +0000 | [diff] [blame] | 108 |     self.assertEqual(self.client.testI64(1), 1) | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 109 |     self.assertEqual(self.client.testI64(-34359738368), -34359738368) | 
| Mark Slee | c98d050 | 2006-09-06 02:42:25 +0000 | [diff] [blame] | 110 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 111 |   def testDouble(self): | 
 | 112 |     self.assertEqual(self.client.testDouble(-5.235098235), -5.235098235) | 
| Bryan Duxbury | 59d4efd | 2011-03-21 17:38:22 +0000 | [diff] [blame] | 113 |     self.assertEqual(self.client.testDouble(0), 0) | 
 | 114 |     self.assertEqual(self.client.testDouble(-1), -1) | 
| Mark Slee | c967656 | 2006-09-05 17:34:52 +0000 | [diff] [blame] | 115 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 116 |   def testStruct(self): | 
 | 117 |     x = Xtruct() | 
 | 118 |     x.string_thing = "Zero" | 
 | 119 |     x.byte_thing = 1 | 
 | 120 |     x.i32_thing = -3 | 
 | 121 |     x.i64_thing = -5 | 
 | 122 |     y = self.client.testStruct(x) | 
| Bryan Duxbury | 59d4efd | 2011-03-21 17:38:22 +0000 | [diff] [blame] | 123 |     self.assertEqual(y, x) | 
| Mark Slee | fc89d39 | 2006-09-04 00:04:39 +0000 | [diff] [blame] | 124 |  | 
| Bryan Duxbury | 59d4efd | 2011-03-21 17:38:22 +0000 | [diff] [blame] | 125 |   def testNest(self): | 
 | 126 |     inner = Xtruct(string_thing="Zero", byte_thing=1, i32_thing=-3, | 
 | 127 |       i64_thing=-5) | 
 | 128 |     x = Xtruct2(struct_thing=inner) | 
 | 129 |     y = self.client.testNest(x) | 
 | 130 |     self.assertEqual(y, x) | 
 | 131 |  | 
 | 132 |   def testMap(self): | 
 | 133 |     x = {0:1, 1:2, 2:3, 3:4, -1:-2} | 
 | 134 |     y = self.client.testMap(x) | 
 | 135 |     self.assertEqual(y, x) | 
 | 136 |  | 
 | 137 |   def testSet(self): | 
 | 138 |     x = set([8, 1, 42]) | 
 | 139 |     y = self.client.testSet(x) | 
 | 140 |     self.assertEqual(y, x) | 
 | 141 |  | 
 | 142 |   def testList(self): | 
 | 143 |     x = [1, 4, 9, -42] | 
 | 144 |     y = self.client.testList(x) | 
 | 145 |     self.assertEqual(y, x) | 
 | 146 |  | 
 | 147 |   def testEnum(self): | 
 | 148 |     x = Numberz.FIVE | 
 | 149 |     y = self.client.testEnum(x) | 
 | 150 |     self.assertEqual(y, x) | 
 | 151 |  | 
 | 152 |   def testTypedef(self): | 
 | 153 |     x = 0xffffffffffffff # 7 bytes of 0xff | 
 | 154 |     y = self.client.testTypedef(x) | 
 | 155 |     self.assertEqual(y, x) | 
 | 156 |  | 
 | 157 |   def testMapMap(self): | 
 | 158 |     # does not work: dict() is not a hashable type, so a dict() cannot be used as a key in another dict() | 
 | 159 |     #x = { {1:10, 2:20}, {1:100, 2:200, 3:300}, {1:1000, 2:2000, 3:3000, 4:4000} } | 
 | 160 |     try: | 
 | 161 |       y = self.client.testMapMap() | 
 | 162 |     except: | 
 | 163 |       pass | 
 | 164 |  | 
 | 165 |   def testMulti(self): | 
 | 166 |     xpected = Xtruct(byte_thing=74, i32_thing=0xff00ff, i64_thing=0xffffffffd0d0) | 
 | 167 |     y = self.client.testMulti(xpected.byte_thing, | 
 | 168 |           xpected.i32_thing, | 
 | 169 |           xpected.i64_thing, | 
 | 170 |           { 0:'abc' }, | 
 | 171 |           Numberz.FIVE, | 
 | 172 |           0xf0f0f0) | 
 | 173 |     self.assertEqual(y, xpected) | 
| Mark Slee | c967656 | 2006-09-05 17:34:52 +0000 | [diff] [blame] | 174 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 175 |   def testException(self): | 
 | 176 |     self.client.testException('Safe') | 
 | 177 |     try: | 
 | 178 |       self.client.testException('Xception') | 
 | 179 |       self.fail("should have gotten exception") | 
 | 180 |     except Xception, x: | 
 | 181 |       self.assertEqual(x.errorCode, 1001) | 
 | 182 |       self.assertEqual(x.message, 'Xception') | 
| Roger Meier | 61188a4 | 2011-11-01 21:03:33 +0000 | [diff] [blame] | 183 |       # TODO ensure same behavior for repr within generated python variants | 
| Roger Meier | f4eec7a | 2011-09-11 18:16:21 +0000 | [diff] [blame] | 184 |       # ensure exception's repr method works | 
| Roger Meier | 61188a4 | 2011-11-01 21:03:33 +0000 | [diff] [blame] | 185 |       #x_repr = repr(x) | 
 | 186 |       #self.assertEqual(x_repr, 'Xception(errorCode=1001, message=\'Xception\')') | 
| Mark Slee | c967656 | 2006-09-05 17:34:52 +0000 | [diff] [blame] | 187 |  | 
| David Reiss | bcaa2ad | 2008-06-10 22:55:26 +0000 | [diff] [blame] | 188 |     try: | 
 | 189 |       self.client.testException("throw_undeclared") | 
 | 190 |       self.fail("should have thrown exception") | 
 | 191 |     except Exception: # type is undefined | 
 | 192 |       pass | 
 | 193 |  | 
| David Reiss | 6ce401d | 2009-03-24 20:01:58 +0000 | [diff] [blame] | 194 |   def testOneway(self): | 
| David Reiss | db893b6 | 2008-02-18 02:11:48 +0000 | [diff] [blame] | 195 |     start = time.time() | 
| Bryan Duxbury | 59d4efd | 2011-03-21 17:38:22 +0000 | [diff] [blame] | 196 |     self.client.testOneway(1) # type is int, not float | 
| David Reiss | db893b6 | 2008-02-18 02:11:48 +0000 | [diff] [blame] | 197 |     end = time.time() | 
| Bryan Duxbury | 59d4efd | 2011-03-21 17:38:22 +0000 | [diff] [blame] | 198 |     self.assertTrue(end - start < 3, | 
| David Reiss | 6ce401d | 2009-03-24 20:01:58 +0000 | [diff] [blame] | 199 |                     "oneway sleep took %f sec" % (end - start)) | 
| Todd Lipcon | f5dea4c | 2009-12-03 01:18:44 +0000 | [diff] [blame] | 200 |    | 
 | 201 |   def testOnewayThenNormal(self): | 
| Bryan Duxbury | 59d4efd | 2011-03-21 17:38:22 +0000 | [diff] [blame] | 202 |     self.client.testOneway(1) # type is int, not float | 
| Todd Lipcon | f5dea4c | 2009-12-03 01:18:44 +0000 | [diff] [blame] | 203 |     self.assertEqual(self.client.testString('Python'), 'Python') | 
| David Reiss | db893b6 | 2008-02-18 02:11:48 +0000 | [diff] [blame] | 204 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 205 | class NormalBinaryTest(AbstractTest): | 
 | 206 |   protocol_factory = TBinaryProtocol.TBinaryProtocolFactory() | 
| Mark Slee | fc89d39 | 2006-09-04 00:04:39 +0000 | [diff] [blame] | 207 |  | 
| Bryan Duxbury | 59d4efd | 2011-03-21 17:38:22 +0000 | [diff] [blame] | 208 | class CompactTest(AbstractTest): | 
 | 209 |   protocol_factory = TCompactProtocol.TCompactProtocolFactory() | 
 | 210 |  | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 211 | class AcceleratedBinaryTest(AbstractTest): | 
 | 212 |   protocol_factory = TBinaryProtocol.TBinaryProtocolAcceleratedFactory() | 
| Mark Slee | a330265 | 2006-10-25 19:03:32 +0000 | [diff] [blame] | 213 |  | 
| David Reiss | 9ff3b9d | 2008-02-15 01:10:23 +0000 | [diff] [blame] | 214 | def suite(): | 
 | 215 |   suite = unittest.TestSuite() | 
 | 216 |   loader = unittest.TestLoader() | 
| Bryan Duxbury | 59d4efd | 2011-03-21 17:38:22 +0000 | [diff] [blame] | 217 |   if options.proto == 'binary': # look for --proto on cmdline | 
 | 218 |     suite.addTest(loader.loadTestsFromTestCase(NormalBinaryTest)) | 
 | 219 |   elif options.proto == 'accel': | 
 | 220 |     suite.addTest(loader.loadTestsFromTestCase(AcceleratedBinaryTest)) | 
 | 221 |   elif options.proto == 'compact': | 
 | 222 |     suite.addTest(loader.loadTestsFromTestCase(CompactTest)) | 
 | 223 |   else: | 
 | 224 |     raise AssertionError('Unknown protocol given with --proto: %s' % options.proto) | 
| David Reiss | 9ff3b9d | 2008-02-15 01:10:23 +0000 | [diff] [blame] | 225 |   return suite | 
| Mark Slee | 5299a95 | 2007-10-05 00:13:24 +0000 | [diff] [blame] | 226 |  | 
| David Reiss | 7442127 | 2008-11-07 23:09:31 +0000 | [diff] [blame] | 227 | class OwnArgsTestProgram(unittest.TestProgram): | 
 | 228 |     def parseArgs(self, argv): | 
 | 229 |         if args: | 
 | 230 |             self.testNames = args | 
 | 231 |         else: | 
 | 232 |             self.testNames = (self.defaultTest,) | 
 | 233 |         self.createTests() | 
 | 234 |  | 
| David Reiss | 9ff3b9d | 2008-02-15 01:10:23 +0000 | [diff] [blame] | 235 | if __name__ == "__main__": | 
| Roger Meier | f4eec7a | 2011-09-11 18:16:21 +0000 | [diff] [blame] | 236 |   OwnArgsTestProgram(defaultTest="suite", testRunner=unittest.TextTestRunner(verbosity=1)) |