You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by jk...@apache.org on 2018/04/13 17:21:16 UTC

[thrift] branch master updated: THRIFT-4548: add python cross test client multiplexed protocol support Client: py

This is an automated email from the ASF dual-hosted git repository.

jking pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/thrift.git


The following commit(s) were added to refs/heads/master by this push:
     new 2068544  THRIFT-4548: add python cross test client multiplexed protocol support Client: py
2068544 is described below

commit 2068544a09e22d4ca2091bde01bc858a15e5b762
Author: James E. King III <jk...@apache.org>
AuthorDate: Tue Apr 10 10:30:51 2018 -0400

    THRIFT-4548: add python cross test client multiplexed protocol support
    Client: py
---
 lib/py/src/TMultiplexedProcessor.py |   4 +-
 test/known_failures_Linux.json      | 144 +++++++++++++++++++++++-------------
 test/py/TestClient.py               |  99 ++++++++++++++++++++++---
 test/tests.json                     |  14 ++++
 4 files changed, 194 insertions(+), 67 deletions(-)

diff --git a/lib/py/src/TMultiplexedProcessor.py b/lib/py/src/TMultiplexedProcessor.py
index 605aa1f..7d60347 100644
--- a/lib/py/src/TMultiplexedProcessor.py
+++ b/lib/py/src/TMultiplexedProcessor.py
@@ -31,11 +31,11 @@ class TMultiplexedProcessor(TProcessor):
     def process(self, iprot, oprot):
         (name, type, seqid) = iprot.readMessageBegin()
         if type != TMessageType.CALL and type != TMessageType.ONEWAY:
-            raise TException("TMultiplex protocol only supports CALL & ONEWAY")
+            raise TException("TMultiplexed protocol only supports CALL & ONEWAY")
 
         index = name.find(TMultiplexedProtocol.SEPARATOR)
         if index < 0:
-            raise TException("Service name not found in message name: " + name + ". Did you forget to use TMultiplexProtocol in your client?")
+            raise TException("Service name not found in message name: " + name + ". Did you forget to use TMultiplexedProtocol in your client?")
 
         serviceName = name[0:index]
         call = name[index + len(TMultiplexedProtocol.SEPARATOR):]
