THRIFT-2013: update docker for artful (go back to lua 5.2) and enhance
cpp client to send 0,1,2,4,8,...,131072 size binary tests, this exposed
problems in the erl and rs servers and those tests have been disabled for now.
diff --git a/LANGUAGES.md b/LANGUAGES.md
index d1a21e2..79fcf28 100644
--- a/LANGUAGES.md
+++ b/LANGUAGES.md
@@ -114,7 +114,7 @@
 <tr align=center>
 <td align=left><a href="lib/netcore/README.md">.NET Core</a></td>
 <!-- Build Systems ---------><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<!-- Language Levels -------><td colspan=2>2.0.0</td>
+<!-- Language Levels -------><td>2.0.0</td><td>2.0.3</td>
 <!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
 <!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
@@ -194,7 +194,7 @@
 <tr align=center>
 <td align=left><a href="lib/lua/README.md">Lua</a></td>
 <!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<!-- Language Levels -------><td>5.1.5</td><td>5.3.3</td>
+<!-- Language Levels -------><td>5.1.5</td><td>5.2.4</td>
 <!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
 <!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
 <!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
@@ -204,7 +204,7 @@
 <tr align=center>
 <td align=left><a href="lib/nodejs/README.md">node.js</a></td>
 <!-- Build Systems ---------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
-<!-- Language Levels -------><td>4.2.6</td><td>8.8.1</td>
+<!-- Language Levels -------><td>4.2.6</td><td>8.9.1</td>
 <!-- Low-Level Transports --><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cred.png" alt=""/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
 <!-- Transport Wrappers ----><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cred.png" alt=""/></td>
 <!-- Protocols -------------><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td><td><img src="doc/images/cgrn.png" alt="Yes"/></td>
diff --git a/build/docker/README.md b/build/docker/README.md
index 10a7a76..a8d9501 100644
--- a/build/docker/README.md
+++ b/build/docker/README.md
@@ -147,15 +147,15 @@
 | d         | 2.070.2       | 2.073.2       | 2.076.0       |       |
 | dart      | 1.20.1        | 1.24.2        | 1.24.2        |       |
 | delphi    |               |               |               | Not in CI |
-| dotnet    |               | 2.0.3         |               | Needs to be added to artful |
+| dotnet    |               | 2.0.3         | 2.0.3         |       |
 | erlang    | R16B03        | 18.3          | 20.0.4        |       |
 | go        | 1.2.1         | 1.6.2         | 1.8.3         |       |
 | haskell   | 7.6.3         | 7.10.3        | 8.0.2         |       |
 | haxe      |               | 3.2.1         | 3.4.2         | disabled in trusty builds - cores on install v3.0.0, disabled in artful builds - see THRIFT-4352 |
-| java      | 1.7.0_151     | 1.8.0_131     | 1.8.0_144     |       |
+| java      | 1.7.0_151     | 1.8.0_131     | 1.8.0_151     |       |
 | js        |               |               |               | Unsure how to look for version info? |
-| lua       | 5.1.5         | 5.2.4         | 5.3.3         |       |
-| nodejs    |               | 4.2.6         | 8.8.1         | trusty has node.js 0.10.0 which is too old |
+| lua       | 5.1.5         | 5.2.4         | 5.2.4         | Lua 5.3: see THRIFT-4386 |
+| nodejs    |               | 4.2.6         | 8.9.1         | trusty has node.js 0.10.0 which is too old |
 | ocaml     |               | 4.02.3        | 4.04.0        |       |
 | perl      | 5.18.2        | 5.22.1        | 5.26.0        |       |
 | php       | 5.5.9         | 7.0.22        | 7.1.8         |       |
diff --git a/build/docker/ubuntu-artful/Dockerfile b/build/docker/ubuntu-artful/Dockerfile
index 756209d..cba2902 100644
--- a/build/docker/ubuntu-artful/Dockerfile
+++ b/build/docker/ubuntu-artful/Dockerfile
@@ -162,12 +162,11 @@
 
 RUN apt-get install -y --no-install-recommends \
 `# Lua dependencies` \
-      lua5.3 \
-      lua5.3-dev && \
-    ln -s /usr/bin/lua5.3 /usr/bin/lua && \
-    ln -s /usr/bin/luac5.3 /usr/bin/luac
+      lua5.2 \
+      lua5.2-dev
 # https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212
 # lua5.3 does not install alternatives!
