Merge github.com:grpc/grpc into qps_driver
diff --git a/.travis.yml b/.travis.yml
index de320b5..e43a89e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,9 +4,11 @@
   - sudo add-apt-repository ppa:h-rayflood/llvm -y
   - sudo apt-get update -qq
   - sudo apt-get install -qq libgtest-dev libgflags-dev python-virtualenv clang-3.5
+  - sudo pip install cpp-coveralls
 env:
   global:
     - RUBY_VERSION=2.1
+    - COVERALLS_PARALLEL=true
   matrix:
     - CONFIG=dbg TEST=c
     - CONFIG=dbg TEST=c++
@@ -15,9 +17,15 @@
     - CONFIG=opt TEST=node
     - CONFIG=opt TEST=ruby
     - CONFIG=opt TEST=python
+    - CONFIG=gcov TEST=c
+    - CONFIG=gcov TEST=c++
 script:
   - rvm use $RUBY_VERSION
   - gem install bundler
   - ./tools/run_tests/run_tests.py -l $TEST -t -j 16 -c $CONFIG -s 4.0
+after_success:
+  - if [ "$CONFIG" = "gcov" ] ; then coveralls --exclude third_party --exclude gens -b. --gcov-options '\-p' ; fi
 notifications:
-  email: false
\ No newline at end of file
+  email: false
+  webhooks:
+    - https://coveralls.io/webhook?repo_token=54IxAHPjJNdQJzJAhPU0MFpCtg7KvcydQ
diff --git a/include/grpc++/impl/rpc_service_method.h b/include/grpc++/impl/rpc_service_method.h
index 325c881..0976678 100644
--- a/include/grpc++/impl/rpc_service_method.h
+++ b/include/grpc++/impl/rpc_service_method.h
@@ -39,10 +39,10 @@
 #include <memory>
 #include <vector>
 
+#include <grpc++/config.h>
 #include <grpc++/impl/rpc_method.h>
 #include <grpc++/status.h>
 #include <grpc++/stream.h>
-#include <google/protobuf/message.h>
 
 namespace grpc {
 class ServerContext;
diff --git a/include/grpc++/server_context.h b/include/grpc++/server_context.h
index 9387f4a..a986fff 100644
--- a/include/grpc++/server_context.h
+++ b/include/grpc++/server_context.h
@@ -37,7 +37,7 @@
 #include <chrono>
 #include <map>
 
-#include "config.h"
+#include <grpc++/config.h>
 
 struct gpr_timespec;
 struct grpc_metadata;
diff --git a/src/cpp/client/channel.cc b/src/cpp/client/channel.cc
index ca69d66..450cf67 100644
--- a/src/cpp/client/channel.cc
+++ b/src/cpp/client/channel.cc
@@ -50,7 +50,6 @@
 #include <grpc++/impl/call.h>
 #include <grpc++/impl/rpc_method.h>
 #include <grpc++/status.h>
-#include <google/protobuf/message.h>
 
 namespace grpc {
 
diff --git a/src/cpp/common/call.cc b/src/cpp/common/call.cc
index b2b6c62..6ce1e8a 100644
--- a/src/cpp/common/call.cc
+++ b/src/cpp/common/call.cc
@@ -31,7 +31,6 @@
  *
  */
 
-#include <google/protobuf/message.h>
 #include <grpc/support/alloc.h>
 #include <grpc++/impl/call.h>
 #include <grpc++/client_context.h>
diff --git a/src/cpp/proto/proto_utils.cc b/src/cpp/proto/proto_utils.cc
index e6badd5..72f1bf7 100644
--- a/src/cpp/proto/proto_utils.cc
+++ b/src/cpp/proto/proto_utils.cc
@@ -36,7 +36,6 @@
 
 #include <grpc/grpc.h>
 #include <grpc/support/slice.h>
-#include <google/protobuf/message.h>
 
 namespace grpc {
 
diff --git a/src/cpp/server/async_server_context.cc b/src/cpp/server/async_server_context.cc
index bee7549..f21efcf 100644
--- a/src/cpp/server/async_server_context.cc
+++ b/src/cpp/server/async_server_context.cc
@@ -36,7 +36,7 @@
 #include <grpc/grpc.h>
 #include <grpc/support/log.h>
 #include "src/cpp/proto/proto_utils.h"
-#include <google/protobuf/message.h>
+#include <grpc++/config.h>
 #include <grpc++/status.h>
 
 namespace grpc {
diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
index e560112..30301f1 100644
--- a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
+++ b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
@@ -103,8 +103,16 @@
             Credentials credentials = null;
             if (options.useTls)
             {
-                // TODO: use also Env variable for location of the ca file.
-                credentials = new SslCredentials(File.ReadAllText("data/ca.pem"));
+                string caPath = "data/ca.pem";  // Default testing CA
+                if (!options.useTestCa)
+                {
+                    caPath = Environment.GetEnvironmentVariable("SSL_CERT_FILE");
+                    if (string.IsNullOrEmpty(caPath))
+                    {
+                        throw new ArgumentException("CA path environment variable is not set.");
+                    }
+                }
+                credentials = new SslCredentials(File.ReadAllText(caPath));
             }
 
             ChannelArgs channelArgs = null;
diff --git a/tools/gce_setup/grpc_docker.sh b/tools/gce_setup/grpc_docker.sh
index 8863856..619eff5 100755
--- a/tools/gce_setup/grpc_docker.sh
+++ b/tools/gce_setup/grpc_docker.sh
@@ -674,7 +674,7 @@
   [[ -n $1 ]] && {
     servers="$@"
   } || {
-    servers="cxx java go node ruby python"
+    servers="cxx java go node ruby python csharp_mono"
     echo "$FUNCNAME: no servers specified, will launch defaults '$servers'"
   }
 }
@@ -710,6 +710,7 @@
       node)   grpc_port=8040 ;;
       python) grpc_port=8050 ;;
       ruby)   grpc_port=8060 ;;
