Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/libraries/System.Net.Quic/ref/System.Net.Quic.cs
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ internal ManagedQuicConnection() : base (default(bool)) { }
public override System.Net.IPEndPoint RemoteEndPoint { get { throw null; } }
public override System.Threading.Tasks.ValueTask<System.Net.Quic.QuicStream> AcceptInboundStreamAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
public override System.Threading.Tasks.ValueTask CloseAsync(long errorCode, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
public static new System.Threading.Tasks.ValueTask<System.Net.Quic.Implementations.Managed.ManagedQuicConnection> ConnectAsync(System.Net.Quic.QuicClientConnectionOptions options, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
public static new System.Threading.Tasks.ValueTask<System.Net.Quic.QuicConnection> ConnectAsync(System.Net.Quic.QuicClientConnectionOptions options, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
public override System.Threading.Tasks.ValueTask DisposeAsync() { throw null; }
public override System.Threading.Tasks.ValueTask<System.Net.Quic.QuicStream> OpenOutboundStreamAsync(System.Net.Quic.QuicStreamType type, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
}
Expand All @@ -159,7 +159,7 @@ internal ManagedQuicListener() : base (default(bool)) { }
public System.Net.IPEndPoint ListenEndPoint { get { throw null; } }
public override System.Threading.Tasks.ValueTask<System.Net.Quic.QuicConnection> AcceptConnectionAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
public override System.Threading.Tasks.ValueTask DisposeAsync() { throw null; }
public static new System.Threading.Tasks.ValueTask<System.Net.Quic.Implementations.Managed.ManagedQuicListener> ListenAsync(System.Net.Quic.QuicListenerOptions options, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
public static new System.Threading.Tasks.ValueTask<System.Net.Quic.QuicListener> ListenAsync(System.Net.Quic.QuicListenerOptions options, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) { throw null; }
}
public sealed partial class ManagedQuicStream : System.Net.Quic.QuicStream
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ namespace System.Net.Quic.Implementations.Managed
public sealed partial class ManagedQuicConnection : QuicConnection, IAsyncDisposable
{
public static new bool IsSupported => true;
public static new async ValueTask<ManagedQuicConnection> ConnectAsync(QuicClientConnectionOptions options, CancellationToken cancellationToken = default)
public static new async ValueTask<QuicConnection> ConnectAsync(QuicClientConnectionOptions options, CancellationToken cancellationToken = default)
{
var connection = new ManagedQuicConnection(options, TlsFactory.Default);
await connection.ConnectAsync(cancellationToken).ConfigureAwait(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ namespace System.Net.Quic.Implementations.Managed
public sealed class ManagedQuicListener : QuicListener, IAsyncDisposable
{
public static new bool IsSupported => true;
public static new ValueTask<ManagedQuicListener> ListenAsync(QuicListenerOptions options, CancellationToken cancellationToken = default)
public static new ValueTask<QuicListener> ListenAsync(QuicListenerOptions options, CancellationToken cancellationToken = default)
{
return ValueTask.FromResult(new ManagedQuicListener(options));
return ValueTask.FromResult((QuicListener)new ManagedQuicListener(options));
}

private bool _disposed;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ namespace System.Net.Quic.Tests

[Collection(nameof(DisableParallelization))]
[ConditionalClass(typeof(QuicTestBase), nameof(QuicTestBase.IsSupported))]
public sealed class QuicConnectionTests : QuicTestBase
public class QuicConnectionTests : QuicTestBase
{
const int ExpectedErrorCode = 1234;
public static IEnumerable<object[]> LocalAddresses = Configuration.Sockets.LocalAddresses();

public QuicConnectionTests(ITestOutputHelper output) : base(output) { }
public QuicConnectionTests(ITestOutputHelper output, bool managed = false) : base(output, managed) { }

[Theory]
[MemberData(nameof(LocalAddresses))]
Expand Down Expand Up @@ -89,7 +89,6 @@ await RunClientServer(

// Subsequent attempts should fail
// TODO: Which exception is correct?
if (IsMockProvider)
await AssertThrowsQuicExceptionAsync(QuicError.OperationAborted, async () => await serverConnection.AcceptInboundStreamAsync());
await Assert.ThrowsAsync<QuicException>(() => OpenAndUseStreamAsync(serverConnection));
});
Expand Down Expand Up @@ -427,9 +426,8 @@ public void ConnectAsync_MissingDefaults_ThrowsInvalidArgument()
}
}

[ConditionalClass(typeof(QuicTestBase<ManagedQuicProviderFactory>), nameof(QuicTestBase<ManagedQuicProviderFactory>.IsSupported))]
public sealed class QuicConnectionTests_ManagedQuicProvider : QuicConnectionTests<ManagedQuicProviderFactory>
public sealed class ManagedQuicConnectionTests : QuicConnectionTests
{
public QuicConnectionTests_ManagedQuicProvider(ITestOutputHelper output) : base(output) { }
public ManagedQuicConnectionTests(ITestOutputHelper output) : base(output, managed: true) { }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ namespace System.Net.Quic.Tests
{
[Collection(nameof(DisableParallelization))]
[ConditionalClass(typeof(QuicTestBase), nameof(QuicTestBase.IsSupported))]
public sealed class QuicListenerTests : QuicTestBase
public class QuicListenerTests : QuicTestBase
{
public QuicListenerTests(ITestOutputHelper output) : base(output) { }
public QuicListenerTests(ITestOutputHelper output, bool managed = false) : base(output, managed) { }

[Fact]
public async Task Listener_Backlog_Success()
Expand Down Expand Up @@ -518,9 +518,8 @@ public async Task Listener_AlpnNarrowingDown_Failure(string alpn)
}
}

[ConditionalClass(typeof(QuicTestBase<ManagedQuicProviderFactory>), nameof(QuicTestBase<ManagedQuicProviderFactory>.IsSupported))]
public sealed class QuicListenerTests_ManagedQuicProvider : QuicListenerTests<ManagedQuicProviderFactory>
public sealed class ManagedQuicListenerTests : QuicListenerTests
{
public QuicListenerTests_ManagedQuicProvider(ITestOutputHelper output) : base(output) { }
public ManagedQuicListenerTests(ITestOutputHelper output) : base(output, managed: true) { }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,27 @@
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
using System.Net.Quic.Implementations.Managed;

namespace System.Net.Quic.Tests
{
[Collection(nameof(DisableParallelization))]
[ConditionalClass(typeof(QuicTestBase), nameof(QuicTestBase.IsSupported))]
public sealed class QuicStreamConformanceTests : ConnectedStreamConformanceTests
public class QuicStreamConformanceTests : ConnectedStreamConformanceTests
{
protected override bool UsableAfterCanceledReads => false;
protected override bool BlocksOnZeroByteReads => true;
protected override bool CanTimeout => true;

public readonly X509Certificate2 ServerCertificate = System.Net.Test.Common.Configuration.Certificates.GetServerCertificate();
public ITestOutputHelper _output;
public bool _managed;

public QuicStreamConformanceTests(ITestOutputHelper output, bool managed = false)
{
_output = output;
_managed = managed;
}

protected override void Dispose(bool disposing)
{
Expand All @@ -33,21 +41,6 @@ protected override void Dispose(bool disposing)
}
base.Dispose(disposing);
}
[ConditionalClass(typeof(QuicTestBase<ManagedQuicProviderFactory>), nameof(QuicTestBase<ManagedQuicProviderFactory>.IsSupported))]
[Collection(nameof(DisableParallelization))]
public sealed class ManagedQuicQuicStreamConformanceTests : QuicStreamConformanceTests
{
protected override QuicImplementationProvider Provider => new ManagedQuicProviderFactory().GetProvider();
protected override bool UsableAfterCanceledReads => false;
protected override bool BlocksOnZeroByteReads => true;
protected override bool CanTimeout => true;

public ManagedQuicQuicStreamConformanceTests(ITestOutputHelper output)
{
_output = output;
}
}


public bool RemoteCertificateValidationCallback(object sender, X509Certificate? certificate, X509Chain? chain, SslPolicyErrors sslPolicyErrors)
{
Expand Down Expand Up @@ -75,7 +68,7 @@ public SslClientAuthenticationOptions GetSslClientAuthenticationOptions()

protected override async Task<StreamPair> CreateConnectedStreamsAsync()
{
var listener = await QuicListener.ListenAsync(new QuicListenerOptions()
var listenerOptions = new QuicListenerOptions()
{
ListenEndPoint = new IPEndPoint(IPAddress.Loopback, 0),
ApplicationProtocols = new List<SslApplicationProtocol>() { new SslApplicationProtocol("quictest") },
Expand All @@ -85,7 +78,8 @@ protected override async Task<StreamPair> CreateConnectedStreamsAsync()
DefaultCloseErrorCode = QuicTestBase.DefaultCloseErrorCodeServer,
ServerAuthenticationOptions = GetSslServerAuthenticationOptions()
})
});
};
var listener = _managed ? await ManagedQuicListener.ListenAsync(listenerOptions) : await QuicListener.ListenAsync(listenerOptions);

byte[] buffer = new byte[1] { 42 };
QuicConnection connection1 = null, connection2 = null;
Expand All @@ -103,13 +97,14 @@ await WhenAllOrAnyFailed(
{
try
{
connection2 = await QuicConnection.ConnectAsync(new QuicClientConnectionOptions()
var connectionOptions = new QuicClientConnectionOptions()
{
DefaultStreamErrorCode = QuicTestBase.DefaultStreamErrorCodeClient,
DefaultCloseErrorCode = QuicTestBase.DefaultCloseErrorCodeClient,
RemoteEndPoint = listener.LocalEndPoint,
ClientAuthenticationOptions = GetSslClientAuthenticationOptions()
});
};
connection2 = _managed ? await ManagedQuicConnection.ConnectAsync(connectionOptions) : await QuicConnection.ConnectAsync(connectionOptions);
stream2 = await connection2.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
// OpenBidirectionalStream only allocates ID. We will force stream opening
// by Writing there and receiving data on the other side.
Expand Down Expand Up @@ -169,4 +164,11 @@ public override void Dispose()
}
}
}

[Collection(nameof(DisableParallelization))]
public sealed class ManagedQuicQuicStreamConformanceTests : QuicStreamConformanceTests
{
public ManagedQuicQuicStreamConformanceTests(ITestOutputHelper output) : base(output, managed: true)
{ }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ namespace System.Net.Quic.Tests
{
[Collection(nameof(DisableParallelization))]
[ConditionalClass(typeof(QuicTestBase), nameof(QuicTestBase.IsSupported))]
public sealed class QuicStreamTests : QuicTestBase
public class QuicStreamTests : QuicTestBase
{
private static byte[] s_data = "Hello world!"u8.ToArray();
public QuicStreamTests(ITestOutputHelper output) : base(output) { }
public QuicStreamTests(ITestOutputHelper output, bool managed = false) : base(output, managed) { }

[Fact]
public async Task BasicTest()
Expand Down Expand Up @@ -1210,10 +1210,9 @@ async ValueTask ReleaseOnReadsClosedAsync()
}
}

[ConditionalClass(typeof(QuicTestBase<ManagedQuicProviderFactory>), nameof(QuicTestBase<ManagedQuicProviderFactory>.IsSupported))]
[Collection(nameof(DisableParallelization))]
public sealed class QuicStreamTests_ManagedQuicProvider : QuicStreamTests<ManagedQuicProviderFactory>
public sealed class QuicStreamTests_ManagedQuicProvider : QuicStreamTests
{
public QuicStreamTests_ManagedQuicProvider(ITestOutputHelper output) : base(output) { }
public QuicStreamTests_ManagedQuicProvider(ITestOutputHelper output) : base(output, managed: true) { }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
using System.Net.Sockets;
using System.Reflection;
using Microsoft.Quic;
using System.Net.Quic.Implementations.Managed;

namespace System.Net.Quic.Tests
{
Expand All @@ -39,6 +40,7 @@ public abstract class QuicTestBase : IDisposable
public readonly X509Certificate2 ClientCertificate = System.Net.Test.Common.Configuration.Certificates.GetClientCertificate();

public ITestOutputHelper _output;
public bool _managed;
public const int PassingTestTimeoutMilliseconds = 4 * 60 * 1000;
public static TimeSpan PassingTestTimeout => TimeSpan.FromMilliseconds(PassingTestTimeoutMilliseconds);

Expand All @@ -64,9 +66,10 @@ static unsafe QuicTestBase()
}
}

public unsafe QuicTestBase(ITestOutputHelper output)
public unsafe QuicTestBase(ITestOutputHelper output, bool managed = false)
{
_output = output;
_managed = managed;
}

public void Dispose()
Expand Down Expand Up @@ -137,7 +140,7 @@ internal ValueTask<QuicConnection> CreateQuicConnection(IPEndPoint endpoint)

internal ValueTask<QuicConnection> CreateQuicConnection(QuicClientConnectionOptions clientOptions)
{
return QuicConnection.ConnectAsync(clientOptions);
return _managed ? ManagedQuicConnection.ConnectAsync(clientOptions) : QuicConnection.ConnectAsync(clientOptions);
}

internal QuicListenerOptions CreateQuicListenerOptions(IPAddress address = null)
Expand Down Expand Up @@ -168,7 +171,7 @@ internal ValueTask<QuicListener> CreateQuicListener(IPEndPoint endpoint)
return CreateQuicListener(options);
}

internal ValueTask<QuicListener> CreateQuicListener(QuicListenerOptions options) => QuicListener.ListenAsync(options);
internal ValueTask<QuicListener> CreateQuicListener(QuicListenerOptions options) => _managed ? ManagedQuicListener.ListenAsync(options) : QuicListener.ListenAsync(options);

internal Task<(QuicConnection, QuicConnection)> CreateConnectedQuicConnection(QuicListener listener) => CreateConnectedQuicConnection(null, listener);
internal async Task<(QuicConnection, QuicConnection)> CreateConnectedQuicConnection(QuicClientConnectionOptions? clientOptions, QuicListenerOptions listenerOptions)
Expand Down Expand Up @@ -411,10 +414,4 @@ internal static bool GetIsIPv6Available()
}
}
}

public sealed class ManagedQuicProviderFactory : IQuicImplProviderFactory
{
// Use MockTls due to lack of modified OpenSSL
public QuicImplementationProvider GetProvider() => QuicImplementationProviders.ManagedMockTls;
}
}