diff --git a/test/known_failures_Linux.json b/test/known_failures_Linux.json
index 16ede27..3212f7e 100644
--- a/test/known_failures_Linux.json
+++ b/test/known_failures_Linux.json
@@ -1,12 +1,12 @@
 [
-  "c_glib-csharp_multi-binary_buffered-ip",
-  "c_glib-csharp_multi-binary_framed-ip",
-  "c_glib-csharp_multi_buffered-ip",
-  "c_glib-csharp_multi_framed-ip",
-  "c_glib-csharp_multic-compact_buffered-ip",
-  "c_glib-csharp_multic-compact_framed-ip",
-  "c_glib-csharp_multic_buffered-ip",
-  "c_glib-csharp_multic_framed-ip",
+  "c_glib-py3_multi-multia_buffered-ip",
+  "c_glib-py3_multi-multia_framed-ip",
+  "c_glib-py3_multic-multiac_buffered-ip",
+  "c_glib-py3_multic-multiac_framed-ip",
+  "c_glib-py_multi-multia_buffered-ip",
+  "c_glib-py_multi-multia_framed-ip",
+  "c_glib-py_multic-multiac_buffered-ip",
+  "c_glib-py_multic-multiac_framed-ip",
   "c_glib-rs_multi_buffered-ip",
   "c_glib-rs_multi_framed-ip",
   "c_glib-rs_multic_buffered-ip",
@@ -19,6 +19,10 @@
   "cl-c_glib_multi_framed-ip",
   "cl-go_binary_buffered-ip",
   "cl-go_binary_framed-ip",
+  "cl-py3_multi-multia_buffered-ip",
+  "cl-py3_multi-multia_framed-ip",
+  "cl-py_multi-multia_buffered-ip",
+  "cl-py_multi-multia_framed-ip",
   "cl-rb_binary-accel_buffered-ip",
   "cl-rb_binary-accel_framed-ip",
   "cl-rb_binary_buffered-ip",
@@ -97,12 +101,30 @@
   "cpp-py3_multi-accel_http-ip-ssl",
   "cpp-py3_multi-binary_http-ip",
   "cpp-py3_multi-binary_http-ip-ssl",
+  "cpp-py3_multi-multia_buffered-ip",
+  "cpp-py3_multi-multia_buffered-ip-ssl",
+  "cpp-py3_multi-multia_framed-ip",
+  "cpp-py3_multi-multia_framed-ip-ssl",
+  "cpp-py3_multi-multia_http-ip",
+  "cpp-py3_multi-multia_http-ip-ssl",
+  "cpp-py3_multi_http-ip",
+  "cpp-py3_multi_http-ip-ssl",
   "cpp-py3_multic-accelc_http-ip",
   "cpp-py3_multic-accelc_http-ip-ssl",
   "cpp-py3_multic-compact_http-ip",
   "cpp-py3_multic-compact_http-ip-ssl",
+  "cpp-py3_multic-multiac_buffered-ip",
+  "cpp-py3_multic-multiac_buffered-ip-ssl",
+  "cpp-py3_multic-multiac_framed-ip",
+  "cpp-py3_multic-multiac_framed-ip-ssl",
+  "cpp-py3_multic-multiac_http-ip",
+  "cpp-py3_multic-multiac_http-ip-ssl",
+  "cpp-py3_multic_http-ip",
+  "cpp-py3_multic_http-ip-ssl",
   "cpp-py3_multij-json_http-ip",
   "cpp-py3_multij-json_http-ip-ssl",
+  "cpp-py3_multij_http-ip",
+  "cpp-py3_multij_http-ip-ssl",
   "cpp-py_binary-accel_http-ip",
   "cpp-py_binary-accel_http-ip-ssl",
   "cpp-py_binary_http-ip",
@@ -117,26 +139,34 @@
   "cpp-py_multi-accel_http-ip-ssl",
   "cpp-py_multi-binary_http-ip",
   "cpp-py_multi-binary_http-ip-ssl",
+  "cpp-py_multi-multia_buffered-ip",
+  "cpp-py_multi-multia_buffered-ip-ssl",
+  "cpp-py_multi-multia_framed-ip",
+  "cpp-py_multi-multia_framed-ip-ssl",
+  "cpp-py_multi-multia_http-ip",
+  "cpp-py_multi-multia_http-ip-ssl",
+  "cpp-py_multi_http-ip",
+  "cpp-py_multi_http-ip-ssl",
   "cpp-py_multic-accelc_http-ip",
   "cpp-py_multic-accelc_http-ip-ssl",
   "cpp-py_multic-compact_http-ip",
   "cpp-py_multic-compact_http-ip-ssl",
+  "cpp-py_multic-multiac_buffered-ip",
+  "cpp-py_multic-multiac_buffered-ip-ssl",
+  "cpp-py_multic-multiac_framed-ip",
+  "cpp-py_multic-multiac_framed-ip-ssl",
+  "cpp-py_multic-multiac_http-ip",
+  "cpp-py_multic-multiac_http-ip-ssl",
+  "cpp-py_multic_http-ip",
+  "cpp-py_multic_http-ip-ssl",
   "cpp-py_multij-json_http-ip",
   "cpp-py_multij-json_http-ip-ssl",
+  "cpp-py_multij_http-ip",
+  "cpp-py_multij_http-ip-ssl",
   "cpp-rs_multi_buffered-ip",
   "cpp-rs_multi_framed-ip",
   "cpp-rs_multic_buffered-ip",
   "cpp-rs_multic_framed-ip",
-  "csharp-d_binary_buffered-ip-ssl",
-  "csharp-d_binary_framed-ip-ssl",
-  "csharp-d_compact_buffered-ip-ssl",
-  "csharp-d_compact_framed-ip-ssl",
-  "csharp-d_json_buffered-ip-ssl",
-  "csharp-d_json_framed-ip-ssl",
-  "csharp-erl_binary_buffered-ip-ssl",
-  "csharp-erl_binary_framed-ip-ssl",
-  "csharp-erl_compact_buffered-ip-ssl",
-  "csharp-erl_compact_framed-ip-ssl",
   "csharp-rb_binary-accel_buffered-ip-ssl",
   "csharp-rb_binary-accel_framed-ip-ssl",
   "csharp-rb_binary_buffered-ip-ssl",
@@ -301,18 +331,34 @@
   "go-java_compact_http-ip-ssl",
   "go-java_json_http-ip",
   "go-java_json_http-ip-ssl",
-  "go-nodejs_json_framed-ip",
+  "hs-csharp_binary_buffered-ip",
   "hs-csharp_binary_framed-ip",
+  "hs-csharp_compact_buffered-ip",
   "hs-csharp_compact_framed-ip",
-  "java-d_compact_buffered-ip",
-  "java-d_compact_buffered-ip-ssl",
-  "java-d_compact_framed-ip",
-  "netcore-csharp_binary_buffered-ip-ssl",
-  "netcore-csharp_binary_framed-ip-ssl",
-  "netcore-csharp_compact_buffered-ip-ssl",
-  "netcore-csharp_compact_framed-ip-ssl",
-  "netcore-csharp_json_buffered-ip-ssl",
-  "netcore-csharp_json_framed-ip-ssl",
+  "java-py3_multi-multia_buffered-ip",
+  "java-py3_multi-multia_buffered-ip-ssl",
+  "java-py3_multi-multia_fastframed-framed-ip",
+  "java-py3_multi-multia_fastframed-framed-ip-ssl",
+  "java-py3_multi-multia_framed-ip",
+  "java-py3_multi-multia_framed-ip-ssl",
+  "java-py3_multic-multiac_buffered-ip",
+  "java-py3_multic-multiac_buffered-ip-ssl",
+  "java-py3_multic-multiac_fastframed-framed-ip",
+  "java-py3_multic-multiac_fastframed-framed-ip-ssl",
+  "java-py3_multic-multiac_framed-ip",
+  "java-py3_multic-multiac_framed-ip-ssl",
+  "java-py_multi-multia_buffered-ip",
+  "java-py_multi-multia_buffered-ip-ssl",
+  "java-py_multi-multia_fastframed-framed-ip",
+  "java-py_multi-multia_fastframed-framed-ip-ssl",
+  "java-py_multi-multia_framed-ip",
+  "java-py_multi-multia_framed-ip-ssl",
+  "java-py_multic-multiac_buffered-ip",
+  "java-py_multic-multiac_buffered-ip-ssl",
+  "java-py_multic-multiac_fastframed-framed-ip",
+  "java-py_multic-multiac_fastframed-framed-ip-ssl",
+  "java-py_multic-multiac_framed-ip",
+  "java-py_multic-multiac_framed-ip-ssl",
   "nodejs-cpp_binary_http-domain",
   "nodejs-cpp_binary_http-ip",
   "nodejs-cpp_binary_http-ip-ssl",
@@ -350,18 +396,6 @@
   "nodejs-lua_binary_http-ip",
   "nodejs-lua_compact_http-ip",
   "nodejs-lua_json_http-ip",
-  "nodejs-netcore_binary_buffered-ip",
-  "nodejs-netcore_binary_buffered-ip-ssl",
-  "nodejs-netcore_binary_framed-ip",
-  "nodejs-netcore_binary_framed-ip-ssl",
-  "nodejs-netcore_compact_buffered-ip",
-  "nodejs-netcore_compact_buffered-ip-ssl",
-  "nodejs-netcore_compact_framed-ip",
-  "nodejs-netcore_compact_framed-ip-ssl",
-  "nodejs-netcore_json_buffered-ip",
-  "nodejs-netcore_json_buffered-ip-ssl",
-  "nodejs-netcore_json_framed-ip",
-  "nodejs-netcore_json_framed-ip-ssl",
   "nodejs-py3_binary-accel_http-ip",
   "nodejs-py3_binary-accel_http-ip-ssl",
   "nodejs-py3_binary_http-ip",
@@ -382,6 +416,14 @@
   "nodejs-py_compact_http-ip-ssl",
   "nodejs-py_json_http-ip",
   "nodejs-py_json_http-ip-ssl",
+  "perl-py3_multi-multia_buffered-ip",
+  "perl-py3_multi-multia_buffered-ip-ssl",
+  "perl-py3_multi-multia_framed-ip",
+  "perl-py3_multi-multia_framed-ip-ssl",
+  "perl-py_multi-multia_buffered-ip",
+  "perl-py_multi-multia_buffered-ip-ssl",
+  "perl-py_multi-multia_framed-ip",
+  "perl-py_multi-multia_framed-ip-ssl",
   "perl-rs_multi_buffered-ip",
   "perl-rs_multi_framed-ip",
   "py-cpp_accel-binary_http-ip",
@@ -480,16 +522,12 @@
   "rb-cpp_json_framed-domain",
   "rb-cpp_json_framed-ip",
   "rb-cpp_json_framed-ip-ssl",
-  "rs-cpp_binary_buffered-ip",
-  "rs-cpp_binary_framed-ip",
-  "rs-cpp_compact_buffered-ip",
-  "rs-cpp_compact_framed-ip",
-  "rs-cpp_multi-binary_buffered-ip",
-  "rs-cpp_multi-binary_framed-ip",
-  "rs-cpp_multi_buffered-ip",
-  "rs-cpp_multi_framed-ip",
-  "rs-cpp_multic-compact_buffered-ip",
-  "rs-cpp_multic-compact_framed-ip",
-  "rs-cpp_multic_buffered-ip",
-  "rs-cpp_multic_framed-ip"
-]
\ No newline at end of file
+  "rs-py3_multi-multia_buffered-ip",
+  "rs-py3_multi-multia_framed-ip",
+  "rs-py3_multic-multiac_buffered-ip",
+  "rs-py3_multic-multiac_framed-ip",
+  "rs-py_multi-multia_buffered-ip",
+  "rs-py_multi-multia_framed-ip",
+  "rs-py_multic-multiac_buffered-ip",
+  "rs-py_multic-multiac_framed-ip"
+]
diff --git a/test/py/TestClient.py b/test/py/TestClient.py
index edab610..2164162 100755
--- a/test/py/TestClient.py
+++ b/test/py/TestClient.py
@@ -63,6 +63,9 @@ class AbstractTest(unittest.TestCase):
         self.transport.open()
         protocol = self.get_protocol(self.transport)
         self.client = ThriftTest.Client(protocol)
