THRIFT-3711 Add D to cross language test

This closes #923
diff --git a/lib/Makefile.am b/lib/Makefile.am
index e699b9f..cb8d290 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -75,6 +75,7 @@
 
 if WITH_D
 SUBDIRS += d
+PRECROSS_TARGET += precross-d
 endif
 
 if WITH_NODEJS
diff --git a/lib/d/Makefile.am b/lib/d/Makefile.am
index 30b5eb3..5c529ba 100644
--- a/lib/d/Makefile.am
+++ b/lib/d/Makefile.am
@@ -185,6 +185,8 @@
 TESTS = $(addprefix unittest/debug/, $(d_test_modules)) \
 	$(addprefix unittest/release/, $(d_test_modules))
 
+precross: all-local
+	$(MAKE) -C test precross
 
 EXTRA_DIST = \
 	src \
diff --git a/lib/d/test/Makefile.am b/lib/d/test/Makefile.am
index edb0444..c510471 100755
--- a/lib/d/test/Makefile.am
+++ b/lib/d/test/Makefile.am
@@ -74,7 +74,7 @@
 
 if WITH_D_SSL_TESTS
 d_test_flags += $(DMD_OPENSSL_FLAGS) ../$(D_SSL_LIB_NAME)
-targets = trusted-ca-certificate.pem server-certificate.pem $(targets_)
+targets = $(targets_)
 ran_tests = $(ran_tests_)
 else
 targets = $(filter-out $(openssl_dependent_targets), $(targets_))
@@ -125,3 +125,5 @@
 	trusted-ca-certificate.pem server-certificate.pem
 
 TESTS = $(ran_tests)
+
+precross: $(targets)
diff --git a/lib/d/test/thrift_test_client.d b/lib/d/test/thrift_test_client.d
index fd53328..49419f7 100644
--- a/lib/d/test/thrift_test_client.d
+++ b/lib/d/test/thrift_test_client.d
@@ -25,6 +25,7 @@
 import std.stdio;
 import std.string;
 import std.traits;
+import thrift.base;
 import thrift.codegen.client;
 import thrift.protocol.base;
 import thrift.protocol.binary;
@@ -75,6 +76,7 @@
     "ssl", &ssl,
     "transport", &transportType,
     "trace", &trace,
+    "port", &port,
     "host", (string _, string value) {
       auto parts = split(value, ":");
       if (parts.length > 1) {
@@ -87,13 +89,14 @@
       }
     }
   );
+  port = to!ushort(port);
 
   TSocket socket;
   if (ssl) {
     auto sslContext = new TSSLContext();
     sslContext.ciphers = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH";
     sslContext.authenticate = true;
-    sslContext.loadTrustedCertificates("./trusted-ca-certificate.pem");
+    sslContext.loadTrustedCertificates("../../../test/keys/CA.pem");
     socket = new TSSLSocket(sslContext, host, port);
   } else {
     socket = new TSocket(host, port);
@@ -280,6 +283,15 @@
       }
 
       try {
+        if (trace) write("client.testException(\"TException\") =>");
+        client.testException("Xception");
+        if (trace) writeln("  void\nFAILURE");
+        throw new Exception("testException failed.");
+      } catch (TException e) {
+        if (trace) writefln("  {%s}", e.msg);
+      }
+
+      try {
         if (trace) write("client.testException(\"success\") =>");
         client.testException("success");
         if (trace) writeln("  void");
diff --git a/lib/d/test/thrift_test_server.d b/lib/d/test/thrift_test_server.d
index b55b7fc..71ab917 100644
--- a/lib/d/test/thrift_test_server.d
+++ b/lib/d/test/thrift_test_server.d
@@ -143,7 +143,17 @@
 
   override Insanity[Numberz][UserId] testInsanity(ref const(Insanity) argument) {
     if (trace_) writeln("testInsanity()");
-    return testInsanityReturn;
+    Insanity[Numberz][UserId] ret;
+    Insanity[Numberz] m1;
+    Insanity[Numberz] m2;
+    Insanity tmp;
+    tmp = cast(Insanity)argument;
+    m1[Numberz.TWO] = tmp;
+    m1[Numberz.THREE] = tmp;
+    m2[Numberz.SIX] = Insanity();
+    ret[1] = m1;
+    ret[2] = m2;
+    return ret;
   }
 
   override Xtruct testMulti(byte arg0, int arg1, long arg2, string[short] arg3,
@@ -160,6 +170,8 @@
       e.errorCode = 1001;
       e.message = arg;
       throw e;
+    } else if (arg == "TException") {
+      throw new TException();
     } else if (arg == "ApplicationException") {
       throw new TException();
     }
@@ -254,8 +266,8 @@
   if (ssl) {
     auto sslContext = new TSSLContext();
     sslContext.serverSide = true;
-    sslContext.loadCertificate("./server-certificate.pem");
-    sslContext.loadPrivateKey("./server-private-key.pem");
+    sslContext.loadCertificate("../../../test/keys/server.crt");
+    sslContext.loadPrivateKey("../../../test/keys/server.key");
     sslContext.ciphers = "ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH";
     serverSocket = new TSSLServerSocket(port, sslContext);
   } else {