From 58402ff6a71f00f9d61a9676bdabd3e5bbe9ea3f Mon Sep 17 00:00:00 2001
From: "James E. King, III"
- * shared_ptr processor(new TMultiplexedProcessor());
+ * stdcxx::shared_ptr processor(new TMultiplexedProcessor());
*
* processor->registerProcessor(
* "Calculator",
- * shared_ptr( new CalculatorProcessor(
- * shared_ptr( new CalculatorHandler()))));
+ * stdcxx::shared_ptr( new CalculatorProcessor(
+ * stdcxx::shared_ptr( new CalculatorHandler()))));
*
* processor->registerProcessor(
* "WeatherReport",
- * shared_ptr( new WeatherReportProcessor(
- * shared_ptr( new WeatherReportHandler()))));
+ * stdcxx::shared_ptr( new WeatherReportProcessor(
+ * stdcxx::shared_ptr( new WeatherReportHandler()))));
*
- * shared_ptr transport(new TServerSocket(9090));
+ * stdcxx::shared_ptr transport(new TServerSocket(9090));
* TSimpleServer server(processor, transport);
*
* server.serve();
@@ -87,7 +85,7 @@ public:
*/
class TMultiplexedProcessor : public TProcessor {
public:
- typedef std::map > services_t;
+ typedef std::map > services_t;
/**
* 'Register' a service with this TMultiplexedProcessor
. This
@@ -100,10 +98,40 @@ public:
* as "handlers", e.g. WeatherReportHandler,
* implementing WeatherReportIf interface.
*/
- void registerProcessor(const std::string& serviceName, shared_ptr processor) {
+ void registerProcessor(const std::string& serviceName, stdcxx::shared_ptr processor) {
services[serviceName] = processor;
}
+ /**
+ * Register a service to be called to process queries without service name
+ * \param [in] processor Implementation of a service.
+ */
+ void registerDefault(const stdcxx::shared_ptr& processor) {
+ defaultProcessor = processor;
+ }
+
+ /**
+ * Chew up invalid input and return an exception to throw.
+ */
+ TException protocol_error(stdcxx::shared_ptr in,
+ stdcxx::shared_ptr out,
+ const std::string& name,
+ int32_t seqid,
+ const std::string& msg) const {
+ in->skip(::apache::thrift::protocol::T_STRUCT);
+ in->readMessageEnd();
+ in->getTransport()->readEnd();
+ ::apache::thrift::TApplicationException
+ x(::apache::thrift::TApplicationException::PROTOCOL_ERROR,
+ "TMultiplexedProcessor: " + msg);
+ out->writeMessageBegin(name, ::apache::thrift::protocol::T_EXCEPTION, seqid);
+ x.write(out.get());
+ out->writeMessageEnd();
+ out->getTransport()->writeEnd();
+ out->getTransport()->flush();
+ return TException(msg);
+}
+
/**
* This implementation of process
performs the following steps:
*
@@ -119,8 +147,8 @@ public:
* the service name was not found in the message, or if the service
* name was not found in the service map.
*/
- bool process(shared_ptr in,
- shared_ptr out,
+ bool process(stdcxx::shared_ptr in,
+ stdcxx::shared_ptr out,
void* connectionContext) {
std::string name;
protocol::TMessageType type;
@@ -133,22 +161,10 @@ public:
if (type != protocol::T_CALL && type != protocol::T_ONEWAY) {
// Unexpected message type.
- in->skip(::apache::thrift::protocol::T_STRUCT);
- in->readMessageEnd();
- in->getTransport()->readEnd();
- const std::string msg("TMultiplexedProcessor: Unexpected message type");
- ::apache::thrift::TApplicationException
- x(::apache::thrift::TApplicationException::PROTOCOL_ERROR, msg);
- out->writeMessageBegin(name, ::apache::thrift::protocol::T_EXCEPTION, seqid);
- x.write(out.get());
- out->writeMessageEnd();
- out->getTransport()->writeEnd();
- out->getTransport()->flush();
- throw TException(msg);
+ throw protocol_error(in, out, name, seqid, "Unexpected message type");
}
// Extract the service name
-
boost::tokenizer > tok(name, boost::char_separator(":"));
std::vector tokens;
@@ -161,39 +177,46 @@ public:
services_t::iterator it = services.find(tokens[0]);
if (it != services.end()) {
- shared_ptr processor = it->second;
+ stdcxx::shared_ptr processor = it->second;
// Let the processor registered for this service name
// process the message.
return processor
- ->process(shared_ptr(
+ ->process(stdcxx::shared_ptr(
new protocol::StoredMessageProtocol(in, tokens[1], type, seqid)),
out,
connectionContext);
} else {
// Unknown service.
- in->skip(::apache::thrift::protocol::T_STRUCT);
- in->readMessageEnd();
- in->getTransport()->readEnd();
-
- std::string msg("TMultiplexedProcessor: Unknown service: ");
- msg += tokens[0];
- ::apache::thrift::TApplicationException
- x(::apache::thrift::TApplicationException::PROTOCOL_ERROR, msg);
- out->writeMessageBegin(name, ::apache::thrift::protocol::T_EXCEPTION, seqid);
- x.write(out.get());
- out->writeMessageEnd();
- out->getTransport()->writeEnd();
- out->getTransport()->flush();
- msg += ". Did you forget to call registerProcessor()?";
- throw TException(msg);
+ throw protocol_error(in, out, name, seqid,
+ "Unknown service: " + tokens[0] +
+ ". Did you forget to call registerProcessor()?");
}
+ } else if (tokens.size() == 1) {
+ if (defaultProcessor) {
+ // non-multiplexed client forwards to default processor
+ return defaultProcessor
+ ->process(stdcxx::shared_ptr(
+ new protocol::StoredMessageProtocol(in, tokens[0], type, seqid)),
+ out,
+ connectionContext);
+ } else {
+ throw protocol_error(in, out, name, seqid,
+ "Non-multiplexed client request dropped. "
+ "Did you forget to call defaultProcessor()?");
+ }
+ } else {
+ throw protocol_error(in, out, name, seqid,
+ "Wrong number of tokens.");
}
- return false;
}
private:
/** Map of service processor objects, indexed by service names. */
services_t services;
+
+ //! If a non-multi client requests something, it goes to the
+ //! default processor (if one is defined) for backwards compatibility.
+ stdcxx::shared_ptr defaultProcessor;
};
}
}
diff --git a/lib/cpp/src/thrift/protocol/THeaderProtocol.h b/lib/cpp/src/thrift/protocol/THeaderProtocol.h
index 0b3997cf6..8cd501736 100644
--- a/lib/cpp/src/thrift/protocol/THeaderProtocol.h
+++ b/lib/cpp/src/thrift/protocol/THeaderProtocol.h
@@ -192,7 +192,7 @@ class THeaderProtocolFactory : public TProtocolFactory {
public:
virtual stdcxx::shared_ptr getProtocol(stdcxx::shared_ptr trans) {
THeaderProtocol* headerProtocol
- = new THeaderProtocol(trans, stdcxx::shared_ptr(), T_BINARY_PROTOCOL);
+ = new THeaderProtocol(trans, trans, T_BINARY_PROTOCOL);
return stdcxx::shared_ptr(headerProtocol);
}
diff --git a/lib/cpp/src/thrift/transport/TSSLSocket.cpp b/lib/cpp/src/thrift/transport/TSSLSocket.cpp
index ddefb34c9..3f0e28ed8 100644
--- a/lib/cpp/src/thrift/transport/TSSLSocket.cpp
+++ b/lib/cpp/src/thrift/transport/TSSLSocket.cpp
@@ -157,7 +157,7 @@ void cleanupOpenSSL() {
mutexes.reset();
}
-static void buildErrors(string& message, int error = 0);
+static void buildErrors(string& message, int errno_copy = 0, int sslerrno = 0);
static bool matchName(const char* host, const char* pattern, int size);
static char uppercase(char c);
@@ -301,7 +301,7 @@ bool TSSLSocket::peek() {
default:;// do nothing
}
string errors;
- buildErrors(errors, errno_copy);
+ buildErrors(errors, errno_copy, error);
throw TSSLException("SSL_peek: " + errors);
} else if (rc == 0) {
ERR_clear_error();
@@ -325,12 +325,14 @@ void TSSLSocket::close() {
if (ssl_ != NULL) {
try {
int rc;
+ int errno_copy = 0;
+ int error = 0;
do {
rc = SSL_shutdown(ssl_);
if (rc <= 0) {
- int errno_copy = THRIFT_GET_SOCKET_ERROR;
- int error = SSL_get_error(ssl_, rc);
+ errno_copy = THRIFT_GET_SOCKET_ERROR;
+ error = SSL_get_error(ssl_, rc);
switch (error) {
case SSL_ERROR_SYSCALL:
if ((errno_copy != THRIFT_EINTR)
@@ -348,9 +350,8 @@ void TSSLSocket::close() {
} while (rc == 2);
if (rc < 0) {
- int errno_copy = THRIFT_GET_SOCKET_ERROR;
string errors;
- buildErrors(errors, errno_copy);
+ buildErrors(errors, errno_copy, error);
GlobalOutput(("SSL_shutdown: " + errors).c_str());
}
} catch (TTransportException& te) {
@@ -380,17 +381,19 @@ uint32_t TSSLSocket::read(uint8_t* buf, uint32_t len) {
throw TTransportException(TTransportException::UNKNOWN, "retry again");
int32_t bytes = 0;
while (readRetryCount_ < maxRecvRetries_) {
- ERR_clear_error();
bytes = SSL_read(ssl_, buf, len);
+ int32_t errno_copy = THRIFT_GET_SOCKET_ERROR;
int32_t error = SSL_get_error(ssl_, bytes);
readRetryCount_++;
- if (bytes >= 0 && error == 0) {
+ if (error == SSL_ERROR_NONE) {
readRetryCount_ = 0;
break;
}
- int32_t errno_copy = THRIFT_GET_SOCKET_ERROR;
unsigned int waitEventReturn;
switch (error) {
+ case SSL_ERROR_ZERO_RETURN:
+ throw TTransportException(TTransportException::END_OF_FILE, "client disconnected");
+
case SSL_ERROR_SYSCALL:
if ((errno_copy != THRIFT_EINTR)
&& (errno_copy != THRIFT_EAGAIN)) {
@@ -422,9 +425,9 @@ uint32_t TSSLSocket::read(uint8_t* buf, uint32_t len) {
throw TTransportException(TTransportException::INTERNAL_ERROR, "too much recv retries");
}
else if (waitEventReturn == TSSL_DATA) {
- // in case of SSL and huge thrift packets, there may be a number of
- // socket operations, before any data becomes available by SSL_read().
- // Therefore the number of retries should not be increased and
+ // in case of SSL and huge thrift packets, there may be a number of
+ // socket operations, before any data becomes available by SSL_read().
+ // Therefore the number of retries should not be increased and
// the operation should be repeated.
readRetryCount_--;
continue;
@@ -433,7 +436,7 @@ uint32_t TSSLSocket::read(uint8_t* buf, uint32_t len) {
default:;// do nothing
}
string errors;
- buildErrors(errors, errno_copy);
+ buildErrors(errors, errno_copy, error);
throw TSSLException("SSL_read: " + errors);
}
return bytes;
@@ -470,7 +473,7 @@ void TSSLSocket::write(const uint8_t* buf, uint32_t len) {
default:;// do nothing
}
string errors;
- buildErrors(errors, errno_copy);
+ buildErrors(errors, errno_copy, error);
throw TSSLException("SSL_write: " + errors);
}
written += bytes;
@@ -514,7 +517,7 @@ uint32_t TSSLSocket::write_partial(const uint8_t* buf, uint32_t len) {
default:;// do nothing
}
string errors;
- buildErrors(errors, errno_copy);
+ buildErrors(errors, errno_copy, error);
throw TSSLException("SSL_write: " + errors);
}
written += bytes;
@@ -574,12 +577,14 @@ void TSSLSocket::initializeHandshake() {
}
int rc;
+ int errno_copy = 0;
+ int error = 0;
if (server()) {
do {
rc = SSL_accept(ssl_);
if (rc <= 0) {
- int errno_copy = THRIFT_GET_SOCKET_ERROR;
- int error = SSL_get_error(ssl_, rc);
+ errno_copy = THRIFT_GET_SOCKET_ERROR;
+ error = SSL_get_error(ssl_, rc);
switch (error) {
case SSL_ERROR_SYSCALL:
if ((errno_copy != THRIFT_EINTR)
@@ -610,8 +615,8 @@ void TSSLSocket::initializeHandshake() {
do {
rc = SSL_connect(ssl_);
if (rc <= 0) {
- int errno_copy = THRIFT_GET_SOCKET_ERROR;
- int error = SSL_get_error(ssl_, rc);
+ errno_copy = THRIFT_GET_SOCKET_ERROR;
+ error = SSL_get_error(ssl_, rc);
switch (error) {
case SSL_ERROR_SYSCALL:
if ((errno_copy != THRIFT_EINTR)
@@ -635,10 +640,9 @@ void TSSLSocket::initializeHandshake() {
} while (rc == 2);
}
if (rc <= 0) {
- int errno_copy = THRIFT_GET_SOCKET_ERROR;
string fname(server() ? "SSL_accept" : "SSL_connect");
string errors;
- buildErrors(errors, errno_copy);
+ buildErrors(errors, errno_copy, error);
throw TSSLException(fname + ": " + errors);
}
authorize();
@@ -975,7 +979,7 @@ int TSSLSocketFactory::passwordCallback(char* password, int size, int, void* dat
}
// extract error messages from error queue
-void buildErrors(string& errors, int errno_copy) {
+void buildErrors(string& errors, int errno_copy, int sslerrno) {
unsigned long errorCode;
char message[256];
@@ -999,6 +1003,9 @@ void buildErrors(string& errors, int errno_copy) {
if (errors.empty()) {
errors = "error code: " + to_string(errno_copy);
}
+ if (sslerrno) {
+ errors += " (SSL_error_code = " + to_string(sslerrno) + ")";
+ }
}
/**
diff --git a/lib/csharp/test/ThriftMVCTest/Controllers/HomeController.cs b/lib/csharp/test/ThriftMVCTest/Controllers/HomeController.cs
index ab9eadafa..c9a1ec43f 100644
--- a/lib/csharp/test/ThriftMVCTest/Controllers/HomeController.cs
+++ b/lib/csharp/test/ThriftMVCTest/Controllers/HomeController.cs
@@ -41,9 +41,8 @@ namespace ThriftMVCTest.Controllers
SecondService.IAsync asyncService =
new SecondService.Client(new TBinaryProtocol(new THttpClient(new Uri(baseUri, "Async.thrift"))));
- await asyncService.blahBlahAsync();
var result = await asyncService.secondtestStringAsync("TestString");
- if (result != "TestString")
+ if (result != "testString(\"TestString\")")
{
throw new Exception("The wrong result was returned");
}
@@ -59,9 +58,8 @@ namespace ThriftMVCTest.Controllers
SecondService.ISync service =
new SecondService.Client(new TBinaryProtocol(new THttpClient(new Uri(baseUri, "Sync.thrift"))));
- service.blahBlah();
var result = service.secondtestString("TestString");
- if (result != "TestString")
+ if (result != "testString(\"TestString\")")
{
throw new Exception("The wrong result was returned");
}
@@ -69,4 +67,4 @@ namespace ThriftMVCTest.Controllers
return RedirectToAction("Index");
}
}
-}
\ No newline at end of file
+}
diff --git a/lib/csharp/test/ThriftMVCTest/SecondServiceImpl.cs b/lib/csharp/test/ThriftMVCTest/SecondServiceImpl.cs
index dce014877..fad301a35 100644
--- a/lib/csharp/test/ThriftMVCTest/SecondServiceImpl.cs
+++ b/lib/csharp/test/ThriftMVCTest/SecondServiceImpl.cs
@@ -24,24 +24,14 @@ namespace ThriftMVCTest
{
public class SecondServiceImpl : SecondService.IAsync, SecondService.ISync
{
- public Task blahBlahAsync()
- {
- return Task.FromResult(0);
- }
-
public Task secondtestStringAsync(string thing)
{
return Task.FromResult(thing);
}
- public void blahBlah()
- {
-
- }
-
public string secondtestString(string thing)
{
- return thing;
+ return "testString(\"" + thing + "\")";
}
}
-}
\ No newline at end of file
+}
diff --git a/lib/erl/test/thrift_test_test.erl b/lib/erl/test/thrift_test_test.erl
index ae20f3199..77df61d9a 100644
--- a/lib/erl/test/thrift_test_test.erl
+++ b/lib/erl/test/thrift_test_test.erl
@@ -628,18 +628,6 @@ service_info_test_() ->
{struct, []},
thrift_test_thrift:function_info(testOneway, exceptions)
)},
- {"blahBlah params", ?_assertEqual(
- {struct, []},
- second_service_thrift:function_info(blahBlah, params_type)
- )},
- {"blahBlah reply", ?_assertEqual(
- {struct, []},
- second_service_thrift:function_info(blahBlah, reply_type)
- )},
- {"blahBlah exceptions", ?_assertEqual(
- {struct, []},
- second_service_thrift:function_info(blahBlah, exceptions)
- )},
{"secondtestString params", ?_assertEqual(
{struct, [{1, string}]},
second_service_thrift:function_info(secondtestString, params_type)
diff --git a/lib/java/test/org/apache/thrift/test/TestClient.java b/lib/java/test/org/apache/thrift/test/TestClient.java
index b2ce1e673..feaa97220 100644
--- a/lib/java/test/org/apache/thrift/test/TestClient.java
+++ b/lib/java/test/org/apache/thrift/test/TestClient.java
@@ -33,6 +33,7 @@ import org.apache.thrift.TSerializer;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TJSONProtocol;
+import org.apache.thrift.protocol.TMultiplexedProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.protocol.TSimpleJSONProtocol;
import org.apache.thrift.transport.TFastFramedTransport;
@@ -46,6 +47,7 @@ import org.apache.thrift.transport.TTransportException;
// Generated code
import thrift.test.Insanity;
import thrift.test.Numberz;
+import thrift.test.SecondService;
import thrift.test.ThriftTest;
import thrift.test.Xception;
import thrift.test.Xception2;
@@ -64,6 +66,7 @@ public class TestClient {
private static int ERR_STRUCTS = 2;
private static int ERR_CONTAINERS = 4;
private static int ERR_EXCEPTIONS = 8;
+ private static int ERR_PROTOCOLS = 16;
private static int ERR_UNKNOWN = 64;
public static void main(String [] args) {
@@ -102,7 +105,7 @@ public class TestClient {
System.out.println(" --host=arg (=" + host + ")\tHost to connect");
System.out.println(" --port=arg (=" + port + ")\tPort number to connect");
System.out.println(" --transport=arg (=" + transport_type + ")\n\t\t\t\tTransport: buffered, framed, fastframed, http");
- System.out.println(" --protocol=arg (=" + protocol_type + ")\tProtocol: binary, json, compact");
+ System.out.println(" --protocol=arg (=" + protocol_type + ")\tProtocol: binary, compact, json, multi, multic, multij");
System.out.println(" --ssl\t\t\tEncrypted Transport using SSL");
System.out.println(" --testloops[--n]=arg (=" + numTests + ")\tNumber of Tests");
System.exit(0);
@@ -117,6 +120,9 @@ public class TestClient {
if (protocol_type.equals("binary")) {
} else if (protocol_type.equals("compact")) {
} else if (protocol_type.equals("json")) {
+ } else if (protocol_type.equals("multi")) {
+ } else if (protocol_type.equals("multic")) {
+ } else if (protocol_type.equals("multij")) {
} else {
throw new Exception("Unknown protocol type! " + protocol_type);
}
@@ -163,16 +169,21 @@ public class TestClient {
}
TProtocol tProtocol = null;
- if (protocol_type.equals("json")) {
+ TProtocol tProtocol2 = null;
+ if (protocol_type.equals("json") || protocol_type.equals("multij")) {
tProtocol = new TJSONProtocol(transport);
- } else if (protocol_type.equals("compact")) {
+ } else if (protocol_type.equals("compact") || protocol_type.equals("multic")) {
tProtocol = new TCompactProtocol(transport);
} else {
tProtocol = new TBinaryProtocol(transport);
}
- ThriftTest.Client testClient =
- new ThriftTest.Client(tProtocol);
+ if (protocol_type.startsWith("multi")) {
+ tProtocol2 = new TMultiplexedProtocol(tProtocol, "SecondService");
+ tProtocol = new TMultiplexedProtocol(tProtocol, "ThriftTest");
+ }
+
+ ThriftTest.Client testClient = new ThriftTest.Client(tProtocol);
Insanity insane = new Insanity();
long timeMin = 0;
@@ -222,6 +233,19 @@ public class TestClient {
System.out.println("*** FAILURE ***\n");
}
+ /**
+ * Multiplexed test
+ */
+ if (protocol_type.startsWith("multi")) {
+ SecondService.Client secondClient = new SecondService.Client(tProtocol2);
+ System.out.print("secondtestString(\"Test2\")");
+ s = secondClient.secondtestString("Test2");
+ System.out.print(" = \"" + s + "\"\n");
+ if (!s.equals("testString(\"Test2\")")) {
+ returnCode |= ERR_PROTOCOLS;
+ System.out.println("*** FAILURE ***\n");
+ }
+ }
/**
* BYTE TEST
*/
diff --git a/lib/java/test/org/apache/thrift/test/TestServer.java b/lib/java/test/org/apache/thrift/test/TestServer.java
index 71b86c33a..1f3e555d9 100644
--- a/lib/java/test/org/apache/thrift/test/TestServer.java
+++ b/lib/java/test/org/apache/thrift/test/TestServer.java
@@ -72,10 +72,6 @@ public class TestServer {
static class SecondHandler implements thrift.test.SecondService.Iface {
- @Override
- public void blahBlah() throws org.apache.thrift.TException
- { throw new org.apache.thrift.TException("blahBlah"); }
-
@Override
public java.lang.String secondtestString(java.lang.String thing) throws org.apache.thrift.TException
{ return "testString(\"" + thing + "\")"; }
diff --git a/lib/nodejs/test/client.js b/lib/nodejs/test/client.js
index 9609518c4..006fad2dc 100644
--- a/lib/nodejs/test/client.js
+++ b/lib/nodejs/test/client.js
@@ -108,7 +108,7 @@ if (type === 'tcp') {
connection.on('connect', function() {
secondclient.secondtestString("Test", function(err, response) {
assert(!err);
- assert.equal("Test", response);
+ assert.equal("testString(\"Test\")", response);
});
runTests();
diff --git a/lib/nodejs/test/server.js b/lib/nodejs/test/server.js
index bad3b1777..8f2e06b8d 100644
--- a/lib/nodejs/test/server.js
+++ b/lib/nodejs/test/server.js
@@ -72,8 +72,8 @@ if (type === 'http' || type ==='websocket') {
if (type === 'multiplex') {
var SecondServiceHandler = {
secondtestString: function(thing, result) {
- console.log('testString(\'' + thing + '\')');
- result(null, thing);
+ console.log('testString("' + thing + '")');
+ result(null, 'testString("' + thing + '")');
}
};
diff --git a/test/ThriftTest.thrift b/test/ThriftTest.thrift
index c56f571d6..24dcbb94e 100644
--- a/test/ThriftTest.thrift
+++ b/test/ThriftTest.thrift
@@ -321,13 +321,12 @@ service ThriftTest
service SecondService
{
- void blahBlah()
/**
* Prints 'testString("%s")' with thing as '%s'
* @param string thing - the string to print
* @return string - returns the string 'thing'
*/
- string secondtestString(1: string thing),
+ string secondtestString(1: string thing)
}
struct VersioningTestV1 {
diff --git a/test/c_glib/src/thrift_second_service_handler.c b/test/c_glib/src/thrift_second_service_handler.c
index c46437211..66ac7bca2 100644
--- a/test/c_glib/src/thrift_second_service_handler.c
+++ b/test/c_glib/src/thrift_second_service_handler.c
@@ -50,17 +50,6 @@ second_service_handler_secondtest_string (TTestSecondServiceIf *iface,
return TRUE;
}
-gboolean
-second_service_handler_blah_blah (TTestSecondServiceIf *iface, GError **error)
-{
- THRIFT_UNUSED_VAR (iface);
- THRIFT_UNUSED_VAR (error);
-
- printf ("blahBlah()\n");
-
- return TRUE;
-}
-
static void
second_service_handler_init (SecondServiceHandler *self)
{
@@ -76,7 +65,5 @@ second_service_handler_class_init (SecondServiceHandlerClass *klass)
base_class->secondtest_string =
second_service_handler_secondtest_string;
- base_class->blah_blah =
- second_service_handler_blah_blah;
}
diff --git a/test/cpp/CMakeLists.txt b/test/cpp/CMakeLists.txt
index 1facfa435..cdd63dbf0 100755
--- a/test/cpp/CMakeLists.txt
+++ b/test/cpp/CMakeLists.txt
@@ -34,6 +34,7 @@ include_directories("${CMAKE_CURRENT_BINARY_DIR}/gen-cpp")
include_directories("${PROJECT_SOURCE_DIR}/lib/cpp/src")
set(crosstestgencpp_SOURCES
+ gen-cpp/SecondService.cpp
gen-cpp/ThriftTest.cpp
gen-cpp/ThriftTest_types.cpp
gen-cpp/ThriftTest_constants.cpp
@@ -44,7 +45,7 @@ LINK_AGAINST_THRIFT_LIBRARY(crosstestgencpp thrift)
set(crossstressgencpp_SOURCES
gen-cpp/Service.cpp
- #gen-cpp/StressTest_types.cpp #basically empty, so omitting
+ gen-cpp/StressTest_types.cpp
gen-cpp/StressTest_constants.cpp
)
add_library(crossstressgencpp STATIC ${crossstressgencpp_SOURCES})
@@ -79,7 +80,7 @@ add_test(NAME StressTestNonBlocking COMMAND StressTestNonBlocking)
# Common thrift code generation rules
#
-add_custom_command(OUTPUT gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_constants.cpp
+add_custom_command(OUTPUT gen-cpp/SecondService.cpp gen-cpp/SecondService.h gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest.h gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_constants.cpp
COMMAND ${THRIFT_COMPILER} --gen cpp:templates,cob_style -r ${PROJECT_SOURCE_DIR}/test/ThriftTest.thrift
)
diff --git a/test/cpp/Makefile.am b/test/cpp/Makefile.am
index 359e7e6dd..e8be80a3a 100755
--- a/test/cpp/Makefile.am
+++ b/test/cpp/Makefile.am
@@ -21,12 +21,16 @@ AUTOMAKE_OPTIONS = subdir-objects serial-tests
BUILT_SOURCES = gen-cpp/ThriftTest.cpp \
gen-cpp/ThriftTest_types.cpp \
gen-cpp/ThriftTest_constants.cpp \
+ gen-cpp/SecondService.cpp \
gen-cpp/StressTest_types.cpp \
gen-cpp/StressTest_constants.cpp \
gen-cpp/Service.cpp
noinst_LTLIBRARIES = libtestgencpp.la libstresstestgencpp.la
nodist_libtestgencpp_la_SOURCES = \
+ gen-cpp/SecondService.cpp \
+ gen-cpp/SecondService.h \
+ gen-cpp/SecondService.tcc \
gen-cpp/ThriftTest_constants.cpp \
gen-cpp/ThriftTest_constants.h \
gen-cpp/ThriftTest_types.cpp \
@@ -98,7 +102,7 @@ StressTestNonBlocking_LDADD = \
#
# Common thrift code generation rules
#
-gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_constants.cpp: $(top_srcdir)/test/ThriftTest.thrift $(THRIFT)
+gen-cpp/ThriftTest.cpp gen-cpp/ThriftTest_types.cpp gen-cpp/ThriftTest_constants.cpp gen-cpp/SecondService.cpp gen-cpp/SecondService.h gen-cpp/SecondService.tcc: $(top_srcdir)/test/ThriftTest.thrift $(THRIFT)
$(THRIFT) --gen cpp:templates,cob_style -r $<
gen-cpp/StressTest_types.cpp gen-cpp/StressTest_constants.cpp gen-cpp/Service.cpp: $(top_srcdir)/test/StressTest.thrift $(THRIFT)
diff --git a/test/cpp/src/TestClient.cpp b/test/cpp/src/TestClient.cpp
index 6b2e7314d..6e7ff8e66 100644
--- a/test/cpp/src/TestClient.cpp
+++ b/test/cpp/src/TestClient.cpp
@@ -26,6 +26,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -40,13 +41,15 @@
#include
#endif
-#include
+#include
#include
+#include
#include
#if _WIN32
#include
#endif
+#include "SecondService.h"
#include "ThriftTest.h"
using namespace std;
@@ -156,28 +159,33 @@ int main(int argc, char** argv) {
int return_code = 0;
boost::program_options::options_description desc("Allowed options");
- desc.add_options()("help,h",
- "produce help message")("host",
- boost::program_options::value(&host)
- ->default_value(host),
- "Host to connect")("port",
- boost::program_options::value(
- &port)->default_value(port),
- "Port number to connect")(
- "domain-socket",
- boost::program_options::value(&domain_socket)->default_value(domain_socket),
- "Domain Socket (e.g. /tmp/ThriftTest.thrift), instead of host and port")(
- "abstract-namespace",
- "Look for the domain socket in the Abstract Namespace (no connection with filesystem pathnames)")(
- "transport",
- boost::program_options::value(&transport_type)->default_value(transport_type),
- "Transport: buffered, framed, http, evhttp")(
- "protocol",
- boost::program_options::value(&protocol_type)->default_value(protocol_type),
- "Protocol: binary, header, compact, json")("ssl", "Encrypted Transport using SSL")(
- "testloops,n",
- boost::program_options::value(&numTests)->default_value(numTests),
- "Number of Tests")("noinsane", "Do not run insanity test");
+ desc.add_options()
+ ("help,h", "produce help message")
+ ("host",
+ boost::program_options::value(&host)->default_value(host),
+ "Host to connect")
+ ("port",
+ boost::program_options::value(&port)->default_value(port),
+ "Port number to connect")
+ ("domain-socket",
+ boost::program_options::value(&domain_socket)->default_value(domain_socket),
+ "Domain Socket (e.g. /tmp/ThriftTest.thrift), instead of host and port")
+ ("abstract-namespace",
+ "Look for the domain socket in the Abstract Namespace"
+ " (no connection with filesystem pathnames)")
+ ("transport",
+ boost::program_options::value(&transport_type)->default_value(transport_type),
+ "Transport: buffered, framed, http, evhttp")
+ ("protocol",
+ boost::program_options::value(&protocol_type)->default_value(protocol_type),
+ "Protocol: binary, compact, header, json, multi, multic, multih, multij")
+ ("ssl",
+ "Encrypted Transport using SSL")
+ ("testloops,n",
+ boost::program_options::value(&numTests)->default_value(numTests),
+ "Number of Tests")
+ ("noinsane",
+ "Do not run insanity test");
boost::program_options::variables_map vm;
boost::program_options::store(boost::program_options::parse_command_line(argc, argv, desc), vm);
@@ -194,6 +202,10 @@ int main(int argc, char** argv) {
} else if (protocol_type == "compact") {
} else if (protocol_type == "header") {
} else if (protocol_type == "json") {
+ } else if (protocol_type == "multi") {
+ } else if (protocol_type == "multic") {
+ } else if (protocol_type == "multih") {
+ } else if (protocol_type == "multij") {
} else {
throw invalid_argument("Unknown protocol type " + protocol_type);
}
@@ -232,6 +244,7 @@ int main(int argc, char** argv) {
stdcxx::shared_ptr socket;
stdcxx::shared_ptr transport;
stdcxx::shared_ptr protocol;
+ stdcxx::shared_ptr protocol2; // SecondService for multiplexed
if (ssl) {
cout << "Client Certificate File: " << certPath << endl;
@@ -271,18 +284,20 @@ int main(int argc, char** argv) {
transport = bufferedSocket;
}
- if (protocol_type.compare("json") == 0) {
- stdcxx::shared_ptr jsonProtocol(new TJSONProtocol(transport));
- protocol = jsonProtocol;
- } else if (protocol_type.compare("compact") == 0) {
- stdcxx::shared_ptr compactProtocol(new TCompactProtocol(transport));
- protocol = compactProtocol;
- } else if (protocol_type == "header") {
- stdcxx::shared_ptr headerProtocol(new THeaderProtocol(transport));
- protocol = headerProtocol;
+ if (protocol_type == "json" || protocol_type == "multij") {
+ protocol = stdcxx::make_shared(transport);
+ } else if (protocol_type == "compact" || protocol_type == "multic") {
+ protocol = stdcxx::make_shared(transport);
+ } else if (protocol_type == "header" || protocol_type == "multih") {
+ protocol = stdcxx::make_shared(transport);
} else {
- stdcxx::shared_ptr binaryProtocol(new TBinaryProtocol(transport));
- protocol = binaryProtocol;
+ protocol = stdcxx::make_shared(transport);
+ }
+
+ if (boost::starts_with(protocol_type, "multi")) {
+ protocol2 = stdcxx::make_shared(protocol, "SecondService");
+ // we don't need access to the original protocol any more, so...
+ protocol = stdcxx::make_shared(protocol, "ThriftTest");
}
// Connection info
@@ -367,6 +382,25 @@ int main(int argc, char** argv) {
return_code |= ERR_BASETYPES;
}
+ //
+ // Multiplexed protocol - call another service method
+ // in the middle of the ThriftTest
+ //
+ if (boost::starts_with(protocol_type, "multi")) {
+ SecondServiceClient ssc(protocol2);
+ // transport is already open...
+
+ try {
+ cout << "secondService.secondTestString(\"foo\") => " << flush;
+ std::string result;
+ ssc.secondtestString(result, "foo");
+ cout << "{" << result << "}" << endl;
+ } catch (std::exception& e) {
+ cout << " *** FAILED *** " << e.what() << endl;
+ return_code |= ERR_EXCEPTIONS;
+ }
+ }
+
try {
#ifdef _MSC_VER
#pragma warning( push )
@@ -1096,12 +1130,14 @@ int main(int argc, char** argv) {
/**
* I32 TEST
*/
- cout << "re-test testI32(-1)";
+ cout << "re-test testI32(-1)" << flush;
int i32 = testClient.testI32(-1);
cout << " = " << i32 << endl;
if (i32 != -1)
return_code |= ERR_BASETYPES;
+ cout << endl << "All tests done." << endl << flush;
+
uint64_t stop = now();
uint64_t tot = stop - start;
@@ -1115,10 +1151,10 @@ int main(int argc, char** argv) {
time_max = tot;
}
+ cout << flush;
transport->close();
}
- cout << endl << "All tests done." << endl;
uint64_t time_avg = time_tot / numTests;
diff --git a/test/cpp/src/TestServer.cpp b/test/cpp/src/TestServer.cpp
index 37d0eb600..744a86c02 100644
--- a/test/cpp/src/TestServer.cpp
+++ b/test/cpp/src/TestServer.cpp
@@ -17,26 +17,29 @@
* under the License.
*/
-#include
+#include
+#include
+#include
#include
+#include
+#include
#include
#include
#include
#include
-#include
-#include
-#include
-#include
-#include
-#include
#include
-#include
-#include
-#include
-#include
+#include
+#include
+#include
#include
#include
+#include
+#include
+#include
+#include
#include
+
+#include "SecondService.h"
#include "ThriftTest.h"
#ifdef HAVE_STDINT_H
@@ -50,6 +53,7 @@
#include
#include
+#include
#include
#include
#include
@@ -331,13 +335,18 @@ public:
}
}
- void testOneway(const int32_t sleepFor) {
- printf("testOneway(%d): Sleeping...\n", sleepFor);
- THRIFT_SLEEP_SEC(sleepFor);
- printf("testOneway(%d): done sleeping!\n", sleepFor);
+ void testOneway(const int32_t aNum) {
+ printf("testOneway(%d): call received\n", aNum);
}
};
+class SecondHandler : public SecondServiceIf
+{
+ public:
+ void secondtestString(std::string& result, const std::string& thing)
+ { result = "testString(\"" + thing + "\")"; }
+};
+
class TestProcessorEventHandler : public TProcessorEventHandler {
virtual void* getContext(const char* fn_name, void* serverContext) {
(void)serverContext;
@@ -565,7 +574,7 @@ int main(int argc, char** argv) {
("abstract-namespace", "Create the domain socket in the Abstract Namespace (no connection with filesystem pathnames)")
("server-type", po::value(&server_type)->default_value(server_type), "type of server, \"simple\", \"thread-pool\", \"threaded\", or \"nonblocking\"")
("transport", po::value(&transport_type)->default_value(transport_type), "transport: buffered, framed, http")
- ("protocol", po::value(&protocol_type)->default_value(protocol_type), "protocol: binary, compact, header, json")
+ ("protocol", po::value(&protocol_type)->default_value(protocol_type), "protocol: binary, compact, header, json, multi, multic, multih, multij")
("ssl", "Encrypted Transport using SSL")
("processor-events", "processor-events")
("workers,n", po::value(&workers)->default_value(workers), "Number of thread pools workers. Only valid for thread-pool server type")
@@ -597,6 +606,10 @@ int main(int argc, char** argv) {
} else if (protocol_type == "compact") {
} else if (protocol_type == "json") {
} else if (protocol_type == "header") {
+ } else if (protocol_type == "multi") { // multiplexed binary
+ } else if (protocol_type == "multic") { // multiplexed compact
+ } else if (protocol_type == "multih") { // multiplexed header
+ } else if (protocol_type == "multij") { // multiplexed json
} else {
throw invalid_argument("Unknown protocol type " + protocol_type);
}
@@ -627,15 +640,15 @@ int main(int argc, char** argv) {
// Dispatcher
stdcxx::shared_ptr protocolFactory;
- if (protocol_type == "json") {
+ if (protocol_type == "json" || protocol_type == "multij") {
stdcxx::shared_ptr jsonProtocolFactory(new TJSONProtocolFactory());
protocolFactory = jsonProtocolFactory;
- } else if (protocol_type == "compact") {
+ } else if (protocol_type == "compact" || protocol_type == "multic") {
TCompactProtocolFactoryT *compactProtocolFactory = new TCompactProtocolFactoryT();
compactProtocolFactory->setContainerSizeLimit(container_limit);
compactProtocolFactory->setStringSizeLimit(string_limit);
protocolFactory.reset(compactProtocolFactory);
- } else if (protocol_type == "header") {
+ } else if (protocol_type == "header" || protocol_type == "multih") {
stdcxx::shared_ptr headerProtocolFactory(new THeaderProtocolFactory());
protocolFactory = headerProtocolFactory;
} else {
@@ -645,9 +658,9 @@ int main(int argc, char** argv) {
protocolFactory.reset(binaryProtocolFactory);
}
- // Processor
+ // Processors
stdcxx::shared_ptr testHandler(new TestHandler());
- stdcxx::shared_ptr testProcessor(new ThriftTestProcessor(testHandler));
+ stdcxx::shared_ptr testProcessor(new ThriftTestProcessor(testHandler));
if (vm.count("processor-events")) {
testProcessor->setEventHandler(
@@ -706,6 +719,18 @@ int main(int argc, char** argv) {
}
cout << endl;
+ // Multiplexed Processor if needed
+ if (boost::starts_with(protocol_type, "multi")) {
+ stdcxx::shared_ptr secondHandler(new SecondHandler());
+ stdcxx::shared_ptr secondProcessor(new SecondServiceProcessor(secondHandler));
+
+ stdcxx::shared_ptr multiplexedProcessor(new TMultiplexedProcessor());
+ multiplexedProcessor->registerDefault(testProcessor); // non-multi clients go to the default processor (multi:binary, multic:compact, ...)
+ multiplexedProcessor->registerProcessor("ThriftTest", testProcessor);
+ multiplexedProcessor->registerProcessor("SecondService", secondProcessor);
+ testProcessor = stdcxx::dynamic_pointer_cast(multiplexedProcessor);
+ }
+
// Server
stdcxx::shared_ptr server;
diff --git a/test/csharp/TestClient.cs b/test/csharp/TestClient.cs
index fad1057d6..17e59787a 100644
--- a/test/csharp/TestClient.cs
+++ b/test/csharp/TestClient.cs
@@ -33,7 +33,7 @@ namespace Test
{
public class TestClient
{
- private class TestParams
+ public class TestParams
{
public int numIterations = 1;
public string host = "localhost";
@@ -44,6 +44,7 @@ namespace Test
public bool framed;
public string protocol;
public bool encrypted = false;
+ public bool multiplexed = false;
protected bool _isFirstTransport = true;
@@ -105,21 +106,30 @@ namespace Test
private const int ErrorStructs = 2;
private const int ErrorContainers = 4;
private const int ErrorExceptions = 8;
+ private const int ErrorProtocol = 16;
private const int ErrorUnknown = 64;
private class ClientTest
{
+ private readonly TestParams param;
private readonly TTransport transport;
+ private readonly SecondService.Client second;
private readonly ThriftTest.Client client;
private readonly int numIterations;
private bool done;
public int ReturnCode { get; set; }
- public ClientTest(TestParams param)
+ public ClientTest(TestParams paramin)
{
+ param = paramin;
transport = param.CreateTransport();
- client = new ThriftTest.Client(param.CreateProtocol(transport));
+ TProtocol protocol = param.CreateProtocol(transport);
+ if (param.multiplexed)
+ {
+ second = new SecondService.Client(new TMultiplexedProtocol(protocol, "SecondService"));
+ }
+ client = new ThriftTest.Client(protocol);
numIterations = param.numIterations;
}
public void Execute()
@@ -148,7 +158,7 @@ namespace Test
try
{
- ReturnCode |= ExecuteClientTest(client);
+ ReturnCode |= ExecuteClientTest(client, second, param);
}
catch (Exception ex)
{
@@ -215,12 +225,12 @@ namespace Test
{
numThreads = Convert.ToInt32(args[++i]);
}
- else if (args[i] == "--compact" || args[i] == "--protocol=compact")
+ else if (args[i] == "--compact" || args[i] == "--protocol=compact" || args[i] == "--protocol=multic")
{
param.protocol = "compact";
Console.WriteLine("Using compact protocol");
}
- else if (args[i] == "--json" || args[i] == "--protocol=json")
+ else if (args[i] == "--json" || args[i] == "--protocol=json" || args[i] == "--protocol=multij")
{
param.protocol = "json";
Console.WriteLine("Using JSON protocol");
@@ -230,6 +240,11 @@ namespace Test
param.encrypted = true;
Console.WriteLine("Using encrypted transport");
}
+
+ if (args[i].StartsWith("--protocol=multi"))
+ {
+ param.multiplexed = true;
+ }
}
}
catch (Exception ex)
@@ -296,7 +311,7 @@ namespace Test
return retval;
}
- public static int ExecuteClientTest(ThriftTest.Client client)
+ public static int ExecuteClientTest(ThriftTest.Client client, SecondService.Client second, TestParams param)
{
int returnCode = 0;
@@ -313,6 +328,18 @@ namespace Test
returnCode |= ErrorBaseTypes;
}
+ if (param.multiplexed)
+ {
+ Console.WriteLine("secondTestString(\"Test2\")");
+ s = second.secondtestString("Test2");
+ Console.WriteLine(" = \"" + s + "\"");
+ if ("testString(\"Test2\")" != s)
+ {
+ Console.WriteLine("*** FAILED ***");
+ returnCode |= ErrorProtocol;
+ }
+ }
+
Console.Write("testBool(true)");
bool t = client.testBool((bool)true);
Console.WriteLine(" = " + t);
diff --git a/test/features/known_failures_Linux.json b/test/features/known_failures_Linux.json
index e3575f917..f96356de7 100644
--- a/test/features/known_failures_Linux.json
+++ b/test/features/known_failures_Linux.json
@@ -1,6 +1,10 @@
[
"c_glib-limit_container_length_binary_buffered-ip",
"c_glib-limit_string_length_binary_buffered-ip",
+ "cpp-theader_framed_binary_multih-header_buffered-ip",
+ "cpp-theader_framed_compact_multih-header_buffered-ip",
+ "cpp-theader_unframed_binary_multih-header_buffered-ip",
+ "cpp-theader_unframed_compact_multih-header_buffered-ip",
"csharp-limit_container_length_binary_buffered-ip",
"csharp-limit_container_length_compact_buffered-ip",
"csharp-limit_string_length_binary_buffered-ip",
@@ -33,8 +37,10 @@
"rb-limit_string_length_accel-binary_buffered-ip",
"rb-limit_string_length_binary_buffered-ip",
"rb-limit_string_length_compact_buffered-ip",
+ "rs-limit_container_length_binary_buffered-ip",
+ "rs-limit_container_length_compact_buffered-ip",
+ "rs-limit_container_length_multic-compact_buffered-ip",
"rs-limit_string_length_binary_buffered-ip",
"rs-limit_string_length_compact_buffered-ip",
- "rs-limit_container_length_binary_buffered-ip",
- "rs-limit_container_length_compact_buffered-ip"
-]
+ "rs-limit_string_length_multic-compact_buffered-ip"
+]
\ No newline at end of file
diff --git a/test/known_failures_Linux.json b/test/known_failures_Linux.json
index eda5df01b..ea194a16d 100644
--- a/test/known_failures_Linux.json
+++ b/test/known_failures_Linux.json
@@ -1,38 +1,90 @@
[
- "cpp-cpp_binary_buffered-ip-ssl",
- "cpp-cpp_binary_framed-ip-ssl",
+ "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_buffered-ip",
+ "c_glib-csharp_multic-compact_buffered-ip",
+ "c_glib-csharp_multic-compact_framed-ip",
+ "c_glib-csharp_multic_framed-ip",
+ "c_glib-rs_multi_buffered-ip",
+ "c_glib-rs_multi_framed-ip",
+ "c_glib-rs_multic_buffered-ip",
+ "c_glib-rs_multic_framed-ip",
"cpp-cpp_binary_http-domain",
- "cpp-cpp_binary_http-ip-ssl",
- "cpp-cpp_compact_buffered-ip-ssl",
- "cpp-cpp_compact_framed-ip-ssl",
- "cpp-cpp_compact_http-ip-ssl",
- "cpp-cpp_header_buffered-ip-ssl",
- "cpp-cpp_header_framed-ip-ssl",
- "cpp-cpp_header_http-ip-ssl",
- "cpp-cpp_json_buffered-ip-ssl",
- "cpp-cpp_json_framed-ip-ssl",
- "cpp-cpp_json_http-ip-ssl",
+ "cpp-cpp_compact_http-domain",
+ "cpp-cpp_compact_http-ip",
+ "cpp-cpp_header_http-domain",
+ "cpp-cpp_json_http-domain",
+ "cpp-cpp_json_http-ip",
+ "cpp-cpp_multi-binary_http-domain",
+ "cpp-cpp_multi-binary_http-ip",
+ "cpp-cpp_multi_http-domain",
+ "cpp-cpp_multi_http-ip",
+ "cpp-cpp_multic-compact_http-domain",
+ "cpp-cpp_multic-compact_http-ip",
+ "cpp-cpp_multic_http-domain",
+ "cpp-cpp_multic_http-ip",
+ "cpp-cpp_multih-header_http-domain",
+ "cpp-cpp_multih-header_http-ip",
+ "cpp-cpp_multih_http-domain",
+ "cpp-cpp_multih_http-ip",
+ "cpp-cpp_multij-json_http-domain",
+ "cpp-cpp_multij-json_http-ip",
+ "cpp-cpp_multij_http-domain",
+ "cpp-cpp_multij_http-ip",
"cpp-dart_binary_http-ip",
"cpp-dart_compact_http-ip",
"cpp-dart_json_http-ip",
+ "cpp-dart_multi-binary_http-ip",
+ "cpp-dart_multic-compact_http-ip",
+ "cpp-dart_multij-json_http-ip",
"cpp-go_binary_http-ip",
"cpp-go_binary_http-ip-ssl",
"cpp-go_compact_http-ip",
"cpp-go_compact_http-ip-ssl",
"cpp-go_json_http-ip",
"cpp-go_json_http-ip-ssl",
+ "cpp-go_multi-binary_http-ip",
+ "cpp-go_multi-binary_http-ip-ssl",
+ "cpp-go_multic-compact_http-ip",
+ "cpp-go_multic-compact_http-ip-ssl",
+ "cpp-go_multij-json_http-ip",
+ "cpp-go_multij-json_http-ip-ssl",
"cpp-java_binary_http-ip",
"cpp-java_binary_http-ip-ssl",
"cpp-java_compact_http-ip",
"cpp-java_compact_http-ip-ssl",
"cpp-java_json_http-ip",
"cpp-java_json_http-ip-ssl",
+ "cpp-java_multi-binary_http-ip",
+ "cpp-java_multi-binary_http-ip-ssl",
+ "cpp-java_multi_http-ip",
+ "cpp-java_multi_http-ip-ssl",
+ "cpp-java_multic-compact_http-ip",
+ "cpp-java_multic-compact_http-ip-ssl",
+ "cpp-java_multic_http-ip",
+ "cpp-java_multic_http-ip-ssl",
+ "cpp-java_multij-json_http-ip",
+ "cpp-java_multij-json_http-ip-ssl",
+ "cpp-java_multij_http-ip",
+ "cpp-java_multij_http-ip-ssl",
"cpp-nodejs_binary_http-ip",
"cpp-nodejs_binary_http-ip-ssl",
"cpp-nodejs_compact_http-ip",
"cpp-nodejs_compact_http-ip-ssl",
"cpp-nodejs_json_http-ip",
"cpp-nodejs_json_http-ip-ssl",
+ "cpp-nodejs_multi-binary_http-ip",
+ "cpp-nodejs_multi-binary_http-ip-ssl",
+ "cpp-nodejs_multic-compact_http-ip",
+ "cpp-nodejs_multic-compact_http-ip-ssl",
+ "cpp-nodejs_multij-json_http-ip",
+ "cpp-nodejs_multij-json_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",
@@ -246,9 +298,19 @@
"nodejs-netcore_json_framed-ip",
"nodejs-netcore_json_framed-ip-ssl",
"rs-csharp_binary_buffered-ip",
- "rs-csharp_compact_buffered-ip",
"rs-csharp_binary_framed-ip",
+ "rs-csharp_compact_buffered-ip",
"rs-csharp_compact_framed-ip",
+ "rs-csharp_multi-binary_buffered-ip",
+ "rs-csharp_multi-binary_framed-ip",
+ "rs-csharp_multi_buffered-ip",
+ "rs-csharp_multi_framed-ip",
+ "rs-csharp_multic-compact_buffered-ip",
+ "rs-csharp_multic-compact_framed-ip",
+ "rs-csharp_multic_buffered-ip",
+ "rs-csharp_multic_framed-ip",
"rs-dart_binary_framed-ip",
- "rs-dart_compact_framed-ip"
+ "rs-dart_compact_framed-ip",
+ "rs-dart_multi-binary_framed-ip",
+ "rs-dart_multic-compact_framed-ip"
]
diff --git a/test/rs/src/bin/test_client.rs b/test/rs/src/bin/test_client.rs
index d720313e9..7c11ad560 100644
--- a/test/rs/src/bin/test_client.rs
+++ b/test/rs/src/bin/test_client.rs
@@ -287,18 +287,6 @@ fn make_thrift_calls(
// do the multiplexed calls while making the main ThriftTest calls
if let Some(ref mut client) = second_service_client.as_mut() {
- info!("SecondService blahBlah");
- {
- let r = client.blah_blah();
- match r {
- Err(thrift::Error::Application(ref e)) => {
- info!("received an {:?}", e);
- Ok(())
- }
- _ => Err(thrift::Error::User("did not get exception".into())),
- }?;
- }
-
info!("SecondService secondtestString");
{
verify_expected_result(
diff --git a/test/rs/src/bin/test_server.rs b/test/rs/src/bin/test_server.rs
index a32e93880..81a2ad81d 100644
--- a/test/rs/src/bin/test_server.rs
+++ b/test/rs/src/bin/test_server.rs
@@ -390,10 +390,6 @@ impl ThriftTestSyncHandler for ThriftTestSyncHandlerImpl {
struct SecondServiceSyncHandlerImpl;
impl SecondServiceSyncHandler for SecondServiceSyncHandlerImpl {
- fn handle_blah_blah(&self) -> thrift::Result<()> {
- Err(thrift::new_application_error(thrift::ApplicationErrorKind::Unknown, "blahBlah"),)
- }
-
fn handle_secondtest_string(&self, thing: String) -> thrift::Result {
info!("testString({})", &thing);
let ret = format!("testString(\"{}\")", &thing);
diff --git a/test/tests.json b/test/tests.json
index c1c3155fd..bde9014dc 100644
--- a/test/tests.json
+++ b/test/tests.json
@@ -11,9 +11,7 @@
],
"protocols": [
"binary:multi",
- "compact:multic",
- "multi",
- "multic"
+ "compact:multic"
]
},
"client": {
@@ -22,8 +20,6 @@
"--lt-debug"
],
"protocols": [
- "multi",
- "multic",
"multi:binary",
"multic:compact"
],
@@ -40,7 +36,9 @@
],
"protocols": [
"binary",
- "compact"
+ "compact",
+ "multi",
+ "multic"
],
"workdir": "c_glib"
},
@@ -124,10 +122,7 @@
"protocols": [
"binary:multi",
"compact:multic",
- "json:multij",
- "multi",
- "multic",
- "multij"
+ "json:multij"
]
},
"client": {
@@ -135,6 +130,11 @@
"extra_args": ["run-testclient"],
"transports": [
"http"
+ ],
+ "protocols": [
+ "multi:binary",
+ "multic:compact",
+ "multij:json"
]
},
"transports": [
@@ -149,7 +149,10 @@
"protocols": [
"binary",
"compact",
- "json"
+ "json",
+ "multi",
+ "multic",
+ "multij"
],
"workdir": "../lib/java"
},
@@ -298,12 +301,24 @@
"server": {
"command": [
"TestServer"
+ ],
+ "protocols": [
+ "binary:multi",
+ "compact:multic",
+ "header:multih",
+ "json:multij"
]
},
"client": {
"timeout": 8,
"command": [
"TestClient"
+ ],
+ "protocols": [
+ "multi:binary",
+ "multic:compact",
+ "multih:header",
+ "multij:json"
]
},
"transports": [
@@ -320,7 +335,11 @@
"compact",
"binary",
"json",
- "header"
+ "header",
+ "multi",
+ "multic",
+ "multih",
+ "multij"
],
"workdir": "cpp"
},
@@ -385,6 +404,12 @@
"mono",
"TestClientServer.exe",
"client"
+ ],
+ "protocols": [
+ "multi",
+ "multic",
+ "multi:binary",
+ "multic:compact"
]
},
"workdir": "csharp"
@@ -408,9 +433,9 @@
"command": [
"dotnet",
"run",
- "--no-build",
- "--no-restore",
- "--",
+ "--no-build",
+ "--no-restore",
+ "--",
"server"
]
},
@@ -419,9 +444,9 @@
"command": [
"dotnet",
"run",
- "--no-build",
- "--no-restore",
- "--",
+ "--no-build",
+ "--no-restore",
+ "--",
"client"
]
},
@@ -622,12 +647,20 @@
"server": {
"command": [
"test_server"
+ ],
+ "protocols": [
+ "binary:multi",
+ "compact:multic"
]
},
"client": {
"timeout": 6,
"command": [
"test_client"
+ ],
+ "protocols": [
+ "multi:binary",
+ "multic:compact"
]
},
"sockets": [