+        # for multiplexed services:
+        protocol2 = self.get_protocol2(self.transport)
+        self.client2 = SecondService.Client(protocol2) if protocol2 is not None else None
 
     def tearDown(self):
         self.transport.close()
@@ -107,6 +110,11 @@ class AbstractTest(unittest.TestCase):
         self.assertEqual(self.client.testString(s1), s1)
         self.assertEqual(self.client.testString(s2), s2)
 
+    def testMultiplexed(self):
+        if self.client2 is not None:
+            print('testMultiplexed')
+            self.assertEqual(self.client2.secondtestString('foobar'), 'testString("foobar")')
+
     def testBool(self):
         print('testBool')
         self.assertEqual(self.client.testBool(True), True)
@@ -260,44 +268,109 @@ class AbstractTest(unittest.TestCase):
         self.assertEqual(self.client.testString('Python'), 'Python')
 
 
-class NormalBinaryTest(AbstractTest):
+class MultiplexedOptionalTest(AbstractTest):
+    def get_protocol2(self, transport):
+        return None
+
+
+class BinaryTest(MultiplexedOptionalTest):
     def get_protocol(self, transport):
         return TBinaryProtocol.TBinaryProtocolFactory().getProtocol(transport)
 
 
-class CompactTest(AbstractTest):
+class MultiplexedBinaryTest(MultiplexedOptionalTest):
     def get_protocol(self, transport):
