|  | @@ -384,6 +384,7 @@ grpc_interop_test_args() {
 | 
	
		
			
				|  |  |    [[ -n $1 ]] && {  # client_type
 | 
	
		
			
				|  |  |      case $1 in
 | 
	
		
			
				|  |  |        cxx|go|java|node|php|python|ruby|csharp_mono)
 | 
	
		
			
				|  |  | +        grpc_client_platform='Docker'
 | 
	
		
			
				|  |  |          grpc_gen_test_cmd="grpc_interop_gen_$1_cmd"
 | 
	
		
			
				|  |  |          declare -F $grpc_gen_test_cmd >> /dev/null || {
 | 
	
		
			
				|  |  |            echo "-f: test_func for $1 => $grpc_gen_test_cmd is not defined" 1>&2
 | 
	
	
		
			
				|  | @@ -391,6 +392,11 @@ grpc_interop_test_args() {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          shift
 | 
	
		
			
				|  |  |          ;;
 | 
	
		
			
				|  |  | +      csharp_dotnet)
 | 
	
		
			
				|  |  | +        grpc_client_platform='Windows'
 | 
	
		
			
				|  |  | +        grpc_gen_test_cmd="grpc_interop_gen_$1_cmd"
 | 
	
		
			
				|  |  | +        shift
 | 
	
		
			
				|  |  | +        ;;
 | 
	
		
			
				|  |  |        *)
 | 
	
		
			
				|  |  |          echo "bad client_type: $1" 1>&2
 | 
	
		
			
				|  |  |          return 1
 | 
	
	
		
			
				|  | @@ -456,6 +462,7 @@ grpc_cloud_prod_test_args() {
 | 
	
		
			
				|  |  |    [[ -n $1 ]] && {  # client_type
 | 
	
		
			
				|  |  |      case $1 in
 | 
	
		
			
				|  |  |        cxx|go|java|node|php|python|ruby|csharp_mono)
 | 
	
		
			
				|  |  | +        grpc_client_platform='Docker'
 | 
	
		
			
				|  |  |          grpc_gen_test_cmd="grpc_cloud_prod_gen_$1_cmd"
 | 
	
		
			
				|  |  |          declare -F $grpc_gen_test_cmd >> /dev/null || {
 | 
	
		
			
				|  |  |            echo "-f: test_func for $1 => $grpc_gen_test_cmd is not defined" 1>&2
 | 
	
	
		
			
				|  | @@ -463,6 +470,11 @@ grpc_cloud_prod_test_args() {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          shift
 | 
	
		
			
				|  |  |          ;;
 | 
	
		
			
				|  |  | +       csharp_dotnet)
 | 
	
		
			
				|  |  | +        grpc_client_platform='Windows'
 | 
	
		
			
				|  |  | +        grpc_gen_test_cmd="grpc_cloud_prod_gen_$1_cmd"
 | 
	
		
			
				|  |  | +        shift
 | 
	
		
			
				|  |  | +        ;;
 | 
	
		
			
				|  |  |        *)
 | 
	
		
			
				|  |  |          echo "bad client_type: $1" 1>&2
 | 
	
		
			
				|  |  |          return 1
 | 
	
	
		
			
				|  | @@ -851,12 +863,23 @@ grpc_launch_servers() {
 | 
	
		
			
				|  |  |  test_runner() {
 | 
	
		
			
				|  |  |    local project_opt="--project $grpc_project"
 | 
	
		
			
				|  |  |    local zone_opt="--zone $grpc_zone"
 | 
	
		
			
				|  |  | -  local ssh_cmd="bash -l -c \"$cmd\""
 | 
	
		
			
				|  |  | -  echo "will run:"
 | 
	
		
			
				|  |  | -  echo "  $ssh_cmd"
 | 
	
		
			
				|  |  | -  echo "on $host"
 | 
	
		
			
				|  |  |    [[ $dry_run == 1 ]] && return 0  # don't run the command on a dry run
 | 
	
		
			
				|  |  | -  gcloud compute $project_opt ssh $zone_opt $host --command "$cmd" &
 | 
	
		
			
				|  |  | +  if [ "$grpc_client_platform" != "Windows" ]
 | 
	
		
			
				|  |  | +  then
 | 
	
		
			
				|  |  | +    echo "will run:"
 | 
	
		
			
				|  |  | +    echo "  $cmd"
 | 
	
		
			
				|  |  | +    echo "on $host"
 | 
	
		
			
				|  |  | +    gcloud compute $project_opt ssh $zone_opt $host --command "$cmd" &
 | 
	
		
			
				|  |  | +  else
 | 
	
		
			
				|  |  | +    # gcloud's auto-uploading of RSA keys doesn't work for Windows VMs.
 | 
	
		
			
				|  |  | +    # So we have a linux machine that is authorized to access the Windows
 | 
	
		
			
				|  |  | +    # machine through ssh and we use gcloud auth support to logon to the proxy.
 | 
	
		
			
				|  |  | +    echo "will run:"
 | 
	
		
			
				|  |  | +    echo "  $cmd"
 | 
	
		
			
				|  |  | +    echo "on $host (through grpc-windows-proxy)"
 | 
	
		
			
				|  |  | +    gcloud compute $project_opt ssh $zone_opt stoked-keyword-656@grpc-windows-proxy --command "ssh $host '$cmd'" &
 | 
	
		
			
				|  |  | +  fi
 | 
	
		
			
				|  |  | +  #
 | 
	
		
			
				|  |  |    PID=$!
 | 
	
		
			
				|  |  |    echo "pid is $PID"
 | 
	
		
			
				|  |  |    for x in {0..5}
 | 
	
	
		
			
				|  | @@ -924,7 +947,7 @@ grpc_interop_test() {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    local grpc_zone grpc_project dry_run  # set by _grpc_set_project_and_zone
 | 
	
		
			
				|  |  |    #  grpc_interop_test_args
 | 
	
		
			
				|  |  | -  local test_case host grpc_gen_test_cmd grpc_server grpc_port
 | 
	
		
			
				|  |  | +  local test_case host grpc_gen_test_cmd grpc_server grpc_port grpc_client_platform
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    # set the project zone and check that all necessary args are provided
 | 
	
		
			
				|  |  |    _grpc_set_project_and_zone -f grpc_interop_test_args "$@" || return 1
 | 
	
	
		
			
				|  | @@ -966,7 +989,7 @@ grpc_cloud_prod_test() {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    local grpc_zone grpc_project dry_run  # set by _grpc_set_project_and_zone
 | 
	
		
			
				|  |  |    #  grpc_cloud_prod_test_args
 | 
	
		
			
				|  |  | -  local test_case host grpc_gen_test_cmd
 | 
	
		
			
				|  |  | +  local test_case host grpc_gen_test_cmd grpc_client_platform
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    # set the project zone and check that all necessary args are provided
 | 
	
		
			
				|  |  |    _grpc_set_project_and_zone -f grpc_cloud_prod_test_args "$@" || return 1
 | 
	
	
		
			
				|  | @@ -1431,6 +1454,18 @@ grpc_interop_gen_csharp_mono_cmd() {
 | 
	
		
			
				|  |  |    echo $the_cmd
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +# constructs the csharp-dotnet interop test cmd.
 | 
	
		
			
				|  |  | +#
 | 
	
		
			
				|  |  | +# call-seq:
 | 
	
		
			
				|  |  | +#   flags= .... # generic flags to include the command
 | 
	
		
			
				|  |  | +#   cmd=$($grpc_gen_test_cmd $flags)
 | 
	
		
			
				|  |  | +grpc_interop_gen_csharp_dotnet_cmd() {
 | 
	
		
			
				|  |  | +  local set_workdir="cd /cygdrive/c/github/grpc/src/csharp/Grpc.IntegrationTesting.Client/bin/Debug &&"
 | 
	
		
			
				|  |  | +  local test_script="./Grpc.IntegrationTesting.Client.exe --use_tls=true --use_test_ca=true";
 | 
	
		
			
				|  |  | +  local the_cmd="$set_workdir $test_script $@";
 | 
	
		
			
				|  |  | +  echo $the_cmd
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  # constructs the full dockerized csharp-mono gce=>prod interop test cmd.
 | 
	
		
			
				|  |  |  #
 | 
	
		
			
				|  |  |  # call-seq:
 | 
	
	
		
			
				|  | @@ -1446,6 +1481,20 @@ grpc_cloud_prod_gen_csharp_mono_cmd() {
 | 
	
		
			
				|  |  |    echo $the_cmd
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +# constructs the csharp-dotnet gce=>prod interop test cmd.
 | 
	
		
			
				|  |  | +#
 | 
	
		
			
				|  |  | +# call-seq:
 | 
	
		
			
				|  |  | +#   flags= .... # generic flags to include the command
 | 
	
		
			
				|  |  | +#   cmd=$($grpc_gen_test_cmd $flags)
 | 
	
		
			
				|  |  | +grpc_cloud_prod_gen_csharp_dotnet_cmd() {
 | 
	
		
			
				|  |  | +  local set_workdir="cd /cygdrive/c/github/grpc/src/csharp/Grpc.IntegrationTesting.Client/bin/Debug &&"
 | 
	
		
			
				|  |  | +  local test_script="./Grpc.IntegrationTesting.Client.exe --use_tls=true";
 | 
	
		
			
				|  |  | +  local set_certfile="SSL_CERT_FILE=/cacerts/roots.pem "
 | 
	
		
			
				|  |  | +  local gfe_flags=$(_grpc_prod_gfe_flags);
 | 
	
		
			
				|  |  | +  local the_cmd="$set_workdir $set_certfile $test_script $gfe_flags $@";
 | 
	
		
			
				|  |  | +  echo $the_cmd
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  # constructs the full dockerized csharp-mono service_account auth interop test cmd.
 | 
	
		
			
				|  |  |  #
 | 
	
		
			
				|  |  |  # call-seq:
 |