From 236dcd9fbe627e59bcdbe1ea604e972d68efa424 Mon Sep 17 00:00:00 2001
From: Kevin Pilch <kevinpi@microsoft.com>
Date: Fri, 20 Mar 2020 23:04:28 -0700
Subject: [PATCH] Revert "Add gRPC interop tests (#17040)" (#20047)

This reverts commit 8afb78fb9573dd6bc62bd2bed329b4c68a00c6a8.
---
 .azure/pipelines/ci.yml                       |   6 +-
 .azure/pipelines/quarantined-tests.yml        |   2 +-
 Directory.Build.targets                       |   2 -
 eng/Build.props                               |   7 -
 eng/Dependencies.props                        |   7 +-
 eng/Versions.props                            |   6 +-
 eng/helix/content/runtests.sh                 |   2 +-
 eng/targets/FunctionalTestAsset.targets       |   9 -
 eng/targets/FunctionalTestWithAssets.targets  |  27 -
 src/Grpc/Grpc.sln                             |  46 -
 src/Grpc/THIRD-PARTY-NOTICES                  |  26 -
 src/Grpc/build.cmd                            |   3 -
 src/Grpc/build.sh                             |   7 -
 src/Grpc/startvs.cmd                          |   3 -
 .../InteropTests/Helpers/ClientProcess.cs     |  62 --
 .../Helpers/InteropTestsFixture.cs            |  44 -
 .../InteropTests/Helpers/WebsiteProcess.cs    |  93 --
 src/Grpc/test/InteropTests/InteropTests.cs    |  80 --
 .../test/InteropTests/InteropTests.csproj     |  21 -
 .../test/testassets/InteropClient/Assert.cs   | 131 ---
 .../InteropClient/AsyncStreamExtensions.cs    |  86 --
 .../InteropClient/IChannelWrapper.cs          |  46 -
 .../testassets/InteropClient/InteropClient.cs | 899 ------------------
 .../InteropClient/InteropClient.csproj        |  24 -
 .../test/testassets/InteropClient/Program.cs  |  32 -
 .../testassets/InteropClient/RunTests.ps1     |  53 --
 .../InteropWebsite/AsyncStreamExtensions.cs   |  41 -
 .../InteropWebsite/Directory.Build.targets    |  24 -
 .../InteropWebsite/InteropWebsite.csproj      |  19 -
 .../test/testassets/InteropWebsite/Program.cs |  63 --
 .../test/testassets/InteropWebsite/Startup.cs |  49 -
 .../InteropWebsite/TestServiceImpl.cs         | 149 ---
 .../testassets/Proto/grpc/testing/empty.proto |  28 -
 .../Proto/grpc/testing/messages.proto         | 165 ----
 .../testassets/Proto/grpc/testing/test.proto  |  79 --
 src/Grpc/test/testassets/README.md            |   3 -
 .../test/Helpers/AspNetProcess.cs             |   1 -
 .../test/Helpers/ErrorMessages.cs             |   2 -
 .../test/Helpers}/ProcessEx.cs                |   6 +-
 src/ProjectTemplates/test/Helpers/Project.cs  |   1 -
 .../test/Helpers/TemplatePackageInstaller.cs  |   1 -
 .../SpaTemplateTest/SpaTemplateTestBase.cs    |   1 -
 42 files changed, 10 insertions(+), 2346 deletions(-)
 delete mode 100644 eng/targets/FunctionalTestAsset.targets
 delete mode 100644 eng/targets/FunctionalTestWithAssets.targets
 delete mode 100644 src/Grpc/Grpc.sln
 delete mode 100644 src/Grpc/THIRD-PARTY-NOTICES
 delete mode 100644 src/Grpc/build.cmd
 delete mode 100644 src/Grpc/build.sh
 delete mode 100644 src/Grpc/startvs.cmd
 delete mode 100644 src/Grpc/test/InteropTests/Helpers/ClientProcess.cs
 delete mode 100644 src/Grpc/test/InteropTests/Helpers/InteropTestsFixture.cs
 delete mode 100644 src/Grpc/test/InteropTests/Helpers/WebsiteProcess.cs
 delete mode 100644 src/Grpc/test/InteropTests/InteropTests.cs
 delete mode 100644 src/Grpc/test/InteropTests/InteropTests.csproj
 delete mode 100644 src/Grpc/test/testassets/InteropClient/Assert.cs
 delete mode 100644 src/Grpc/test/testassets/InteropClient/AsyncStreamExtensions.cs
 delete mode 100644 src/Grpc/test/testassets/InteropClient/IChannelWrapper.cs
 delete mode 100644 src/Grpc/test/testassets/InteropClient/InteropClient.cs
 delete mode 100644 src/Grpc/test/testassets/InteropClient/InteropClient.csproj
 delete mode 100644 src/Grpc/test/testassets/InteropClient/Program.cs
 delete mode 100644 src/Grpc/test/testassets/InteropClient/RunTests.ps1
 delete mode 100644 src/Grpc/test/testassets/InteropWebsite/AsyncStreamExtensions.cs
 delete mode 100644 src/Grpc/test/testassets/InteropWebsite/Directory.Build.targets
 delete mode 100644 src/Grpc/test/testassets/InteropWebsite/InteropWebsite.csproj
 delete mode 100644 src/Grpc/test/testassets/InteropWebsite/Program.cs
 delete mode 100644 src/Grpc/test/testassets/InteropWebsite/Startup.cs
 delete mode 100644 src/Grpc/test/testassets/InteropWebsite/TestServiceImpl.cs
 delete mode 100644 src/Grpc/test/testassets/Proto/grpc/testing/empty.proto
 delete mode 100644 src/Grpc/test/testassets/Proto/grpc/testing/messages.proto
 delete mode 100644 src/Grpc/test/testassets/Proto/grpc/testing/test.proto
 delete mode 100644 src/Grpc/test/testassets/README.md
 rename src/{Shared/Process => ProjectTemplates/test/Helpers}/ProcessEx.cs (99%)

diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml
index 6c4e6adbcde..9b491337a97 100644
--- a/.azure/pipelines/ci.yml
+++ b/.azure/pipelines/ci.yml
@@ -674,9 +674,9 @@ stages:
       # Build the shared framework
       - script: ./build.cmd -ci -all -pack -arch x64 -buildNative /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log /bl:artifacts/log/helix.build.x64.binlog
         displayName: Build shared fx
-      - script: .\restore.cmd -ci /p:BuildInteropProjects=true
+      - script: .\restore.cmd -ci
         displayName: Restore
-      - script: .\build.cmd -ci -NoRestore -test -projects eng\helix\helix.proj /p:IsRequiredCheck=true /p:IsHelixJob=true /p:BuildAllProjects=true /p:BuildInteropProjects=true /p:BuildNative=true /p:RunTemplateTests=true /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log -bl
+      - script: .\build.cmd -ci -NoRestore -test -projects eng\helix\helix.proj /p:IsRequiredCheck=true /p:IsHelixJob=true /p:BuildAllProjects=true /p:BuildNative=true /p:RunTemplateTests=true /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log -bl
         displayName: Run build.cmd helix target
         env:
           HelixApiAccessToken: $(HelixApiAccessToken) # Needed for internal queues
@@ -701,7 +701,7 @@ stages:
       # Build the x86 shared framework
       - script: .\restore.cmd -ci
         displayName: Restore
-      - script: .\build.cmd -ci -NoRestore -test -projects eng\helix\helix.proj /p:IsHelixJob=true /p:IsHelixDaily=true /p:BuildAllProjects=true /p:BuildInteropProjects=true /p:BuildNative=true /p:RunTemplateTests=true /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log -bl
+      - script: .\build.cmd -ci -NoRestore -test -projects eng\helix\helix.proj /p:IsHelixJob=true /p:IsHelixDaily=true /p:BuildAllProjects=true /p:BuildNative=true /p:RunTemplateTests=true /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log -bl
         displayName: Run build.cmd helix target
         env:
           HelixApiAccessToken: $(HelixApiAccessToken) # Needed for internal queues
diff --git a/.azure/pipelines/quarantined-tests.yml b/.azure/pipelines/quarantined-tests.yml
index 791283efd6f..415853ed8e1 100644
--- a/.azure/pipelines/quarantined-tests.yml
+++ b/.azure/pipelines/quarantined-tests.yml
@@ -35,7 +35,7 @@ jobs:
       displayName: Build shared fx
     - script: .\restore.cmd -ci
       displayName: Restore
-    - script: .\build.cmd -ci -NoRestore -test -noBuildJava -projects eng\helix\helix.proj /p:RunQuarantinedTests=true /p:IsRequiredCheck=true /p:IsHelixJob=true /p:BuildAllProjects=true /p:BuildInteropProjects=true /p:BuildNative=true /p:RunTemplateTests=true /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log -bl
+    - script: .\build.cmd -ci -NoRestore -test -noBuildJava -projects eng\helix\helix.proj /p:RunQuarantinedTests=true /p:IsRequiredCheck=true /p:IsHelixJob=true /p:BuildAllProjects=true /p:BuildNative=true /p:RunTemplateTests=true /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log -bl
       displayName: Run build.cmd helix target
       env:
         HelixApiAccessToken: $(HelixApiAccessToken) # Needed for internal queues
diff --git a/Directory.Build.targets b/Directory.Build.targets
index 9a30afbb8e0..a62e3ed6a48 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -167,7 +167,5 @@
   <Import Project="eng\targets\Npm.Common.targets"  Condition="'$(MSBuildProjectExtension)' == '.npmproj'" />
   <Import Project="eng\targets\ReferenceAssembly.targets" Condition=" $(HasReferenceAssembly) " />
   <Import Project="eng\targets\Helix.targets" Condition="'$(IsTestProject)' == 'true'" />
-  <Import Project="eng\targets\FunctionalTestAsset.targets" Condition="'$(IsTestAssetProject)' == 'true'" />
-  <Import Project="eng\targets\FunctionalTestWithAssets.targets" Condition="'$(ContainsFunctionalTestAssets)' == 'true'" />
 
 </Project>
diff --git a/eng/Build.props b/eng/Build.props
index 6f1b3f19089..4c0542db15d 100644
--- a/eng/Build.props
+++ b/eng/Build.props
@@ -123,13 +123,6 @@
         <ProjectToBuild Condition=" '$(BuildJava)' == 'true'" Include="@(JavaProjects)" Exclude="@(ProjectToExclude)" />
         <ProjectToExclude Condition=" '$(BuildJava)' != 'true'" Include="@(JavaProjects)" />
 
-        <!-- These interop test projects can only be restored and built after the shared framework is built -->
-        <InteropProjects Include="$(RepoRoot)src\Grpc\**\*.csproj"
-                      Exclude="@(ProjectToExclude)" />
-
-        <ProjectToBuild Condition=" '$(BuildInteropProjects)' == 'true'" Include="@(InteropProjects)" Exclude="@(ProjectToExclude)" />
-        <ProjectToExclude Condition=" '$(BuildInteropProjects)' != 'true'" Include="@(InteropProjects)" />
-
         <!--
           Use caution to avoid deep recursion. If the globbing pattern picks up something which exceeds MAX_PATH,
           the entire pattern will silently fail to evaluate correctly.
diff --git a/eng/Dependencies.props b/eng/Dependencies.props
index d02e5158ae1..37c0b6a4717 100644
--- a/eng/Dependencies.props
+++ b/eng/Dependencies.props
@@ -154,13 +154,8 @@ and are generated based on the last package release.
   <ItemGroup Label="External dependencies" Condition="'$(DotNetBuildFromSource)' != 'true'">
     <LatestPackageReference Include="AngleSharp" Version="$(AngleSharpPackageVersion)" />
     <LatestPackageReference Include="BenchmarkDotNet" Version="$(BenchmarkDotNetPackageVersion)" />
-    <LatestPackageReference Include="CommandLineParser" Version="$(CommandLineParserPackageVersion)" />
     <LatestPackageReference Include="FSharp.Core" Version="$(FSharpCorePackageVersion)" />