-        return TCompactProtocol.TCompactProtocolFactory().getProtocol(transport)
+        wrapped_proto = TBinaryProtocol.TBinaryProtocolFactory().getProtocol(transport)
+        return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "ThriftTest")
+
+    def get_protocol2(self, transport):
+        wrapped_proto = TBinaryProtocol.TBinaryProtocolFactory().getProtocol(transport)
+        return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "SecondService")
 
 
-class JSONTest(AbstractTest):
+class AcceleratedBinaryTest(MultiplexedOptionalTest):
     def get_protocol(self, transport):
-        return TJSONProtocol.TJSONProtocolFactory().getProtocol(transport)
+        return TBinaryProtocol.TBinaryProtocolAcceleratedFactory(fallback=False).getProtocol(transport)
 
 
-class AcceleratedBinaryTest(AbstractTest):
+class MultiplexedAcceleratedBinaryTest(MultiplexedOptionalTest):
     def get_protocol(self, transport):
-        return TBinaryProtocol.TBinaryProtocolAcceleratedFactory(fallback=False).getProtocol(transport)
+        wrapped_proto = TBinaryProtocol.TBinaryProtocolAcceleratedFactory(fallback=False).getProtocol(transport)
+        return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "ThriftTest")
+
+    def get_protocol2(self, transport):
+        wrapped_proto = TBinaryProtocol.TBinaryProtocolAcceleratedFactory(fallback=False).getProtocol(transport)
+        return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "SecondService")
+
+
+class CompactTest(MultiplexedOptionalTest):
+    def get_protocol(self, transport):
+        return TCompactProtocol.TCompactProtocolFactory().getProtocol(transport)
+
+
+class MultiplexedCompactTest(MultiplexedOptionalTest):
+    def get_protocol(self, transport):
+        wrapped_proto = TCompactProtocol.TCompactProtocolFactory().getProtocol(transport)
+        return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "ThriftTest")
+
+    def get_protocol2(self, transport):
+        wrapped_proto = TCompactProtocol.TCompactProtocolFactory().getProtocol(transport)
+        return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "SecondService")
 
 
-class AcceleratedCompactTest(AbstractTest):
+class AcceleratedCompactTest(MultiplexedOptionalTest):
     def get_protocol(self, transport):
         return TCompactProtocol.TCompactProtocolAcceleratedFactory(fallback=False).getProtocol(transport)
 
 