+# need to update our luasocket code, lua doesn't have luaL_openlib any more
 
 RUN apt-get install -y --no-install-recommends \
 `# Node.js dependencies` \
diff --git a/lib/netcore/Thrift/Thrift.csproj b/lib/netcore/Thrift/Thrift.csproj
index 3725d7b..e806fed 100644
--- a/lib/netcore/Thrift/Thrift.csproj
+++ b/lib/netcore/Thrift/Thrift.csproj
@@ -22,6 +22,7 @@
     <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="[2.0,)" />
     <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="[2.0,)" />
     <PackageReference Include="System.IO.Pipes" Version="[4.3,)" />
+    <PackageReference Include="System.Net.Http.WinHttpHandler" Version="4.4.0" />
     <PackageReference Include="System.Net.NameResolution" Version="[4.3,)" />
     <PackageReference Include="System.Net.Requests" Version="[4.3,)" />
     <PackageReference Include="System.Net.Security" Version="[4.3,)" />
diff --git a/lib/rs/src/transport/socket.rs b/lib/rs/src/transport/socket.rs
index a6f780a..727bba3 100644
--- a/lib/rs/src/transport/socket.rs
+++ b/lib/rs/src/transport/socket.rs
@@ -156,7 +156,7 @@
 
 impl Write for TTcpChannel {
     fn write(&mut self, b: &[u8]) -> io::Result<usize> {
-        self.if_set(|s| s.write(b))
+        self.if_set(|s| s.write_all(b)).map(|_| b.len())
     }
 
     fn flush(&mut self) -> io::Result<()> {
diff --git a/test/cpp/src/TestClient.cpp b/test/cpp/src/TestClient.cpp
index 6e7ff8e..9544a4a 100644
--- a/test/cpp/src/TestClient.cpp
+++ b/test/cpp/src/TestClient.cpp
@@ -44,6 +44,7 @@
 #include <boost/algorithm/string.hpp>
 #include <boost/filesystem.hpp>
 #include <boost/program_options.hpp>
+#include <boost/random/random_device.hpp>
 #include <thrift/stdcxx.h>
 #if _WIN32
 #include <thrift/windows/TWinsockSingleton.h>
@@ -130,13 +131,16 @@
     return_code |= ERR_BASETYPES;                                                                  \
   }
 
+int binary_test(ThriftTestClient& testClient, string::size_type siz);
+
+BOOST_CONSTEXPR_OR_CONST int ERR_BASETYPES = 1;
+BOOST_CONSTEXPR_OR_CONST int ERR_STRUCTS = 2;
+BOOST_CONSTEXPR_OR_CONST int ERR_CONTAINERS = 4;
+BOOST_CONSTEXPR_OR_CONST int ERR_EXCEPTIONS = 8;
+BOOST_CONSTEXPR_OR_CONST int ERR_UNKNOWN = 64;
+
 int main(int argc, char** argv) {
   cout.precision(19);
-  int ERR_BASETYPES = 1;
-  int ERR_STRUCTS = 2;
-  int ERR_CONTAINERS = 4;
-  int ERR_EXCEPTIONS = 8;
-  int ERR_UNKNOWN = 64;
 
   string testDir  = boost::filesystem::system_complete(argv[0]).parent_path().parent_path().parent_path().string();
   string caPath   = testDir + "/keys/CA.pem";
@@ -161,13 +165,13 @@
   boost::program_options::options_description desc("Allowed options");
   desc.add_options()
       ("help,h", "produce help message")
-      ("host", 
-          boost::program_options::value<string>(&host)->default_value(host), 
+      ("host",
+          boost::program_options::value<string>(&host)->default_value(host),
           "Host to connect")
-      ("port", 
-          boost::program_options::value<int>(&port)->default_value(port), 
+      ("port",
+          boost::program_options::value<int>(&port)->default_value(port),
           "Port number to connect")
-      ("domain-socket", 
+      ("domain-socket",
           boost::program_options::value<string>(&domain_socket)->default_value(domain_socket),
           "Domain Socket (e.g. /tmp/ThriftTest.thrift), instead of host and port")
       ("abstract-namespace",
@@ -179,7 +183,7 @@
       ("protocol",
           boost::program_options::value<string>(&protocol_type)->default_value(protocol_type),
           "Protocol: binary, compact, header, json, multi, multic, multih, multij")
-      ("ssl", 
+      ("ssl",
           "Encrypted Transport using SSL")
       ("testloops,n",
           boost::program_options::value<int>(&numTests)->default_value(numTests),
@@ -244,7 +248,7 @@
   stdcxx::shared_ptr<TSocket> socket;
   stdcxx::shared_ptr<TTransport> transport;
   stdcxx::shared_ptr<TProtocol> protocol;
-  stdcxx::shared_ptr<TProtocol> protocol2;	// SecondService for multiplexed
+  stdcxx::shared_ptr<TProtocol> protocol2;  // SecondService for multiplexed
 
   if (ssl) {
     cout << "Client Certificate File: " << certPath << endl;
@@ -295,9 +299,9 @@
   }
 
   if (boost::starts_with(protocol_type, "multi")) {
-	protocol2 = stdcxx::make_shared<TMultiplexedProtocol>(protocol, "SecondService");
-	// we don't need access to the original protocol any more, so...
-	protocol = stdcxx::make_shared<TMultiplexedProtocol>(protocol, "ThriftTest");
+  protocol2 = stdcxx::make_shared<TMultiplexedProtocol>(protocol, "SecondService");
+  // we don't need access to the original protocol any more, so...
+  protocol = stdcxx::make_shared<TMultiplexedProtocol>(protocol, "ThriftTest");
   }
 
   // Connection info
@@ -387,18 +391,18 @@
     // in the middle of the ThriftTest
     //
     if (boost::starts_with(protocol_type, "multi")) {
-		SecondServiceClient ssc(protocol2);
-		// transport is already open...
-		  
+    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;
-		}
+        std::string result;
+      ssc.secondtestString(result, "foo");
+      cout << "{" << result << "}" << endl;
+      } catch (std::exception& e) {
+      cout << "  *** FAILED *** " << e.what() << endl;
+      return_code |= ERR_EXCEPTIONS;
+    }
     }
 
     try {
@@ -568,72 +572,9 @@
     /**
      * BINARY TEST
      */
-    cout << "testBinary(empty)" << endl;
-    try {
-      string bin_result;
-      testClient.testBinary(bin_result, string());
-      if (!bin_result.empty()) {
-        cout << endl << "*** FAILED ***" << endl;
-        cout << "invalid length: " << bin_result.size() << endl;
-        return_code |= ERR_BASETYPES;
-      }
-    } catch (TTransportException&) {
-      throw;
-    } catch (exception& ex) {
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
-      return_code |= ERR_BASETYPES;
-    }
-    cout << "testBinary([-128..127]) = {" << flush;
-    const signed char bin_data[256]
-        = {-128, -127, -126, -125, -124, -123, -122, -121, -120, -119, -118, -117, -116, -115, -114,
-           -113, -112, -111, -110, -109, -108, -107, -106, -105, -104, -103, -102, -101, -100, -99,
-           -98,  -97,  -96,  -95,  -94,  -93,  -92,  -91,  -90,  -89,  -88,  -87,  -86,  -85,  -84,
-           -83,  -82,  -81,  -80,  -79,  -78,  -77,  -76,  -75,  -74,  -73,  -72,  -71,  -70,  -69,
-           -68,  -67,  -66,  -65,  -64,  -63,  -62,  -61,  -60,  -59,  -58,  -57,  -56,  -55,  -54,
-           -53,  -52,  -51,  -50,  -49,  -48,  -47,  -46,  -45,  -44,  -43,  -42,  -41,  -40,  -39,
-           -38,  -37,  -36,  -35,  -34,  -33,  -32,  -31,  -30,  -29,  -28,  -27,  -26,  -25,  -24,
-           -23,  -22,  -21,  -20,  -19,  -18,  -17,  -16,  -15,  -14,  -13,  -12,  -11,  -10,  -9,
-           -8,   -7,   -6,   -5,   -4,   -3,   -2,   -1,   0,    1,    2,    3,    4,    5,    6,
-           7,    8,    9,    10,   11,   12,   13,   14,   15,   16,   17,   18,   19,   20,   21,
-           22,   23,   24,   25,   26,   27,   28,   29,   30,   31,   32,   33,   34,   35,   36,
-           37,   38,   39,   40,   41,   42,   43,   44,   45,   46,   47,   48,   49,   50,   51,
-           52,   53,   54,   55,   56,   57,   58,   59,   60,   61,   62,   63,   64,   65,   66,
-           67,   68,   69,   70,   71,   72,   73,   74,   75,   76,   77,   78,   79,   80,   81,
-           82,   83,   84,   85,   86,   87,   88,   89,   90,   91,   92,   93,   94,   95,   96,
-           97,   98,   99,   100,  101,  102,  103,  104,  105,  106,  107,  108,  109,  110,  111,
-           112,  113,  114,  115,  116,  117,  118,  119,  120,  121,  122,  123,  124,  125,  126,
-           127};
-    try {
-      string bin_result;
-      testClient.testBinary(bin_result, string(reinterpret_cast<const char *>(bin_data), 256));
-      if (bin_result.size() != 256) {
-        cout << endl << "*** FAILED ***" << endl;
-        cout << "invalid length: " << bin_result.size() << endl;
-        return_code |= ERR_BASETYPES;
-      } else {
-        bool first = true;
-        bool failed = false;
-        for (int i = 0; i < 256; ++i) {
-          if (!first)
-            cout << ",";
-          else
-            first = false;
-          cout << static_cast<int>(bin_result[i]);
-          if (!failed && bin_result[i] != i - 128) {
-            failed = true;
-          }
-        }
-        cout << "}" << endl;
-        if (failed) {
-          cout << "*** FAILED ***" << endl;
-          return_code |= ERR_BASETYPES;
-        }
-      }
-    } catch (TTransportException&) {
-      throw;
-    } catch (exception& ex) {
-      cout << "*** FAILED ***" << endl << ex.what() << endl;
-      return_code |= ERR_BASETYPES;
+    for (string::size_type i = 0; i < 131073 && !return_code; ) {
+      return_code |= binary_test(testClient, i);
+      if (i > 0) { i *= 2; } else { ++i; }
     }
 
 
@@ -1137,7 +1078,7 @@
       return_code |= ERR_BASETYPES;
 
     cout << endl << "All tests done." << endl << flush;
-    
+
     uint64_t stop = now();
     uint64_t tot = stop - start;
 
@@ -1164,3 +1105,66 @@
 
   return return_code;
 }
+
+void binary_fill(std::string& str, string::size_type siz)
+{
+    static const signed char bin_data[256]
+        = {-128, -127, -126, -125, -124, -123, -122, -121, -120, -119, -118, -117, -116, -115, -114,
+           -113, -112, -111, -110, -109, -108, -107, -106, -105, -104, -103, -102, -101, -100, -99,
+           -98,  -97,  -96,  -95,  -94,  -93,  -92,  -91,  -90,  -89,  -88,  -87,  -86,  -85,  -84,
+           -83,  -82,  -81,  -80,  -79,  -78,  -77,  -76,  -75,  -74,  -73,  -72,  -71,  -70,  -69,
+           -68,  -67,  -66,  -65,  -64,  -63,  -62,  -61,  -60,  -59,  -58,  -57,  -56,  -55,  -54,
+           -53,  -52,  -51,  -50,  -49,  -48,  -47,  -46,  -45,  -44,  -43,  -42,  -41,  -40,  -39,
+           -38,  -37,  -36,  -35,  -34,  -33,  -32,  -31,  -30,  -29,  -28,  -27,  -26,  -25,  -24,
+           -23,  -22,  -21,  -20,  -19,  -18,  -17,  -16,  -15,  -14,  -13,  -12,  -11,  -10,  -9,
+           -8,   -7,   -6,   -5,   -4,   -3,   -2,   -1,   0,    1,    2,    3,    4,    5,    6,
+           7,    8,    9,    10,   11,   12,   13,   14,   15,   16,   17,   18,   19,   20,   21,
+           22,   23,   24,   25,   26,   27,   28,   29,   30,   31,   32,   33,   34,   35,   36,
+           37,   38,   39,   40,   41,   42,   43,   44,   45,   46,   47,   48,   49,   50,   51,
+           52,   53,   54,   55,   56,   57,   58,   59,   60,   61,   62,   63,   64,   65,   66,
+           67,   68,   69,   70,   71,   72,   73,   74,   75,   76,   77,   78,   79,   80,   81,
+           82,   83,   84,   85,   86,   87,   88,   89,   90,   91,   92,   93,   94,   95,   96,
+           97,   98,   99,   100,  101,  102,  103,  104,  105,  106,  107,  108,  109,  110,  111,
+           112,  113,  114,  115,  116,  117,  118,  119,  120,  121,  122,  123,  124,  125,  126,
+           127};
+
+    str.resize(siz);
+    char *ptr = &str[0];
+    string::size_type pos = 0;
+    for (string::size_type i = 0; i < siz; ++i)
+    {
+        if (pos == 255) { pos = 0; } else { ++pos; }
+        *ptr++ = bin_data[pos];
+    }
+}
+
+int binary_test(ThriftTestClient& testClient, string::size_type siz)
+{
+    string bin_request;
+    string bin_result;
+
+    cout << "testBinary(siz = " << siz << ")" << endl;
+    binary_fill(bin_request, siz);
+    try {
+        testClient.testBinary(bin_result, bin_request);
+
+        if (bin_request.size() != bin_result.size()) {
+            cout << "*** FAILED: request size " << bin_request.size() << "; result size " << bin_result.size() << endl;
+            return ERR_BASETYPES;
+        }
+
+        for (string::size_type i = 0; i < siz; ++i) {
+            if (bin_request.at(i) != bin_result.at(i)) {
+                cout << "*** FAILED: at position " << i << " request[i] is h" << hex << bin_request.at(i) << " result[i] is h" << hex << bin_result.at(i) << endl;
+                return ERR_BASETYPES;
+            }
+        }
+    } catch (TTransportException&) {
+        throw;
+    } catch (exception& ex) {
+        cout << "*** FAILED ***" << endl << ex.what() << endl;
+        return ERR_BASETYPES;
+    }
+
+    return 0;
+}
diff --git a/test/cpp/src/TestServer.cpp b/test/cpp/src/TestServer.cpp
index 744a86c..78b0a74 100644
--- a/test/cpp/src/TestServer.cpp
+++ b/test/cpp/src/TestServer.cpp
@@ -113,7 +113,7 @@
   void testBinary(std::string& _return, const std::string& thing) {
     std::ostringstream hexstr;
     hexstr << std::hex << thing;
-    printf("testBinary(%s)\n", hexstr.str().c_str());
+    printf("testBinary(%lu: %s)\n", thing.size(), hexstr.str().c_str());
     _return = thing;
   }
 
@@ -345,7 +345,7 @@
   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) {
@@ -606,10 +606,10 @@
       } 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 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);
       }
diff --git a/test/known_failures_Linux.json b/test/known_failures_Linux.json
index ea194a1..ae9b370 100644
--- a/test/known_failures_Linux.json
+++ b/test/known_failures_Linux.json
@@ -3,9 +3,9 @@
   "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_buffered-ip",
   "c_glib-csharp_multic_framed-ip",
   "c_glib-rs_multi_buffered-ip",
   "c_glib-rs_multi_framed-ip",
@@ -195,6 +195,8 @@
   "d-py_json_buffered-ip-ssl",
   "d-py_json_framed-ip",
   "d-py_json_framed-ip-ssl",
+  "erl-cpp_binary_buffered-ip",
+  "erl-cpp_compact_buffered-ip",
   "erl-csharp_binary_buffered-ip",
   "erl-csharp_compact_buffered-ip",
   "erl-nodejs_binary_buffered-ip",
@@ -297,6 +299,20 @@
   "nodejs-netcore_json_buffered-ip-ssl",
   "nodejs-netcore_json_framed-ip",
   "nodejs-netcore_json_framed-ip-ssl",
+  "rb-cpp_json_buffered-ip",
+  "rb-cpp_json_framed-ip",
+  "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",
   "rs-csharp_binary_buffered-ip",
   "rs-csharp_binary_framed-ip",
   "rs-csharp_compact_buffered-ip",
diff --git a/test/rs/src/bin/test_client.rs b/test/rs/src/bin/test_client.rs
index 7c11ad5..0df2f00 100644
--- a/test/rs/src/bin/test_client.rs
+++ b/test/rs/src/bin/test_client.rs
@@ -126,7 +126,7 @@
     };
 
     let (i_prot, o_prot): (Box<TInputProtocol>, Box<TOutputProtocol>) = match protocol {
-        "binary" | "multi:binary" => {
+        "binary" => {
             (Box::new(TBinaryInputProtocol::new(i_tran, true)),
              Box::new(TBinaryOutputProtocol::new(o_tran, true)))
         }
@@ -139,7 +139,7 @@
                 ),
             ))
         }
-        "compact" | "multi:compact" => {
+        "compact" => {
             (Box::new(TCompactInputProtocol::new(i_tran)),
              Box::new(TCompactOutputProtocol::new(o_tran)))
         }