From a3295c1c1772fe0d93308efb10402a7759c0cc81 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 17 Jul 2020 13:36:38 +1200 Subject: [PATCH] Multi-target .NET 5 --- build/get-dotnet.sh | 3 + build_and_test.sh | 23 ++------ global.json | 2 +- .../Grpc.AspNetCore.HealthChecks.csproj | 2 +- ...rpc.AspNetCore.Server.ClientFactory.csproj | 2 +- .../Grpc.AspNetCore.Server.Reflection.csproj | 2 +- .../GrpcReflectionServiceExtensions.cs | 2 +- .../Grpc.AspNetCore.Server.csproj | 2 +- .../Internal/HttpContextServerCallContext.cs | 4 +- .../Internal/ServerCallHandlerFactory.cs | 4 +- .../Internal/X509CertificateHelpers.cs | 2 +- .../Model/Internal/ServiceRouteBuilder.cs | 5 +- src/Grpc.AspNetCore/Grpc.AspNetCore.csproj | 2 +- src/Grpc.AspNetCore/lib/net5.0/_._ | 0 .../Grpc.Net.Client.Web.csproj | 2 +- src/Grpc.Net.Client.Web/GrpcWebHandler.cs | 2 +- .../Internal/Base64RequestStream.cs | 14 +++-- .../Internal/GrpcWebRequestContent.cs | 2 +- .../Internal/GrpcWebResponseContent.cs | 2 +- src/Grpc.Net.Client/Grpc.Net.Client.csproj | 2 +- src/Grpc.Net.Client/GrpcChannel.cs | 13 ++++- src/Grpc.Net.Client/Internal/GrpcCall.cs | 4 +- .../Internal/PushStreamContent.cs | 2 +- .../Internal/PushUnaryContent.cs | 2 +- .../Grpc.Net.ClientFactory.csproj | 2 +- .../Internal/TypeNameHelper.cs | 10 ++-- src/Grpc.Net.Common/Grpc.Net.Common.csproj | 2 +- .../Client/CancellationTests.cs | 57 +++++++++++-------- .../Client/CompressionTests.cs | 2 +- .../FunctionalTests/Client/ConnectionTests.cs | 2 +- test/FunctionalTests/Client/StreamingTests.cs | 10 ++-- test/FunctionalTests/FunctionalTestBase.cs | 2 +- .../Grpc.AspNetCore.FunctionalTests.csproj | 2 +- .../Infrastructure/GrpcStreamContent.cs | 2 +- .../HttpResponseMessageExtensions.cs | 2 +- .../Infrastructure/PushStreamContent.cs | 2 +- .../Infrastructure/StreamingContent.cs | 2 +- .../Server/CompressionTests.cs | 4 +- test/FunctionalTests/Server/DeadlineTests.cs | 2 +- .../Server/UnaryMethodTests.cs | 2 +- .../TestServer/FunctionalTestBase.cs | 2 +- .../TestServer/TesterServiceTests.cs | 4 +- test/FunctionalTests/Web/Client/AuthTests.cs | 2 +- test/FunctionalTests/Web/Client/IssueTests.cs | 5 +- .../Web/Client/ServerStreamingMethodTests.cs | 10 ++-- .../Web/Client/TrailerMetadataTests.cs | 5 +- .../Web/Client/UnaryMethodTests.cs | 2 +- .../Web/GrpcWebFunctionalTestBase.cs | 2 +- .../Web/Server/DeadlineTests.cs | 2 +- .../Web/Server/UnaryMethodTests.cs | 8 +-- ...pNetCore.Server.ClientFactory.Tests.csproj | 2 +- .../CallHandlerTests.cs | 4 +- .../Grpc.AspNetCore.Server.Tests.csproj | 2 +- ...GrpcEndpointRouteBuilderExtensionsTests.cs | 14 ++--- .../HttpContextServerCallContextTests.cs | 8 +-- .../Infrastructure/TestHttpResponseFeature.cs | 2 +- .../Infrastructure/TestPipeReader.cs | 2 +- .../ReflectionGrpcServiceActivatorTests.cs | 2 +- .../AsyncClientStreamingCallTests.cs | 4 +- .../AsyncDuplexStreamingCallTests.cs | 2 +- .../AsyncUnaryCallTests.cs | 12 ++-- .../CancellationTests.cs | 2 +- .../Grpc.Net.Client.Tests/CompressionTests.cs | 10 ++-- test/Grpc.Net.Client.Tests/DeadlineTests.cs | 8 +-- .../Grpc.Net.Client.Tests/DiagnosticsTests.cs | 18 +++--- .../Grpc.Net.Client.Tests/GetTrailersTests.cs | 2 +- .../Grpc.Net.Client.Tests.csproj | 2 +- .../HttpContentClientStreamReaderTests.cs | 2 +- .../HttpClientCallInvokerFactory.cs | 2 +- .../Grpc.Net.Client.Tests/InterceptorTests.cs | 2 +- test/Grpc.Net.Client.Tests/LoggingTests.cs | 2 +- .../MaximumMessageSizeTests.cs | 2 +- .../SubdirectoryHandlerTests.cs | 2 +- .../Web/GrpcWebHandlerTests.cs | 2 +- .../Web/GrpcWebResponseContentTests.cs | 2 +- .../DefaultGrpcClientFactoryTests.cs | 2 +- .../Grpc.Net.ClientFactory.Tests.csproj | 2 +- .../GrpcHttpClientBuilderExtensionsTests.cs | 2 +- test/Shared/HttpContextHelpers.cs | 2 +- test/Shared/TestHelpers.cs | 6 +- test/Shared/TestHttpContextAccessor.cs | 2 +- test/dotnet-grpc.Tests/CommandBaseTests.cs | 6 +- test/dotnet-grpc.Tests/TestBase.cs | 2 +- .../dotnet-grpc.Tests.csproj | 2 +- .../InteropTestsGrpcWebClient.csproj | 11 ++-- .../InteropTestsGrpcWebWebsite/Dockerfile | 5 +- .../InteropTestsGrpcWebWebsite.csproj | 7 +-- .../InteropTestsGrpcWebWebsite/Startup.cs | 2 +- testassets/InteropTestsWebsite/Dockerfile | 5 +- .../InteropTestsWebsite.csproj | 2 +- testassets/Shared/IChannelWrapper.cs | 2 +- testassets/Shared/InteropClient.cs | 22 +++---- 92 files changed, 231 insertions(+), 210 deletions(-) create mode 100644 src/Grpc.AspNetCore/lib/net5.0/_._ diff --git a/build/get-dotnet.sh b/build/get-dotnet.sh index 020bc076b..22276916b 100755 --- a/build/get-dotnet.sh +++ b/build/get-dotnet.sh @@ -27,4 +27,7 @@ echo "Downloading install script: $install_script_url => $install_script_path" curl -sSL -o $install_script_path $install_script_url chmod +x $install_script_path +# Require .NET Core 3.x SDK to run 3.x test targets +$install_script_path -v 3.1.300 -i $dotnet_install_path + $install_script_path -v $sdk_version -i $dotnet_install_path diff --git a/build_and_test.sh b/build_and_test.sh index 31cb77e86..f2179e065 100755 --- a/build_and_test.sh +++ b/build_and_test.sh @@ -27,12 +27,6 @@ example_solutions=( $( ls examples/**/*.sln ) ) for example_solution in "${example_solutions[@]}" do - # dotnet build uses msbuild, and attempts to speed consecutive builds by reusing processes. - # This can become a problem when multiple versions of Grpc.Tools are used between builds. - # The different versions will conflict. Shutdown build processes between builds to avoid conflicts. - # Will be fixed in msbuild 16.5 - https://github.com/microsoft/msbuild/issues/1754 - dotnet build-server shutdown - dotnet build $example_solution -c Release done @@ -42,20 +36,11 @@ test_projects=( $( ls test/**/*Tests.csproj ) ) for test_project in "${test_projects[@]}" do - # "dotnet test" is hanging when it writes to console for an unknown reason - # Tracking issue at https://github.com/microsoft/vstest/issues/2080 - # Write test output to a text file and then write the text file to console as a workaround - { - dotnet test $test_project -c Release -v n --no-build &> ${test_project##*/}.log.txt && - echo "Success" && - cat ${test_project##*/}.log.txt - } || { - echo "Failure" && - cat ${test_project##*/}.log.txt && - exit 1 - } + # https://github.com/microsoft/vstest/issues/2080#issuecomment-539879345 + dotnet test $test_project -c Release -v n --no-build < /dev/null done echo "Tests finished" -source grpcweb_interoptests.sh \ No newline at end of file +# Temporarily disable while using nightly .NET SDK build +# source grpcweb_interoptests.sh \ No newline at end of file diff --git a/global.json b/global.json index 0ebfb85f9..db556b759 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "3.1.300" + "version": "5.0.100-rc.1.20367.2" } } diff --git a/src/Grpc.AspNetCore.HealthChecks/Grpc.AspNetCore.HealthChecks.csproj b/src/Grpc.AspNetCore.HealthChecks/Grpc.AspNetCore.HealthChecks.csproj index 91b44e05c..68ec9b0ad 100644 --- a/src/Grpc.AspNetCore.HealthChecks/Grpc.AspNetCore.HealthChecks.csproj +++ b/src/Grpc.AspNetCore.HealthChecks/Grpc.AspNetCore.HealthChecks.csproj @@ -6,7 +6,7 @@ true true - netcoreapp3.0 + netcoreapp3.0;net5.0 $(WarningsNotAsErrors);CA2007 diff --git a/src/Grpc.AspNetCore.Server.ClientFactory/Grpc.AspNetCore.Server.ClientFactory.csproj b/src/Grpc.AspNetCore.Server.ClientFactory/Grpc.AspNetCore.Server.ClientFactory.csproj index 99d27016b..a0e5007da 100644 --- a/src/Grpc.AspNetCore.Server.ClientFactory/Grpc.AspNetCore.Server.ClientFactory.csproj +++ b/src/Grpc.AspNetCore.Server.ClientFactory/Grpc.AspNetCore.Server.ClientFactory.csproj @@ -6,7 +6,7 @@ true true - netcoreapp3.0 + netcoreapp3.0;net5.0 $(WarningsNotAsErrors);CA2007 diff --git a/src/Grpc.AspNetCore.Server.Reflection/Grpc.AspNetCore.Server.Reflection.csproj b/src/Grpc.AspNetCore.Server.Reflection/Grpc.AspNetCore.Server.Reflection.csproj index 22df44a72..5f9b96f39 100644 --- a/src/Grpc.AspNetCore.Server.Reflection/Grpc.AspNetCore.Server.Reflection.csproj +++ b/src/Grpc.AspNetCore.Server.Reflection/Grpc.AspNetCore.Server.Reflection.csproj @@ -6,7 +6,7 @@ true true - netcoreapp3.0 + netcoreapp3.0;net5.0 $(WarningsNotAsErrors);CA2007 diff --git a/src/Grpc.AspNetCore.Server.Reflection/GrpcReflectionServiceExtensions.cs b/src/Grpc.AspNetCore.Server.Reflection/GrpcReflectionServiceExtensions.cs index 5f055247d..088afb6fd 100644 --- a/src/Grpc.AspNetCore.Server.Reflection/GrpcReflectionServiceExtensions.cs +++ b/src/Grpc.AspNetCore.Server.Reflection/GrpcReflectionServiceExtensions.cs @@ -54,7 +54,7 @@ public static IServiceCollection AddGrpcReflection(this IServiceCollection servi var grpcEndpointMetadata = endpointDataSource.Endpoints .Select(ep => ep.Metadata.GetMetadata()) - .Where(m => m != null) + .OfType() .ToList(); var serviceTypes = grpcEndpointMetadata.Select(m => m.ServiceType).Distinct().ToList(); diff --git a/src/Grpc.AspNetCore.Server/Grpc.AspNetCore.Server.csproj b/src/Grpc.AspNetCore.Server/Grpc.AspNetCore.Server.csproj index b7b0b8e15..73e0bc278 100644 --- a/src/Grpc.AspNetCore.Server/Grpc.AspNetCore.Server.csproj +++ b/src/Grpc.AspNetCore.Server/Grpc.AspNetCore.Server.csproj @@ -6,7 +6,7 @@ true true - netcoreapp3.0 + netcoreapp3.0;net5.0 $(WarningsNotAsErrors);CA2007 diff --git a/src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs b/src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs index dcf52e966..d4020f3eb 100644 --- a/src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs +++ b/src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs @@ -71,7 +71,7 @@ internal DefaultDeserializationContext DeserializationContext internal bool HasResponseTrailers => _responseTrailers != null; - protected override string MethodCore => HttpContext.Request.Path.Value; + protected override string MethodCore => HttpContext.Request.Path.Value!; protected override string HostCore => HttpContext.Request.Host.Value; @@ -313,7 +313,7 @@ protected override AuthContext AuthContextCore public ServerCallContext ServerCallContext => this; - protected override IDictionary UserStateCore => HttpContext.Items; + protected override IDictionary UserStateCore => HttpContext.Items!; internal bool HasBufferedMessage { get; set; } diff --git a/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs b/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs index 7553f0f57..5801078ef 100644 --- a/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs +++ b/src/Grpc.AspNetCore.Server/Internal/ServerCallHandlerFactory.cs @@ -114,7 +114,7 @@ public RequestDelegate CreateUnimplementedMethod() var unimplementedMethod = httpContext.Request.RouteValues["unimplementedMethod"]?.ToString() ?? ""; Log.MethodUnimplemented(logger, unimplementedMethod); - GrpcEventSource.Log.CallUnimplemented(httpContext.Request.Path.Value); + GrpcEventSource.Log.CallUnimplemented(httpContext.Request.Path.Value!); GrpcProtocolHelpers.SetStatus(GrpcProtocolHelpers.GetTrailersDestination(httpContext.Response), new Status(StatusCode.Unimplemented, "Method is unimplemented.")); return Task.CompletedTask; @@ -142,7 +142,7 @@ public RequestDelegate CreateUnimplementedService() var unimplementedService = httpContext.Request.RouteValues["unimplementedService"]?.ToString() ?? ""; Log.ServiceUnimplemented(logger, unimplementedService); - GrpcEventSource.Log.CallUnimplemented(httpContext.Request.Path.Value); + GrpcEventSource.Log.CallUnimplemented(httpContext.Request.Path.Value!); GrpcProtocolHelpers.SetStatus(GrpcProtocolHelpers.GetTrailersDestination(httpContext.Response), new Status(StatusCode.Unimplemented, "Service is unimplemented.")); return Task.CompletedTask; diff --git a/src/Grpc.AspNetCore.Server/Internal/X509CertificateHelpers.cs b/src/Grpc.AspNetCore.Server/Internal/X509CertificateHelpers.cs index 749b62809..161556e12 100644 --- a/src/Grpc.AspNetCore.Server/Internal/X509CertificateHelpers.cs +++ b/src/Grpc.AspNetCore.Server/Internal/X509CertificateHelpers.cs @@ -31,7 +31,7 @@ public static string[] GetDnsFromExtensions(X509Certificate2 cert) foreach (X509Extension ext in cert.Extensions) { // Extension is SAN2 - if (ext.Oid.Value == X509SubjectAlternativeNameConstants.Oid) + if (ext.Oid?.Value == X509SubjectAlternativeNameConstants.Oid) { string asnString = ext.Format(false); if (string.IsNullOrWhiteSpace(asnString)) diff --git a/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs b/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs index 78f73a034..a02d66f32 100644 --- a/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs +++ b/src/Grpc.AspNetCore.Server/Model/Internal/ServiceRouteBuilder.cs @@ -137,7 +137,10 @@ internal static void CreateUnimplementedEndpoints( private static IEndpointConventionBuilder CreateUnimplementedEndpoint(IEndpointRouteBuilder endpointRouteBuilder, string pattern, string displayName, RequestDelegate requestDelegate) { +#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type. + // https://github.com/dotnet/aspnetcore/issues/24042 var routePattern = RoutePatternFactory.Parse(pattern, defaults: null, new { contentType = GrpcUnimplementedConstraint.Instance }); +#pragma warning restore CS8625 // Cannot convert null literal to non-nullable reference type. var endpointBuilder = endpointRouteBuilder.Map(routePattern, requestDelegate); endpointBuilder.Add(ep => @@ -154,7 +157,7 @@ private class GrpcUnimplementedConstraint : IRouteConstraint { public static readonly GrpcUnimplementedConstraint Instance = new GrpcUnimplementedConstraint(); - public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) + public bool Match(HttpContext? httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection) { if (httpContext == null) { diff --git a/src/Grpc.AspNetCore/Grpc.AspNetCore.csproj b/src/Grpc.AspNetCore/Grpc.AspNetCore.csproj index 53a8522f0..709bb8ba4 100644 --- a/src/Grpc.AspNetCore/Grpc.AspNetCore.csproj +++ b/src/Grpc.AspNetCore/Grpc.AspNetCore.csproj @@ -5,7 +5,7 @@ gRPC RPC HTTP/2 aspnetcore true - netcoreapp3.0 + netcoreapp3.0;net5.0 false diff --git a/src/Grpc.AspNetCore/lib/net5.0/_._ b/src/Grpc.AspNetCore/lib/net5.0/_._ new file mode 100644 index 000000000..e69de29bb diff --git a/src/Grpc.Net.Client.Web/Grpc.Net.Client.Web.csproj b/src/Grpc.Net.Client.Web/Grpc.Net.Client.Web.csproj index a48726c12..8a550ea5f 100644 --- a/src/Grpc.Net.Client.Web/Grpc.Net.Client.Web.csproj +++ b/src/Grpc.Net.Client.Web/Grpc.Net.Client.Web.csproj @@ -6,7 +6,7 @@ true true - netstandard2.1 + netstandard2.1;net5.0 diff --git a/src/Grpc.Net.Client.Web/GrpcWebHandler.cs b/src/Grpc.Net.Client.Web/GrpcWebHandler.cs index 33ec19714..f83450d97 100644 --- a/src/Grpc.Net.Client.Web/GrpcWebHandler.cs +++ b/src/Grpc.Net.Client.Web/GrpcWebHandler.cs @@ -115,7 +115,7 @@ protected override Task SendAsync(HttpRequestMessage reques private async Task SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken) { - request.Content = new GrpcWebRequestContent(request.Content, GrpcWebMode); + request.Content = new GrpcWebRequestContent(request.Content!, GrpcWebMode); // Set WebAssemblyEnableStreamingResponse to true on gRPC-Web request. // https://github.com/mono/mono/blob/a0d69a4e876834412ba676f544d447ec331e7c01/sdks/wasm/framework/src/System.Net.Http.WebAssemblyHttpHandler/WebAssemblyHttpHandler.cs#L149 diff --git a/src/Grpc.Net.Client.Web/Internal/Base64RequestStream.cs b/src/Grpc.Net.Client.Web/Internal/Base64RequestStream.cs index df2e158e7..5947085b7 100644 --- a/src/Grpc.Net.Client.Web/Internal/Base64RequestStream.cs +++ b/src/Grpc.Net.Client.Web/Internal/Base64RequestStream.cs @@ -84,7 +84,13 @@ public override async ValueTask WriteAsync(ReadOnlyMemory data, Cancellati EnsureSuccess( Base64.EncodeToUtf8(data.Span.Slice(0, encodeLength), localBuffer.Span, out var bytesConsumed, out var bytesWritten, isFinalBlock: false), - OperationStatus.NeedMoreData); +#if NETSTANDARD2_1 + OperationStatus.NeedMoreData +#else + // React to fix https://github.com/dotnet/runtime/pull/281 + encodeLength == bytesConsumed ? OperationStatus.Done : OperationStatus.NeedMoreData +#endif + ); var base64Remainder = _buffer.Length - localBuffer.Length; await _inner.WriteAsync(_buffer.AsMemory(0, bytesWritten + base64Remainder), cancellationToken).ConfigureAwait(false); @@ -113,7 +119,7 @@ private static void EnsureSuccess(OperationStatus status, OperationStatus expect { if (status != expectedStatus) { - throw new InvalidOperationException("Error encoding content to base64: " + status); + throw new InvalidOperationException($"Error encoding content to base64. Expected status: {expectedStatus}, actual status: {status}."); } } @@ -146,7 +152,7 @@ protected override void Dispose(bool disposing) base.Dispose(disposing); } - #region Stream implementation +#region Stream implementation public override bool CanRead => _inner.CanRead; public override bool CanSeek => _inner.CanSeek; public override bool CanWrite => _inner.CanWrite; @@ -183,6 +189,6 @@ public override void Write(byte[] buffer, int offset, int count) WriteAsync(buffer.AsMemory(0, count)).AsTask().GetAwaiter().GetResult(); FlushAsync().GetAwaiter().GetResult(); } - #endregion +#endregion } } diff --git a/src/Grpc.Net.Client.Web/Internal/GrpcWebRequestContent.cs b/src/Grpc.Net.Client.Web/Internal/GrpcWebRequestContent.cs index ce81180e6..8353144e1 100644 --- a/src/Grpc.Net.Client.Web/Internal/GrpcWebRequestContent.cs +++ b/src/Grpc.Net.Client.Web/Internal/GrpcWebRequestContent.cs @@ -43,7 +43,7 @@ public GrpcWebRequestContent(HttpContent inner, GrpcWebMode mode) : GrpcWebProtocolConstants.GrpcWebHeader; } - protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) => + protected override Task SerializeToStreamAsync(Stream stream, TransportContext? context) => _mode == GrpcWebMode.GrpcWebText ? SerializeTextToStreamAsync(stream) : _inner.CopyToAsync(stream); diff --git a/src/Grpc.Net.Client.Web/Internal/GrpcWebResponseContent.cs b/src/Grpc.Net.Client.Web/Internal/GrpcWebResponseContent.cs index 783855c32..cda4ff651 100644 --- a/src/Grpc.Net.Client.Web/Internal/GrpcWebResponseContent.cs +++ b/src/Grpc.Net.Client.Web/Internal/GrpcWebResponseContent.cs @@ -46,7 +46,7 @@ public GrpcWebResponseContent(HttpContent inner, GrpcWebMode mode, HttpHeaders r Headers.ContentType = GrpcWebProtocolConstants.GrpcHeader; } - protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context) + protected override async Task SerializeToStreamAsync(Stream stream, TransportContext? context) { // This method will only be called by tests when response content is // accessed via ReadAsBytesAsync. The gRPC client will always diff --git a/src/Grpc.Net.Client/Grpc.Net.Client.csproj b/src/Grpc.Net.Client/Grpc.Net.Client.csproj index 7049aa2b3..b3c307726 100644 --- a/src/Grpc.Net.Client/Grpc.Net.Client.csproj +++ b/src/Grpc.Net.Client/Grpc.Net.Client.csproj @@ -6,7 +6,7 @@ true true - netstandard2.1 + netstandard2.1;net5.0 diff --git a/src/Grpc.Net.Client/GrpcChannel.cs b/src/Grpc.Net.Client/GrpcChannel.cs index 03f4eb0bf..cfc8777d9 100644 --- a/src/Grpc.Net.Client/GrpcChannel.cs +++ b/src/Grpc.Net.Client/GrpcChannel.cs @@ -99,7 +99,18 @@ private static HttpMessageInvoker CreateInternalHttpInvoker(HttpMessageHandler? { // HttpMessageInvoker should always dispose handler if Disposed is called on it. // Decision to dispose invoker is controlled by _shouldDisposeHttpClient. - var httpInvoker = new HttpMessageInvoker(handler ?? new HttpClientHandler(), disposeHandler: true); + if (handler == null) + { +#if NET5_0 + // TODO(JamesNK): Wrap sockets handler with a handler that sets traceparent header + handler = new SocketsHttpHandler(); +#else + handler = new HttpClientHandler(); +#endif + } + + + var httpInvoker = new HttpMessageInvoker(handler, disposeHandler: true); return httpInvoker; } diff --git a/src/Grpc.Net.Client/Internal/GrpcCall.cs b/src/Grpc.Net.Client/Internal/GrpcCall.cs index 540c4ba43..8fae91f44 100644 --- a/src/Grpc.Net.Client/Internal/GrpcCall.cs +++ b/src/Grpc.Net.Client/Internal/GrpcCall.cs @@ -651,7 +651,7 @@ public Exception CreateFailureStatusException(Status status) private (bool diagnosticSourceEnabled, Activity? activity) InitializeCall(HttpRequestMessage request, TimeSpan? timeout) { - GrpcCallLog.StartingCall(Logger, Method.Type, request.RequestUri); + GrpcCallLog.StartingCall(Logger, Method.Type, request.RequestUri!); GrpcEventSource.Log.CallStart(Method.FullName); // Deadline will cancel the call CTS. @@ -862,7 +862,7 @@ private long GetTimerDueTime(TimeSpan timeout) return timeout; } - private void DeadlineExceededCallback(object state) + private void DeadlineExceededCallback(object? state) { // Deadline is only exceeded if the timeout has passed and // the response has not been finished or canceled diff --git a/src/Grpc.Net.Client/Internal/PushStreamContent.cs b/src/Grpc.Net.Client/Internal/PushStreamContent.cs index 589d51da1..d0869d2a6 100644 --- a/src/Grpc.Net.Client/Internal/PushStreamContent.cs +++ b/src/Grpc.Net.Client/Internal/PushStreamContent.cs @@ -37,7 +37,7 @@ public PushStreamContent(HttpContentClientStreamWriter stre _streamWriter = streamWriter; } - protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context) + protected override async Task SerializeToStreamAsync(Stream stream, TransportContext? context) { // Immediately flush request stream to send headers // https://github.com/dotnet/corefx/issues/39586#issuecomment-516210081 diff --git a/src/Grpc.Net.Client/Internal/PushUnaryContent.cs b/src/Grpc.Net.Client/Internal/PushUnaryContent.cs index 76bbb93f3..ca5c2c499 100644 --- a/src/Grpc.Net.Client/Internal/PushUnaryContent.cs +++ b/src/Grpc.Net.Client/Internal/PushUnaryContent.cs @@ -40,7 +40,7 @@ public PushUnaryContent(TRequest content, GrpcCall call, st Headers.ContentType = mediaType; } - protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) + protected override Task SerializeToStreamAsync(Stream stream, TransportContext? context) { var writeMessageTask = _call.WriteMessageAsync(stream, _content, _grpcEncoding, _call.Options); if (writeMessageTask.IsCompletedSuccessfully) diff --git a/src/Grpc.Net.ClientFactory/Grpc.Net.ClientFactory.csproj b/src/Grpc.Net.ClientFactory/Grpc.Net.ClientFactory.csproj index cae2616d5..d37a8936d 100644 --- a/src/Grpc.Net.ClientFactory/Grpc.Net.ClientFactory.csproj +++ b/src/Grpc.Net.ClientFactory/Grpc.Net.ClientFactory.csproj @@ -6,7 +6,7 @@ true true - netstandard2.1 + netstandard2.1;net5.0 diff --git a/src/Grpc.Net.ClientFactory/Internal/TypeNameHelper.cs b/src/Grpc.Net.ClientFactory/Internal/TypeNameHelper.cs index b447916a8..4564fafd9 100644 --- a/src/Grpc.Net.ClientFactory/Internal/TypeNameHelper.cs +++ b/src/Grpc.Net.ClientFactory/Internal/TypeNameHelper.cs @@ -92,7 +92,7 @@ private static void ProcessType(StringBuilder builder, Type type, in DisplayName } else { - var name = options.FullName ? type.FullName : type.Name; + var name = options.FullName ? type.FullName! : type.Name; builder.Append(name); if (options.NestedTypeDelimiter != DefaultNestedTypeDelimiter) @@ -107,7 +107,7 @@ private static void ProcessArrayType(StringBuilder builder, Type type, in Displa var innerType = type; while (innerType.IsArray) { - innerType = innerType.GetElementType(); + innerType = innerType.GetElementType()!; } ProcessType(builder, innerType, options); @@ -117,7 +117,7 @@ private static void ProcessArrayType(StringBuilder builder, Type type, in Displa builder.Append('['); builder.Append(',', type.GetArrayRank() - 1); builder.Append(']'); - type = type.GetElementType(); + type = type.GetElementType()!; } } @@ -126,14 +126,14 @@ private static void ProcessGenericType(StringBuilder builder, Type type, Type[] var offset = 0; if (type.IsNested) { - offset = type.DeclaringType.GetGenericArguments().Length; + offset = type.DeclaringType!.GetGenericArguments().Length; } if (options.FullName) { if (type.IsNested) { - ProcessGenericType(builder, type.DeclaringType, genericArguments, offset, options); + ProcessGenericType(builder, type.DeclaringType!, genericArguments, offset, options); builder.Append(options.NestedTypeDelimiter); } else if (!string.IsNullOrEmpty(type.Namespace)) diff --git a/src/Grpc.Net.Common/Grpc.Net.Common.csproj b/src/Grpc.Net.Common/Grpc.Net.Common.csproj index 065431d82..475e80812 100644 --- a/src/Grpc.Net.Common/Grpc.Net.Common.csproj +++ b/src/Grpc.Net.Common/Grpc.Net.Common.csproj @@ -6,7 +6,7 @@ true true - netstandard2.1 + netstandard2.1;net5.0 diff --git a/test/FunctionalTests/Client/CancellationTests.cs b/test/FunctionalTests/Client/CancellationTests.cs index 0b6788c23..928231dd3 100644 --- a/test/FunctionalTests/Client/CancellationTests.cs +++ b/test/FunctionalTests/Client/CancellationTests.cs @@ -37,9 +37,10 @@ public class CancellationTests : FunctionalTestBase [TestCase(1)] [TestCase(5)] [TestCase(20)] + [Ignore("https://github.com/dotnet/runtime/issues/39608")] public async Task DuplexStreaming_CancelAfterHeadersInParallel_Success(int tasks) { - await CancelInParallel(tasks, waitForHeaders: true, interations: 10); + await CancelInParallel(tasks, waitForHeaders: true, interations: 10).TimeoutAfter(TimeSpan.FromSeconds(60)); } [TestCase(1)] @@ -47,7 +48,7 @@ public async Task DuplexStreaming_CancelAfterHeadersInParallel_Success(int tasks [TestCase(20)] public async Task DuplexStreaming_CancelWithoutHeadersInParallel_Success(int tasks) { - await CancelInParallel(tasks, waitForHeaders: false, interations: 10); + await CancelInParallel(tasks, waitForHeaders: false, interations: 10).TimeoutAfter(TimeSpan.FromSeconds(60)); } private async Task CancelInParallel(int tasks, bool waitForHeaders, int interations) @@ -96,29 +97,39 @@ private async Task CancelInParallel(int tasks, bool waitForHeaders, int interati var client = new StreamService.StreamServiceClient(Channel); - await TestHelpers.RunParallel(tasks, async () => + await TestHelpers.RunParallel(tasks, async taskIndex => { - for (int i = 0; i < interations; i++) + try { - var cts = new CancellationTokenSource(); - var headers = new Metadata(); - if (waitForHeaders) + for (int i = 0; i < interations; i++) { - headers.Add("flush-headers", bool.TrueString); + Logger.LogInformation($"Staring {taskIndex}-{i}"); + + var cts = new CancellationTokenSource(); + var headers = new Metadata(); + if (waitForHeaders) + { + headers.Add("flush-headers", bool.TrueString); + } + using var call = client.EchoAllData(cancellationToken: cts.Token, headers: headers); + + if (waitForHeaders) + { + await call.ResponseHeadersAsync.DefaultTimeout(); + } + + await call.RequestStream.WriteAsync(new DataMessage + { + Data = ByteString.CopyFrom(data) + }).DefaultTimeout(); + + cts.Cancel(); } - var call = client.EchoAllData(cancellationToken: cts.Token, headers: headers); - - if (waitForHeaders) - { - await call.ResponseHeadersAsync.DefaultTimeout(); - } - - await call.RequestStream.WriteAsync(new DataMessage - { - Data = ByteString.CopyFrom(data) - }).DefaultTimeout(); - - cts.Cancel(); + } + catch (Exception ex) + { + Logger.LogError(ex, "Cancellation error"); + throw; } }); } @@ -172,7 +183,7 @@ async Task ServerStreamingCall(DataMessage request, IServerStreamWriter + await TestHelpers.RunParallel(tasks, async taskIndex => { - var (sent, received) = await EchoData(total, data, client); + var (sent, received) = await EchoData(total, data, client).DefaultTimeout(); // Assert Assert.AreEqual(sent, total); Assert.AreEqual(received, total); - }); + }).DefaultTimeout(); } [Test] @@ -354,7 +354,7 @@ writeContext.Exception is InvalidOperationException && var httpClient = Fixture.CreateClient(); httpClient.Timeout = TimeSpan.FromSeconds(0.5); - var channel = GrpcChannel.ForAddress(httpClient.BaseAddress, new GrpcChannelOptions + var channel = GrpcChannel.ForAddress(httpClient.BaseAddress!, new GrpcChannelOptions { HttpClient = httpClient, LoggerFactory = LoggerFactory @@ -490,7 +490,7 @@ await context.WriteResponseHeadersAsync(new Metadata var call = client.ServerStreamingCall(new DataMessage()); // Assert - var headers = await call.ResponseHeadersAsync; + var headers = await call.ResponseHeadersAsync.DefaultTimeout(); var keyHeaders = headers.GetAll("key").ToList(); Assert.AreEqual("key", keyHeaders[0].Key); Assert.AreEqual("Value1", keyHeaders[0].Value); diff --git a/test/FunctionalTests/FunctionalTestBase.cs b/test/FunctionalTests/FunctionalTestBase.cs index 4ad7c2f54..ebe17a2e9 100644 --- a/test/FunctionalTests/FunctionalTestBase.cs +++ b/test/FunctionalTests/FunctionalTestBase.cs @@ -55,7 +55,7 @@ protected GrpcChannel CreateChannel(bool useHandler = false) { options.HttpClient = Fixture.Client; } - return GrpcChannel.ForAddress(Fixture.Client.BaseAddress, options); + return GrpcChannel.ForAddress(Fixture.Client.BaseAddress!, options); } protected virtual void ConfigureServices(IServiceCollection services) { } diff --git a/test/FunctionalTests/Grpc.AspNetCore.FunctionalTests.csproj b/test/FunctionalTests/Grpc.AspNetCore.FunctionalTests.csproj index 1a1cfd6aa..a42f2d021 100644 --- a/test/FunctionalTests/Grpc.AspNetCore.FunctionalTests.csproj +++ b/test/FunctionalTests/Grpc.AspNetCore.FunctionalTests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + netcoreapp3.1;net5.0 false 8.0 diff --git a/test/FunctionalTests/Infrastructure/GrpcStreamContent.cs b/test/FunctionalTests/Infrastructure/GrpcStreamContent.cs index 4ed0b78b8..af327218b 100644 --- a/test/FunctionalTests/Infrastructure/GrpcStreamContent.cs +++ b/test/FunctionalTests/Infrastructure/GrpcStreamContent.cs @@ -35,7 +35,7 @@ public GrpcStreamContent(Stream content, string contentType = GrpcProtocolConsta _content = content; } - protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) + protected override Task SerializeToStreamAsync(Stream stream, TransportContext? context) { return _content.CopyToAsync(stream); } diff --git a/test/FunctionalTests/Infrastructure/HttpResponseMessageExtensions.cs b/test/FunctionalTests/Infrastructure/HttpResponseMessageExtensions.cs index 41fb5c625..0ffdc50d7 100644 --- a/test/FunctionalTests/Infrastructure/HttpResponseMessageExtensions.cs +++ b/test/FunctionalTests/Infrastructure/HttpResponseMessageExtensions.cs @@ -36,7 +36,7 @@ internal static class HttpResponseMessageExtensions public static void AssertIsSuccessfulGrpcRequest(this HttpResponseMessage response, string contentType = GrpcProtocolConstants.GrpcContentType) { Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); - Assert.AreEqual(contentType, response.Content.Headers.ContentType.MediaType); + Assert.AreEqual(contentType, response.Content?.Headers?.ContentType?.MediaType); } public static async Task GetSuccessfulGrpcMessageAsync(this HttpResponseMessage response, string contentType = GrpcProtocolConstants.GrpcContentType) where T : class, IMessage, new() diff --git a/test/FunctionalTests/Infrastructure/PushStreamContent.cs b/test/FunctionalTests/Infrastructure/PushStreamContent.cs index 401181d47..b560af339 100644 --- a/test/FunctionalTests/Infrastructure/PushStreamContent.cs +++ b/test/FunctionalTests/Infrastructure/PushStreamContent.cs @@ -36,7 +36,7 @@ public PushStreamContent(Func onStreamAvailable, MediaTypeHeaderVa Headers.ContentType = mediaType ?? new MediaTypeHeaderValue(GrpcProtocolConstants.GrpcContentType); } - protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) + protected override Task SerializeToStreamAsync(Stream stream, TransportContext? context) { return _onStreamAvailable(stream); } diff --git a/test/FunctionalTests/Infrastructure/StreamingContent.cs b/test/FunctionalTests/Infrastructure/StreamingContent.cs index bf50ea742..84010aa17 100644 --- a/test/FunctionalTests/Infrastructure/StreamingContent.cs +++ b/test/FunctionalTests/Infrastructure/StreamingContent.cs @@ -38,7 +38,7 @@ public StreamingContent(MediaTypeHeaderValue? mediaType = null) Headers.ContentType = mediaType ?? new MediaTypeHeaderValue(GrpcProtocolConstants.GrpcContentType); } - protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) + protected override Task SerializeToStreamAsync(Stream stream, TransportContext? context) { _streamTcs.TrySetResult(stream); return _contentTcs.Task; diff --git a/test/FunctionalTests/Server/CompressionTests.cs b/test/FunctionalTests/Server/CompressionTests.cs index 7f0195af4..9295cfcc3 100644 --- a/test/FunctionalTests/Server/CompressionTests.cs +++ b/test/FunctionalTests/Server/CompressionTests.cs @@ -175,12 +175,12 @@ async Task ServerStreamingEnableCompression(HelloRequest request, IServerStreamW ReadResult readResult; - readResult = await pipeReader.ReadAsync(); + readResult = await pipeReader.ReadAsync().AsTask().DefaultTimeout(); Assert.AreEqual(1, readResult.Buffer.FirstSpan[0]); // Message is compressed var greeting1 = await MessageHelpers.AssertReadStreamMessageAsync(pipeReader, "gzip").DefaultTimeout(); Assert.AreEqual($"Hello 1", greeting1!.Message); - readResult = await pipeReader.ReadAsync(); + readResult = await pipeReader.ReadAsync().AsTask().DefaultTimeout(); Assert.AreEqual(0, readResult.Buffer.FirstSpan[0]); // Message is uncompressed var greeting2 = await MessageHelpers.AssertReadStreamMessageAsync(pipeReader, "gzip").DefaultTimeout(); Assert.AreEqual($"Hello 2", greeting2!.Message); diff --git a/test/FunctionalTests/Server/DeadlineTests.cs b/test/FunctionalTests/Server/DeadlineTests.cs index a8345ab5b..f8fca32c0 100644 --- a/test/FunctionalTests/Server/DeadlineTests.cs +++ b/test/FunctionalTests/Server/DeadlineTests.cs @@ -412,7 +412,7 @@ await TestHelpers.AssertIsTrueRetryAsync(() => (r.Exception!.Message == "Cannot write message after request is complete." || r.Exception!.Message == "Writing is not allowed after writer was completed.")); return errorLogged; - }, "Expected error not thrown."); + }, "Expected error not thrown.").DefaultTimeout(); await TestHelpers.AssertIsTrueRetryAsync( () => HasLog(LogLevel.Trace, "DeadlineStopped", "Request deadline stopped."), diff --git a/test/FunctionalTests/Server/UnaryMethodTests.cs b/test/FunctionalTests/Server/UnaryMethodTests.cs index 23bd1ad1c..e86f52c39 100644 --- a/test/FunctionalTests/Server/UnaryMethodTests.cs +++ b/test/FunctionalTests/Server/UnaryMethodTests.cs @@ -329,7 +329,7 @@ static Task ReturnContextInfoInTrailers(Empty request, ServerCallContext Assert.IsTrue(Guid.TryParse(methodName, out var _)); Assert.IsTrue(response.TrailingHeaders.TryGetValues("Test-Peer", out _)); - Assert.AreEqual(Fixture.Client.BaseAddress.Authority, response.TrailingHeaders.GetValues("Test-Host").Single()); + Assert.AreEqual(Fixture.Client.BaseAddress!.Authority, response.TrailingHeaders.GetValues("Test-Host").Single()); } [Test] diff --git a/test/FunctionalTests/TestServer/FunctionalTestBase.cs b/test/FunctionalTests/TestServer/FunctionalTestBase.cs index 11aa247dd..a94897fe8 100644 --- a/test/FunctionalTests/TestServer/FunctionalTestBase.cs +++ b/test/FunctionalTests/TestServer/FunctionalTestBase.cs @@ -39,7 +39,7 @@ public class FunctionalTestBase protected GrpcChannel CreateChannel() { - return GrpcChannel.ForAddress(Fixture.Client.BaseAddress, new GrpcChannelOptions + return GrpcChannel.ForAddress(Fixture.Client.BaseAddress!, new GrpcChannelOptions { LoggerFactory = LoggerFactory, HttpClient = Fixture.Client diff --git a/test/FunctionalTests/TestServer/TesterServiceTests.cs b/test/FunctionalTests/TestServer/TesterServiceTests.cs index 3982a7301..3001dd4ac 100644 --- a/test/FunctionalTests/TestServer/TesterServiceTests.cs +++ b/test/FunctionalTests/TestServer/TesterServiceTests.cs @@ -150,9 +150,9 @@ public async Task ServerStreamingTest_Throw() using var call = client.SayHelloServerStreamingError(new HelloRequest { Name = "Joe" }); // Assert - Assert.IsTrue(await call.ResponseStream.MoveNext()); + Assert.IsTrue(await call.ResponseStream.MoveNext().DefaultTimeout()); - var ex = await ExceptionAssert.ThrowsAsync(() => call.ResponseStream.MoveNext()); + var ex = await ExceptionAssert.ThrowsAsync(() => call.ResponseStream.MoveNext()).DefaultTimeout(); Assert.AreEqual(StatusCode.NotFound, ex.StatusCode); } diff --git a/test/FunctionalTests/Web/Client/AuthTests.cs b/test/FunctionalTests/Web/Client/AuthTests.cs index a1eccb2fc..2f194ffd5 100644 --- a/test/FunctionalTests/Web/Client/AuthTests.cs +++ b/test/FunctionalTests/Web/Client/AuthTests.cs @@ -60,7 +60,7 @@ public async Task SendUnauthenticatedRequest_UnauthenticatedErrorResponse() // Arrage var httpClient = CreateGrpcWebClient(); - var channel = GrpcChannel.ForAddress(httpClient.BaseAddress, new GrpcChannelOptions + var channel = GrpcChannel.ForAddress(httpClient.BaseAddress!, new GrpcChannelOptions { HttpClient = httpClient, LoggerFactory = LoggerFactory diff --git a/test/FunctionalTests/Web/Client/IssueTests.cs b/test/FunctionalTests/Web/Client/IssueTests.cs index 1f877ad95..10a7bdfc8 100644 --- a/test/FunctionalTests/Web/Client/IssueTests.cs +++ b/test/FunctionalTests/Web/Client/IssueTests.cs @@ -20,6 +20,7 @@ using Google.Protobuf; using Grpc.AspNetCore.FunctionalTests.Infrastructure; using Grpc.Net.Client; +using Grpc.Tests.Shared; using Issue; using NUnit.Framework; @@ -43,7 +44,7 @@ public async Task SendLargeRequest_SuccessResponse() { // Arrage var httpClient = CreateGrpcWebClient(); - var channel = GrpcChannel.ForAddress(httpClient.BaseAddress, new GrpcChannelOptions + var channel = GrpcChannel.ForAddress(httpClient.BaseAddress!, new GrpcChannelOptions { HttpClient = httpClient, LoggerFactory = LoggerFactory @@ -59,7 +60,7 @@ public async Task SendLargeRequest_SuccessResponse() } // Act - var response = await client.GetLibraryAsync(request); + var response = await client.GetLibraryAsync(request).ResponseAsync.DefaultTimeout(); // Assert Assert.AreEqual("admin", response.UserId); diff --git a/test/FunctionalTests/Web/Client/ServerStreamingMethodTests.cs b/test/FunctionalTests/Web/Client/ServerStreamingMethodTests.cs index b7658604a..bbcf9dde6 100644 --- a/test/FunctionalTests/Web/Client/ServerStreamingMethodTests.cs +++ b/test/FunctionalTests/Web/Client/ServerStreamingMethodTests.cs @@ -48,7 +48,7 @@ public async Task SendValidRequest_StreamedContentReturned() { // Arrage var httpClient = CreateGrpcWebClient(); - var channel = GrpcChannel.ForAddress(httpClient.BaseAddress, new GrpcChannelOptions + var channel = GrpcChannel.ForAddress(httpClient.BaseAddress!, new GrpcChannelOptions { HttpClient = httpClient, LoggerFactory = LoggerFactory @@ -85,7 +85,7 @@ public async Task SendValidRequest_ServerAbort_ClientThrowsAbortException() { // Arrage var httpClient = CreateGrpcWebClient(); - var channel = GrpcChannel.ForAddress(httpClient.BaseAddress, new GrpcChannelOptions + var channel = GrpcChannel.ForAddress(httpClient.BaseAddress!, new GrpcChannelOptions { HttpClient = httpClient, LoggerFactory = LoggerFactory @@ -105,7 +105,7 @@ public async Task SendValidRequest_ServerAbort_ClientThrowsAbortException() Assert.IsTrue(await call.ResponseStream.MoveNext(CancellationToken.None).DefaultTimeout()); Assert.AreEqual("test", call.ResponseStream.Current.Message); - var ex = await ExceptionAssert.ThrowsAsync(() => call.ResponseStream.MoveNext(CancellationToken.None)); + var ex = await ExceptionAssert.ThrowsAsync(() => call.ResponseStream.MoveNext(CancellationToken.None)).DefaultTimeout(); Assert.AreEqual(StatusCode.Aborted, ex.StatusCode); Assert.AreEqual("Aborted from server side.", ex.Status.Detail); @@ -125,7 +125,7 @@ public async Task SendValidRequest_ClientAbort_ClientThrowsCancelledException() { // Arrage var httpClient = CreateGrpcWebClient(); - var channel = GrpcChannel.ForAddress(httpClient.BaseAddress, new GrpcChannelOptions + var channel = GrpcChannel.ForAddress(httpClient.BaseAddress!, new GrpcChannelOptions { HttpClient = httpClient, LoggerFactory = LoggerFactory @@ -148,7 +148,7 @@ public async Task SendValidRequest_ClientAbort_ClientThrowsCancelledException() cts.Cancel(); - var ex = await ExceptionAssert.ThrowsAsync(() => call.ResponseStream.MoveNext(CancellationToken.None)); + var ex = await ExceptionAssert.ThrowsAsync(() => call.ResponseStream.MoveNext(CancellationToken.None)).DefaultTimeout(); Assert.AreEqual(StatusCode.Cancelled, ex.StatusCode); Assert.AreEqual("Call canceled by the client.", ex.Status.Detail); diff --git a/test/FunctionalTests/Web/Client/TrailerMetadataTests.cs b/test/FunctionalTests/Web/Client/TrailerMetadataTests.cs index 3ccb0e5ff..54d0f004e 100644 --- a/test/FunctionalTests/Web/Client/TrailerMetadataTests.cs +++ b/test/FunctionalTests/Web/Client/TrailerMetadataTests.cs @@ -22,6 +22,7 @@ using Greet; using Grpc.AspNetCore.FunctionalTests.Infrastructure; using Grpc.Core; +using Grpc.Tests.Shared; using NUnit.Framework; namespace Grpc.AspNetCore.FunctionalTests.Web.Client @@ -58,7 +59,7 @@ Task LargeTrailer(HelloRequest request, ServerCallContext context) // Act var call = client.UnaryCall(new HelloRequest()); - await call; + await call.ResponseAsync.DefaultTimeout(); // Assert var trailers = call.GetTrailers(); @@ -100,7 +101,7 @@ Task LargeTrailer(HelloRequest request, ServerCallContext context) // Act var call = client.UnaryCall(new HelloRequest()); - await call; + await call.ResponseAsync.DefaultTimeout(); // Assert var trailers = call.GetTrailers(); diff --git a/test/FunctionalTests/Web/Client/UnaryMethodTests.cs b/test/FunctionalTests/Web/Client/UnaryMethodTests.cs index 459afdf8a..8a15dbe75 100644 --- a/test/FunctionalTests/Web/Client/UnaryMethodTests.cs +++ b/test/FunctionalTests/Web/Client/UnaryMethodTests.cs @@ -43,7 +43,7 @@ public async Task SendValidRequest_SuccessResponse() { // Arrage var httpClient = CreateGrpcWebClient(); - var channel = GrpcChannel.ForAddress(httpClient.BaseAddress, new GrpcChannelOptions + var channel = GrpcChannel.ForAddress(httpClient.BaseAddress!, new GrpcChannelOptions { HttpClient = httpClient, LoggerFactory = LoggerFactory diff --git a/test/FunctionalTests/Web/GrpcWebFunctionalTestBase.cs b/test/FunctionalTests/Web/GrpcWebFunctionalTestBase.cs index e56c84e4a..a5f6e1e9f 100644 --- a/test/FunctionalTests/Web/GrpcWebFunctionalTestBase.cs +++ b/test/FunctionalTests/Web/GrpcWebFunctionalTestBase.cs @@ -64,7 +64,7 @@ protected HttpClient CreateGrpcWebClient() protected GrpcChannel CreateGrpcWebChannel() { var httpClient = CreateGrpcWebClient(); - var channel = GrpcChannel.ForAddress(httpClient.BaseAddress, new GrpcChannelOptions + var channel = GrpcChannel.ForAddress(httpClient.BaseAddress!, new GrpcChannelOptions { HttpClient = httpClient, LoggerFactory = LoggerFactory diff --git a/test/FunctionalTests/Web/Server/DeadlineTests.cs b/test/FunctionalTests/Web/Server/DeadlineTests.cs index 4ddd3e9f5..0136d180e 100644 --- a/test/FunctionalTests/Web/Server/DeadlineTests.cs +++ b/test/FunctionalTests/Web/Server/DeadlineTests.cs @@ -214,7 +214,7 @@ await TestHelpers.AssertIsTrueRetryAsync(() => (r.Exception!.Message == "Cannot write message after request is complete." || r.Exception!.Message == "Writing is not allowed after writer was completed.")); return errorLogged; - }, "Expected error not thrown."); + }, "Expected error not thrown.").DefaultTimeout(); } } } diff --git a/test/FunctionalTests/Web/Server/UnaryMethodTests.cs b/test/FunctionalTests/Web/Server/UnaryMethodTests.cs index e9eb355b2..8cb090cca 100644 --- a/test/FunctionalTests/Web/Server/UnaryMethodTests.cs +++ b/test/FunctionalTests/Web/Server/UnaryMethodTests.cs @@ -62,10 +62,10 @@ public async Task SendValidRequest_SuccessResponse() // Assert response.AssertIsSuccessfulGrpcRequest(); - var s = await response.Content.ReadAsStreamAsync(); + var s = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var reader = PipeReader.Create(s); - var message = await MessageHelpers.AssertReadStreamMessageAsync(reader); + var message = await MessageHelpers.AssertReadStreamMessageAsync(reader).DefaultTimeout(); Assert.AreEqual("test", message!.Message); response.AssertTrailerStatus(); @@ -92,10 +92,10 @@ public async Task SendValidRequest_ServerAbort_AbortResponse() // Assert response.AssertIsSuccessfulGrpcRequest(); - var s = await response.Content.ReadAsStreamAsync(); + var s = await response.Content.ReadAsStreamAsync().DefaultTimeout(); var reader = PipeReader.Create(s); - var readResult = await reader.ReadAsync(); + var readResult = await reader.ReadAsync().AsTask().DefaultTimeout(); Assert.AreEqual(0, readResult.Buffer.Length); Assert.IsTrue(readResult.IsCompleted); diff --git a/test/Grpc.AspNetCore.Server.ClientFactory.Tests/Grpc.AspNetCore.Server.ClientFactory.Tests.csproj b/test/Grpc.AspNetCore.Server.ClientFactory.Tests/Grpc.AspNetCore.Server.ClientFactory.Tests.csproj index 91f7be2d2..e041ffdcc 100644 --- a/test/Grpc.AspNetCore.Server.ClientFactory.Tests/Grpc.AspNetCore.Server.ClientFactory.Tests.csproj +++ b/test/Grpc.AspNetCore.Server.ClientFactory.Tests/Grpc.AspNetCore.Server.ClientFactory.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + netcoreapp3.1;net5.0 false diff --git a/test/Grpc.AspNetCore.Server.Tests/CallHandlerTests.cs b/test/Grpc.AspNetCore.Server.Tests/CallHandlerTests.cs index b93ed8045..4e6f19cd7 100644 --- a/test/Grpc.AspNetCore.Server.Tests/CallHandlerTests.cs +++ b/test/Grpc.AspNetCore.Server.Tests/CallHandlerTests.cs @@ -116,7 +116,7 @@ public async Task ContentTypeValidation_InvalidContentType_FailureLogged() // Assert var log = testSink.Writes.SingleOrDefault(w => w.EventId.Name == "UnsupportedRequestContentType"); Assert.IsNotNull(log); - Assert.AreEqual("Request content-type of 'text/plain' is not supported.", log.Message); + Assert.AreEqual("Request content-type of 'text/plain' is not supported.", log!.Message); } [Test] @@ -154,7 +154,7 @@ public async Task ProtocolValidation_InvalidProtocol_FailureLogged() // Assert var log = testSink.Writes.SingleOrDefault(w => w.EventId.Name == "UnsupportedRequestProtocol"); Assert.IsNotNull(log); - Assert.AreEqual("Request protocol of 'HTTP/1.1' is not supported.", log.Message); + Assert.AreEqual("Request protocol of 'HTTP/1.1' is not supported.", log!.Message); } [Test] diff --git a/test/Grpc.AspNetCore.Server.Tests/Grpc.AspNetCore.Server.Tests.csproj b/test/Grpc.AspNetCore.Server.Tests/Grpc.AspNetCore.Server.Tests.csproj index cf82caa68..ae7ba9fb7 100644 --- a/test/Grpc.AspNetCore.Server.Tests/Grpc.AspNetCore.Server.Tests.csproj +++ b/test/Grpc.AspNetCore.Server.Tests/Grpc.AspNetCore.Server.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + netcoreapp3.1;net5.0 false diff --git a/test/Grpc.AspNetCore.Server.Tests/GrpcEndpointRouteBuilderExtensionsTests.cs b/test/Grpc.AspNetCore.Server.Tests/GrpcEndpointRouteBuilderExtensionsTests.cs index 88c8ab497..eb183ff37 100644 --- a/test/Grpc.AspNetCore.Server.Tests/GrpcEndpointRouteBuilderExtensionsTests.cs +++ b/test/Grpc.AspNetCore.Server.Tests/GrpcEndpointRouteBuilderExtensionsTests.cs @@ -110,13 +110,13 @@ private void BindServiceCore() where TService : class var routeEndpoint1 = (RouteEndpoint)endpoints[0]; Assert.AreEqual("/greet.Greeter/SayHello", routeEndpoint1.RoutePattern.RawText); - Assert.AreEqual("POST", routeEndpoint1.Metadata.GetMetadata().HttpMethods.Single()); - Assert.AreEqual("/greet.Greeter/SayHello", routeEndpoint1.Metadata.GetMetadata().Method.FullName); + Assert.AreEqual("POST", routeEndpoint1.Metadata.GetMetadata()?.HttpMethods.Single()); + Assert.AreEqual("/greet.Greeter/SayHello", routeEndpoint1.Metadata.GetMetadata()?.Method.FullName); var routeEndpoint2 = (RouteEndpoint)endpoints[1]; Assert.AreEqual("/greet.Greeter/SayHellos", routeEndpoint2.RoutePattern.RawText); - Assert.AreEqual("POST", routeEndpoint2.Metadata.GetMetadata().HttpMethods.Single()); - Assert.AreEqual("/greet.Greeter/SayHellos", routeEndpoint2.Metadata.GetMetadata().Method.FullName); + Assert.AreEqual("POST", routeEndpoint2.Metadata.GetMetadata()?.HttpMethods.Single()); + Assert.AreEqual("/greet.Greeter/SayHellos", routeEndpoint2.Metadata.GetMetadata()?.Method.FullName); } [Test] @@ -242,11 +242,11 @@ public void MapGrpcService_ServiceWithAttribute_AddsAttributesAsMetadata() var routeEndpoint1 = (RouteEndpoint)endpoints[0]; Assert.AreEqual("/greet.Greeter/SayHello", routeEndpoint1.RoutePattern.RawText); - Assert.AreEqual("Method", routeEndpoint1.Metadata.GetMetadata().Value); + Assert.AreEqual("Method", routeEndpoint1.Metadata.GetMetadata()?.Value); var routeEndpoint2 = (RouteEndpoint)endpoints[1]; Assert.AreEqual("/greet.Greeter/SayHellos", routeEndpoint2.RoutePattern.RawText); - Assert.AreEqual("Class", routeEndpoint2.Metadata.GetMetadata().Value); + Assert.AreEqual("Class", routeEndpoint2.Metadata.GetMetadata()?.Value); } [Test] @@ -278,7 +278,7 @@ public void MapGrpcService_ServiceWithAttributeAndBuilder_TestMetdataPrecedence( Assert.AreEqual("Method", orderedMetadata[1].Value); Assert.AreEqual("Builder", orderedMetadata[2].Value); - Assert.AreEqual("Builder", routeEndpoint1.Metadata.GetMetadata().Value); + Assert.AreEqual("Builder", routeEndpoint1.Metadata.GetMetadata()?.Value); } [Test] diff --git a/test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs b/test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs index 988778023..1d41e38c1 100644 --- a/test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs +++ b/test/Grpc.AspNetCore.Server.Tests/HttpContextServerCallContextTests.cs @@ -670,7 +670,7 @@ public void Initialize_MethodInPath_SetsMethodOnActivity() context.Initialize(); // Assert - Assert.AreEqual("/Package.Service/Method", Activity.Current.Tags.Single(t => t.Key == GrpcServerConstants.ActivityMethodTag).Value); + Assert.AreEqual("/Package.Service/Method", Activity.Current!.Tags.Single(t => t.Key == GrpcServerConstants.ActivityMethodTag).Value); } } @@ -691,7 +691,7 @@ public void Initialize_MethodInPathAndChildActivity_SetsMethodOnActivity() } // Assert - Assert.AreEqual("/Package.Service/Method", Activity.Current.Tags.Single(t => t.Key == GrpcServerConstants.ActivityMethodTag).Value); + Assert.AreEqual("/Package.Service/Method", Activity.Current?.Tags.Single(t => t.Key == GrpcServerConstants.ActivityMethodTag).Value); } } @@ -710,7 +710,7 @@ public async Task EndCallAsync_StatusSet_SetsStatusOnActivity() await context.EndCallAsync(); // Assert - Assert.AreEqual("8", Activity.Current.Tags.Single(t => t.Key == GrpcServerConstants.ActivityStatusCodeTag).Value); + Assert.AreEqual("8", Activity.Current!.Tags.Single(t => t.Key == GrpcServerConstants.ActivityStatusCodeTag).Value); } } @@ -729,7 +729,7 @@ public async Task ProcessHandlerErrorAsync_Exception_SetsStatusOnActivity() await context.ProcessHandlerErrorAsync(new Exception(), "MethodName"); // Assert - Assert.AreEqual("2", Activity.Current.Tags.Single(t => t.Key == GrpcServerConstants.ActivityStatusCodeTag).Value); + Assert.AreEqual("2", Activity.Current!.Tags.Single(t => t.Key == GrpcServerConstants.ActivityStatusCodeTag).Value); } } diff --git a/test/Grpc.AspNetCore.Server.Tests/Infrastructure/TestHttpResponseFeature.cs b/test/Grpc.AspNetCore.Server.Tests/Infrastructure/TestHttpResponseFeature.cs index 38bcbeff4..8c230bea6 100644 --- a/test/Grpc.AspNetCore.Server.Tests/Infrastructure/TestHttpResponseFeature.cs +++ b/test/Grpc.AspNetCore.Server.Tests/Infrastructure/TestHttpResponseFeature.cs @@ -33,7 +33,7 @@ public class TestHttpResponseFeature : IHttpResponseFeature public Stream Body { get; set; } = Stream.Null; public bool HasStarted { get; } public IHeaderDictionary Headers { get; set; } = new HeaderDictionary(); - public string ReasonPhrase { get; set; } = string.Empty; + public string? ReasonPhrase { get; set; } = string.Empty; public int StatusCode { get; set; } public void OnCompleted(Func callback, object state) diff --git a/test/Grpc.AspNetCore.Server.Tests/Infrastructure/TestPipeReader.cs b/test/Grpc.AspNetCore.Server.Tests/Infrastructure/TestPipeReader.cs index 32f18cdd1..8cb61ceb9 100644 --- a/test/Grpc.AspNetCore.Server.Tests/Infrastructure/TestPipeReader.cs +++ b/test/Grpc.AspNetCore.Server.Tests/Infrastructure/TestPipeReader.cs @@ -62,7 +62,7 @@ public override void Complete(Exception? exception = null) } [Obsolete] - public override void OnWriterCompleted(Action callback, object state) + public override void OnWriterCompleted(Action callback, object state) { _pipeReader.OnWriterCompleted(callback, state); } diff --git a/test/Grpc.AspNetCore.Server.Tests/Reflection/ReflectionGrpcServiceActivatorTests.cs b/test/Grpc.AspNetCore.Server.Tests/Reflection/ReflectionGrpcServiceActivatorTests.cs index 539c01495..a7d0f2a2d 100644 --- a/test/Grpc.AspNetCore.Server.Tests/Reflection/ReflectionGrpcServiceActivatorTests.cs +++ b/test/Grpc.AspNetCore.Server.Tests/Reflection/ReflectionGrpcServiceActivatorTests.cs @@ -115,7 +115,7 @@ public TestEndpointRouteBuilder() } public ICollection DataSources { get; } - public IServiceProvider? ServiceProvider { get; set; } + public IServiceProvider ServiceProvider { get; set; } = default!; public IApplicationBuilder CreateApplicationBuilder() { diff --git a/test/Grpc.Net.Client.Tests/AsyncClientStreamingCallTests.cs b/test/Grpc.Net.Client.Tests/AsyncClientStreamingCallTests.cs index 0a5c1fa45..57e0e1f1b 100644 --- a/test/Grpc.Net.Client.Tests/AsyncClientStreamingCallTests.cs +++ b/test/Grpc.Net.Client.Tests/AsyncClientStreamingCallTests.cs @@ -69,7 +69,7 @@ public async Task AsyncClientStreamingCall_Success_HttpRequestMessagePopulated() Assert.AreEqual(new Version(2, 0), httpRequestMessage!.Version); Assert.AreEqual(HttpMethod.Post, httpRequestMessage.Method); Assert.AreEqual(new Uri("https://localhost/ServiceName/MethodName"), httpRequestMessage.RequestUri); - Assert.AreEqual(new MediaTypeHeaderValue("application/grpc"), httpRequestMessage.Content.Headers.ContentType); + Assert.AreEqual(new MediaTypeHeaderValue("application/grpc"), httpRequestMessage.Content?.Headers?.ContentType); } [Test] @@ -80,7 +80,7 @@ public async Task AsyncClientStreamingCall_Success_RequestContentSent() var httpClient = ClientTestHelpers.CreateTestClient(async request => { - content = (PushStreamContent)request.Content; + content = (PushStreamContent)request.Content!; await content.PushComplete.DefaultTimeout(); HelloReply reply = new HelloReply diff --git a/test/Grpc.Net.Client.Tests/AsyncDuplexStreamingCallTests.cs b/test/Grpc.Net.Client.Tests/AsyncDuplexStreamingCallTests.cs index 57e2b8bde..7a66622b4 100644 --- a/test/Grpc.Net.Client.Tests/AsyncDuplexStreamingCallTests.cs +++ b/test/Grpc.Net.Client.Tests/AsyncDuplexStreamingCallTests.cs @@ -96,7 +96,7 @@ public async Task AsyncDuplexStreamingCall_MessagesStreamed_MessagesReceived() var httpClient = ClientTestHelpers.CreateTestClient(async request => { - content = (PushStreamContent)request.Content; + content = (PushStreamContent)request.Content!; await content.PushComplete.DefaultTimeout(); return ResponseUtils.CreateResponse(HttpStatusCode.OK, new StreamContent(streamContent)); diff --git a/test/Grpc.Net.Client.Tests/AsyncUnaryCallTests.cs b/test/Grpc.Net.Client.Tests/AsyncUnaryCallTests.cs index 0844f704a..a5b6c6106 100644 --- a/test/Grpc.Net.Client.Tests/AsyncUnaryCallTests.cs +++ b/test/Grpc.Net.Client.Tests/AsyncUnaryCallTests.cs @@ -67,18 +67,18 @@ public async Task AsyncUnaryCall_Success_HttpRequestMessagePopulated() Assert.AreEqual(new Version(2, 0), httpRequestMessage!.Version); Assert.AreEqual(HttpMethod.Post, httpRequestMessage.Method); Assert.AreEqual(new Uri("https://localhost/ServiceName/MethodName"), httpRequestMessage.RequestUri); - Assert.AreEqual(new MediaTypeHeaderValue("application/grpc"), httpRequestMessage.Content.Headers.ContentType); + Assert.AreEqual(new MediaTypeHeaderValue("application/grpc"), httpRequestMessage.Content?.Headers?.ContentType); Assert.AreEqual(GrpcProtocolConstants.TEHeaderValue, httpRequestMessage.Headers.TE.Single().Value); Assert.AreEqual("identity,gzip", httpRequestMessage.Headers.GetValues(GrpcProtocolConstants.MessageAcceptEncodingHeader).Single()); - var userAgent = httpRequestMessage.Headers.UserAgent.Single(); - Assert.AreEqual("grpc-dotnet", userAgent.Product.Name); - Assert.IsTrue(!string.IsNullOrEmpty(userAgent.Product.Version)); + var userAgent = httpRequestMessage.Headers.UserAgent.Single()!; + Assert.AreEqual("grpc-dotnet", userAgent.Product?.Name); + Assert.IsTrue(!string.IsNullOrEmpty(userAgent.Product?.Version)); // Santity check that the user agent doesn't have the git hash in it and isn't too long. // Sending a long user agent with each call has performance implications. - Assert.IsTrue(!userAgent.Product.Version.Contains('+')); - Assert.IsTrue(userAgent.Product.Version.Length <= 10); + Assert.IsFalse(userAgent.Product!.Version!.Contains('+')); + Assert.IsTrue(userAgent.Product!.Version!.Length <= 10); } [Test] diff --git a/test/Grpc.Net.Client.Tests/CancellationTests.cs b/test/Grpc.Net.Client.Tests/CancellationTests.cs index bfa3c3663..bdc3e870f 100644 --- a/test/Grpc.Net.Client.Tests/CancellationTests.cs +++ b/test/Grpc.Net.Client.Tests/CancellationTests.cs @@ -143,7 +143,7 @@ private static HttpClientCallInvoker CreateTimedoutCallInvoker { - var content = (PushStreamContent)request.Content; + var content = (PushStreamContent)request.Content!; await content.PushComplete.DefaultTimeout(); return ResponseUtils.CreateResponse(HttpStatusCode.OK); diff --git a/test/Grpc.Net.Client.Tests/CompressionTests.cs b/test/Grpc.Net.Client.Tests/CompressionTests.cs index d732f742c..6f090c384 100644 --- a/test/Grpc.Net.Client.Tests/CompressionTests.cs +++ b/test/Grpc.Net.Client.Tests/CompressionTests.cs @@ -50,7 +50,7 @@ public async Task AsyncUnaryCall_UnknownCompressMetadataSentWithRequest_ThrowsEr { httpRequestMessage = request; - var requestStream = await request.Content.ReadAsStreamAsync(); + var requestStream = await request.Content!.ReadAsStreamAsync(); helloRequest = await StreamExtensions.ReadMessageAsync( requestStream, @@ -100,7 +100,7 @@ public async Task AsyncUnaryCall_CompressMetadataSentWithRequest_RequestMessageC { httpRequestMessage = request; - var requestData = await request.Content.ReadAsByteArrayAsync(); + var requestData = await request.Content!.ReadAsByteArrayAsync(); isRequestNotCompressed = requestData[0] == 0; helloRequest = await StreamExtensions.ReadMessageAsync( @@ -168,7 +168,7 @@ public async Task AsyncUnaryCall_CompressedResponse_ResponseMessageDecompressed( { httpRequestMessage = request; - var requestStream = await request.Content.ReadAsStreamAsync(); + var requestStream = await request.Content!.ReadAsStreamAsync(); helloRequest = await StreamExtensions.ReadMessageAsync( requestStream, @@ -215,7 +215,7 @@ public async Task AsyncUnaryCall_CompressedResponseWithUnknownEncoding_ErrorThro { httpRequestMessage = request; - var requestStream = await request.Content.ReadAsStreamAsync(); + var requestStream = await request.Content!.ReadAsStreamAsync(); helloRequest = await StreamExtensions.ReadMessageAsync( requestStream, @@ -265,7 +265,7 @@ public async Task AsyncClientStreamingCall_CompressMetadataSentWithRequest_Reque { httpRequestMessage = request; - var requestData = await request.Content.ReadAsByteArrayAsync(); + var requestData = await request.Content!.ReadAsByteArrayAsync(); var requestStream = new MemoryStream(requestData); isRequestNotCompressed1 = requestData[0] == 0; diff --git a/test/Grpc.Net.Client.Tests/DeadlineTests.cs b/test/Grpc.Net.Client.Tests/DeadlineTests.cs index b55aa8265..55d95bc4a 100644 --- a/test/Grpc.Net.Client.Tests/DeadlineTests.cs +++ b/test/Grpc.Net.Client.Tests/DeadlineTests.cs @@ -147,7 +147,7 @@ public async Task AsyncUnaryCall_SetVeryLargeDeadline_MaximumDeadlineTimeoutSent Assert.IsNotNull(httpRequestMessage); Assert.AreEqual("99999999S", httpRequestMessage!.Headers.GetValues(GrpcProtocolConstants.TimeoutHeader).Single()); - var s = testSink.Writes.SingleOrDefault(w => w.EventId.Name == "DeadlineTimeoutTooLong"); + var s = testSink.Writes.Single(w => w.EventId.Name == "DeadlineTimeoutTooLong"); Assert.AreEqual("Deadline timeout 2000.00:00:00 is above maximum allowed timeout of 99999999 seconds. Maximum timeout will be used.", s.Message); } @@ -193,7 +193,7 @@ public async Task AsyncClientStreamingCall_DeadlineDuringSend_ResponseThrowsDead // Arrange var httpClient = ClientTestHelpers.CreateTestClient(async request => { - var content = (PushStreamContent)request.Content; + var content = (PushStreamContent)request.Content!; await content.PushComplete.DefaultTimeout(); return ResponseUtils.CreateResponse(HttpStatusCode.OK); @@ -222,7 +222,7 @@ public async Task AsyncClientStreamingCall_DeadlineDuringSend_ThrowOperationCanc // Arrange var httpClient = ClientTestHelpers.CreateTestClient(async request => { - var content = (PushStreamContent)request.Content; + var content = (PushStreamContent)request.Content!; await content.PushComplete.DefaultTimeout(); return ResponseUtils.CreateResponse(HttpStatusCode.OK); @@ -459,7 +459,7 @@ public async Task AsyncClientStreamingCall_DeadlineLargerThanMaxTimerDueTime_Dea var httpClient = ClientTestHelpers.CreateTestClient(async request => { - var content = (PushStreamContent)request.Content; + var content = (PushStreamContent)request.Content!; await content.PushComplete.DefaultTimeout(); return ResponseUtils.CreateResponse(HttpStatusCode.OK); diff --git a/test/Grpc.Net.Client.Tests/DiagnosticsTests.cs b/test/Grpc.Net.Client.Tests/DiagnosticsTests.cs index b15448a97..f98359c5b 100644 --- a/test/Grpc.Net.Client.Tests/DiagnosticsTests.cs +++ b/test/Grpc.Net.Client.Tests/DiagnosticsTests.cs @@ -49,7 +49,7 @@ public async Task Dispose_StartCallInTask_ActivityPreserved() // Act & Assert var a = new Activity("a").Start(); - Assert.AreEqual("a", Activity.Current.OperationName); + Assert.AreEqual("a", Activity.Current!.OperationName); var call = await Task.Run(() => { @@ -84,10 +84,10 @@ public void DiagnosticListener_MakeCall_ActivityWritten() }); var invoker = HttpClientCallInvokerFactory.Create(httpClient); - var result = new List>(); + var result = new List>(); // Act - using (GrpcDiagnostics.DiagnosticListener.Subscribe(new ObserverToList>(result))) + using (GrpcDiagnostics.DiagnosticListener.Subscribe(new ObserverToList>(result))) { var c = invoker.AsyncDuplexStreamingCall(ClientTestHelpers.ServiceMethod, string.Empty, new CallOptions()); c.Dispose(); @@ -96,10 +96,10 @@ public void DiagnosticListener_MakeCall_ActivityWritten() // Assert Assert.AreEqual(2, result.Count); Assert.AreEqual(GrpcDiagnostics.ActivityStartKey, result[0].Key); - Assert.AreEqual(requestMessage, GetValueFromAnonymousType(result[0].Value, "Request")); + Assert.AreEqual(requestMessage, GetValueFromAnonymousType(result[0].Value!, "Request")); Assert.AreEqual(GrpcDiagnostics.ActivityStopKey, result[1].Key); - Assert.AreEqual(requestMessage, GetValueFromAnonymousType(result[1].Value, "Request")); - Assert.AreEqual(responseMessage, GetValueFromAnonymousType(result[1].Value, "Response")); + Assert.AreEqual(requestMessage, GetValueFromAnonymousType(result[1].Value!, "Request")); + Assert.AreEqual(responseMessage, GetValueFromAnonymousType(result[1].Value!, "Response")); } [Test] @@ -117,17 +117,17 @@ public void DiagnosticListener_MakeCall_ActivityHasNameAndDuration() string? activityName = null; TimeSpan? activityDurationOnStop = null; - Action> onDiagnosticMessage = (m) => + Action> onDiagnosticMessage = (m) => { if (m.Key == GrpcDiagnostics.ActivityStopKey) { - activityName = Activity.Current.OperationName; + activityName = Activity.Current!.OperationName; activityDurationOnStop = Activity.Current.Duration; } }; // Act - using (GrpcDiagnostics.DiagnosticListener.Subscribe(new ActionObserver>(onDiagnosticMessage))) + using (GrpcDiagnostics.DiagnosticListener.Subscribe(new ActionObserver>(onDiagnosticMessage))) { var c = invoker.AsyncDuplexStreamingCall(ClientTestHelpers.ServiceMethod, string.Empty, new CallOptions()); c.Dispose(); diff --git a/test/Grpc.Net.Client.Tests/GetTrailersTests.cs b/test/Grpc.Net.Client.Tests/GetTrailersTests.cs index 920e44739..55ed5fef8 100644 --- a/test/Grpc.Net.Client.Tests/GetTrailersTests.cs +++ b/test/Grpc.Net.Client.Tests/GetTrailersTests.cs @@ -240,7 +240,7 @@ public async Task AsyncClientStreamingCall_CompleteWriter_ReturnsTrailers() var httpClient = ClientTestHelpers.CreateTestClient(request => { - var content = (PushStreamContent)request.Content; + var content = (PushStreamContent)request.Content!; var stream = new SyncPointMemoryStream(); var response = ResponseUtils.CreateResponse(HttpStatusCode.OK, new StreamContent(stream)); diff --git a/test/Grpc.Net.Client.Tests/Grpc.Net.Client.Tests.csproj b/test/Grpc.Net.Client.Tests/Grpc.Net.Client.Tests.csproj index dccdbada3..0e7ded493 100644 --- a/test/Grpc.Net.Client.Tests/Grpc.Net.Client.Tests.csproj +++ b/test/Grpc.Net.Client.Tests/Grpc.Net.Client.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + netcoreapp3.1;net5.0 false true diff --git a/test/Grpc.Net.Client.Tests/HttpContentClientStreamReaderTests.cs b/test/Grpc.Net.Client.Tests/HttpContentClientStreamReaderTests.cs index fa8654b4d..8a6df1652 100644 --- a/test/Grpc.Net.Client.Tests/HttpContentClientStreamReaderTests.cs +++ b/test/Grpc.Net.Client.Tests/HttpContentClientStreamReaderTests.cs @@ -215,7 +215,7 @@ private static GrpcCall CreateGrpcCall(GrpcChannel cha private static GrpcChannel CreateChannel(HttpClient httpClient, ILoggerFactory? loggerFactory = null, bool? throwOperationCanceledOnCancellation = null) { return GrpcChannel.ForAddress( - httpClient.BaseAddress, + httpClient.BaseAddress!, new GrpcChannelOptions { HttpClient = httpClient, diff --git a/test/Grpc.Net.Client.Tests/Infrastructure/HttpClientCallInvokerFactory.cs b/test/Grpc.Net.Client.Tests/Infrastructure/HttpClientCallInvokerFactory.cs index 0245c8bf1..3f99d9900 100644 --- a/test/Grpc.Net.Client.Tests/Infrastructure/HttpClientCallInvokerFactory.cs +++ b/test/Grpc.Net.Client.Tests/Infrastructure/HttpClientCallInvokerFactory.cs @@ -40,7 +40,7 @@ public static HttpClientCallInvoker Create( }; configure?.Invoke(channelOptions); - var channel = GrpcChannel.ForAddress(httpClient.BaseAddress, channelOptions); + var channel = GrpcChannel.ForAddress(httpClient.BaseAddress!, channelOptions); channel.Clock = systemClock ?? SystemClock.Instance; if (disableClientDeadline != null) { diff --git a/test/Grpc.Net.Client.Tests/InterceptorTests.cs b/test/Grpc.Net.Client.Tests/InterceptorTests.cs index bd562ca0e..f61f6c0e8 100644 --- a/test/Grpc.Net.Client.Tests/InterceptorTests.cs +++ b/test/Grpc.Net.Client.Tests/InterceptorTests.cs @@ -122,7 +122,7 @@ public async Task Intercept_WrapClientStream_ClientStreamWrapperExecuted() var httpClient = ClientTestHelpers.CreateTestClient(async request => { - var requestContent = await request.Content.ReadAsStreamAsync(); + var requestContent = await request.Content!.ReadAsStreamAsync(); await requestContent.CopyToAsync(new MemoryStream()); var streamContent = await ClientTestHelpers.CreateResponseContent(new HelloReply { Message = "PASS" }).DefaultTimeout(); diff --git a/test/Grpc.Net.Client.Tests/LoggingTests.cs b/test/Grpc.Net.Client.Tests/LoggingTests.cs index 64452b052..e7d1f8bf6 100644 --- a/test/Grpc.Net.Client.Tests/LoggingTests.cs +++ b/test/Grpc.Net.Client.Tests/LoggingTests.cs @@ -40,7 +40,7 @@ public async Task AsyncUnaryCall_Success_LogToFactory() var httpClient = ClientTestHelpers.CreateTestClient(async request => { // Trigger request stream serialization - await request.Content.ReadAsStreamAsync().DefaultTimeout(); + await request.Content!.ReadAsStreamAsync().DefaultTimeout(); var streamContent = await ClientTestHelpers.CreateResponseContent(new HelloReply { diff --git a/test/Grpc.Net.Client.Tests/MaximumMessageSizeTests.cs b/test/Grpc.Net.Client.Tests/MaximumMessageSizeTests.cs index 7b5764d5b..d47499bfe 100644 --- a/test/Grpc.Net.Client.Tests/MaximumMessageSizeTests.cs +++ b/test/Grpc.Net.Client.Tests/MaximumMessageSizeTests.cs @@ -35,7 +35,7 @@ public class MaximumMessageSizeTests { private async Task HandleRequest(HttpRequestMessage request) { - var requestStream = await request.Content.ReadAsStreamAsync(); + var requestStream = await request.Content!.ReadAsStreamAsync(); var helloRequest = await StreamExtensions.ReadMessageAsync( requestStream, diff --git a/test/Grpc.Net.Client.Tests/SubdirectoryHandlerTests.cs b/test/Grpc.Net.Client.Tests/SubdirectoryHandlerTests.cs index 100882334..2b6f0aa05 100644 --- a/test/Grpc.Net.Client.Tests/SubdirectoryHandlerTests.cs +++ b/test/Grpc.Net.Client.Tests/SubdirectoryHandlerTests.cs @@ -82,7 +82,7 @@ public SubdirectoryHandler(HttpMessageHandler innerHandler, string subdirectory) protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { - var url = $"{request.RequestUri.Scheme}://{request.RequestUri.Host}{_subdirectory}{request.RequestUri.AbsolutePath}"; + var url = $"{request.RequestUri!.Scheme}://{request.RequestUri.Host}{_subdirectory}{request.RequestUri.AbsolutePath}"; request.RequestUri = new Uri(url, UriKind.Absolute); return base.SendAsync(request, cancellationToken); } diff --git a/test/Grpc.Net.Client.Tests/Web/GrpcWebHandlerTests.cs b/test/Grpc.Net.Client.Tests/Web/GrpcWebHandlerTests.cs index 0806cd037..09f70662b 100644 --- a/test/Grpc.Net.Client.Tests/Web/GrpcWebHandlerTests.cs +++ b/test/Grpc.Net.Client.Tests/Web/GrpcWebHandlerTests.cs @@ -143,7 +143,7 @@ protected override Task SendAsync(HttpRequestMessage reques RequestVersion = request.Version; if (request.Properties.TryGetValue(GrpcWebHandler.WebAssemblyEnableStreamingResponseKey, out var enableStreaming)) { - WebAssemblyEnableStreamingResponse = (bool)enableStreaming; + WebAssemblyEnableStreamingResponse = (bool)enableStreaming!; } return Task.FromResult(new HttpResponseMessage() diff --git a/test/Grpc.Net.Client.Tests/Web/GrpcWebResponseContentTests.cs b/test/Grpc.Net.Client.Tests/Web/GrpcWebResponseContentTests.cs index 1fa5ef6fd..a31817eea 100644 --- a/test/Grpc.Net.Client.Tests/Web/GrpcWebResponseContentTests.cs +++ b/test/Grpc.Net.Client.Tests/Web/GrpcWebResponseContentTests.cs @@ -52,7 +52,7 @@ private class TestHttpContent : HttpContent { public bool Disposed { get; private set; } - protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) + protected override Task SerializeToStreamAsync(Stream stream, TransportContext? context) { throw new System.NotImplementedException(); } diff --git a/test/Grpc.Net.ClientFactory.Tests/DefaultGrpcClientFactoryTests.cs b/test/Grpc.Net.ClientFactory.Tests/DefaultGrpcClientFactoryTests.cs index 907b491dd..2f4f4f7f4 100644 --- a/test/Grpc.Net.ClientFactory.Tests/DefaultGrpcClientFactoryTests.cs +++ b/test/Grpc.Net.ClientFactory.Tests/DefaultGrpcClientFactoryTests.cs @@ -246,7 +246,7 @@ public TestHttpContextAccessor(HttpContext httpContext) HttpContext = httpContext; } - public HttpContext HttpContext { get; set; } + public HttpContext? HttpContext { get; set; } } public class TestLoggerProvider : ILoggerProvider diff --git a/test/Grpc.Net.ClientFactory.Tests/Grpc.Net.ClientFactory.Tests.csproj b/test/Grpc.Net.ClientFactory.Tests/Grpc.Net.ClientFactory.Tests.csproj index 833566c0f..42f529cf6 100644 --- a/test/Grpc.Net.ClientFactory.Tests/Grpc.Net.ClientFactory.Tests.csproj +++ b/test/Grpc.Net.ClientFactory.Tests/Grpc.Net.ClientFactory.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + netcoreapp3.1;net5.0 false true diff --git a/test/Grpc.Net.ClientFactory.Tests/GrpcHttpClientBuilderExtensionsTests.cs b/test/Grpc.Net.ClientFactory.Tests/GrpcHttpClientBuilderExtensionsTests.cs index dc74f3ffb..dc8916f74 100644 --- a/test/Grpc.Net.ClientFactory.Tests/GrpcHttpClientBuilderExtensionsTests.cs +++ b/test/Grpc.Net.ClientFactory.Tests/GrpcHttpClientBuilderExtensionsTests.cs @@ -341,7 +341,7 @@ private class TestHttpMessageHandler : HttpMessageHandler protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // Get stream from request content so gRPC client serializes request message - _ = await request.Content.ReadAsStreamAsync(); + _ = await request.Content!.ReadAsStreamAsync(); var reply = new HelloReply { Message = "Hello world" }; var streamContent = await ClientTestHelpers.CreateResponseContent(reply).DefaultTimeout(); diff --git a/test/Shared/HttpContextHelpers.cs b/test/Shared/HttpContextHelpers.cs index 1e9cf6149..4dd996230 100644 --- a/test/Shared/HttpContextHelpers.cs +++ b/test/Shared/HttpContextHelpers.cs @@ -52,7 +52,7 @@ public static HttpContext CreateContext( var responseFeature = new TestHttpResponseFeature(); var responseBodyFeature = new TestHttpResponseBodyFeature(httpContext.Features.Get(), responseFeature); - httpContext.RequestServices = serviceProvider; + httpContext.RequestServices = serviceProvider!; httpContext.Request.Protocol = protocol ?? GrpcProtocolConstants.Http2Protocol; httpContext.Request.ContentType = contentType ?? GrpcProtocolConstants.GrpcContentType; httpContext.Features.Set(new TestMinRequestBodyDataRateFeature()); diff --git a/test/Shared/TestHelpers.cs b/test/Shared/TestHelpers.cs index 513e8a528..a80f6bcbb 100644 --- a/test/Shared/TestHelpers.cs +++ b/test/Shared/TestHelpers.cs @@ -51,15 +51,15 @@ public static async Task AssertIsTrueRetryAsync(Func assert, string messag throw new Exception($"Assert failed after {Retrys} retries: {message}"); } - public static Task RunParallel(int count, Func action) + public static async Task RunParallel(int count, Func action) { var actionTasks = new Task[count]; for (int i = 0; i < actionTasks.Length; i++) { - actionTasks[i] = action(); + actionTasks[i] = action(i); } - return Task.WhenAll(actionTasks); + await Task.WhenAll(actionTasks); } } } diff --git a/test/Shared/TestHttpContextAccessor.cs b/test/Shared/TestHttpContextAccessor.cs index bc156a814..1d628c5b0 100644 --- a/test/Shared/TestHttpContextAccessor.cs +++ b/test/Shared/TestHttpContextAccessor.cs @@ -27,6 +27,6 @@ public TestHttpContextAccessor(HttpContext httpContext) HttpContext = httpContext; } - public HttpContext HttpContext { get; set; } + public HttpContext? HttpContext { get; set; } } } diff --git a/test/dotnet-grpc.Tests/CommandBaseTests.cs b/test/dotnet-grpc.Tests/CommandBaseTests.cs index e3bd6f797..b77ab9c61 100644 --- a/test/dotnet-grpc.Tests/CommandBaseTests.cs +++ b/test/dotnet-grpc.Tests/CommandBaseTests.cs @@ -510,10 +510,10 @@ public async Task EnsureNugetPackages_UsesVersionsFromRemoteFile_IfAvailable() var packageRefs = commandBase.Project.GetItems(CommandBase.PackageReferenceElement); var protobufReference = packageRefs.SingleOrDefault(r => r.UnevaluatedInclude == "Google.Protobuf"); Assert.NotNull(protobufReference); - Assert.AreEqual("4.5.6", protobufReference.GetMetadataValue("Version")); + Assert.AreEqual("4.5.6", protobufReference!.GetMetadataValue("Version")); var toolsReference = packageRefs.SingleOrDefault(r => r.UnevaluatedInclude == "Grpc.Tools"); Assert.NotNull(toolsReference); - Assert.AreEqual("7.8.9", toolsReference.GetMetadataValue("Version")); + Assert.AreEqual("7.8.9", toolsReference!.GetMetadataValue("Version")); var clientFactoryReference = packageRefs.SingleOrDefault(r => r.UnevaluatedInclude == "Grpc.Net.ClientFactory"); Assert.NotNull(clientFactoryReference); var clientFactoryVersion = GetType().Assembly @@ -521,7 +521,7 @@ public async Task EnsureNugetPackages_UsesVersionsFromRemoteFile_IfAvailable() .Select(a => a as GrpcDependencyAttribute) .Single(a => a.Name == "Grpc.Net.ClientFactory") .Version; - Assert.AreEqual(clientFactoryVersion, clientFactoryReference.GetMetadataValue("Version")); + Assert.AreEqual(clientFactoryVersion, clientFactoryReference!.GetMetadataValue("Version")); } } } diff --git a/test/dotnet-grpc.Tests/TestBase.cs b/test/dotnet-grpc.Tests/TestBase.cs index 1c544b0ec..830988a9c 100644 --- a/test/dotnet-grpc.Tests/TestBase.cs +++ b/test/dotnet-grpc.Tests/TestBase.cs @@ -104,7 +104,7 @@ public TestMessageHandler(Dictionary contentDictionary) protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { - var requestUriString = request.RequestUri.ToString(); + var requestUriString = request.RequestUri!.ToString(); Assert.Contains(requestUriString, _contentDictionary.Keys); return Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK) { diff --git a/test/dotnet-grpc.Tests/dotnet-grpc.Tests.csproj b/test/dotnet-grpc.Tests/dotnet-grpc.Tests.csproj index 5a436c8f2..2814d0813 100644 --- a/test/dotnet-grpc.Tests/dotnet-grpc.Tests.csproj +++ b/test/dotnet-grpc.Tests/dotnet-grpc.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.0 + netcoreapp3.0;net5.0 false Grpc.Dotnet.Cli.Tests diff --git a/testassets/InteropTestsGrpcWebClient/InteropTestsGrpcWebClient.csproj b/testassets/InteropTestsGrpcWebClient/InteropTestsGrpcWebClient.csproj index aada78d01..c323bd8af 100644 --- a/testassets/InteropTestsGrpcWebClient/InteropTestsGrpcWebClient.csproj +++ b/testassets/InteropTestsGrpcWebClient/InteropTestsGrpcWebClient.csproj @@ -1,8 +1,10 @@  - netstandard2.1 - 3.0 + net5.0 + browser-wasm + true + BLAZOR_WASM @@ -17,9 +19,8 @@ - - - + + diff --git a/testassets/InteropTestsGrpcWebWebsite/Dockerfile b/testassets/InteropTestsGrpcWebWebsite/Dockerfile index c2771f0e9..50dea70c5 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Dockerfile +++ b/testassets/InteropTestsGrpcWebWebsite/Dockerfile @@ -1,13 +1,14 @@ -FROM mcr.microsoft.com/dotnet/core/sdk:3.1.300 AS build-env +FROM mcr.microsoft.com/dotnet/nightly/sdk:5.0 AS build-env WORKDIR /app # Copy everything COPY . ./ +RUN dotnet --info RUN dotnet restore testassets/InteropTestsGrpcWebWebsite RUN dotnet publish testassets/InteropTestsGrpcWebWebsite -c Release -o out # Build runtime image -FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 +FROM mcr.microsoft.com/dotnet/nightly/aspnet:5.0 WORKDIR /app COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "InteropTestsGrpcWebWebsite.dll"] \ No newline at end of file diff --git a/testassets/InteropTestsGrpcWebWebsite/InteropTestsGrpcWebWebsite.csproj b/testassets/InteropTestsGrpcWebWebsite/InteropTestsGrpcWebWebsite.csproj index 3937f6dc3..9cb68b91a 100644 --- a/testassets/InteropTestsGrpcWebWebsite/InteropTestsGrpcWebWebsite.csproj +++ b/testassets/InteropTestsGrpcWebWebsite/InteropTestsGrpcWebWebsite.csproj @@ -1,14 +1,11 @@  - netcoreapp3.1 - InProcess - false + net5.0 - - + diff --git a/testassets/InteropTestsGrpcWebWebsite/Startup.cs b/testassets/InteropTestsGrpcWebWebsite/Startup.cs index 1e6d8b6d9..8f02f88be 100644 --- a/testassets/InteropTestsGrpcWebWebsite/Startup.cs +++ b/testassets/InteropTestsGrpcWebWebsite/Startup.cs @@ -32,8 +32,8 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env) app.UseWebAssemblyDebugging(); } - app.UseStaticFiles(); app.UseBlazorFrameworkFiles(); + app.UseStaticFiles(); app.UseRouting(); diff --git a/testassets/InteropTestsWebsite/Dockerfile b/testassets/InteropTestsWebsite/Dockerfile index ebbe41aee..036633684 100644 --- a/testassets/InteropTestsWebsite/Dockerfile +++ b/testassets/InteropTestsWebsite/Dockerfile @@ -1,13 +1,14 @@ -FROM mcr.microsoft.com/dotnet/core/sdk:3.1.300 AS build-env +FROM mcr.microsoft.com/dotnet/nightly/sdk:5.0 AS build-env WORKDIR /app # Copy everything COPY . ./ +RUN dotnet --info RUN dotnet restore testassets/InteropTestsWebsite RUN dotnet publish testassets/InteropTestsWebsite -c Release -o out # Build runtime image -FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 +FROM mcr.microsoft.com/dotnet/nightly/aspnet:5.0 WORKDIR /app COPY --from=build-env /app/out . ENTRYPOINT ["dotnet", "InteropTestsWebsite.dll", "--port_http1", "80"] \ No newline at end of file diff --git a/testassets/InteropTestsWebsite/InteropTestsWebsite.csproj b/testassets/InteropTestsWebsite/InteropTestsWebsite.csproj index 4ecc6574d..5478d6f71 100644 --- a/testassets/InteropTestsWebsite/InteropTestsWebsite.csproj +++ b/testassets/InteropTestsWebsite/InteropTestsWebsite.csproj @@ -1,7 +1,7 @@  - netcoreapp3.0 + net5.0 InProcess false diff --git a/testassets/Shared/IChannelWrapper.cs b/testassets/Shared/IChannelWrapper.cs index d517bf718..6392b4b38 100644 --- a/testassets/Shared/IChannelWrapper.cs +++ b/testassets/Shared/IChannelWrapper.cs @@ -44,7 +44,7 @@ public Task ShutdownAsync() } } -#if !NETSTANDARD2_1 +#if !BLAZOR_WASM public class CoreChannelWrapper : IChannelWrapper { private Channel _channel; diff --git a/testassets/Shared/InteropClient.cs b/testassets/Shared/InteropClient.cs index de91b8722..26b9cb6d8 100644 --- a/testassets/Shared/InteropClient.cs +++ b/testassets/Shared/InteropClient.cs @@ -33,7 +33,7 @@ using Empty = Grpc.Testing.Empty; using Grpc.Shared.TestAssets; -#if !NETSTANDARD2_1 +#if !BLAZOR_WASM using Google.Apis.Auth.OAuth2; using Grpc.Auth; using Grpc.Core.Logging; @@ -75,7 +75,7 @@ public InteropClient(ClientOptions options, ILoggerFactory loggerFactory) public async Task Run() { -#if !NETSTANDARD2_1 +#if !BLAZOR_WASM var channel = IsHttpClient() ? await HttpClientCreateChannel() : await CoreCreateChannel(); #else var channel = await HttpClientCreateChannel(); @@ -115,7 +115,7 @@ private async Task HttpClientCreateChannel() } var httpClientHandler = new HttpClientHandler(); -#if !NETSTANDARD2_1 +#if !BLAZOR_WASM httpClientHandler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; #endif @@ -123,7 +123,7 @@ private async Task HttpClientCreateChannel() { var pem = File.ReadAllText("Certs/ca.pem"); var certData = GetBytesFromPem(pem, "CERTIFICATE"); - var cert = new X509Certificate2(certData); + var cert = new X509Certificate2(certData!); httpClientHandler.ClientCertificates.Add(cert); } @@ -152,7 +152,7 @@ private async Task HttpClientCreateChannel() return new GrpcChannelWrapper(channel); } -#if !NETSTANDARD2_1 +#if !BLAZOR_WASM private async Task CoreCreateChannel() { var credentials = await CreateCredentialsAsync(); @@ -176,7 +176,7 @@ private async Task CreateCredentialsAsync(bool? useTestCaOve var credentials = ChannelCredentials.Insecure; if (options.UseTls) { -#if !NETSTANDARD2_1 +#if !BLAZOR_WASM if (useTestCaOverride ?? options.UseTestCa) { credentials = TestCredentials.CreateSslCredentials(); @@ -188,7 +188,7 @@ private async Task CreateCredentialsAsync(bool? useTestCaOve } } -#if !NETSTANDARD2_1 +#if !BLAZOR_WASM if (options.TestCase == "jwt_token_creds") { var googleCredential = await GoogleCredential.GetApplicationDefaultAsync(); @@ -226,7 +226,7 @@ private static TClient CreateClient(IChannelWrapper channel) where TCli ["ping_pong"] = RunPingPongAsync, ["empty_stream"] = RunEmptyStreamAsync, ["compute_engine_creds"] = RunComputeEngineCreds, -#if !NETSTANDARD2_1 +#if !BLAZOR_WASM ["jwt_token_creds"] = RunJwtTokenCreds, ["oauth2_auth_token"] = RunOAuth2AuthTokenAsync, ["per_rpc_creds"] = RunPerRpcCredsAsync, @@ -394,7 +394,7 @@ public static async Task RunComputeEngineCreds(IChannelWrapper channel, ClientOp Assert.AreEqual(defaultServiceAccount, response.Username); } -#if !NETSTANDARD2_1 +#if !BLAZOR_WASM public static async Task RunJwtTokenCreds(IChannelWrapper channel, ClientOptions options) { var client = CreateClient(channel); @@ -597,7 +597,7 @@ public static async Task RunStatusCodeAndMessageAsync(IChannelWrapper channel, C } // We want to test a unary call in gRPC-Web but skip the unsupported full duplex call. -#if !NETSTANDARD2_1 +#if !BLAZOR_WASM { // step 2: test full duplex call var request = new StreamingOutputCallRequest { ResponseStatus = echoStatus }; @@ -816,7 +816,7 @@ private static Metadata CreateClientCompressionMetadata(bool compressed) } // extracts the client_email field from service account file used for auth test cases -#if !NETSTANDARD2_1 +#if !BLAZOR_WASM private static string GetEmailFromServiceAccountFile() { string keyFile = Environment.GetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS")!;