-    <LatestPackageReference Include="Google.Protobuf" Version="$(GoogleProtobufPackageVersion)" />
-    <LatestPackageReference Include="Grpc.AspNetCore" Version="$(GrpcAspNetCorePackageVersion)" />
-    <LatestPackageReference Include="Grpc.Auth" Version="$(GrpcAuthPackageVersion)" />
-    <LatestPackageReference Include="Grpc.Net.Client" Version="$(GrpcNetClientPackageVersion)" />
-    <LatestPackageReference Include="Grpc.Tools" Version="$(GrpcToolsPackageVersion)" />
+    <LatestPackageReference Include="Google.ProtoBuf" Version="$(GoogleProtoBufPackageVersion)" />
     <LatestPackageReference Include="IdentityServer4" Version="$(IdentityServer4PackageVersion)" />
     <LatestPackageReference Include="IdentityServer4.AspNetIdentity" Version="$(IdentityServer4AspNetIdentityPackageVersion)" />
     <LatestPackageReference Include="IdentityServer4.EntityFramework" Version="$(IdentityServer4EntityFrameworkPackageVersion)" />
diff --git a/eng/Versions.props b/eng/Versions.props
index 2baa023263c..39216eac618 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -217,13 +217,9 @@
     <AngleSharpPackageVersion>0.9.9</AngleSharpPackageVersion>
     <BenchmarkDotNetPackageVersion>0.12.0</BenchmarkDotNetPackageVersion>
     <CastleCorePackageVersion>4.2.1</CastleCorePackageVersion>
-    <CommandLineParserPackageVersion>2.3.0</CommandLineParserPackageVersion>
     <FSharpCorePackageVersion>4.2.1</FSharpCorePackageVersion>
-    <GoogleProtobufPackageVersion>3.10.0</GoogleProtobufPackageVersion>
+    <GoogleProtobufPackageVersion>3.8.0</GoogleProtobufPackageVersion>
     <GrpcAspNetCorePackageVersion>2.27.0</GrpcAspNetCorePackageVersion>
-    <GrpcAuthPackageVersion>2.27.0</GrpcAuthPackageVersion>
-    <GrpcNetClientPackageVersion>2.27.0</GrpcNetClientPackageVersion>
-    <GrpcToolsPackageVersion>2.27.0</GrpcToolsPackageVersion>
     <IdentityServer4AspNetIdentityPackageVersion>3.0.0</IdentityServer4AspNetIdentityPackageVersion>
     <IdentityServer4EntityFrameworkPackageVersion>3.0.0</IdentityServer4EntityFrameworkPackageVersion>
     <IdentityServer4PackageVersion>3.0.0</IdentityServer4PackageVersion>
diff --git a/eng/helix/content/runtests.sh b/eng/helix/content/runtests.sh
index 7788f800f9c..9ff0133e34f 100644
--- a/eng/helix/content/runtests.sh
+++ b/eng/helix/content/runtests.sh
@@ -41,7 +41,7 @@ echo "Creating nugetRestore directory: $NUGET_RESTORE"
 mkdir $NUGET_RESTORE
 mkdir logs
 
-ls -laR
+ls -la
 
 RESET="\033[0m"
 RED="\033[0;31m"