+class MultiplexedAcceleratedCompactTest(MultiplexedOptionalTest):
+    def get_protocol(self, transport):
+        wrapped_proto = TCompactProtocol.TCompactProtocolAcceleratedFactory(fallback=False).getProtocol(transport)
+        return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "ThriftTest")
+
+    def get_protocol2(self, transport):
+        wrapped_proto = TCompactProtocol.TCompactProtocolAcceleratedFactory(fallback=False).getProtocol(transport)
+        return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "SecondService")
+
+
+class JSONTest(MultiplexedOptionalTest):
+    def get_protocol(self, transport):
+        return TJSONProtocol.TJSONProtocolFactory().getProtocol(transport)
+
+
+class MultiplexedJSONTest(MultiplexedOptionalTest):
+    def get_protocol(self, transport):
+        wrapped_proto = TJSONProtocol.TJSONProtocolFactory().getProtocol(transport)
+        return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "ThriftTest")
+
+    def get_protocol2(self, transport):
+        wrapped_proto = TJSONProtocol.TJSONProtocolFactory().getProtocol(transport)
+        return TMultiplexedProtocol.TMultiplexedProtocol(wrapped_proto, "SecondService")
+
+
 def suite():
     suite = unittest.TestSuite()
     loader = unittest.TestLoader()
     if options.proto == 'binary':  # look for --proto on cmdline
