From: Roger Meier Date: Sat, 31 May 2014 20:22:07 +0000 (+0200) Subject: THRIFT-847 Test Framework harmonization across all languages X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=76150722af2751768411573b9fbbed163f4f55db;p=common%2Fthrift.git THRIFT-847 Test Framework harmonization across all languages Added 'ssl' tests for python tests. Added '-transport arg (=buffered) transport: buffered, framed, http' to test/py/TestServer.py and test/py/TestClient.py and removed '-framed' arguement. Changed test/py/RunClientServer.py to match above changes. Added tests to compact protocol in python cases. Added tests to test BinaryAccelarated protocol with Binary Protocol. Changed py/TestClient.py and py/TestServer.py from --proto to --protocol parameter Patch: Chamila Dilshan Wijayarathna & Roger Meier --- diff --git a/test/py/RunClientServer.py b/test/py/RunClientServer.py index 782bd837..46c9f8a0 100755 --- a/test/py/RunClientServer.py +++ b/test/py/RunClientServer.py @@ -34,10 +34,10 @@ parser.add_option('--genpydirs', type='string', dest='genpydirs', help='directory extensions for generated code, used as suffixes for \"gen-py-*\" added sys.path for individual tests') parser.add_option("--port", type="int", dest="port", default=9090, help="port number for server to listen on") -parser.add_option('-v', '--verbose', action="store_const", +parser.add_option('-v', '--verbose', action="store_const", dest="verbose", const=2, help="verbose output") -parser.add_option('-q', '--quiet', action="store_const", +parser.add_option('-q', '--quiet', action="store_const", dest="verbose", const=0, help="minimal output") parser.set_defaults(verbose=1) @@ -107,14 +107,14 @@ def runScriptTest(genpydir, script): ret = subprocess.call(script_args) if ret != 0: raise Exception("Script subprocess failed, retcode=%d, args: %s" % (ret, ' '.join(script_args))) - + def runServiceTest(genpydir, server_class, proto, port, use_zlib, use_ssl): # Build command line arguments server_args = [sys.executable, relfile('TestServer.py') ] cli_args = [sys.executable, relfile('TestClient.py') ] for which in (server_args, cli_args): which.append('--genpydir=%s' % genpydir) - which.append('--proto=%s' % proto) # accel, binary or compact + which.append('--protocol=%s' % proto) # accel, binary or compact which.append('--port=%d' % port) # default to 9090 if use_zlib: which.append('--zlib') @@ -128,7 +128,9 @@ def runServiceTest(genpydir, server_class, proto, port, use_zlib, use_ssl): server_args.append(server_class) # client-specific cmdline options if server_class in FRAMED: - cli_args.append('--framed') + cli_args.append('--transport=framed') + else: + cli_args.append('--transport=buffered') if server_class == 'THttpServer': cli_args.append('--http=/') if options.verbose > 0: @@ -186,7 +188,7 @@ print '----------------' for genpydir in generated_dirs: for script in SCRIPTS: runScriptTest(genpydir, script) - + print '----------------' print ' Executing Client/Server tests with various generated code directories' print ' Servers to be tested: ' + ', '.join(SERVERS) diff --git a/test/py/TestClient.py b/test/py/TestClient.py index 18aea866..fd6b8e96 100755 --- a/test/py/TestClient.py +++ b/test/py/TestClient.py @@ -40,18 +40,18 @@ parser.add_option("--ssl", action="store_true", dest="ssl", help="use SSL for encrypted transport") parser.add_option("--multiple", action="store_true", dest="multiple", help="use Multiple service") -parser.add_option("--framed", action="store_true", dest="framed", - help="use framed transport") parser.add_option("--http", dest="http_path", help="Use the HTTP transport with the specified path") -parser.add_option('-v', '--verbose', action="store_const", +parser.add_option('-v', '--verbose', action="store_const", dest="verbose", const=2, help="verbose output") -parser.add_option('-q', '--quiet', action="store_const", +parser.add_option('-q', '--quiet', action="store_const", dest="verbose", const=0, help="minimal output") -parser.add_option('--proto', dest="proto", type="string", - help="protocol to use, one of: accel, binary, compact") +parser.add_option('--protocol', dest="proto", type="string", + help="protocol to use, one of: accel, binary, compact, json") +parser.add_option('--transport', dest="trans", type="string", + help="transport to use, one of: buffered, framed") parser.set_defaults(framed=False, http_path=None, verbose=1, host='localhost', port=9090, proto='binary') options, args = parser.parse_args() @@ -79,10 +79,13 @@ class AbstractTest(unittest.TestCase): else: socket = TSocket.TSocket(options.host, options.port) # frame or buffer depending upon args - if options.framed: + self.transport = TTransport.TBufferedTransport(socket) + if options.trans == 'framed': self.transport = TTransport.TFramedTransport(socket) - else: + elif options.trans == 'buffered': self.transport = TTransport.TBufferedTransport(socket) + elif options.trans == '': + raise AssertionError('Unknown --transport option: %s' % options.trans) if options.zlib: self.transport = TZlibTransport.TZlibTransport(self.transport, 9) self.transport.open() @@ -180,7 +183,7 @@ class AbstractTest(unittest.TestCase): xpected.i64_thing, { 0:'abc' }, Numberz.FIVE, - 0xf0f0f0) + 0xf0f0f0) self.assertEqual(y, xpected) def testException(self): @@ -208,7 +211,7 @@ class AbstractTest(unittest.TestCase): end = time.time() self.assertTrue(end - start < 3, "oneway sleep took %f sec" % (end - start)) - + def testOnewayThenNormal(self): self.client.testOneway(1) # type is int, not float self.assertEqual(self.client.testString('Python'), 'Python') @@ -241,7 +244,7 @@ def suite(): elif options.proto == 'json': suite.addTest(loader.loadTestsFromTestCase(JSONTest)) else: - raise AssertionError('Unknown protocol given with --proto: %s' % options.proto) + raise AssertionError('Unknown protocol given with --protocol: %s' % options.proto) return suite class OwnArgsTestProgram(unittest.TestProgram): diff --git a/test/py/TestServer.py b/test/py/TestServer.py index 80223413..6ee03992 100755 --- a/test/py/TestServer.py +++ b/test/py/TestServer.py @@ -35,14 +35,16 @@ parser.add_option("--ssl", action="store_true", dest="ssl", help="use SSL for encrypted transport") parser.add_option("--multiple", action="store_true", dest="multiple", help="use multiple service") -parser.add_option('-v', '--verbose', action="store_const", +parser.add_option('-v', '--verbose', action="store_const", dest="verbose", const=2, help="verbose output") -parser.add_option('-q', '--quiet', action="store_const", +parser.add_option('-q', '--quiet', action="store_const", dest="verbose", const=0, help="minimal output") -parser.add_option('--proto', dest="proto", type="string", +parser.add_option('--protocol', dest="proto", type="string", help="protocol to use, one of: accel, binary, compact, json") +parser.add_option('--transport', dest="trans", type="string", + help="transport to use, one of: buffered, framed") parser.set_defaults(port=9090, verbose=1, proto='binary') options, args = parser.parse_args() @@ -185,10 +187,10 @@ class TestHandler: byte_thing=arg0, i32_thing=arg1, i64_thing=arg2) -# set up the protocol factory form the --proto option +# set up the protocol factory form the --protocol option pfactory_cls = PROT_FACTORIES.get(options.proto, None) if pfactory_cls is None: - raise AssertionError('Unknown --proto option: %s' % options.proto) + raise AssertionError('Unknown --protocol option: %s' % options.proto) pfactory = pfactory_cls() # get the server type (TSimpleServer, TNonblockingServer, etc...) @@ -214,14 +216,26 @@ if server_type == 'THttpServer': sys.exit(0) # set up server transport and transport factory + +script_dir = os.path.dirname(__file__) #<-- absolute dir the script is in +rel_path = "../keys/server.pem" +abs_key_path = os.path.join(script_dir, rel_path) + host = None if options.ssl: from thrift.transport import TSSLSocket - transport = TSSLSocket.TSSLServerSocket(host, options.port, certfile='../keys/server.pem') + transport = TSSLSocket.TSSLServerSocket(host, options.port, certfile=abs_key_path) else: transport = TSocket.TServerSocket(host, options.port) tfactory = TTransport.TBufferedTransportFactory() - +if options.trans == 'buffered': + tfactory = TTransport.TBufferedTransportFactory() +elif options.trans == 'framed': + tfactory = TTransport.TFramedTransportFactory() +elif options.trans == '': + raise AssertionError('Unknown --transport option: %s' % options.trans) +else: + tfactory = TTransport.TBufferedTransportFactory() # if --zlib, then wrap server transport, and use a different transport factory if options.zlib: transport = TZlibTransport.TZlibTransport(transport) # wrap with zlib diff --git a/test/test.sh b/test/test.sh index c25a5d67..0fdb0de7 100755 --- a/test/test.sh +++ b/test/test.sh @@ -31,7 +31,7 @@ cd "$( dirname "$0" )" BASEDIR=$(pwd) print_header() { - printf "%-16s %-11s %-17s %-s\n" "client-server:" "protocol:" "transport:" "result:" + printf "%-16s %-13s %-17s %-s\n" "client-server:" "protocol:" "transport:" "result:" } STATUS_HTML="status.html" @@ -116,7 +116,7 @@ do_test () { testname=${client_server}_${protocol}_${transport} server_timeout=$(echo "(${server_startup_time}+${client_timeout})" | bc) - printf "%-16s %-11s %-17s" ${client_server} ${protocol} ${transport} + printf "%-16s %-13s %-17s" ${client_server} ${protocol} ${transport} timeout $server_timeout $server_exec > log/${testname}_server.log 2>&1 & server_pid=$! @@ -183,7 +183,6 @@ java_protocols="binary compact json" cpp_transports="buffered framed http" java_server_transports="buffered framed fastframed" java_client_transports=${java_server_transports}" http" -# we need a test certificate first cpp_sockets="ip domain ip-ssl" java_sockets="ip ip-ssl" # TODO fastframed java transport is another implementation of framed transport @@ -197,8 +196,8 @@ csharp_transports="buffered framed" csharp_sockets="ip ip-ssl" py_protocols="binary compact json accel" -py_transports="buffered" -py_sockets="ip" +py_transports="buffered framed" +py_sockets="ip ip-ssl" ######### java client - java server ############# @@ -363,13 +362,30 @@ for proto in ${py_protocols}; do "ip-ssl" ) extraparam="--ssl";; esac do_test "py-py" "${proto}" "${trans}-${sock}" \ - "py/TestClient.py --proto=${proto} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ - "py/TestServer.py --proto=${proto} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ + "py/TestClient.py --protocol=${proto} --transport={trans} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ + "py/TestServer.py --protocol=${proto} --transport={trans} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ "10" "2" done done done +for trans in ${py_transports}; do + for sock in ${py_sockets}; do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "py-py" "accel-binary" "${trans}-${sock}" \ + "py/TestClient.py --protocol=accel --transport=${trans} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ + "py/TestServer.py --protocol=binary --transport=${trans} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ + "10" "2" + do_test "py-py" "binary-accel" "${trans}-${sock}" \ + "py/TestClient.py --protocol=binary --transport={trans} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ + "py/TestServer.py --protocol=accel --transport={trans} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ + "10" "2" + done + done + ######### py client - cpp server ############## for proto in $(intersection "${cpp_protocols}" "${py_protocols}"); do for trans in $(intersection "${cpp_transports}" "${py_transports}"); do @@ -379,13 +395,26 @@ for proto in $(intersection "${cpp_protocols}" "${py_protocols}"); do "ip-ssl" ) extraparam="--ssl";; esac do_test "py-cpp" "${proto}" "${trans}-${sock}" \ - "py/TestClient.py --proto=${proto} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ + "py/TestClient.py --protocol=${proto} --transport=${trans} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ "cpp/TestServer --protocol=${proto} --transport=${trans} ${extraparam}" \ "10" "2" done done done +for trans in $(intersection "${cpp_transports}" "${py_transports}"); do + for sock in $(intersection "${cpp_sockets}" "${py_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "py-cpp" "accel-binary" "${trans}-${sock}" \ + "py/TestClient.py --protocol=accel --transport=${trans} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ + "cpp/TestServer --protocol=binary --transport=${trans} ${extraparam}" \ + "10" "2" + done + done + ######### cpp client - py server ############## for proto in $(intersection "${cpp_protocols}" "${py_protocols}"); do for trans in $(intersection "${cpp_transports}" "${py_transports}"); do @@ -396,12 +425,25 @@ for proto in $(intersection "${cpp_protocols}" "${py_protocols}"); do esac do_test "cpp-py" "${proto}" "${trans}-${sock}" \ "cpp/TestClient --protocol=${proto} --transport=${trans} ${extraparam}" \ - "py/TestServer.py --proto=${proto} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ + "py/TestServer.py --protocol=${proto} --transport=${trans} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ "10" "2" done done done +for trans in $(intersection "${cpp_transports}" "${py_transports}"); do + for sock in $(intersection "${cpp_sockets}" "${py_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "cpp-py" "binary-accel" "${trans}-${sock}" \ + "cpp/TestClient --protocol=binary --transport=${trans} ${extraparam}" \ + "py/TestServer.py --protocol=accel --transport=${trans} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ + "10" "2" + done + done + ######### py client - java server ############## ## for proto in $(intersection "${py_protocols}" "${java_protocols}"); do @@ -412,13 +454,26 @@ for proto in $(intersection "${py_protocols}" "${java_protocols}"); do "ip-ssl" ) extraparam="--ssl";; esac do_test "py-java" "${proto}" "${trans}-${sock}" \ - "py/TestClient.py --proto=${proto} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ + "py/TestClient.py --protocol=${proto} --transport=${trans} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ "ant -f ../lib/java/build.xml -Dno-gen-thrift=\"\" -Dtestargs \"--protocol=${proto} --transport=${trans} ${extraparam}\" run-testserver" \ "15" "2" done done done +for trans in $(intersection "${py_transports}" "${java_server_transports}"); do + for sock in $(intersection "${py_sockets}" "${java_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "py-java" "accel-binary" "${trans}-${sock}" \ + "py/TestClient.py --protocol=accel --transport=${trans} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ + "ant -f ../lib/java/build.xml -Dno-gen-thrift=\"\" -Dtestargs \"--protocol=binary --transport=${trans} ${extraparam}\" run-testserver" \ + "15" "2" + done + done + ######### java client - py server ############## for proto in $(intersection "${py_protocols}" "${java_protocols}"); do for trans in $(intersection "${py_transports}" "${java_client_transports}"); do @@ -429,12 +484,25 @@ for proto in $(intersection "${py_protocols}" "${java_protocols}"); do esac do_test "java-py" "${proto}" "${trans}-${sock}" \ "ant -f ../lib/java/build.xml -Dno-gen-thrift=\"\" -Dtestargs \"--protocol=${proto} --transport=${trans} ${extraparam}\" run-testclient" \ - "py/TestServer.py --proto=${proto} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ + "py/TestServer.py --protocol=${proto} --transport=${trans} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ "10" "5" done done done +for trans in $(intersection "${py_transports}" "${java_client_transports}"); do + for sock in $(intersection "${py_sockets}" "${java_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "java-py" "binary-accel" "${trans}-${sock}" \ + "ant -f ../lib/java/build.xml -Dno-gen-thrift=\"\" -Dtestargs \"--protocol=binary --transport=${trans} ${extraparam}\" run-testclient" \ + "py/TestServer.py --protocol=accel --transport=${trans} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ + "10" "5" + done + done + ######### py client - nodejs server ############## ## for proto in $(intersection "${py_protocols}" "${nodejs_protocols}"); do @@ -445,13 +513,26 @@ for proto in $(intersection "${py_protocols}" "${nodejs_protocols}"); do "ip-ssl" ) extraparam="--ssl";; esac do_test "py-nodejs" "${proto}" "${trans}-${sock}" \ - "py/TestClient.py --proto=${proto} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ + "py/TestClient.py --protocol=${proto} --transport=${trans} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ "node ${NODE_TEST_DIR}/server.js -p ${proto} -t ${trans} ${extraparam}" \ "15" "2" done done done +for trans in $(intersection "${py_transports}" "${nodejs_transports}"); do + for sock in $(intersection "${py_sockets}" "${nodejs_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "py-nodejs" "${proto}" "${trans}-${sock}" \ + "py/TestClient.py --protocol=accel --transport=${trans} --port=9090 --host=localhost --genpydir=py/gen-py ${extraparam}" \ + "node ${NODE_TEST_DIR}/server.js -p binary -t ${trans} ${extraparam}" \ + "15" "2" + done + done + ######### nodejs client - py server ############## for proto in $(intersection "${py_protocols}" "${nodejs_protocols}"); do for trans in $(intersection "${py_transports}" "${nodejs_transports}"); do @@ -462,12 +543,25 @@ for proto in $(intersection "${py_protocols}" "${nodejs_protocols}"); do esac do_test "nodejs-py" "${proto}" "${trans}-${sock}" \ "node ${NODE_TEST_DIR}/client.js -p ${proto} -t ${trans} ${extraparam}" \ - "py/TestServer.py --proto=${proto} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ + "py/TestServer.py --protocol=${proto} --transport=${trans} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ "10" "2" done done done +for trans in $(intersection "${py_transports}" "${nodejs_transports}"); do + for sock in $(intersection "${py_sockets}" "${nodejs_sockets}"); do + case "$sock" in + "ip" ) extraparam="";; + "ip-ssl" ) extraparam="--ssl";; + esac + do_test "nodejs-py" "binary-accel" "${trans}-${sock}" \ + "node ${NODE_TEST_DIR}/client.js -p binary -t ${trans} ${extraparam}" \ + "py/TestServer.py --protocol=accel --transport=${trans} --port=9090 --genpydir=py/gen-py TSimpleServer ${extraparam}" \ + "10" "2" + done + done + # delete Unix Domain Socket used by cpp tests rm -f /tmp/ThriftTest.thrift