diff --git a/eng/targets/FunctionalTestAsset.targets b/eng/targets/FunctionalTestAsset.targets
deleted file mode 100644
index 04b35133412..00000000000
--- a/eng/targets/FunctionalTestAsset.targets
+++ /dev/null
@@ -1,9 +0,0 @@
-<Project>
-  <Target Name="CollectFunctionalTestPayload" DependsOnTargets="Publish" Returns="@(DependencyPayload)" >
-    <ItemGroup>
-      <DependencyPayload Include="@(ResolvedFileToPublish)">
-        <RelativePath>$(MSBuildProjectName)\%(ResolvedFileToPublish.RelativePath)</RelativePath>
-      </DependencyPayload>
-    </ItemGroup>
-  </Target>
-</Project>
\ No newline at end of file
diff --git a/eng/targets/FunctionalTestWithAssets.targets b/eng/targets/FunctionalTestWithAssets.targets
deleted file mode 100644
index b6194607cb4..00000000000
--- a/eng/targets/FunctionalTestWithAssets.targets
+++ /dev/null
@@ -1,27 +0,0 @@
-<Project>
-
-  <ItemGroup>
-    <ProjectReference Include="@(FunctionalTestAssetProjectReference)" ReferenceOutputAssembly="false" />
-  </ItemGroup>
-
-  <Target Name="CollectTestAssetPayload" BeforeTargets="GetCopyToOutputDirectoryItems" >
-    <MSBuild Targets="CollectFunctionalTestPayload"
-             BuildInParallel="true"
-             SkipNonexistentTargets="true"
-             Projects="%(FunctionalTestAssetProjectReference.Identity)"
-             RebaseOutputs="True">
-      <Output TaskParameter="TargetOutputs" ItemName="DependencyPayload" />
-    </MSBuild>
-
-    <ItemGroup>
-      <ContentWithTargetPath
-        Include="@(DependencyPayload)"
-        Condition="'@(DependencyPayload->Count())' != '0'">
-        <TargetPath>%(DependencyPayload.RelativePath)</TargetPath>
-        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-        <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
-      </ContentWithTargetPath>
-    </ItemGroup>
-  </Target>
-
-</Project>
\ No newline at end of file
diff --git a/src/Grpc/Grpc.sln b/src/Grpc/Grpc.sln
deleted file mode 100644
index d1491ed3e35..00000000000
--- a/src/Grpc/Grpc.sln
+++ /dev/null
@@ -1,46 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.29505.145
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{0FFB3605-0203-450F-80C8-F82CA2E8269F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "testassets", "testassets", "{F5841B0A-901A-448F-9CC5-4CB393CE86AF}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InteropTests", "test\InteropTests\InteropTests.csproj", "{90BF37E6-B3F1-4EFC-A233-8288D8B32DD2}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InteropWebsite", "test\testassets\InteropWebsite\InteropWebsite.csproj", "{3AB7E8E4-BA36-44CE-844E-39DB66E46D45}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InteropClient", "test\testassets\InteropClient\InteropClient.csproj", "{66E6C55E-E4E3-4F4B-834A-BB34BFE00D2F}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Any CPU = Debug|Any CPU
-		Release|Any CPU = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{90BF37E6-B3F1-4EFC-A233-8288D8B32DD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{90BF37E6-B3F1-4EFC-A233-8288D8B32DD2}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{90BF37E6-B3F1-4EFC-A233-8288D8B32DD2}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{90BF37E6-B3F1-4EFC-A233-8288D8B32DD2}.Release|Any CPU.Build.0 = Release|Any CPU
-		{3AB7E8E4-BA36-44CE-844E-39DB66E46D45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{3AB7E8E4-BA36-44CE-844E-39DB66E46D45}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{3AB7E8E4-BA36-44CE-844E-39DB66E46D45}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{3AB7E8E4-BA36-44CE-844E-39DB66E46D45}.Release|Any CPU.Build.0 = Release|Any CPU
-		{66E6C55E-E4E3-4F4B-834A-BB34BFE00D2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{66E6C55E-E4E3-4F4B-834A-BB34BFE00D2F}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{66E6C55E-E4E3-4F4B-834A-BB34BFE00D2F}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{66E6C55E-E4E3-4F4B-834A-BB34BFE00D2F}.Release|Any CPU.Build.0 = Release|Any CPU
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-	GlobalSection(NestedProjects) = preSolution
-		{90BF37E6-B3F1-4EFC-A233-8288D8B32DD2} = {0FFB3605-0203-450F-80C8-F82CA2E8269F}
-		{3AB7E8E4-BA36-44CE-844E-39DB66E46D45} = {F5841B0A-901A-448F-9CC5-4CB393CE86AF}
-		{66E6C55E-E4E3-4F4B-834A-BB34BFE00D2F} = {F5841B0A-901A-448F-9CC5-4CB393CE86AF}
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-		SolutionGuid = {3CAE66FD-9A59-49C2-B133-1D599225259A}
-	EndGlobalSection
-EndGlobal
diff --git a/src/Grpc/THIRD-PARTY-NOTICES b/src/Grpc/THIRD-PARTY-NOTICES
deleted file mode 100644
index 6b4a863467d..00000000000
--- a/src/Grpc/THIRD-PARTY-NOTICES
+++ /dev/null
@@ -1,26 +0,0 @@
-.NET Core uses third-party libraries or other resources that may be
-distributed under licenses different than the .NET Core software.
-
-In the event that we accidentally failed to list a required notice, please
-bring it to our attention. Post an issue or email us:
-
-           dotnet@microsoft.com
-
-The attached notices are provided for information only.
-
-License notice for gRPC interop tests
--------------------------------------
-
-Copyright 2019 The gRPC Authors
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
diff --git a/src/Grpc/build.cmd b/src/Grpc/build.cmd
deleted file mode 100644
index 2406296662e..00000000000
--- a/src/Grpc/build.cmd
+++ /dev/null
@@ -1,3 +0,0 @@
-@ECHO OFF
-SET RepoRoot=%~dp0..\..
-%RepoRoot%\build.cmd -projects %~dp0**\*.*proj %*
diff --git a/src/Grpc/build.sh b/src/Grpc/build.sh
deleted file mode 100644
index 7046bb98a0f..00000000000
--- a/src/Grpc/build.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env bash
-
-set -euo pipefail
-
-DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
-repo_root="$DIR/../.."
-"$repo_root/build.sh" --projects "$DIR/**/*.*proj" "$@"
diff --git a/src/Grpc/startvs.cmd b/src/Grpc/startvs.cmd
deleted file mode 100644
index a4a22788e6f..00000000000
--- a/src/Grpc/startvs.cmd
+++ /dev/null
@@ -1,3 +0,0 @@
-@ECHO OFF
-
-%~dp0..\..\startvs.cmd %~dp0Grpc.sln
diff --git a/src/Grpc/test/InteropTests/Helpers/ClientProcess.cs b/src/Grpc/test/InteropTests/Helpers/ClientProcess.cs
deleted file mode 100644
index 449342b28de..00000000000
--- a/src/Grpc/test/InteropTests/Helpers/ClientProcess.cs
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Diagnostics;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Internal;
-using Xunit.Abstractions;
-
-namespace InteropTests.Helpers
-{
-    public class ClientProcess : IDisposable
-    {
-        private readonly Process _process;
-        private readonly ProcessEx _processEx;
-        private readonly TaskCompletionSource<object> _startTcs;
-
-        public ClientProcess(ITestOutputHelper output, string path, string serverPort, string testCase)
-        {
-            _process = new Process();
-            _process.StartInfo = new ProcessStartInfo
-            {
-                RedirectStandardOutput = true,
-                RedirectStandardError = true,
-                FileName = "dotnet",
-                Arguments = @$"{path} --use_tls false --server_port {serverPort} --client_type httpclient --test_case {testCase}"
-            };
-            _process.EnableRaisingEvents = true;
-            _process.OutputDataReceived += Process_OutputDataReceived;
-            _process.Start();
-
-            _processEx = new ProcessEx(output, _process);
-
-            _startTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
-        }
-
-        public Task WaitForReady()
-        {
-            return _startTcs.Task;
-        }
-
-        public int ExitCode => _process.ExitCode;
-        public Task Exited => _processEx.Exited;
-
-        private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
-        {
-            var data = e.Data;
-            if (data != null)
-            {
-                if (data.Contains("Application started."))
-                {
-                    _startTcs.TrySetResult(null);
-                }
-            }
-        }
-
-        public void Dispose()
-        {
-            _processEx.Dispose();
-        }
-    }
-}
diff --git a/src/Grpc/test/InteropTests/Helpers/InteropTestsFixture.cs b/src/Grpc/test/InteropTests/Helpers/InteropTestsFixture.cs
deleted file mode 100644
index 86ffff4a079..00000000000
--- a/src/Grpc/test/InteropTests/Helpers/InteropTestsFixture.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Threading.Tasks;
-using Xunit.Abstractions;
-
-namespace InteropTests.Helpers
-{
-    public class InteropTestsFixture : IDisposable
-    {
-        private WebsiteProcess _process;
-
-        public string Path { get; set; }
-
-
-        public string ServerPort { get; private set; }
-
-
-        public async Task EnsureStarted(ITestOutputHelper output)
-        {
-            if (_process != null)
-            {
-                return;
-            }
-
-            if (string.IsNullOrEmpty(Path))
-            {
-                throw new InvalidOperationException("Path has not been set.");
-            }
-
-            _process = new WebsiteProcess(Path, output);
-
-            await _process.WaitForReady();
-
-            ServerPort = _process.ServerPort;
-        }
-
-        public void Dispose()
-        {
-            _process.Dispose();
-        }
-    }
-}
diff --git a/src/Grpc/test/InteropTests/Helpers/WebsiteProcess.cs b/src/Grpc/test/InteropTests/Helpers/WebsiteProcess.cs
deleted file mode 100644
index 77ac62242df..00000000000
--- a/src/Grpc/test/InteropTests/Helpers/WebsiteProcess.cs
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Text;
-using System.Text.RegularExpressions;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Internal;
-using Xunit.Abstractions;
-
-namespace InteropTests.Helpers
-{
-    public class WebsiteProcess : IDisposable
-    {
-        private readonly Process _process;
-        private readonly ProcessEx _processEx;
-        private readonly TaskCompletionSource<object> _startTcs;
-        private readonly StringBuilder _consoleOut = new StringBuilder();
-        private static readonly Regex NowListeningRegex = new Regex(@"^\s*Now listening on: .*:(?<port>\d*)$");
-
-        public string ServerPort { get; private set; }
-
-        public WebsiteProcess(string path, ITestOutputHelper output)
-        {
-            _process = new Process();
-            _process.StartInfo = new ProcessStartInfo
-            {
-                RedirectStandardOutput = true,
-                RedirectStandardError = true,
-                FileName = "dotnet",
-                Arguments = path
-            };
-            _process.EnableRaisingEvents = true;
-            _process.OutputDataReceived += Process_OutputDataReceived;
-            _process.Start();
-
-            _processEx = new ProcessEx(output, _process);
-
-            _startTcs = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously);
-        }
-
-        public Task WaitForReady()
-        {
-            if (_processEx.HasExited)
-            {
-                return Task.FromException(new InvalidOperationException("Server is not running."));
-            }
-
-            return _startTcs.Task;
-        }
-
-        private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
-        {
-            var data = e.Data;
-            if (data != null)
-            {
-                _consoleOut.AppendLine(data);
-                var m = NowListeningRegex.Match(data);
-                if (m.Success)
-                {
-                    ServerPort = m.Groups["port"].Value;
-                }
-
-                if (data.Contains("Application started. Press Ctrl+C to shut down."))
-                {
-                    _startTcs.TrySetResult(null);
-                }
-            }
-        }
-
-        public void Dispose()
-        {
-            var attributes = Assembly.GetExecutingAssembly()
-                .GetCustomAttributes<AssemblyMetadataAttribute>();
-            var serverLogPath = attributes.SingleOrDefault(a => a.Key == "ServerLogPath")?.Value;
-            if (!string.IsNullOrEmpty(serverLogPath))
-            {
-                File.WriteAllText(serverLogPath, _consoleOut.ToString());
-            }
-            else
-            {
-                var logDir = Path.Combine(Directory.GetCurrentDirectory(), "artifacts", "logs");
-                Directory.CreateDirectory(logDir);
-                File.WriteAllText(Path.Combine(logDir, "InteropServer.log"), _consoleOut.ToString());
-            }
-            _processEx.Dispose();
-        }
-    }
-}
diff --git a/src/Grpc/test/InteropTests/InteropTests.cs b/src/Grpc/test/InteropTests/InteropTests.cs
deleted file mode 100644
index b12ec316dc6..00000000000
--- a/src/Grpc/test/InteropTests/InteropTests.cs
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Reflection;
-using System.Threading.Tasks;
-using InteropTests.Helpers;
-using Microsoft.AspNetCore.Testing;
-using Xunit;
-using Xunit.Abstractions;
-
-namespace InteropTests
-{
-    public class InteropTests : IClassFixture<InteropTestsFixture>
-    {
-        private static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(30);
-
-        private readonly string _clientPath = Path.Combine(Directory.GetCurrentDirectory(), "InteropClient", "InteropClient.dll");
-        private readonly InteropTestsFixture _fixture;
-        private readonly ITestOutputHelper _output;
-
-        public InteropTests(InteropTestsFixture fixture, ITestOutputHelper output)
-        {
-            var attributes = Assembly.GetExecutingAssembly()
-                .GetCustomAttributes<AssemblyMetadataAttribute>();
-
-            fixture.Path = Path.Combine(Directory.GetCurrentDirectory(), "InteropWebsite", "InteropWebsite.dll");
-
-            _fixture = fixture;
-            _output = output;
-        }
-
-        [Theory]
-        [MemberData(nameof(TestCaseData))]
-        public async Task InteropTestCase(string name)
-        {
-            await _fixture.EnsureStarted(_output).TimeoutAfter(DefaultTimeout);
-
-            using (var clientProcess = new ClientProcess(_output, _clientPath, _fixture.ServerPort, name))
-            {
-                await clientProcess.WaitForReady().TimeoutAfter(DefaultTimeout);
-
-                await clientProcess.Exited.TimeoutAfter(DefaultTimeout);
-
-                Assert.Equal(0, clientProcess.ExitCode);
-            }
-        }
-
-        #region TestData
-        // All interop test cases, minus GCE authentication specific tests
-        private static string[] AllTests = new string[]
-        {
-            "empty_unary",
-            "large_unary",
-            "client_streaming",
-            "server_streaming",
-            "ping_pong",
-            "empty_stream",
-
-            "cancel_after_begin",
-            "cancel_after_first_response",
-            "timeout_on_sleeping_server",
-            "custom_metadata",
-            "status_code_and_message",
-            "special_status_message",
-            "unimplemented_service",
-            "unimplemented_method",
-            "client_compressed_unary",
-            "client_compressed_streaming",
-            "server_compressed_unary",
-            "server_compressed_streaming"
-        };
-
-        public static IEnumerable<object[]> TestCaseData => AllTests.Select(t => new object[] { t });
-        #endregion
-    }
-}
diff --git a/src/Grpc/test/InteropTests/InteropTests.csproj b/src/Grpc/test/InteropTests/InteropTests.csproj
deleted file mode 100644
index bcbd1fc4b6a..00000000000
--- a/src/Grpc/test/InteropTests/InteropTests.csproj
+++ /dev/null
@@ -1,21 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <ContainsFunctionalTestAssets>true</ContainsFunctionalTestAssets>
-    <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <Compile Include="..\..\..\Shared\Process\ProcessEx.cs" Link="Helpers\ProcessEx.cs" />
-    <Compile Include="..\..\..\Shared\Process\ProcessExtensions.cs" Link="Helpers\ProcessExtensions.cs" />
-
-    <AssemblyAttribute Include="System.Reflection.AssemblyMetadataAttribute" Condition="'$(IsHelixJob)' != 'true'">
-      <_Parameter1>ServerLogPath</_Parameter1>
-      <_Parameter2>$(ArtifactsLogDir)InteropServer.log</_Parameter2>
-    </AssemblyAttribute>
-
-    <FunctionalTestAssetProjectReference Include="..\testassets\InteropClient\InteropClient.csproj" />
-    <FunctionalTestAssetProjectReference Include="..\testassets\InteropWebsite\InteropWebsite.csproj" />
-  </ItemGroup>
-
-</Project>
diff --git a/src/Grpc/test/testassets/InteropClient/Assert.cs b/src/Grpc/test/testassets/InteropClient/Assert.cs
deleted file mode 100644
index 8ae666f4116..00000000000
--- a/src/Grpc/test/testassets/InteropClient/Assert.cs
+++ /dev/null
@@ -1,131 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2015-2016 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using System;
-using System.Collections;
-using System.Threading.Tasks;
-
-namespace InteropTestsClient
-{
-    internal static class Assert
-    {
-        public static void IsTrue(bool condition)
-        {
-            if (!condition)
-            {
-                throw new InvalidOperationException("Expected true but got false.");
-            }
-        }
-
-        public static void IsFalse(bool condition)
-        {
-            if (condition)
-            {
-                throw new InvalidOperationException("Expected false but got true.");
-            }
-        }
-
-        public static void AreEqual(object expected, object actual)
-        {
-            if (!Equals(expected, actual))
-            {
-                throw new InvalidOperationException($"Expected {expected} but got {actual}.");
-            }
-        }
-
-        public static void IsNotNull(object value)
-        {
-            if (value == null)
-            {
-                throw new InvalidOperationException("Expected not null but got null.");
-            }
-        }
-
-        public static void Fail()
-        {
-            throw new InvalidOperationException("Failure assert.");
-        }
-
-        public static async Task<TException> ThrowsAsync<TException>(Func<Task> action) where TException : Exception
-        {
-            try
-            {
-                await action();
-            }
-            catch (Exception ex)
-            {
-                if (ex.GetType() == typeof(TException))
-                {
-                    return (TException)ex;
-                }
-
-                throw new InvalidOperationException($"Expected ${typeof(TException)} but got ${ex.GetType()}.");
-            }
-
-            throw new InvalidOperationException("No exception thrown.");
-        }
-
-        public static TException Throws<TException>(Action action) where TException : Exception
-        {
-            try
-            {
-                action();
-            }
-            catch (Exception ex)
-            {
-                if (ex.GetType() == typeof(TException))
-                {
-                    return (TException)ex;
-                }
-
-                throw new InvalidOperationException($"Expected ${typeof(TException)} but got ${ex.GetType()}.");
-            }
-
-            throw new InvalidOperationException("No exception thrown.");
-        }
-
-        public static void Contains(object expected, ICollection actual)
-        {
-            foreach (var item in actual)
-            {
-                if (Equals(item, expected))
-                {
-                    return;
-                }
-            }
-
-            throw new InvalidOperationException($"Could not find {expected} in the collection.");
-        }
-    }
-
-    internal static class CollectionAssert
-    {
-        public static void AreEqual(IList expected, IList actual)
-        {
-            if (expected.Count != actual.Count)
-            {
-                throw new InvalidOperationException($"Collection lengths differ. {expected.Count} but got {actual.Count}.");
-            }
-
-            for (var i = 0; i < expected.Count; i++)
-            {
-                Assert.AreEqual(expected[i]!, actual[i]!);
-            }
-        }
-    }
-}
diff --git a/src/Grpc/test/testassets/InteropClient/AsyncStreamExtensions.cs b/src/Grpc/test/testassets/InteropClient/AsyncStreamExtensions.cs
deleted file mode 100644
index 00c1876fd13..00000000000
--- a/src/Grpc/test/testassets/InteropClient/AsyncStreamExtensions.cs
+++ /dev/null
@@ -1,86 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2015 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Grpc.Core;
-
-namespace InteropTestsClient
-{
-    /// <summary>
-    /// Extension methods that simplify work with gRPC streaming calls.
-    /// </summary>
-    public static class AsyncStreamExtensions
-    {
-        /// <summary>
-        /// Reads the entire stream and executes an async action for each element.
-        /// </summary>
-        public static async Task ForEachAsync<T>(this IAsyncStreamReader<T> streamReader, Func<T, Task> asyncAction)
-            where T : class
-        {
-            while (await streamReader.MoveNext().ConfigureAwait(false))
-            {
-                await asyncAction(streamReader.Current).ConfigureAwait(false);
-            }
-        }
-
-        /// <summary>
-        /// Reads the entire stream and creates a list containing all the elements read.
-        /// </summary>
-        public static async Task<List<T>> ToListAsync<T>(this IAsyncStreamReader<T> streamReader)
-            where T : class
-        {
-            var result = new List<T>();
-            while (await streamReader.MoveNext().ConfigureAwait(false))
-            {
-                result.Add(streamReader.Current);
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// Writes all elements from given enumerable to the stream.
-        /// Completes the stream afterwards unless close = false.
-        /// </summary>
-        public static async Task WriteAllAsync<T>(this IClientStreamWriter<T> streamWriter, IEnumerable<T> elements, bool complete = true)
-            where T : class
-        {
-            foreach (var element in elements)
-            {
-                await streamWriter.WriteAsync(element).ConfigureAwait(false);
-            }
-            if (complete)
-            {
-                await streamWriter.CompleteAsync().ConfigureAwait(false);
-            }
-        }
-
-        /// <summary>
-        /// Writes all elements from given enumerable to the stream.
-        /// </summary>
-        public static async Task WriteAllAsync<T>(this IServerStreamWriter<T> streamWriter, IEnumerable<T> elements)
-            where T : class
-        {
-            foreach (var element in elements)
-            {
-                await streamWriter.WriteAsync(element).ConfigureAwait(false);
-            }
-        }
-    }
-}
diff --git a/src/Grpc/test/testassets/InteropClient/IChannelWrapper.cs b/src/Grpc/test/testassets/InteropClient/IChannelWrapper.cs
deleted file mode 100644
index 4cbc82532b5..00000000000
--- a/src/Grpc/test/testassets/InteropClient/IChannelWrapper.cs
+++ /dev/null
@@ -1,46 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2019 The gRPC Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using System.Net.Http;
-using System.Threading.Tasks;
-using Grpc.Core;
-using Grpc.Net.Client;
-
-namespace InteropTestsClient
-{
-    public interface IChannelWrapper
-    {
-        ChannelBase Channel { get; }
-        Task ShutdownAsync();
-    }
-
-    public class GrpcChannelWrapper : IChannelWrapper
-    {
-        public ChannelBase Channel { get; }
-
-        public GrpcChannelWrapper(GrpcChannel channel)
-        {
-            Channel = channel;
-        }
-
-        public Task ShutdownAsync()
-        {
-            return Task.CompletedTask;
-        }
-    }
-}
diff --git a/src/Grpc/test/testassets/InteropClient/InteropClient.cs b/src/Grpc/test/testassets/InteropClient/InteropClient.cs
deleted file mode 100644
index 27d51f69985..00000000000
--- a/src/Grpc/test/testassets/InteropClient/InteropClient.cs
+++ /dev/null
@@ -1,899 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2015-2016 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Net.Http;
-using System.Security.Cryptography.X509Certificates;
-using System.Threading;
-using System.Threading.Tasks;
-using CommandLine;
-using Google.Apis.Auth.OAuth2;
-using Google.Protobuf;
-using Grpc.Auth;
-using Grpc.Core;
-using Grpc.Core.Utils;
-using Grpc.Net.Client;
-using Grpc.Testing;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
-using Newtonsoft.Json.Linq;
-
-namespace InteropTestsClient
-{
-    public class InteropClient : IDisposable
-    {
-        internal const string CompressionRequestAlgorithmMetadataKey = "grpc-internal-encoding-request";
-
-        private class ClientOptions
-        {
-            [Option("client_type", Default = "httpclient")]
-            public string? ClientType { get; set; }
-
-            [Option("server_host", Default = "localhost")]
-            public string? ServerHost { get; set; }
-
-            [Option("server_host_override")]
-            public string? ServerHostOverride { get; set; }
-
-            [Option("server_port"
-#if DEBUG
-                , Default = 50052
-#endif
-                )]
-            public int ServerPort { get; set; }
-
-            [Option("test_case"
-#if DEBUG
-                , Default = "large_unary"
-#endif
-                )]
-            public string? TestCase { get; set; }
-
-            // Deliberately using nullable bool type to allow --use_tls=true syntax (as opposed to --use_tls)
-            [Option("use_tls", Default = false)]
-            public bool? UseTls { get; set; }
-
-            // Deliberately using nullable bool type to allow --use_test_ca=true syntax (as opposed to --use_test_ca)
-            [Option("use_test_ca", Default = false)]
-            public bool? UseTestCa { get; set; }
-
-            [Option("default_service_account", Required = false)]
-            public string? DefaultServiceAccount { get; set; }
-
-            [Option("oauth_scope", Required = false)]
-            public string? OAuthScope { get; set; }
-
-            [Option("service_account_key_file", Required = false)]
-            public string? ServiceAccountKeyFile { get; set; }
-        }
-
-        private ServiceProvider serviceProvider;
-        private ILoggerFactory loggerFactory;
-        private ClientOptions options;
-
-        private InteropClient(ClientOptions options)
-        {
-            this.options = options;
-
-            var services = new ServiceCollection();
-            services.AddLogging(configure =>
-            {
-                configure.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
-                configure.AddConsole(loggerOptions => loggerOptions.IncludeScopes = true);
-            });
-
-            serviceProvider = services.BuildServiceProvider();
-
-            loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
-        }
-
-        public void Dispose()
-        {
-            serviceProvider.Dispose();
-        }
-
-        public static void Run(string[] args)
-        {
-            var parserResult = Parser.Default.ParseArguments<ClientOptions>(args)
-                .WithNotParsed(errors => Environment.Exit(1))
-                .WithParsed(options =>
-                {
-                    Console.WriteLine("Use TLS: " + options.UseTls);
-                    Console.WriteLine("Use Test CA: " + options.UseTestCa);
-                    Console.WriteLine("Client type: " + options.ClientType);
-                    Console.WriteLine("Server host: " + options.ServerHost);
-                    Console.WriteLine("Server port: " + options.ServerPort);
-
-                    using (var interopClient = new InteropClient(options))
-                    {
-                        interopClient.Run().GetAwaiter().GetResult();
-                    }
-                });
-        }
-
-        private async Task Run()
-        {
-            var channel = await HttpClientCreateChannel();
-            await RunTestCaseAsync(channel, options);
-            await channel.ShutdownAsync();
-        }
-
-        private async Task<IChannelWrapper> HttpClientCreateChannel()
-        {
-            var credentials = await CreateCredentialsAsync(useTestCaOverride: false);
-
-            string scheme;
-            if (!(options.UseTls ?? false))
-            {
-                AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
-                scheme = "http";
-            }
-            else
-            {
-                scheme = "https";
-            }
-
-            var httpClientHandler = new HttpClientHandler();
-            httpClientHandler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
-
-            if (options.UseTestCa ?? false)
-            {
-                var pem = File.ReadAllText("Certs/ca.pem");
-                var certData = GetBytesFromPem(pem, "CERTIFICATE");
-                var cert = new X509Certificate2(certData!);
-
-                httpClientHandler.ClientCertificates.Add(cert);
-            }
-
-            var httpClient = new HttpClient(httpClientHandler);
-
-            var channel = GrpcChannel.ForAddress($"{scheme}://{options.ServerHost}:{options.ServerPort}", new GrpcChannelOptions
-            {
-                Credentials = credentials,
-                HttpClient = httpClient,
-                LoggerFactory = loggerFactory
-            });
-
-            return new GrpcChannelWrapper(channel);
-        }
-
-        private bool IsHttpClient() => string.Equals(options.ClientType, "httpclient", StringComparison.OrdinalIgnoreCase);
-
-        private async Task<ChannelCredentials> CreateCredentialsAsync(bool? useTestCaOverride = null)
-        {
-            var credentials = ChannelCredentials.Insecure;
-            if (options.UseTls.GetValueOrDefault())
-            {
-                credentials = new SslCredentials();
-            }
-
-            if (options.TestCase == "jwt_token_creds")
-            {
-                var googleCredential = await GoogleCredential.GetApplicationDefaultAsync();
-                Assert.IsTrue(googleCredential.IsCreateScopedRequired);
-                credentials = ChannelCredentials.Create(credentials, googleCredential.ToCallCredentials());
-            }
-
-            if (options.TestCase == "compute_engine_creds")
-            {
-                var googleCredential = await GoogleCredential.GetApplicationDefaultAsync();
-                Assert.IsFalse(googleCredential.IsCreateScopedRequired);
-                credentials = ChannelCredentials.Create(credentials, googleCredential.ToCallCredentials());
-            }
-            return credentials;
-        }
-
-        private TClient CreateClient<TClient>(IChannelWrapper channel) where TClient : ClientBase
-        {
-            return (TClient)Activator.CreateInstance(typeof(TClient), channel.Channel)!;
-        }
-
-        private async Task RunTestCaseAsync(IChannelWrapper channel, ClientOptions options)
-        {
-            var client = CreateClient<TestService.TestServiceClient>(channel);
-            switch (options.TestCase)
-            {
-                case "empty_unary":
-                    RunEmptyUnary(client);
-                    break;
-                case "large_unary":
-                    RunLargeUnary(client);
-                    break;
-                case "client_streaming":
-                    await RunClientStreamingAsync(client);
-                    break;
-                case "server_streaming":
-                    await RunServerStreamingAsync(client);
-                    break;
-                case "ping_pong":
-                    await RunPingPongAsync(client);
-                    break;
-                case "empty_stream":
-                    await RunEmptyStreamAsync(client);
-                    break;
-                case "compute_engine_creds":
-                    RunComputeEngineCreds(client, options.DefaultServiceAccount!, options.OAuthScope!);
-                    break;
-                case "jwt_token_creds":
-                    RunJwtTokenCreds(client);
-                    break;
-                case "oauth2_auth_token":
-                    await RunOAuth2AuthTokenAsync(client, options.OAuthScope!);
-                    break;
-                case "per_rpc_creds":
-                    await RunPerRpcCredsAsync(client, options.OAuthScope!);
-                    break;
-                case "cancel_after_begin":
-                    await RunCancelAfterBeginAsync(client);
-                    break;
-                case "cancel_after_first_response":
-                    await RunCancelAfterFirstResponseAsync(client);
-                    break;
-                case "timeout_on_sleeping_server":
-                    await RunTimeoutOnSleepingServerAsync(client);
-                    break;
-                case "custom_metadata":
-                    await RunCustomMetadataAsync(client);
-                    break;
-                case "status_code_and_message":
-                    await RunStatusCodeAndMessageAsync(client);
-                    break;
-                case "unimplemented_service":
-                    RunUnimplementedService(CreateClient<UnimplementedService.UnimplementedServiceClient>(channel));
-                    break;
-                case "special_status_message":
-                    await RunSpecialStatusMessageAsync(client);
-                    break;
-                case "unimplemented_method":
-                    RunUnimplementedMethod(client);
-                    break;
-                case "client_compressed_unary":
-                    RunClientCompressedUnary(client);
-                    break;
-                case "client_compressed_streaming":
-                    await RunClientCompressedStreamingAsync(client);
-                    break;
-                case "server_compressed_unary":
-                    await RunServerCompressedUnary(client);
-                    break;
-                case "server_compressed_streaming":
-                    await RunServerCompressedStreamingAsync(client);
-                    break;
-                default:
-                    throw new ArgumentException("Unknown test case " + options.TestCase);
-            }
-        }
-
-        public static void RunEmptyUnary(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running empty_unary");
-            var response = client.EmptyCall(new Empty());
-            Assert.IsNotNull(response);
-            Console.WriteLine("Passed!");
-        }
-
-        public static void RunLargeUnary(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running large_unary");
-            var request = new SimpleRequest
-            {
-                ResponseSize = 314159,
-                Payload = CreateZerosPayload(271828)
-            };
-            var response = client.UnaryCall(request);
-
-            Assert.AreEqual(314159, response.Payload.Body.Length);
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunClientStreamingAsync(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running client_streaming");
-
-            var bodySizes = new List<int> { 27182, 8, 1828, 45904 }.Select((size) => new StreamingInputCallRequest { Payload = CreateZerosPayload(size) });
-
-            using (var call = client.StreamingInputCall())
-            {
-                await call.RequestStream.WriteAllAsync(bodySizes);
-
-                var response = await call.ResponseAsync;
-                Assert.AreEqual(74922, response.AggregatedPayloadSize);
-            }
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunServerStreamingAsync(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running server_streaming");
-
-            var bodySizes = new List<int> { 31415, 9, 2653, 58979 };
-
-            var request = new StreamingOutputCallRequest
-            {
-                ResponseParameters = { bodySizes.Select((size) => new ResponseParameters { Size = size }) }
-            };
-
-            using (var call = client.StreamingOutputCall(request))
-            {
-                var responseList = await call.ResponseStream.ToListAsync();
-                CollectionAssert.AreEqual(bodySizes, responseList.Select((item) => item.Payload.Body.Length).ToList());
-            }
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunPingPongAsync(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running ping_pong");
-
-            using (var call = client.FullDuplexCall())
-            {
-                await call.RequestStream.WriteAsync(new StreamingOutputCallRequest
-                {
-                    ResponseParameters = { new ResponseParameters { Size = 31415 } },
-                    Payload = CreateZerosPayload(27182)
-                });
-
-                Assert.IsTrue(await call.ResponseStream.MoveNext());
-                Assert.AreEqual(31415, call.ResponseStream.Current.Payload.Body.Length);
-
-                await call.RequestStream.WriteAsync(new StreamingOutputCallRequest
-                {
-                    ResponseParameters = { new ResponseParameters { Size = 9 } },
-                    Payload = CreateZerosPayload(8)
-                });
-
-                Assert.IsTrue(await call.ResponseStream.MoveNext());
-                Assert.AreEqual(9, call.ResponseStream.Current.Payload.Body.Length);
-
-                await call.RequestStream.WriteAsync(new StreamingOutputCallRequest
-                {
-                    ResponseParameters = { new ResponseParameters { Size = 2653 } },
-                    Payload = CreateZerosPayload(1828)
-                });
-
-                Assert.IsTrue(await call.ResponseStream.MoveNext());
-                Assert.AreEqual(2653, call.ResponseStream.Current.Payload.Body.Length);
-
-                await call.RequestStream.WriteAsync(new StreamingOutputCallRequest
-                {
-                    ResponseParameters = { new ResponseParameters { Size = 58979 } },
-                    Payload = CreateZerosPayload(45904)
-                });
-
-                Assert.IsTrue(await call.ResponseStream.MoveNext());
-                Assert.AreEqual(58979, call.ResponseStream.Current.Payload.Body.Length);
-
-                await call.RequestStream.CompleteAsync();
-
-                Assert.IsFalse(await call.ResponseStream.MoveNext());
-            }
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunEmptyStreamAsync(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running empty_stream");
-            using (var call = client.FullDuplexCall())
-            {
-                await call.RequestStream.CompleteAsync();
-
-                var responseList = await call.ResponseStream.ToListAsync();
-                Assert.AreEqual(0, responseList.Count);
-            }
-            Console.WriteLine("Passed!");
-        }
-
-        public static void RunComputeEngineCreds(TestService.TestServiceClient client, string defaultServiceAccount, string oauthScope)
-        {
-            Console.WriteLine("running compute_engine_creds");
-
-            var request = new SimpleRequest
-            {
-                ResponseSize = 314159,
-                Payload = CreateZerosPayload(271828),
-                FillUsername = true,
-                FillOauthScope = true
-            };
-
-            // not setting credentials here because they were set on channel already
-            var response = client.UnaryCall(request);
-
-            Assert.AreEqual(314159, response.Payload.Body.Length);
-            Assert.IsFalse(string.IsNullOrEmpty(response.OauthScope));
-            Assert.IsTrue(oauthScope.Contains(response.OauthScope));
-            Assert.AreEqual(defaultServiceAccount, response.Username);
-            Console.WriteLine("Passed!");
-        }
-
-        public static void RunJwtTokenCreds(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running jwt_token_creds");
-
-            var request = new SimpleRequest
-            {
-                ResponseSize = 314159,
-                Payload = CreateZerosPayload(271828),
-                FillUsername = true,
-            };
-
-            // not setting credentials here because they were set on channel already
-            var response = client.UnaryCall(request);
-
-            Assert.AreEqual(314159, response.Payload.Body.Length);
-            Assert.AreEqual(GetEmailFromServiceAccountFile(), response.Username);
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunOAuth2AuthTokenAsync(TestService.TestServiceClient client, string oauthScope)
-        {
-            Console.WriteLine("running oauth2_auth_token");
-            ITokenAccess credential = (await GoogleCredential.GetApplicationDefaultAsync()).CreateScoped(new[] { oauthScope });
-            string oauth2Token = await credential.GetAccessTokenForRequestAsync();
-
-            var credentials = GoogleGrpcCredentials.FromAccessToken(oauth2Token);
-            var request = new SimpleRequest
-            {
-                FillUsername = true,
-                FillOauthScope = true
-            };
-
-            var response = client.UnaryCall(request, new CallOptions(credentials: credentials));
-
-            Assert.IsFalse(string.IsNullOrEmpty(response.OauthScope));
-            Assert.IsTrue(oauthScope.Contains(response.OauthScope));
-            Assert.AreEqual(GetEmailFromServiceAccountFile(), response.Username);
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunPerRpcCredsAsync(TestService.TestServiceClient client, string oauthScope)
-        {
-            Console.WriteLine("running per_rpc_creds");
-            ITokenAccess googleCredential = await GoogleCredential.GetApplicationDefaultAsync();
-
-            var credentials = googleCredential.ToCallCredentials();
-            var request = new SimpleRequest
-            {
-                FillUsername = true,
-            };
-
-            var response = client.UnaryCall(request, new CallOptions(credentials: credentials));
-
-            Assert.AreEqual(GetEmailFromServiceAccountFile(), response.Username);
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunCancelAfterBeginAsync(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running cancel_after_begin");
-
-            var cts = new CancellationTokenSource();
-            using (var call = client.StreamingInputCall(cancellationToken: cts.Token))
-            {
-                // TODO(jtattermusch): we need this to ensure call has been initiated once we cancel it.
-                await Task.Delay(1000);
-                cts.Cancel();
-
-                var ex = await Assert.ThrowsAsync<RpcException>(() => call.ResponseAsync);
-                Assert.AreEqual(StatusCode.Cancelled, ex.Status.StatusCode);
-            }
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunCancelAfterFirstResponseAsync(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running cancel_after_first_response");
-
-            var cts = new CancellationTokenSource();
-            using (var call = client.FullDuplexCall(cancellationToken: cts.Token))
-            {
-                await call.RequestStream.WriteAsync(new StreamingOutputCallRequest
-                {
-                    ResponseParameters = { new ResponseParameters { Size = 31415 } },
-                    Payload = CreateZerosPayload(27182)
-                });
-
-                Assert.IsTrue(await call.ResponseStream.MoveNext());
-                Assert.AreEqual(31415, call.ResponseStream.Current.Payload.Body.Length);
-
-                cts.Cancel();
-
-                try
-                {
-                    // cannot use Assert.ThrowsAsync because it uses Task.Wait and would deadlock.
-                    await call.ResponseStream.MoveNext();
-                    Assert.Fail();
-                }
-                catch (RpcException ex)
-                {
-                    Assert.AreEqual(StatusCode.Cancelled, ex.Status.StatusCode);
-                }
-            }
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunTimeoutOnSleepingServerAsync(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running timeout_on_sleeping_server");
-
-            var deadline = DateTime.UtcNow.AddMilliseconds(1);
-            using (var call = client.FullDuplexCall(deadline: deadline))
-            {
-                try
-                {
-                    await call.RequestStream.WriteAsync(new StreamingOutputCallRequest { Payload = CreateZerosPayload(27182) });
-                }
-                catch (InvalidOperationException)
-                {
-                    // Deadline was reached before write has started. Eat the exception and continue.
-                }
-                catch (RpcException)
-                {
-                    // Deadline was reached before write has started. Eat the exception and continue.
-                }
-
-                try
-                {
-                    await call.ResponseStream.MoveNext();
-                    Assert.Fail();
-                }
-                catch (RpcException ex)
-                {
-                    Assert.AreEqual(StatusCode.DeadlineExceeded, ex.StatusCode);
-                }
-            }
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunCustomMetadataAsync(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running custom_metadata");
-            {
-                // step 1: test unary call
-                var request = new SimpleRequest
-                {
-                    ResponseSize = 314159,
-                    Payload = CreateZerosPayload(271828)
-                };
-
-                var call = client.UnaryCallAsync(request, headers: CreateTestMetadata());
-                await call.ResponseAsync;
-
-                var responseHeaders = await call.ResponseHeadersAsync;
-                var responseTrailers = call.GetTrailers();
-
-                Assert.AreEqual("test_initial_metadata_value", responseHeaders.First((entry) => entry.Key == "x-grpc-test-echo-initial").Value);
-                CollectionAssert.AreEqual(new byte[] { 0xab, 0xab, 0xab }, responseTrailers.First((entry) => entry.Key == "x-grpc-test-echo-trailing-bin").ValueBytes);
-            }
-
-            {
-                // step 2: test full duplex call
-                var request = new StreamingOutputCallRequest
-                {
-                    ResponseParameters = { new ResponseParameters { Size = 31415 } },
-                    Payload = CreateZerosPayload(27182)
-                };
-
-                var call = client.FullDuplexCall(headers: CreateTestMetadata());
-
-                await call.RequestStream.WriteAsync(request);
-                await call.RequestStream.CompleteAsync();
-                await call.ResponseStream.ToListAsync();
-
-                var responseHeaders = await call.ResponseHeadersAsync;
-                var responseTrailers = call.GetTrailers();
-
-                Assert.AreEqual("test_initial_metadata_value", responseHeaders.First((entry) => entry.Key == "x-grpc-test-echo-initial").Value);
-                CollectionAssert.AreEqual(new byte[] { 0xab, 0xab, 0xab }, responseTrailers.First((entry) => entry.Key == "x-grpc-test-echo-trailing-bin").ValueBytes);
-            }
-
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunStatusCodeAndMessageAsync(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running status_code_and_message");
-            var echoStatus = new EchoStatus
-            {
-                Code = 2,
-                Message = "test status message"
-            };
-
-            {
-                // step 1: test unary call
-                var request = new SimpleRequest { ResponseStatus = echoStatus };
-
-                var e = Assert.Throws<RpcException>(() => client.UnaryCall(request));
-                Assert.AreEqual(StatusCode.Unknown, e.Status.StatusCode);
-                Assert.AreEqual(echoStatus.Message, e.Status.Detail);
-            }
-
-            {
-                // step 2: test full duplex call
-                var request = new StreamingOutputCallRequest { ResponseStatus = echoStatus };
-
-                var call = client.FullDuplexCall();
-                await call.RequestStream.WriteAsync(request);
-                await call.RequestStream.CompleteAsync();
-
-                try
-                {
-                    // cannot use Assert.ThrowsAsync because it uses Task.Wait and would deadlock.
-                    await call.ResponseStream.ToListAsync();
-                    Assert.Fail();
-                }
-                catch (RpcException e)
-                {
-                    Assert.AreEqual(StatusCode.Unknown, e.Status.StatusCode);
-                    Assert.AreEqual(echoStatus.Message, e.Status.Detail);
-                }
-            }
-
-            Console.WriteLine("Passed!");
-        }
-
-        private static async Task RunSpecialStatusMessageAsync(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running special_status_message");
-
-            var echoStatus = new EchoStatus
-            {
-                Code = 2,
-                Message = "\t\ntest with whitespace\r\nand Unicode BMP ☺ and non-BMP 😈\t\n"
-            };
-
-            try
-            {
-                await client.UnaryCallAsync(new SimpleRequest
-                {
-                    ResponseStatus = echoStatus
-                });
-                Assert.Fail();
-            }
-            catch (RpcException e)
-            {
-                Assert.AreEqual(StatusCode.Unknown, e.Status.StatusCode);
-                Assert.AreEqual(echoStatus.Message, e.Status.Detail);
-            }
-
-            Console.WriteLine("Passed!");
-        }
-
-        public static void RunUnimplementedService(UnimplementedService.UnimplementedServiceClient client)
-        {
-            Console.WriteLine("running unimplemented_service");
-            var e = Assert.Throws<RpcException>(() => client.UnimplementedCall(new Empty()));
-
-            Assert.AreEqual(StatusCode.Unimplemented, e.Status.StatusCode);
-            Console.WriteLine("Passed!");
-        }
-
-        public static void RunUnimplementedMethod(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running unimplemented_method");
-            var e = Assert.Throws<RpcException>(() => client.UnimplementedCall(new Empty()));
-
-            Assert.AreEqual(StatusCode.Unimplemented, e.Status.StatusCode);
-            Console.WriteLine("Passed!");
-        }
-
-        public static void RunClientCompressedUnary(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running client_compressed_unary");
-            var probeRequest = new SimpleRequest
-            {
-                ExpectCompressed = new BoolValue
-                {
-                    Value = true  // lie about compression
-                },
-                ResponseSize = 314159,
-                Payload = CreateZerosPayload(271828)
-            };
-            var e = Assert.Throws<RpcException>(() => client.UnaryCall(probeRequest, CreateClientCompressionMetadata(false)));
-            Assert.AreEqual(StatusCode.InvalidArgument, e.Status.StatusCode);
-
-            var compressedRequest = new SimpleRequest
-            {
-                ExpectCompressed = new BoolValue
-                {
-                    Value = true
-                },
-                ResponseSize = 314159,
-                Payload = CreateZerosPayload(271828)
-            };
-            var response1 = client.UnaryCall(compressedRequest, CreateClientCompressionMetadata(true));
-            Assert.AreEqual(314159, response1.Payload.Body.Length);
-
-            var uncompressedRequest = new SimpleRequest
-            {
-                ExpectCompressed = new BoolValue
-                {
-                    Value = false
-                },
-                ResponseSize = 314159,
-                Payload = CreateZerosPayload(271828)
-            };
-            var response2 = client.UnaryCall(uncompressedRequest, CreateClientCompressionMetadata(false));
-            Assert.AreEqual(314159, response2.Payload.Body.Length);
-
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunClientCompressedStreamingAsync(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running client_compressed_streaming");
-            try
-            {
-                var probeCall = client.StreamingInputCall(CreateClientCompressionMetadata(false));
-                await probeCall.RequestStream.WriteAsync(new StreamingInputCallRequest
-                {
-                    ExpectCompressed = new BoolValue
-                    {
-                        Value = true
-                    },
-                    Payload = CreateZerosPayload(27182)
-                });
-
-                // cannot use Assert.ThrowsAsync because it uses Task.Wait and would deadlock.
-                await probeCall;
-                Assert.Fail();
-            }
-            catch (RpcException e)
-            {
-                Assert.AreEqual(StatusCode.InvalidArgument, e.Status.StatusCode);
-            }
-
-            var call = client.StreamingInputCall(CreateClientCompressionMetadata(true));
-            await call.RequestStream.WriteAsync(new StreamingInputCallRequest
-            {
-                ExpectCompressed = new BoolValue
-                {
-                    Value = true
-                },
-                Payload = CreateZerosPayload(27182)
-            });
-
-            call.RequestStream.WriteOptions = new WriteOptions(WriteFlags.NoCompress);
-            await call.RequestStream.WriteAsync(new StreamingInputCallRequest
-            {
-                ExpectCompressed = new BoolValue
-                {
-                    Value = false
-                },
-                Payload = CreateZerosPayload(45904)
-            });
-            await call.RequestStream.CompleteAsync();
-
-            var response = await call.ResponseAsync;
-            Assert.AreEqual(73086, response.AggregatedPayloadSize);
-
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunServerCompressedUnary(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running server_compressed_unary");
-
-            var request = new SimpleRequest
-            {
-                ResponseSize = 314159,
-                Payload = CreateZerosPayload(271828),
-                ResponseCompressed = new BoolValue { Value = true }
-            };
-            var response = await client.UnaryCallAsync(request);
-
-            // Compression of response message is not verified because there is no API available
-            Assert.AreEqual(314159, response.Payload.Body.Length);
-
-            request = new SimpleRequest
-            {
-                ResponseSize = 314159,
-                Payload = CreateZerosPayload(271828),
-                ResponseCompressed = new BoolValue { Value = false }
-            };
-            response = await client.UnaryCallAsync(request);
-
-            // Compression of response message is not verified because there is no API available
-            Assert.AreEqual(314159, response.Payload.Body.Length);
-
-            Console.WriteLine("Passed!");
-        }
-
-        public static async Task RunServerCompressedStreamingAsync(TestService.TestServiceClient client)
-        {
-            Console.WriteLine("running server_compressed_streaming");
-
-            var bodySizes = new List<int> { 31415, 92653 };
-
-            var request = new StreamingOutputCallRequest
-            {
-                ResponseParameters = { bodySizes.Select((size) => new ResponseParameters { Size = size, Compressed = new BoolValue { Value = true } }) }
-            };
-
-            using (var call = client.StreamingOutputCall(request))
-            {
-                // Compression of response message is not verified because there is no API available
-                var responseList = await call.ResponseStream.ToListAsync();
-                CollectionAssert.AreEqual(bodySizes, responseList.Select((item) => item.Payload.Body.Length).ToList());
-            }
-
-            Console.WriteLine("Passed!");
-        }
-
-        private static Payload CreateZerosPayload(int size)
-        {
-            return new Payload { Body = ByteString.CopyFrom(new byte[size]) };
-        }
-
-        private static Metadata CreateClientCompressionMetadata(bool compressed)
-        {
-            var algorithmName = compressed ? "gzip" : "identity";
-            return new Metadata
-            {
-                { new Metadata.Entry(CompressionRequestAlgorithmMetadataKey, algorithmName) }
-            };
-        }
-
-        // extracts the client_email field from service account file used for auth test cases
-        private static string GetEmailFromServiceAccountFile()
-        {
-            string keyFile = Environment.GetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS")!;
-            Assert.IsNotNull(keyFile);
-            var jobject = JObject.Parse(File.ReadAllText(keyFile));
-            string email = jobject.GetValue("client_email").Value<string>();
-            Assert.IsTrue(email.Length > 0);  // spec requires nonempty client email.
-            return email;
-        }
-
-        private static Metadata CreateTestMetadata()
-        {
-            return new Metadata
-            {
-                {"x-grpc-test-echo-initial", "test_initial_metadata_value"},
-                {"x-grpc-test-echo-trailing-bin", new byte[] {0xab, 0xab, 0xab}}
-            };
-        }
-
-        // TODO(JamesNK): PEM loading logic from https://stackoverflow.com/a/10498045/11829
-        // .NET does not have a built-in API for loading pem files
-        // Consider providing ca file in a different format and removing method
-        private byte[]? GetBytesFromPem(string pemString, string section)
-        {
-            var header = string.Format("-----BEGIN {0}-----", section);
-            var footer = string.Format("-----END {0}-----", section);
-
-            var start = pemString.IndexOf(header, StringComparison.Ordinal);
-            if (start == -1)
-            {
-                return null;
-            }
-
-            start += header.Length;
-            var end = pemString.IndexOf(footer, start, StringComparison.Ordinal) - start;
-
-            if (end == -1)
-            {
-                return null;
-            }
-
-            return Convert.FromBase64String(pemString.Substring(start, end));
-        }
-    }
-}
diff --git a/src/Grpc/test/testassets/InteropClient/InteropClient.csproj b/src/Grpc/test/testassets/InteropClient/InteropClient.csproj
deleted file mode 100644
index 274295c8386..00000000000
--- a/src/Grpc/test/testassets/InteropClient/InteropClient.csproj
+++ /dev/null
@@ -1,24 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <OutputType>Exe</OutputType>
-    <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
-    <Nullable>enable</Nullable>
-    <LangVersion>8.0</LangVersion>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <Protobuf Include="..\Proto\grpc\testing\test.proto" GrpcServices="Client" Link="Protos\test.proto" />
-    <Protobuf Include="..\Proto\grpc\testing\empty.proto" GrpcServices="None" Link="Protos\empty.proto" />
-    <Protobuf Include="..\Proto\grpc\testing\messages.proto" GrpcServices="None" Link="Protos\messages.proto" />
-
-    <Reference Include="CommandLineParser" />
-    <Reference Include="Google.Protobuf" />
-    <Reference Include="Grpc.Auth" />
-    <Reference Include="Grpc.Net.Client" />
-    <Reference Include="Grpc.Tools" PrivateAssets="All" />
-    <Reference Include="Microsoft.Extensions.DependencyInjection" />
-    <Reference Include="Microsoft.Extensions.Logging.Console" />
-  </ItemGroup>
-
-</Project>
diff --git a/src/Grpc/test/testassets/InteropClient/Program.cs b/src/Grpc/test/testassets/InteropClient/Program.cs
deleted file mode 100644
index 3fc3d9d9757..00000000000
--- a/src/Grpc/test/testassets/InteropClient/Program.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2019 The gRPC Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using System;
-
-namespace InteropTestsClient
-{
-    public class Program
-    {
-        public static void Main(string[] args)
-        {
-            Console.WriteLine("Application started.");
-
-            InteropClient.Run(args);
-        }
-    }
-}
diff --git a/src/Grpc/test/testassets/InteropClient/RunTests.ps1 b/src/Grpc/test/testassets/InteropClient/RunTests.ps1
deleted file mode 100644
index faa46d98c1b..00000000000
--- a/src/Grpc/test/testassets/InteropClient/RunTests.ps1
+++ /dev/null
@@ -1,53 +0,0 @@
-Param
-(
-    [bool]$use_tls = $false
-)
-
-$allTests =
-  "empty_unary",
-  "large_unary",
-  "client_streaming",
-  "server_streaming",
-  "ping_pong",
-  "empty_stream",
-
-  #"compute_engine_creds",
-  #"jwt_token_creds",
-  #"oauth2_auth_token",
-  #"per_rpc_creds",
-
-  "cancel_after_begin",
-  "cancel_after_first_response",
-  "timeout_on_sleeping_server",
-  "custom_metadata",
-  "status_code_and_message",
-  "special_status_message",
-  "unimplemented_service",
-  "unimplemented_method",
-  "client_compressed_unary",
-  "client_compressed_streaming",
-  "server_compressed_unary",
-  "server_compressed_streaming"
-
-Write-Host "Running $($allTests.Count) tests" -ForegroundColor Cyan
-Write-Host "Use TLS: $use_tls" -ForegroundColor Cyan
-Write-Host
-
-foreach ($test in $allTests)
-{
-  Write-Host "Running $test" -ForegroundColor Cyan
-
-  if (!$use_tls)
-  {
-    dotnet run --use_tls false --server_port 50052 --client_type httpclient --test_case $test
-  }
-  else
-  {
-    # Certificate is for test.google.com host. To run locally, setup the host file to point test.google.com to 127.0.0.1
-    dotnet run --use_tls true --server_port 50052 --client_type httpclient --test_case $test --server_host test.google.com
-  }
-
-  Write-Host
-}
-
-Write-Host "Done" -ForegroundColor Cyan
\ No newline at end of file
diff --git a/src/Grpc/test/testassets/InteropWebsite/AsyncStreamExtensions.cs b/src/Grpc/test/testassets/InteropWebsite/AsyncStreamExtensions.cs
deleted file mode 100644
index 1f296cb7ba3..00000000000
--- a/src/Grpc/test/testassets/InteropWebsite/AsyncStreamExtensions.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2015 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using Grpc.Core;
-
-namespace InteropTestsWebsite
-{
-    // Implementation copied from https://github.com/grpc/grpc/blob/master/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs
-    internal static class AsyncStreamExtensions
-    {
-        /// <summary>
-        /// Reads the entire stream and executes an async action for each element.
-        /// </summary>
-        public static async Task ForEachAsync<T>(this IAsyncStreamReader<T> streamReader, Func<T, Task> asyncAction)
-            where T : class
-        {
-            while (await streamReader.MoveNext().ConfigureAwait(false))
-            {
-                await asyncAction(streamReader.Current).ConfigureAwait(false);
-            }
-        }
-    }
-}
diff --git a/src/Grpc/test/testassets/InteropWebsite/Directory.Build.targets b/src/Grpc/test/testassets/InteropWebsite/Directory.Build.targets
deleted file mode 100644
index 2f889b40eae..00000000000
--- a/src/Grpc/test/testassets/InteropWebsite/Directory.Build.targets
+++ /dev/null
@@ -1,24 +0,0 @@
-<Project>
-  <!-- Skip the parent folder to prevent getting test package references. -->
-  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)..\..\, Directory.Build.targets))\Directory.Build.targets" />
-
-  <PropertyGroup>
-    <RestoreAdditionalProjectSources>$(RestoreAdditionalProjectSources);$(ArtifactsShippingPackagesDir)</RestoreAdditionalProjectSources>
-    <MicrosoftAspNetCoreAppRefPackageVersion Condition="'$(IsTargetingPackBuilding)' != 'false'">$(TargetingPackVersion)</MicrosoftAspNetCoreAppRefPackageVersion>
-    <MicrosoftAspNetCoreAppRefPackageVersion Condition="'$(IsTargetingPackBuilding)' == 'false'">$(AspNetCoreBaselineVersion)</MicrosoftAspNetCoreAppRefPackageVersion>
-  </PropertyGroup>
-
-  <!-- Use the shared framework that was produced -->
-  <ItemGroup>
-    <KnownFrameworkReference
-      Include="Microsoft.AspNetCore.App"
-      TargetFramework="$(DefaultNetCoreTargetFramework)"
-      RuntimeFrameworkName="Microsoft.AspNetCore.App"
-      TargetingPackName="Microsoft.AspNetCore.App.Ref"
-      RuntimePackNamePatterns="Microsoft.AspNetCore.App.Runtime.**RID**"
-      DefaultRuntimeFrameworkVersion="$(SharedFxVersion)"
-      LatestRuntimeFrameworkVersion="$(SharedFxVersion)"
-      TargetingPackVersion="$(MicrosoftAspNetCoreAppRefPackageVersion)"
-      RuntimePackRuntimeIdentifiers="$(SupportedRuntimeIdentifiers)" />
-  </ItemGroup>
-</Project>
diff --git a/src/Grpc/test/testassets/InteropWebsite/InteropWebsite.csproj b/src/Grpc/test/testassets/InteropWebsite/InteropWebsite.csproj
deleted file mode 100644
index 4b8d6d38509..00000000000
--- a/src/Grpc/test/testassets/InteropWebsite/InteropWebsite.csproj
+++ /dev/null
@@ -1,19 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
-
-  <PropertyGroup>
-    <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
-    <AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
-    <GenerateUserSecretsAttribute>false</GenerateUserSecretsAttribute>
-    <Nullable>enable</Nullable>
-    <LangVersion>8.0</LangVersion>
-  </PropertyGroup>
-
-  <ItemGroup>
-    <Protobuf Include="..\Proto\grpc\testing\test.proto" GrpcServices="Server" Link="Protos\test.proto" />
-    <Protobuf Include="..\Proto\grpc\testing\empty.proto" GrpcServices="None" Link="Protos\empty.proto" />
-    <Protobuf Include="..\Proto\grpc\testing\messages.proto" GrpcServices="None" Link="Protos\messages.proto" />
-
-    <Reference Include="Grpc.AspNetCore" />
-  </ItemGroup>
-
-</Project>
diff --git a/src/Grpc/test/testassets/InteropWebsite/Program.cs b/src/Grpc/test/testassets/InteropWebsite/Program.cs
deleted file mode 100644
index fffaf75c559..00000000000
--- a/src/Grpc/test/testassets/InteropWebsite/Program.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2019 The gRPC Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using System;
-using System.IO;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Server.Kestrel.Core;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.Hosting;
-
-namespace InteropTestsWebsite
-{
-    public class Program
-    {
-        public static void Main(string[] args)
-        {
-            CreateHostBuilder(args).Build().Run();
-        }
-
-        public static IHostBuilder CreateHostBuilder(string[] args) =>
-            Host.CreateDefaultBuilder(args)
-                .ConfigureWebHostDefaults(webBuilder =>
-                {
-                    webBuilder.ConfigureKestrel((context, options) =>
-                    {
-                        // Support --port and --use_tls cmdline arguments normally supported
-                        // by gRPC interop servers.
-                        var useTls = context.Configuration.GetValue("use_tls", false);
-
-                        options.Limits.MinRequestBodyDataRate = null;
-                        options.ListenAnyIP(0, listenOptions =>
-                        {
-                            Console.WriteLine($"Enabling connection encryption: {useTls}");
-
-                            if (useTls)
-                            {
-                                var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
-                                var certPath = Path.Combine(basePath!, "Certs", "server1.pfx");
-
-                                listenOptions.UseHttps(certPath, "1111");
-                            }
-                            listenOptions.Protocols = HttpProtocols.Http2;
-                        });
-                    });
-                    webBuilder.UseStartup<Startup>();
-                });
-    }
-}
diff --git a/src/Grpc/test/testassets/InteropWebsite/Startup.cs b/src/Grpc/test/testassets/InteropWebsite/Startup.cs
deleted file mode 100644
index 4715d1fbbca..00000000000
--- a/src/Grpc/test/testassets/InteropWebsite/Startup.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2019 The gRPC Authors
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using System;
-using Grpc.Testing;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
-
-namespace InteropTestsWebsite
-{
-    public class Startup
-    {
-        // This method gets called by the runtime. Use this method to add services to the container.
-        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
-        public void ConfigureServices(IServiceCollection services)
-        {
-            services.AddGrpc();
-        }
-
-        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
-        public void Configure(IApplicationBuilder app, IHostApplicationLifetime applicationLifetime)
-        {
-            // Required to notify test infrastructure that it can begin tests
-            applicationLifetime.ApplicationStarted.Register(() => Console.WriteLine("Application started."));
-
-            app.UseRouting();
-            app.UseEndpoints(endpoints =>
-            {
-                endpoints.MapGrpcService<TestServiceImpl>();
-            });
-        }
-    }
-}
diff --git a/src/Grpc/test/testassets/InteropWebsite/TestServiceImpl.cs b/src/Grpc/test/testassets/InteropWebsite/TestServiceImpl.cs
deleted file mode 100644
index 918500cd256..00000000000
--- a/src/Grpc/test/testassets/InteropWebsite/TestServiceImpl.cs
+++ /dev/null
@@ -1,149 +0,0 @@
-#region Copyright notice and license
-
-// Copyright 2015-2016 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#endregion
-
-using System;
-using System.Linq;
-using System.Threading.Tasks;
-using Google.Protobuf;
-using Grpc.Core;
-using InteropTestsWebsite;
-
-namespace Grpc.Testing
-{
-    // Implementation copied from https://github.com/grpc/grpc/blob/master/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs
-    public class TestServiceImpl : TestService.TestServiceBase
-    {
-        public override Task<Empty> EmptyCall(Empty request, ServerCallContext context)
-        {
-            return Task.FromResult(new Empty());
-        }
-
-        public override async Task<SimpleResponse> UnaryCall(SimpleRequest request, ServerCallContext context)
-        {
-            await EnsureEchoMetadataAsync(context, request.ResponseCompressed?.Value ?? false);
-            EnsureEchoStatus(request.ResponseStatus, context);
-            EnsureCompression(request.ExpectCompressed, context);
-
-            var response = new SimpleResponse { Payload = CreateZerosPayload(request.ResponseSize) };
-            return response;
-        }
-
-        public override async Task StreamingOutputCall(StreamingOutputCallRequest request, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context)
-        {
-            await EnsureEchoMetadataAsync(context, request.ResponseParameters.Any(rp => rp.Compressed?.Value ?? false));
-            EnsureEchoStatus(request.ResponseStatus, context);
-
-            foreach (var responseParam in request.ResponseParameters)
-            {
-                responseStream.WriteOptions = !(responseParam.Compressed?.Value ?? false)
-                    ? new WriteOptions(WriteFlags.NoCompress)
-                    : null;
-
-                var response = new StreamingOutputCallResponse { Payload = CreateZerosPayload(responseParam.Size) };
-                await responseStream.WriteAsync(response);
-            }
-        }
-
-        public override async Task<StreamingInputCallResponse> StreamingInputCall(IAsyncStreamReader<StreamingInputCallRequest> requestStream, ServerCallContext context)
-        {
-            await EnsureEchoMetadataAsync(context);
-
-            int sum = 0;
-            await requestStream.ForEachAsync(request =>
-            {
-                EnsureCompression(request.ExpectCompressed, context);
-
-                sum += request.Payload.Body.Length;
-                return Task.CompletedTask;
-            });
-            return new StreamingInputCallResponse { AggregatedPayloadSize = sum };
-        }
-
-        public override async Task FullDuplexCall(IAsyncStreamReader<StreamingOutputCallRequest> requestStream, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context)
-        {
-            await EnsureEchoMetadataAsync(context);
-
-            await requestStream.ForEachAsync(async request =>
-            {
-                EnsureEchoStatus(request.ResponseStatus, context);
-                foreach (var responseParam in request.ResponseParameters)
-                {
-                    var response = new StreamingOutputCallResponse { Payload = CreateZerosPayload(responseParam.Size) };
-                    await responseStream.WriteAsync(response);
-                }
-            });
-        }
-
-        public override Task HalfDuplexCall(IAsyncStreamReader<StreamingOutputCallRequest> requestStream, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context)
-        {
-            throw new NotImplementedException();
-        }
-
-        private static Payload CreateZerosPayload(int size)
-        {
-            return new Payload { Body = ByteString.CopyFrom(new byte[size]) };
-        }
-
-        private static async Task EnsureEchoMetadataAsync(ServerCallContext context, bool enableCompression = false)
-        {
-            var echoInitialList = context.RequestHeaders.Where((entry) => entry.Key == "x-grpc-test-echo-initial").ToList();
-
-            // Append grpc internal compression header if compression is requested by the client
-            if (enableCompression)
-            {
-                echoInitialList.Add(new Metadata.Entry("grpc-internal-encoding-request", "gzip"));
-            }
-
-            if (echoInitialList.Any()) {
-                var entry = echoInitialList.Single();
-                await context.WriteResponseHeadersAsync(new Metadata { entry });
-            }
-
-            var echoTrailingList = context.RequestHeaders.Where((entry) => entry.Key == "x-grpc-test-echo-trailing-bin").ToList();
-            if (echoTrailingList.Any()) {
-                context.ResponseTrailers.Add(echoTrailingList.Single());
-            }
-        }
-
-        private static void EnsureEchoStatus(EchoStatus responseStatus, ServerCallContext context)
-        {
-            if (responseStatus != null)
-            {
-                var statusCode = (StatusCode)responseStatus.Code;
-                context.Status = new Status(statusCode, responseStatus.Message);
-            }
-        }
-
-        private static void EnsureCompression(BoolValue? expectCompressed, ServerCallContext context)
-        {
-            if (expectCompressed != null)
-            {
-                // ServerCallContext.RequestHeaders filters out grpc-* headers
-                // Get grpc-encoding from HttpContext instead
-                var encoding = context.GetHttpContext().Request.Headers.SingleOrDefault(h => h.Key == "grpc-encoding").Value.SingleOrDefault();
-                if (expectCompressed.Value)
-                {
-                    if (encoding == null || encoding == "identity")
-                    {
-                        throw new RpcException(new Status(StatusCode.InvalidArgument, string.Empty));
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/src/Grpc/test/testassets/Proto/grpc/testing/empty.proto b/src/Grpc/test/testassets/Proto/grpc/testing/empty.proto
deleted file mode 100644
index 6a0aa88dfde..00000000000
--- a/src/Grpc/test/testassets/Proto/grpc/testing/empty.proto
+++ /dev/null
@@ -1,28 +0,0 @@
-
-// Copyright 2015 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-syntax = "proto3";
-
-package grpc.testing;
-
-// An empty message that you can re-use to avoid defining duplicated empty
-// messages in your project. A typical example is to use it as argument or the
-// return value of a service API. For instance:
-//
-//   service Foo {
-//     rpc Bar (grpc.testing.Empty) returns (grpc.testing.Empty) { };
-//   };
-//
-message Empty {}
diff --git a/src/Grpc/test/testassets/Proto/grpc/testing/messages.proto b/src/Grpc/test/testassets/Proto/grpc/testing/messages.proto
deleted file mode 100644
index 7b1b7286dce..00000000000
--- a/src/Grpc/test/testassets/Proto/grpc/testing/messages.proto
+++ /dev/null
@@ -1,165 +0,0 @@
-
-// Copyright 2015-2016 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Message definitions to be used by integration test service definitions.
-
-syntax = "proto3";
-
-package grpc.testing;
-
-// TODO(dgq): Go back to using well-known types once
-// https://github.com/grpc/grpc/issues/6980 has been fixed.
-// import "google/protobuf/wrappers.proto";
-message BoolValue {
-  // The bool value.
-  bool value = 1;
-}
-
-// The type of payload that should be returned.
-enum PayloadType {
-  // Compressable text format.
-  COMPRESSABLE = 0;
-}
-
-// A block of data, to simply increase gRPC message size.
-message Payload {
-  // The type of data in body.
-  PayloadType type = 1;
-  // Primary contents of payload.
-  bytes body = 2;
-}
-
-// A protobuf representation for grpc status. This is used by test
-// clients to specify a status that the server should attempt to return.
-message EchoStatus {
-  int32 code = 1;
-  string message = 2;
-}
-
-// Unary request.
-message SimpleRequest {
-  // Desired payload type in the response from the server.
-  // If response_type is RANDOM, server randomly chooses one from other formats.
-  PayloadType response_type = 1;
-
-  // Desired payload size in the response from the server.
-  int32 response_size = 2;
-
-  // Optional input payload sent along with the request.
-  Payload payload = 3;
-
-  // Whether SimpleResponse should include username.
-  bool fill_username = 4;
-
-  // Whether SimpleResponse should include OAuth scope.
-  bool fill_oauth_scope = 5;
-
-  // Whether to request the server to compress the response. This field is
-  // "nullable" in order to interoperate seamlessly with clients not able to
-  // implement the full compression tests by introspecting the call to verify
-  // the response's compression status.
-  BoolValue response_compressed = 6;
-
-  // Whether server should return a given status
-  EchoStatus response_status = 7;
-
-  // Whether the server should expect this request to be compressed.
-  BoolValue expect_compressed = 8;
-}
-
-// Unary response, as configured by the request.
-message SimpleResponse {
-  // Payload to increase message size.
-  Payload payload = 1;
-  // The user the request came from, for verifying authentication was
-  // successful when the client expected it.
-  string username = 2;
-  // OAuth scope.
-  string oauth_scope = 3;
-}
-
-// Client-streaming request.
-message StreamingInputCallRequest {
-  // Optional input payload sent along with the request.
-  Payload payload = 1;
-
-  // Whether the server should expect this request to be compressed. This field
-  // is "nullable" in order to interoperate seamlessly with servers not able to
-  // implement the full compression tests by introspecting the call to verify
-  // the request's compression status.
-  BoolValue expect_compressed = 2;
-
-  // Not expecting any payload from the response.
-}
-
-// Client-streaming response.
-message StreamingInputCallResponse {
-  // Aggregated size of payloads received from the client.
-  int32 aggregated_payload_size = 1;
-}
-
-// Configuration for a particular response.
-message ResponseParameters {
-  // Desired payload sizes in responses from the server.
-  int32 size = 1;
-
-  // Desired interval between consecutive responses in the response stream in
-  // microseconds.
-  int32 interval_us = 2;
-
-  // Whether to request the server to compress the response. This field is
-  // "nullable" in order to interoperate seamlessly with clients not able to
-  // implement the full compression tests by introspecting the call to verify
-  // the response's compression status.
-  BoolValue compressed = 3;
-}
-
-// Server-streaming request.
-message StreamingOutputCallRequest {
-  // Desired payload type in the response from the server.
-  // If response_type is RANDOM, the payload from each response in the stream
-  // might be of different types. This is to simulate a mixed type of payload
-  // stream.
-  PayloadType response_type = 1;
-
-  // Configuration for each expected response message.
-  repeated ResponseParameters response_parameters = 2;
-
-  // Optional input payload sent along with the request.
-  Payload payload = 3;
-
-  // Whether server should return a given status
-  EchoStatus response_status = 7;
-}
-
-// Server-streaming response, as configured by the request and parameters.
-message StreamingOutputCallResponse {
-  // Payload to increase response size.
-  Payload payload = 1;
-}
-
-// For reconnect interop test only.
-// Client tells server what reconnection parameters it used.
-message ReconnectParams {
-  int32 max_reconnect_backoff_ms = 1;
-}
-
-// For reconnect interop test only.
-// Server tells client whether its reconnects are following the spec and the
-// reconnect backoffs it saw.
-message ReconnectInfo {
-  bool passed = 1;
-  repeated int32 backoff_ms = 2;
-}
diff --git a/src/Grpc/test/testassets/Proto/grpc/testing/test.proto b/src/Grpc/test/testassets/Proto/grpc/testing/test.proto
deleted file mode 100644
index 86d6ab60506..00000000000
--- a/src/Grpc/test/testassets/Proto/grpc/testing/test.proto
+++ /dev/null
@@ -1,79 +0,0 @@
-
-// Copyright 2015-2016 gRPC authors.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// An integration test service that covers all the method signature permutations
-// of unary/streaming requests/responses.
-
-syntax = "proto3";
-
-import "empty.proto";
-import "messages.proto";
-
-package grpc.testing;
-
-// A simple service to test the various types of RPCs and experiment with
-// performance with various types of payload.
-service TestService {
-  // One empty request followed by one empty response.
-  rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty);
-
-  // One request followed by one response.
-  rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
-
-  // One request followed by one response. Response has cache control
-  // headers set such that a caching HTTP proxy (such as GFE) can
-  // satisfy subsequent requests.
-  rpc CacheableUnaryCall(SimpleRequest) returns (SimpleResponse);
-
-  // One request followed by a sequence of responses (streamed download).
-  // The server returns the payload with client desired type and sizes.
-  rpc StreamingOutputCall(StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-
-  // A sequence of requests followed by one response (streamed upload).
-  // The server returns the aggregated size of client payload as the result.
-  rpc StreamingInputCall(stream StreamingInputCallRequest)
-      returns (StreamingInputCallResponse);
-
-  // A sequence of requests with each request served by the server immediately.
-  // As one request could lead to multiple responses, this interface
-  // demonstrates the idea of full duplexing.
-  rpc FullDuplexCall(stream StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-
-  // A sequence of requests followed by a sequence of responses.
-  // The server buffers all the client requests and then serves them in order. A
-  // stream of responses are returned to the client when the server starts with
-  // first request.
-  rpc HalfDuplexCall(stream StreamingOutputCallRequest)
-      returns (stream StreamingOutputCallResponse);
-
-  // The test server will not implement this method. It will be used
-  // to test the behavior when clients call unimplemented methods.
-  rpc UnimplementedCall(grpc.testing.Empty) returns (grpc.testing.Empty);
-}
-
-// A simple service NOT implemented at servers so clients can test for
-// that case.
-service UnimplementedService {
-  // A call that no server should implement
-  rpc UnimplementedCall(grpc.testing.Empty) returns (grpc.testing.Empty);
-}
-
-// A service used to control reconnect server.
-service ReconnectService {
-  rpc Start(grpc.testing.ReconnectParams) returns (grpc.testing.Empty);
-  rpc Stop(grpc.testing.Empty) returns (grpc.testing.ReconnectInfo);
-}
diff --git a/src/Grpc/test/testassets/README.md b/src/Grpc/test/testassets/README.md
deleted file mode 100644
index d7798c92695..00000000000
--- a/src/Grpc/test/testassets/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-InteropTestsClient and InteropTestsWebsite are copied from [grpc-dotnet](https://github.com/grpc/grpc-dotnet/tree/master/testassets).
-
-For more information about the interop tests, see the [interop tests specification](https://github.com/grpc/grpc/blob/master/doc/interop-test-descriptions.md).
diff --git a/src/ProjectTemplates/test/Helpers/AspNetProcess.cs b/src/ProjectTemplates/test/Helpers/AspNetProcess.cs
index 86724b970fb..753eb1258a5 100644
--- a/src/ProjectTemplates/test/Helpers/AspNetProcess.cs
+++ b/src/ProjectTemplates/test/Helpers/AspNetProcess.cs
@@ -11,7 +11,6 @@ using System.Threading.Tasks;
 using AngleSharp.Dom.Html;
 using AngleSharp.Parser.Html;
 using Microsoft.AspNetCore.Certificates.Generation;
-using Microsoft.AspNetCore.Internal;
 using Microsoft.AspNetCore.Server.IntegrationTesting;
 using Microsoft.Extensions.CommandLineUtils;
 using Microsoft.Extensions.Logging.Abstractions;
diff --git a/src/ProjectTemplates/test/Helpers/ErrorMessages.cs b/src/ProjectTemplates/test/Helpers/ErrorMessages.cs
index 744ada299bf..c63f008f831 100644
--- a/src/ProjectTemplates/test/Helpers/ErrorMessages.cs
+++ b/src/ProjectTemplates/test/Helpers/ErrorMessages.cs
@@ -1,8 +1,6 @@
 // Copyright (c) .NET Foundation. All rights reserved.
 // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
 
-using Microsoft.AspNetCore.Internal;
-
 namespace Templates.Test.Helpers
 {
     internal static class ErrorMessages
diff --git a/src/Shared/Process/ProcessEx.cs b/src/ProjectTemplates/test/Helpers/ProcessEx.cs
similarity index 99%
rename from src/Shared/Process/ProcessEx.cs
rename to src/ProjectTemplates/test/Helpers/ProcessEx.cs
index c1743a2f0a9..db132bdafe0 100644
--- a/src/Shared/Process/ProcessEx.cs
+++ b/src/ProjectTemplates/test/Helpers/ProcessEx.cs
@@ -15,7 +15,7 @@ using System.Threading.Tasks;
 using Microsoft.Extensions.Internal;
 using Xunit.Abstractions;
 
-namespace Microsoft.AspNetCore.Internal
+namespace Templates.Test.Helpers
 {
     internal class ProcessEx : IDisposable
     {
@@ -100,7 +100,7 @@ namespace Microsoft.AspNetCore.Internal
             }
 
             startInfo.EnvironmentVariables["NUGET_PACKAGES"] = NUGET_PACKAGES;
-
+            
             if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("helix")))
             {
                 startInfo.EnvironmentVariables["NUGET_FALLBACK_PACKAGES"] = Environment.GetEnvironmentVariable("NUGET_FALLBACK_PACKAGES");
@@ -195,7 +195,7 @@ namespace Microsoft.AspNetCore.Internal
             }
         }
 
-        private static string GetNugetPackagesRestorePath() => (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("NUGET_RESTORE")))
+        private static string GetNugetPackagesRestorePath() => (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("NUGET_RESTORE"))) 
             ? typeof(ProcessEx).Assembly
                 .GetCustomAttributes<AssemblyMetadataAttribute>()
                 .First(attribute => attribute.Key == "TestPackageRestorePath")
diff --git a/src/ProjectTemplates/test/Helpers/Project.cs b/src/ProjectTemplates/test/Helpers/Project.cs
index b16801a5f74..3fdcdf9d0ce 100644
--- a/src/ProjectTemplates/test/Helpers/Project.cs
+++ b/src/ProjectTemplates/test/Helpers/Project.cs
@@ -10,7 +10,6 @@ using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Threading;
 using System.Threading.Tasks;
-using Microsoft.AspNetCore.Internal;
 using Microsoft.Extensions.CommandLineUtils;
 using Xunit;
 using Xunit.Abstractions;
diff --git a/src/ProjectTemplates/test/Helpers/TemplatePackageInstaller.cs b/src/ProjectTemplates/test/Helpers/TemplatePackageInstaller.cs
index 5c94fde2b49..3eed004ef60 100644
--- a/src/ProjectTemplates/test/Helpers/TemplatePackageInstaller.cs
+++ b/src/ProjectTemplates/test/Helpers/TemplatePackageInstaller.cs
@@ -8,7 +8,6 @@ using System.Linq;
 using System.Reflection;
 using System.Threading;
 using System.Threading.Tasks;
-using Microsoft.AspNetCore.Internal;
 using Microsoft.Extensions.CommandLineUtils;
 using Xunit;
 using Xunit.Abstractions;
diff --git a/src/ProjectTemplates/test/SpaTemplateTest/SpaTemplateTestBase.cs b/src/ProjectTemplates/test/SpaTemplateTest/SpaTemplateTestBase.cs
index d702e01be1e..bd393b8d586 100644
--- a/src/ProjectTemplates/test/SpaTemplateTest/SpaTemplateTestBase.cs
+++ b/src/ProjectTemplates/test/SpaTemplateTest/SpaTemplateTestBase.cs
@@ -10,7 +10,6 @@ using System.Net.Http;
 using System.Text.RegularExpressions;
 using System.Threading.Tasks;
 using Microsoft.AspNetCore.E2ETesting;
-using Microsoft.AspNetCore.Internal;
 using Newtonsoft.Json.Linq;
 using OpenQA.Selenium;
 using Templates.Test.Helpers;
-- 
GitLab