icerpc / icerpc-csharp

A C# RPC framework built for QUIC, with bidirectional streaming, first-class async/await, and Protobuf support.
https://docs.icerpc.dev
Apache License 2.0
92 stars 14 forks source link

QUIC conformance test failure with .NET 9.0 #3990

Open bernardnormier opened 1 month ago

bernardnormier commented 1 month ago

I am getting the following errors in the dev container:

  IceRpc.Quic.Tests test failed with 2 error(s) and 3 warning(s) (10.6s)
    /workspaces/icerpc-csharp/tests/IceRpc.Conformance.Tests/Transports/MultiplexedConnectionConformanceTests.cs(450): error VSTEST1: IceRpc:Tests:Transports:QuicConnectionConformanceTests:Connection_dispose_aborts_pending_operations_with_operation_aborted_error: IceRpc.Conformance.Tests.MultiplexedConnectionConformanceTests.Connection_dispose_aborts_pending_operations_with_operation_aborted_error()   Expected: <IceRpc.IceRpcException>   But was:  <System.ObjectDisposedException: Cannot access a disposed object. Object name: 'System.Net.Quic.QuicConnection'.    at System.Net.Quic.QuicConnection.HandleEventShutdownComplete()    at System.Net.Quic.QuicConnection.HandleConnectionEvent(QUIC_CONNECTION_EVENT& connectionEvent)    at System.Net.Quic.QuicConnection.NativeCallback(QUIC_HANDLE* connection, Void* context, QUIC_CONNECTION_EVENT* connectionEvent) --- End of stack trace from previous location ---    at System.Net.Quic.QuicConnection.AcceptInboundStreamAsync(CancellationToken cancellationToken)    at IceRpc.Transports.Quic.Internal.QuicMultiplexedConnection.AcceptStreamAsync(CancellationToken cancellationToken) in /workspaces/icerpc-csharp/src/IceRpc.Transports.Quic/Internal/QuicMultiplexedConnection.cs:line 33    at IceRpc.Conformance.Tests.MultiplexedConnectionConformanceTests.<>c__DisplayClass16_0.<<Connection_dispose_aborts_pending_operations_with_operation_aborted_error>b__
    /workspaces/icerpc-csharp/tests/IceRpc.Conformance.Tests/Transports/MultiplexedListenerConformanceTests.cs(127): error VSTEST1: IceRpc:Tests:Transports:QuicListenerConformanceTests:Call_accept_on_a_listener_and_then_dispose_it_fails_with_operation_aborted_error: IceRpc.Conformance.Tests.MultiplexedListenerConformanceTests.Call_accept_on_a_listener_and_then_dispose_it_fails_with_operation_aborted_error()   Expected: <IceRpc.IceRpcException>   But was:  <System.ObjectDisposedException: Cannot access a disposed object. Object name: 'System.Net.Quic.QuicListener'.    at System.Net.Quic.QuicListener.DisposeAsync()    at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)    at System.Net.Quic.QuicListener.DisposeAsync()    at IceRpc.Transports.Quic.Internal.QuicMultiplexedListener.DisposeAsync() in /workspaces/icerpc-csharp/src/IceRpc.Transports.Quic/Internal/QuicMultiplexedListener.cs:line 36    at IceRpc.Conformance.Tests.MultiplexedListenerConformanceTests.Call_accept_on_a_listener_and_then_dispose_it_fails_with_operation_aborted_error() in /workspaces/icerpc-csharp/tests/IceRpc.Conformance.Tests/Transports/MultiplexedListenerConformanceTests.cs:line 124    at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)    at IceRpc.Conformance.Tests.MultiplexedListenerConformanceTests.Call_
    /home/vscode/dotnet/sdk/9.0.100-preview.4.24267.66/Microsoft.TestPlatform.targets(46,5): warning : Tests triggered 2 unobserved task exceptions
    /home/vscode/dotnet/sdk/9.0.100-preview.4.24267.66/Microsoft.TestPlatform.targets(46,5): warning : 

      +++ Unobserved task exception System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[IceRpc.Transports.IMultiplexedStream,IceRpc.Transports.Quic.Internal.QuicMultiplexedConnection+<CreateStreamAsync>d__9]:
      System.ObjectDisposedException: Cannot access a disposed object.
      Object name: 'System.Net.Quic.QuicConnection'.
         at System.Net.Quic.QuicConnection.OpenOutboundStreamAsync(QuicStreamType type, CancellationToken cancellationToken)
         at IceRpc.Transports.Quic.Internal.QuicMultiplexedConnection.CreateStreamAsync(Boolean bidirectional, CancellationToken cancellationToken) in /workspaces/icerpc-csharp/src/IceRpc.Transports.Quic/Internal/QuicMultiplexedConnection.cs:line 80
    /home/vscode/dotnet/sdk/9.0.100-preview.4.24267.66/Microsoft.TestPlatform.targets(46,5): warning : 

      +++ Unobserved task exception System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[System.IO.Pipelines.ReadResult,IceRpc.Transports.Quic.Internal.QuicPipeReader+<ReadAsync>d__11]:
      IceRpc.IceRpcException: An IceRpc call failed with error 'OperationAborted'.
       ---> System.Net.Quic.QuicException: Operation aborted.
         at System.Net.Quic.ResettableValueTaskSource.TryComplete(Exception exception, Boolean final)
         at System.Net.Quic.QuicStream.HandleEventShutdownComplete(_SHUTDOWN_COMPLETE_e__Struct& data)
         at System.Net.Quic.QuicStream.HandleStreamEvent(QUIC_STREAM_EVENT& streamEvent)
         at System.Net.Quic.QuicStream.NativeCallback(QUIC_HANDLE* stream, Void* context, QUIC_STREAM_EVENT* streamEvent)
      --- End of stack trace from previous location ---
         at System.Net.Quic.ResettableValueTaskSource.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
         at System.Net.Quic.QuicStream.ReadAsync(Memory`1 buffer, CancellationToken cancellationToken)
         at System.IO.Pipelines.StreamPipeReader.<ReadInternalAsync>g__Core|40_0(StreamPipeReader reader, Nullable`1 minimumSize, CancellationTokenSource tokenSource, CancellationToken cancellationToken)
         at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(Int16 token)
         at IceRpc.Transports.Quic.Internal.QuicPipeReader.ReadAsync(CancellationToken cancellationToken) in /workspaces/icerpc-csharp/src/IceRpc.Transports.Quic/Internal/QuicPipeReader.cs:line 93
         --- End of inner exception stack trace ---
         at IceRpc.Transports.Quic.Internal.QuicPipeReader.ReadAsync(CancellationToken cancellationToken) in /workspaces/icerpc-csharp/src/IceRpc.Transports.Quic/Internal/QuicPipeReader.cs:line 97
  IceRpc.Telemetry.Tests succeeded (0.1s) → tests/IceRpc.Telemetry.Tests/net9.0/IceRpc.Telemetry.Tests.dll
  IceRpc.Tests test succeeded (11.0s)
  IceRpc.Telemetry.Tests test succeeded (0.4s)
