THRIFT-3371: added test for abstract namespace domain sockets.
diff --git a/test/cpp/src/TestClient.cpp b/test/cpp/src/TestClient.cpp
index e709899..1ab4d21 100644
--- a/test/cpp/src/TestClient.cpp
+++ b/test/cpp/src/TestClient.cpp
@@ -125,6 +125,7 @@
string transport_type = "buffered";
string protocol_type = "binary";
string domain_socket = "";
+ bool abstract_namespace = false;
bool noinsane = false;
boost::program_options::options_description desc("Allowed options");
@@ -139,6 +140,8 @@
"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",
+ "Look for the domain socket in the Abstract Namespace (no connection with filesystem pathnames)")(
"transport",
boost::program_options::value<string>(&transport_type)->default_value(transport_type),
"Transport: buffered, framed, http, evhttp")(
@@ -188,6 +191,10 @@
ssl = true;
}
+ if (vm.count("abstract-namespace")) {
+ abstract_namespace = true;
+ }
+
if (vm.count("noinsane")) {
noinsane = true;
}
@@ -206,7 +213,13 @@
socket = factory->createSocket(host, port);
} else {
if (domain_socket != "") {
- socket = boost::shared_ptr<TSocket>(new TSocket(domain_socket));
+ if (abstract_namespace) {
+ std::string abstract_socket("\0", 1);
+ abstract_socket += domain_socket;
+ socket = boost::shared_ptr<TSocket>(new TSocket(abstract_socket));
+ } else {
+ socket = boost::shared_ptr<TSocket>(new TSocket(domain_socket));
+ }
port = 0;
} else {
socket = boost::shared_ptr<TSocket>(new TSocket(host, port));
@@ -236,7 +249,11 @@
}
// Connection info
- cout << "Connecting (" << transport_type << "/" << protocol_type << ") to: " << domain_socket;
+ cout << "Connecting (" << transport_type << "/" << protocol_type << ") to: ";
+ if (abstract_namespace) {
+ cout << '@';
+ }
+ cout << domain_socket;
if (port != 0) {
cout << host << ":" << port;
}
diff --git a/test/cpp/src/TestServer.cpp b/test/cpp/src/TestServer.cpp
index 66d3bb2..51169af 100644
--- a/test/cpp/src/TestServer.cpp
+++ b/test/cpp/src/TestServer.cpp
@@ -546,6 +546,7 @@
string protocol_type = "binary";
string server_type = "simple";
string domain_socket = "";
+ bool abstract_namespace = false;
size_t workers = 4;
boost::program_options::options_description desc("Allowed options");
@@ -556,6 +557,8 @@
boost::program_options::value<string>(&domain_socket)
->default_value(domain_socket),
"Unix Domain Socket (e.g. /tmp/ThriftTest.thrift)")(
+ "abstract-namespace",
+ "Create the domain socket in the Abstract Namespace (no connection with filesystem pathnames)")(
"server-type",
boost::program_options::value<string>(&server_type)->default_value(server_type),
"type of server, \"simple\", \"thread-pool\", \"threaded\", or \"nonblocking\"")(
@@ -618,6 +621,10 @@
ssl = true;
}
+ if (vm.count("abstract-namespace")) {
+ abstract_namespace = true;
+ }
+
// Dispatcher
boost::shared_ptr<TProtocolFactory> protocolFactory;
if (protocol_type == "json") {
@@ -653,8 +660,14 @@
serverSocket = boost::shared_ptr<TServerSocket>(new TSSLServerSocket(port, sslSocketFactory));
} else {
if (domain_socket != "") {
- unlink(domain_socket.c_str());
- serverSocket = boost::shared_ptr<TServerSocket>(new TServerSocket(domain_socket));
+ if (abstract_namespace) {
+ std::string abstract_socket("\0", 1);
+ abstract_socket += domain_socket;
+ serverSocket = boost::shared_ptr<TServerSocket>(new TServerSocket(abstract_socket));
+ } else {
+ unlink(domain_socket.c_str());
+ serverSocket = boost::shared_ptr<TServerSocket>(new TServerSocket(domain_socket));
+ }
port = 0;
} else {
serverSocket = boost::shared_ptr<TServerSocket>(new TServerSocket(port));
@@ -677,7 +690,11 @@
// Server Info
cout << "Starting \"" << server_type << "\" server (" << transport_type << "/" << protocol_type
- << ") listen on: " << domain_socket;
+ << ") listen on: ";
+ if (abstract_namespace) {
+ cout << '@';
+ }
+ cout << domain_socket;
if (port != 0) {
cout << port;
}
diff --git a/test/crossrunner/run.py b/test/crossrunner/run.py
index e3300ba..ae7d366 100644
--- a/test/crossrunner/run.py
+++ b/test/crossrunner/run.py
@@ -204,7 +204,7 @@
return port if ok else self._get_domain_port()
def alloc_port(self, socket_type):
- if socket_type == 'domain':
+ if socket_type in ('domain', 'abstract'):
return self._get_domain_port()
else:
return self._get_tcp_port()
@@ -226,6 +226,8 @@
path = domain_socket_path(port)
if os.path.exists(path):
os.remove(path)
+ elif socket_type == 'abstract':
+ self._dom_ports.remove(port)
else:
self._ports.remove(port)
except IOError as err:
diff --git a/test/crossrunner/test.py b/test/crossrunner/test.py
index 512e664..3750ba3 100644
--- a/test/crossrunner/test.py
+++ b/test/crossrunner/test.py
@@ -60,10 +60,11 @@
cmd[0] = abs_if_exists(cmd[0])
return cmd
- def _socket_arg(self, socket, port):
+ def _socket_args(self, socket, port):
return {
- 'ip-ssl': '--ssl',
- 'domain': '--domain-socket=%s' % domain_socket_path(port),
+ 'ip-ssl': ['--ssl'],
+ 'domain': ['--domain-socket=%s' % domain_socket_path(port)],
+ 'abstract': ['--abstract-namespace', '--domain-socket=%s' % domain_socket_path(port)],
}.get(socket, None)
def build_command(self, port):
@@ -71,9 +72,9 @@
args = []
args.append('--protocol=' + self.protocol)
args.append('--transport=' + self.transport)
- socket_arg = self._socket_arg(self.socket, port)
- if socket_arg:
- args.append(socket_arg)
+ socket_args = self._socket_args(self.socket, port)
+ if socket_args:
+ args += socket_args
args.append('--port=%d' % port)
if self._join_args:
cmd.append('%s' % " ".join(args))