-        suite.addTest(loader.loadTestsFromTestCase(NormalBinaryTest))
+        suite.addTest(loader.loadTestsFromTestCase(BinaryTest))
     elif options.proto == 'accel':
         suite.addTest(loader.loadTestsFromTestCase(AcceleratedBinaryTest))
-    elif options.proto == 'compact':
-        suite.addTest(loader.loadTestsFromTestCase(CompactTest))
     elif options.proto == 'accelc':
         suite.addTest(loader.loadTestsFromTestCase(AcceleratedCompactTest))
+    elif options.proto == 'compact':
+        suite.addTest(loader.loadTestsFromTestCase(CompactTest))
     elif options.proto == 'json':
         suite.addTest(loader.loadTestsFromTestCase(JSONTest))
+    elif options.proto == 'multi':
+        suite.addTest(loader.loadTestsFromTestCase(MultiplexedBinaryTest))
+    elif options.proto == 'multia':
+        suite.addTest(loader.loadTestsFromTestCase(MultiplexedAcceleratedBinaryTest))
+    elif options.proto == 'multiac':
+        suite.addTest(loader.loadTestsFromTestCase(MultiplexedAcceleratedCompactTest))
+    elif options.proto == 'multic':
+        suite.addTest(loader.loadTestsFromTestCase(MultiplexedCompactTest))
+    elif options.proto == 'multij':
+        suite.addTest(loader.loadTestsFromTestCase(MultiplexedJSONTest))
     else:
         raise AssertionError('Unknown protocol given with --protocol: %s' % options.proto)
     return suite
@@ -335,7 +408,7 @@ if __name__ == "__main__":
                       dest="verbose", const=0,
                       help="minimal output")
     parser.add_option('--protocol', dest="proto", type="string",
-                      help="protocol to use, one of: accel, accelc, binary, compact, json")
+                      help="protocol to use, one of: accel, accelc, binary, compact, json, multi, multia, multiac, multic, multij")
     parser.add_option('--transport', dest="trans", type="string",
                       help="transport to use, one of: buffered, framed, http")
     parser.set_defaults(framed=False, http_path=None, verbose=1, host='localhost', port=9090, proto='binary')
@@ -348,6 +421,7 @@ if __name__ == "__main__":
     if options.http_path:
         options.trans = 'http'
 
+    from ThriftTest import SecondService
     from ThriftTest import ThriftTest
     from ThriftTest.ttypes import Xtruct, Xtruct2, Numberz, Xception, Xception2
     from thrift.Thrift import TException
@@ -358,5 +432,6 @@ if __name__ == "__main__":
     from thrift.protocol import TBinaryProtocol
     from thrift.protocol import TCompactProtocol
     from thrift.protocol import TJSONProtocol
+    from thrift.protocol import TMultiplexedProtocol
 
     OwnArgsTestProgram(defaultTest="suite", testRunner=unittest.TextTestRunner(verbosity=1))
diff --git a/test/tests.json b/test/tests.json
index ed38fea..72790ac 100644
--- a/test/tests.json
+++ b/test/tests.json
@@ -250,6 +250,13 @@
         "--verbose",
         "--host=localhost",
         "--genpydir=gen-py"
+      ],
+      "protocols": [
+        "multi",
+        "multi:multia",
+        "multic",
+        "multic:multiac",
+        "multij"
       ]
     },
     "transports": [
@@ -289,6 +296,13 @@
         "TestClient.py",
         "--host=localhost",
         "--genpydir=gen-py"
+      ],
+      "protocols": [
+        "multi",
+        "multi:multia",
+        "multic",
+        "multic:multiac",
+        "multij"
       ]
     },
     "transports": [

-- 
To stop receiving notification emails like this one, please contact
jking@apache.org.