public void CanRegisterAListener()
        {
            IWebSocketListener listener = this._SubprotocolListener("abc");
            var registry = new WebSocketListenerRegistry();

            Assert.True(registry.TryRegister(listener));
        }
        public void CannotRegisterAListenerWithoutASubProtocol()
        {
            IWebSocketListener listener = this._SubprotocolListener(null);
            var registry = new WebSocketListenerRegistry();

            Assert.Throws <ArgumentNullException>(() => registry.TryRegister(listener));
        }
        public async Task AuthorizedRequestWhenCertIsNotSet()
        {
            var next = Mock.Of <RequestDelegate>();

            var listener = new Mock <IWebSocketListener>();

            listener.Setup(wsl => wsl.SubProtocol).Returns("abc");
            listener.Setup(
                wsl => wsl.ProcessWebSocketRequestAsync(
                    It.IsAny <WebSocket>(),
                    It.IsAny <Option <EndPoint> >(),
                    It.IsAny <EndPoint>(),
                    It.IsAny <string>()))
            .Returns(Task.CompletedTask);

            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(listener.Object);

            HttpContext httpContext   = this.ContextWithRequestedSubprotocols("abc");
            var         authenticator = new Mock <IAuthenticator>();

            authenticator.Setup(p => p.AuthenticateAsync(It.IsAny <IClientCredentials>())).ReturnsAsync(false);

            IHttpProxiedCertificateExtractor certExtractor = new HttpProxiedCertificateExtractor(authenticator.Object, Mock.Of <IClientCredentialsFactory>(), "hub", "edge", "proxy");

            var middleware = new WebSocketHandlingMiddleware(next, registry, Task.FromResult(certExtractor));
            await middleware.Invoke(httpContext);

            authenticator.Verify(auth => auth.AuthenticateAsync(It.IsAny <IClientCredentials>()), Times.Never);
            listener.VerifyAll();
        }
        public void CannotUnregisterANonExistentListener()
        {
            var registry = new WebSocketListenerRegistry();

            Assert.False(registry.TryUnregister("abc", out IWebSocketListener outListener));
            Assert.Null(outListener);
        }
        public void CannotInvokeWhenNoListenersAreRegistered()
        {
            var         registry    = new WebSocketListenerRegistry();
            HttpContext httpContext = this._ContextWithRequestedSubprotocols("abc");

            Assert.False(registry.GetListener(httpContext.WebSockets.WebSocketRequestedProtocols).HasValue);
        }
        public async Task CannotInvokeWhenNoListenersAreRegistered()
        {
            var         registry    = new WebSocketListenerRegistry();
            HttpContext httpContext = this._ContextWithRequestedSubprotocols("abc");

            Assert.False(await registry.InvokeAsync(httpContext, "dontcare"));
            Assert.Equal((int)HttpStatusCode.BadRequest, httpContext.Response.StatusCode);
        }
        public void CannotRegisterTheSameListenerTwice()
        {
            IWebSocketListener listener = this._SubprotocolListener("abc");
            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(listener);
            Assert.False(registry.TryRegister(listener));
        }
        public async Task CanInvokeARegisteredListener()
        {
            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(this._SubprotocolListener("abc"));
            HttpContext httpContext = this._ContextWithRequestedSubprotocols("abc");

            Assert.True(await registry.InvokeAsync(httpContext, "dontcare"));
        }
        public void CannotInvokeANonExistentListener()
        {
            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(this._SubprotocolListener("abc"));
            HttpContext httpContext = this._ContextWithRequestedSubprotocols("xyz");

            Assert.False(registry.GetListener(httpContext.WebSockets.WebSocketRequestedProtocols).HasValue);
        }
        public void CanUnregisterAListener()
        {
            IWebSocketListener inListener = this._SubprotocolListener("abc");
            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(inListener);

            Assert.True(registry.TryUnregister("abc", out IWebSocketListener outListener));
            Assert.Equal(inListener, outListener);
        }
        public async Task SetsBadrequestWhenNoRegisteredListener()
        {
            var         registry    = new WebSocketListenerRegistry();
            HttpContext httpContext = this.ContextWithRequestedSubprotocols("xyz");

            var middleware = new WebSocketHandlingMiddleware(this.ThrowingNextDelegate(), registry, Task.FromResult(Mock.Of <IHttpProxiedCertificateExtractor>()));
            await middleware.Invoke(httpContext);

            Assert.Equal((int)HttpStatusCode.BadRequest, httpContext.Response.StatusCode);
        }
        public async Task SetsBadrequestWhenNoRegisteredListener()
        {
            var         registry    = new WebSocketListenerRegistry();
            HttpContext httpContext = this._ContextWithRequestedSubprotocols("xyz");

            var middleware = new WebSocketHandlingMiddleware(this._ThrowingNextDelegate(), registry);
            await middleware.Invoke(httpContext);

            Assert.Equal((int)HttpStatusCode.BadRequest, httpContext.Response.StatusCode);
        }
        public void CannotUnregisterAListenerWithANullOrWhitespaceSubProtocol()
        {
            IWebSocketListener inListener = this._SubprotocolListener("abc");
            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(inListener);

            Assert.Throws <ArgumentException>(() => registry.TryUnregister(null, out IWebSocketListener _));
            Assert.Throws <ArgumentException>(() => registry.TryUnregister(string.Empty, out IWebSocketListener _));
            Assert.Throws <ArgumentException>(() => registry.TryUnregister("  ", out IWebSocketListener _));
        }
        public void CanInvokeARegisteredListener()
        {
            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(this._SubprotocolListener("abc"));
            HttpContext httpContext = this._ContextWithRequestedSubprotocols("abc");

            Option <IWebSocketListener> listener = registry.GetListener(httpContext.WebSockets.WebSocketRequestedProtocols);

            Assert.True(listener.HasValue);
        }
        public async Task SetsBadrequestWhenANonExistentListener()
        {
            var listener = Mock.Of <IWebSocketListener>(wsl => wsl.SubProtocol == "abc");
            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(listener);
            HttpContext httpContext = this._ContextWithRequestedSubprotocols("xyz");

            var middleware = new WebSocketHandlingMiddleware(this._ThrowingNextDelegate(), registry);
            await middleware.Invoke(httpContext);

            Assert.Equal((int)HttpStatusCode.BadRequest, httpContext.Response.StatusCode);
        }
        public async Task AlwaysInvokesTheFirstMatchingListener()
        {
            IWebSocketListener abcListener = this._SubprotocolListener("abc");
            IWebSocketListener xyzListener = this._SubprotocolListener("xyz");

            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(abcListener);
            registry.TryRegister(xyzListener);

            HttpContext httpContext = this._ContextWithRequestedSubprotocols("xyz", "abc");

            Assert.True(await registry.InvokeAsync(httpContext, "123"));
            Mock.Get(xyzListener).Verify(wsl => wsl.ProcessWebSocketRequestAsync(httpContext, "123"));
        }
        public async Task HandlesAWebSocketRequest()
        {
            HttpContext httpContext = this._ContextWithRequestedSubprotocols("abc");

            var listener = Mock.Of <IWebSocketListener>(wsl => wsl.SubProtocol == "abc");

            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(listener);

            var middleware = new WebSocketHandlingMiddleware(this._ThrowingNextDelegate(), registry);
            await middleware.Invoke(httpContext);

            Mock.Get(listener).Verify(r => r.ProcessWebSocketRequestAsync(It.IsAny <WebSocket>(), It.IsAny <Option <EndPoint> >(), It.IsAny <EndPoint>(), It.IsAny <string>()));
        }
        public void AlwaysInvokesTheFirstMatchingListener()
        {
            IWebSocketListener abcListener = this._SubprotocolListener("abc");
            IWebSocketListener xyzListener = this._SubprotocolListener("xyz");

            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(abcListener);
            registry.TryRegister(xyzListener);

            HttpContext httpContext = this._ContextWithRequestedSubprotocols("xyz", "abc");

            var listener = registry.GetListener(httpContext.WebSockets.WebSocketRequestedProtocols);

            Assert.True(listener.HasValue);
            listener.ForEach(l => Assert.Equal(l.SubProtocol, "xyz"));
            //Mock.Get(xyzListener).Verify(wsl => wsl.ProcessWebSocketRequestAsync(It.IsAny<WebSocket>(), It.IsAny<string>(), It.IsAny<EndPoint>(), It.IsAny<EndPoint>(), It.IsAny<string>()));
        }
        public async Task AuthorizedRequestWhenProxyAuthSuccess()
        {
            var next = Mock.Of <RequestDelegate>();

            var listener = new Mock <IWebSocketListener>();

            listener.Setup(wsl => wsl.SubProtocol).Returns("abc");
            listener.Setup(
                wsl => wsl.ProcessWebSocketRequestAsync(
                    It.IsAny <WebSocket>(),
                    It.IsAny <Option <EndPoint> >(),
                    It.IsAny <EndPoint>(),
                    It.IsAny <string>(),
                    It.IsAny <X509Certificate2>(),
                    It.IsAny <IList <X509Certificate2> >(),
                    It.Is <IAuthenticator>(auth => auth == null)))
            .Returns(Task.CompletedTask);

            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(listener.Object);
            var    certContentBytes  = Util.Test.Common.CertificateHelper.GenerateSelfSignedCert($"test_cert").Export(X509ContentType.Cert);
            string certContentBase64 = Convert.ToBase64String(certContentBytes);
            string clientCertString  = $"-----BEGIN CERTIFICATE-----\n{certContentBase64}\n-----END CERTIFICATE-----\n";

            clientCertString = WebUtility.UrlEncode(clientCertString);
            HttpContext httpContext   = this.ContextWithRequestedSubprotocolsAndForwardedCert(new StringValues(clientCertString), "abc");
            var         certExtractor = new Mock <IHttpProxiedCertificateExtractor>();

            certExtractor.Setup(p => p.GetClientCertificate(It.IsAny <HttpContext>())).ReturnsAsync(Option.Some(new X509Certificate2(certContentBytes)));

            var middleware = new WebSocketHandlingMiddleware(next, registry, Task.FromResult(certExtractor.Object));
            await middleware.Invoke(httpContext);

            listener.VerifyAll();
        }
        public void CannotRegisterANullListener()
        {
            var registry = new WebSocketListenerRegistry();

            Assert.Throws <ArgumentNullException>(() => registry.TryRegister(null));
        }