public void ExtensionHandlerNotRemovedByFailureWritePromise()
        {
            // initialize
            _mainHandshaker.Setup(x => x.HandshakeExtension(
                                      It.Is <WebSocketExtensionData>(v => v.Name.Equals("main")))).
            Returns(_mainExtension.Object);
            _mainExtension.Setup(x => x.NewReponseData()).Returns(
                new WebSocketExtensionData("main", new Dictionary <string, string>()));

            // execute
            WebSocketServerExtensionHandler extensionHandler =
                new WebSocketServerExtensionHandler(_mainHandshaker.Object);
            EmbeddedChannel ch = new EmbeddedChannel(extensionHandler);

            IHttpRequest req = NewUpgradeRequest("main");

            ch.WriteInbound(req);

            IHttpResponse res            = NewUpgradeResponse(null);
            var           failurePromise = ch.NewPromise();

            ch.WriteOneOutbound(res, failurePromise);
            failurePromise.SetException(new IOException("Cannot write response"));

            // test
            Assert.Null(ch.ReadOutbound());
            Assert.NotNull(ch.Pipeline.Context(extensionHandler));
            Assert.True(ch.Finish());
        }
        public void NoneExtensionMatchingSuccess()
        {
            // initialize
            _mainHandshaker.Setup(x => x.HandshakeExtension(
                                      It.Is <WebSocketExtensionData>(v => v.Name.Equals("unknown")))).
            Returns(default(IWebSocketServerExtension));
            _mainHandshaker.Setup(x => x.HandshakeExtension(
                                      It.Is <WebSocketExtensionData>(v => v.Name.Equals("unknown2")))).
            Returns(default(IWebSocketServerExtension));

            _fallbackHandshaker.Setup(x => x.HandshakeExtension(
                                          It.Is <WebSocketExtensionData>(v => v.Name.Equals("unknown")))).
            Returns(default(IWebSocketServerExtension));
            _fallbackHandshaker.Setup(x => x.HandshakeExtension(
                                          It.Is <WebSocketExtensionData>(v => v.Name.Equals("unknown2")))).
            Returns(default(IWebSocketServerExtension));

            // execute
            WebSocketServerExtensionHandler extensionHandler =
                new WebSocketServerExtensionHandler(_mainHandshaker.Object, _fallbackHandshaker.Object);
            var ch = new EmbeddedChannel(extensionHandler);

            IHttpRequest req = NewUpgradeRequest("unknown, unknown2");

            ch.WriteInbound(req);

            IHttpResponse res = NewUpgradeResponse(null);

            ch.WriteOutbound(res);

            var res2 = ch.ReadOutbound <IHttpResponse>();

            // test
            Assert.Null(ch.Pipeline.Context(extensionHandler));
            Assert.False(res2.Headers.Contains(HttpHeaderNames.SecWebsocketExtensions));

            _mainHandshaker.Verify(x => x.HandshakeExtension(It.Is <WebSocketExtensionData>(v => v.Name.Equals("unknown"))));
            _mainHandshaker.Verify(x => x.HandshakeExtension(It.Is <WebSocketExtensionData>(v => v.Name.Equals("unknown2"))));

            _fallbackHandshaker.Verify(x => x.HandshakeExtension(It.Is <WebSocketExtensionData>(v => v.Name.Equals("unknown"))));
            _fallbackHandshaker.Verify(x => x.HandshakeExtension(It.Is <WebSocketExtensionData>(v => v.Name.Equals("unknown2"))));
        }
        public void MainSuccess()
        {
            // initialize
            _mainHandshaker.Setup(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("main"))))
            .Returns(_mainExtension.Object);
            _mainHandshaker.Setup(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))))
            .Returns(default(IWebSocketServerExtension));

            _fallbackHandshaker.Setup(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))))
            .Returns(_fallbackExtension.Object);
            _fallbackHandshaker.Setup(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("main"))))
            .Returns(default(IWebSocketServerExtension));

            _mainExtension.Setup(x => x.Rsv).Returns(WebSocketRsv.Rsv1);
            _mainExtension.Setup(x => x.NewReponseData()).Returns(
                new WebSocketExtensionData("main", new Dictionary <string, string>()));
            _mainExtension.Setup(x => x.NewExtensionEncoder()).Returns(new DummyEncoder());
            _mainExtension.Setup(x => x.NewExtensionDecoder()).Returns(new DummyDecoder());

            _fallbackExtension.Setup(x => x.Rsv).Returns(WebSocketRsv.Rsv1);

            // execute
            WebSocketServerExtensionHandler extensionHandler =
                new WebSocketServerExtensionHandler(_mainHandshaker.Object, _fallbackHandshaker.Object);
            var ch = new EmbeddedChannel(extensionHandler);

            IHttpRequest req = NewUpgradeRequest("main, fallback");

            ch.WriteInbound(req);

            IHttpResponse res = NewUpgradeResponse(null);

            ch.WriteOutbound(res);

            var res2 = ch.ReadOutbound <IHttpResponse>();

            Assert.True(res2.Headers.TryGet(HttpHeaderNames.SecWebsocketExtensions, out ICharSequence value));
            List <WebSocketExtensionData> resExts = WebSocketExtensionUtil.ExtractExtensions(value.ToString());

            // test
            Assert.Null(ch.Pipeline.Context(extensionHandler));
            Assert.Single(resExts);
            Assert.Equal("main", resExts[0].Name);
            Assert.Empty(resExts[0].Parameters);
            Assert.NotNull(ch.Pipeline.Get <DummyDecoder>());
            Assert.NotNull(ch.Pipeline.Get <DummyEncoder>());

            _mainHandshaker.Verify(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("main"))),
                Times.AtLeastOnce);
            _mainHandshaker.Verify(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))),
                Times.AtLeastOnce);
            _fallbackHandshaker.Verify(
                x => x.HandshakeExtension(
                    It.Is <WebSocketExtensionData>(v => v.Name.Equals("fallback"))),
                Times.AtLeastOnce);

            _mainExtension.Verify(x => x.Rsv, Times.AtLeastOnce);
            _mainExtension.Verify(x => x.NewReponseData());
            _mainExtension.Verify(x => x.NewExtensionEncoder());
            _mainExtension.Verify(x => x.NewExtensionDecoder());
            _fallbackExtension.Verify(x => x.Rsv, Times.AtLeastOnce);
        }