+      csharp_mono)   grpc_port=8070 ;;
       *) echo "bad server_type: $1" 1>&2; return 1 ;;
     esac
     local docker_label="grpc/$server"
@@ -1169,8 +1170,9 @@
 #   flags= .... # generic flags to include the command
 #   cmd=$($grpc_gen_test_cmd $flags)
 grpc_interop_gen_csharp_mono_cmd() {
-  local cmd_prefix="sudo docker run grpc/csharp_mono";
-  local test_script="mono /var/local/git/grpc/src/csharp/Grpc.IntegrationTesting.Client/bin/Debug/Grpc.IntegrationTesting.Client.exe --use_tls=true --use_test_ca=true";
+  local workdir_flag="-w /var/local/git/grpc/src/csharp/Grpc.IntegrationTesting.Client/bin/Debug"
+  local cmd_prefix="sudo docker run $workdir_flag grpc/csharp_mono";
+  local test_script="mono Grpc.IntegrationTesting.Client.exe --use_tls=true --use_test_ca=true";
   local the_cmd="$cmd_prefix $test_script $@";
   echo $the_cmd
 }
@@ -1182,8 +1184,9 @@
 #   cmd=$($grpc_gen_test_cmd $flags)
 grpc_cloud_prod_gen_csharp_mono_cmd() {
   local env_flag="-e SSL_CERT_FILE=/cacerts/roots.pem "
-  local cmd_prefix="sudo docker run $env_flag grpc/csharp_mono";
-  local test_script="mono /var/local/git/grpc/src/csharp/Grpc.IntegrationTesting.Client/bin/Debug/Grpc.IntegrationTesting.Client.exe --use_tls=true";
+  local workdir_flag="-w /var/local/git/grpc/src/csharp/Grpc.IntegrationTesting.Client/bin/Debug"
+  local cmd_prefix="sudo docker run $env_flag $workdir_flag grpc/csharp_mono";
+  local test_script="mono Grpc.IntegrationTesting.Client.exe --use_tls=true";
   local gfe_flags=$(_grpc_prod_gfe_flags);
   local the_cmd="$cmd_prefix $test_script $gfe_flags $@";
   echo $the_cmd