[Fact]
public async Task SslStream_StreamToStream_Alpn_NonMatchingProtocols_Fail()
{
- TcpListener listener = new TcpListener(IPAddress.Loopback, 0);
- try
+ (SslStream clientStream, SslStream serverStream) = TestHelper.GetConnectedSslStreams();
+
+ using (serverStream)
+ using (clientStream)
+ using (X509Certificate2 certificate = Configuration.Certificates.GetServerCertificate())
{
- listener.Start();
- using (TcpClient client = new TcpClient())
+ SslServerAuthenticationOptions serverOptions = new SslServerAuthenticationOptions
{
- Task<TcpClient> serverTask = listener.AcceptTcpClientAsync();
- await client.ConnectAsync(IPAddress.Loopback, ((IPEndPoint)listener.LocalEndpoint).Port);
+ ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http2 },
+ ServerCertificate = certificate,
+ };
+ SslClientAuthenticationOptions clientOptions = new SslClientAuthenticationOptions
+ {
+ ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http11 },
+ RemoteCertificateValidationCallback = AllowAnyServerCertificate,
+ TargetHost = certificate.GetNameInfo(X509NameType.SimpleName, false),
+ };
- using (TcpClient server = await serverTask)
- using (SslStream serverStream = new SslStream(server.GetStream(), leaveInnerStreamOpen: false))
- using (SslStream clientStream = new SslStream(client.GetStream(), leaveInnerStreamOpen: false))
- using (X509Certificate2 certificate = Configuration.Certificates.GetServerCertificate())
- {
- SslServerAuthenticationOptions serverOptions = new SslServerAuthenticationOptions
- {
- ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http2 },
- ServerCertificate = certificate,
- };
- SslClientAuthenticationOptions clientOptions = new SslClientAuthenticationOptions
- {
- ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http11 },
- RemoteCertificateValidationCallback = AllowAnyServerCertificate,
- TargetHost = certificate.GetNameInfo(X509NameType.SimpleName, false),
- };
+ // Test ALPN failure only on platforms that supports ALPN.
+ if (BackendSupportsAlpn)
+ {
+ Task t1 = Assert.ThrowsAsync<AuthenticationException>(() => clientStream.AuthenticateAsClientAsync(TestAuthenticateAsync, clientOptions));
- // Test alpn failure only on platforms that supports ALPN.
- if (BackendSupportsAlpn)
- {
- // schannel sends alert on ALPN failure, openssl does not.
- Task t1 = Assert.ThrowsAsync(TestConfiguration.SupportsAlpnAlerts ? typeof(AuthenticationException) : typeof(IOException), () =>
- clientStream.AuthenticateAsClientAsync(TestAuthenticateAsync, clientOptions));
-
- try
- {
- await serverStream.AuthenticateAsServerAsync(TestAuthenticateAsync, serverOptions);
- Assert.True(false, "AuthenticationException was not thrown.");
- }
- catch (AuthenticationException) { server.Dispose(); }
-
- await TestConfiguration.WhenAllOrAnyFailedWithTimeout(t1);
- }
- else
- {
- Task t1 = clientStream.AuthenticateAsClientAsync(TestAuthenticateAsync, clientOptions);
- Task t2 = serverStream.AuthenticateAsServerAsync(TestAuthenticateAsync, serverOptions);
+ await Assert.ThrowsAsync<AuthenticationException>(() => serverStream.AuthenticateAsServerAsync(TestAuthenticateAsync, serverOptions));
+ serverStream.Dispose();
- await TestConfiguration.WhenAllOrAnyFailedWithTimeout(t1, t2);
+ await t1.TimeoutAfter(TestConfiguration.PassingTestTimeoutMilliseconds);
+ }
+ else
+ {
+ Task t1 = clientStream.AuthenticateAsClientAsync(TestAuthenticateAsync, clientOptions);
+ Task t2 = serverStream.AuthenticateAsServerAsync(TestAuthenticateAsync, serverOptions);
- Assert.Equal(default(SslApplicationProtocol), clientStream.NegotiatedApplicationProtocol);
- Assert.Equal(default(SslApplicationProtocol), serverStream.NegotiatedApplicationProtocol);
- }
- }
+ await TestConfiguration.WhenAllOrAnyFailedWithTimeout(t1, t2);
+
+ Assert.Equal(default(SslApplicationProtocol), clientStream.NegotiatedApplicationProtocol);
+ Assert.Equal(default(SslApplicationProtocol), serverStream.NegotiatedApplicationProtocol);
}
}
- finally
- {
- listener.Stop();
- }
}
[OuterLoop("Uses external server")]