pepone commented 1 month ago

Happening with CI VMs too

      Tests triggered 2 unobserved task exceptions [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
      [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
   +++ Unobserved task exception System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[System.IO.Pipelines.ReadResult,IceRpc.Transports.Quic.Internal.QuicPipeReader+<ReadAsync>d__11]: [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
   IceRpc.IceRpcException: An IceRpc call failed with error 'OperationAborted'. [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
   ---> System.Net.Quic.QuicException: Operation aborted. [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
      at System.Net.Quic.ResettableValueTaskSource.TryComplete(Exception exception, Boolean final) [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
      at System.Net.Quic.QuicStream.HandleEventShutdownComplete(_SHUTDOWN_COMPLETE_e__Struct& data) [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
      at System.Net.Quic.QuicStream.HandleStreamEvent(QUIC_STREAM_EVENT& streamEvent) [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
      at System.Net.Quic.QuicStream.NativeCallback(QUIC_HANDLE* stream, Void* context, QUIC_STREAM_EVENT* streamEvent) [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
   --- End of stack trace from previous location --- [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
      at IceRpc.Transports.Quic.Internal.QuicPipeWriter.<.ctor>g__ClosedAsync|21_0() in /_/src/IceRpc.Transports.Quic/Internal/QuicPipeWriter.cs:line 226 [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
      --- End of inner exception stack trace --- [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
      at IceRpc.Transports.Quic.Internal.QuicPipeReader.ReadAsync(CancellationToken cancellationToken) in /_/src/IceRpc.Transports.Quic/Internal/QuicPipeReader.cs:line 97 [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
      [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
   +++ Unobserved task exception System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1+AsyncStateMachineBox`1[IceRpc.Transports.IMultiplexedStream,IceRpc.Transports.Quic.Internal.QuicMultiplexedConnection+<CreateStreamAsync>d__9]: [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
   System.ObjectDisposedException: Cannot access a disposed object. [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
   Object name: 'System.Net.Quic.QuicConnection'. [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
      at System.Net.Quic.QuicConnection.OpenOutboundStreamAsync(QuicStreamType type, CancellationToken cancellationToken) [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
      at IceRpc.Transports.Quic.Internal.QuicMultiplexedConnection.CreateStreamAsync(Boolean bidirectional, CancellationToken cancellationToken) in /_/src/IceRpc.Transports.Quic/Internal/QuicMultiplexedConnection.cs:line 80 [/home/runner/work/icerpc-csharp/icerpc-csharp/tests/IceRpc.Quic.Tests/IceRpc.Quic.Tests.csproj::TargetFramework=net9.0]
pepone commented 1 month ago

Seems the failing tests are related to behavior changed in .NET QUIC see https://github.com/dotnet/runtime/pull/92215

pepone commented 1 month ago
    [Ignore("TODO: Fix https://github.com/icerpc/icerpc-csharp/issues/3990")]
    public async Task Connection_dispose_aborts_pending_operations_with_operation_aborted_error()

    [Ignore("TODO: Fix https://github.com/icerpc/icerpc-csharp/issues/3990")]
    public async Task Call_accept_on_a_listener_and_then_dispose_it_fails_with_operation_aborted_error()

Once this is fixes, we should enable these two tests disabled in https://github.com/icerpc/icerpc-csharp/commit/904acb031926a4fb2da7969b5c4d4a1328d56943