public async Task ResumeShouldSucceed()
        {
            var         testPromise     = new TaskCompletionSource <bool>();
            Func <Task> closeServerFunc = await StartServerAsync(ch =>
            {
                ch.Pipeline.AddLast(
                    new StringEncoder(),
                    new StringDecoder(),
                    new TestServerHandler("ClientEnd2End.stream_management_resume_success.xml"));
            }, testPromise);

            try
            {
                bool resumedStateFired = false;

                StreamManagementHandler smHandler = null;

                var xmppClient = new XmppClient(
                    new Action <IChannelPipeline, ISession>((pipeline, session) =>
                {
                    pipeline.AddBefore <XmppStanzaHandler>(smHandler);
                })
                    )
                {
                    Username         = "******",
                    Password         = "******",
                    XmppDomain       = "localhost",
                    HostnameResolver = new StaticNameResolver(IPAddress.Parse("127.0.0.1"), 5222)
                };

                smHandler = new StreamManagementHandler(xmppClient)
                {
                    StreamId  = "b39f4f76-da2a-4785-8764-1fda0e6a5435",
                    CanResume = true,
                    IsEnabled = true,
                };

                smHandler.IncomingStanzaCounter.Value = 99;

                xmppClient
                .XmppSessionState
                .Subject
                .DistinctUntilChanged()
                .Subscribe(st =>
                {
                    if (st == SessionState.Resumed)
                    {
                        resumedStateFired = true;
                    }
                });


                ShouldThrowExtensions.ShouldNotThrow(
                    () => xmppClient.ConnectAsync().GetAwaiter().GetResult()
                    );

                await xmppClient.DisconnectAsync();

                resumedStateFired.ShouldBeTrue();
            }
            finally
            {
                Task serverCloseTask = closeServerFunc();
                serverCloseTask.Wait(ShutdownTimeout);
            }
        }
        public async Task OnResumeFailureShouldContinueWithResourceBinding()
        {
            var         testPromise     = new TaskCompletionSource <bool>();
            Func <Task> closeServerFunc = await StartServerAsync(ch =>
            {
                ch.Pipeline.AddLast(
                    new StringEncoder(),
                    new StringDecoder(),
                    new TestServerHandler("ClientEnd2End.stream_management_resume_failure.xml"));
            }, testPromise);

            try
            {
                bool resumedStateFired = false;
                bool bindedStateFired  = false;

                StreamManagementHandler smHandler = null;

                var xmppClient = new XmppClient(
                    conf =>
                {
                    conf.UseStreamManagement();
                }
                    )
                {
                    Username         = "******",
                    Password         = "******",
                    XmppDomain       = "localhost",
                    Resource         = "MatriX",
                    HostnameResolver = new StaticNameResolver(IPAddress.Parse("127.0.0.1"), 5222)
                };

                xmppClient
                .XmppSessionState
                .Subject
                .DistinctUntilChanged()
                .Subscribe(st =>
                {
                    if (st == SessionState.Connected)
                    {
                        smHandler           = xmppClient.Pipeline.Get <StreamManagementHandler>();
                        smHandler.StreamId  = "b39f4f76-da2a-4785-8764-1fda0e6a5435";
                        smHandler.IsEnabled = true;
                        smHandler.CanResume = true;
                        smHandler.IncomingStanzaCounter.Value = 99;
                    }
                });

                xmppClient
                .XmppSessionState
                .Subject
                .DistinctUntilChanged()
                .Subscribe(st =>
                {
                    if (st == SessionState.Resumed)
                    {
                        resumedStateFired = true;
                    }
                });

                xmppClient
                .XmppSessionState
                .Subject
                .DistinctUntilChanged()
                .Subscribe(st =>
                {
                    if (st == SessionState.Binded)
                    {
                        bindedStateFired = true;
                    }
                });


                ShouldThrowExtensions.ShouldNotThrow(
                    () => xmppClient.ConnectAsync().GetAwaiter().GetResult()
                    );

                await xmppClient.DisconnectAsync();

                resumedStateFired.ShouldBeFalse();
                bindedStateFired.ShouldBeTrue();

                // because we did a manual disconnect resumption gets disabled in the handler
                smHandler.StreamId.ShouldBeNull();
                smHandler.CanResume.ShouldBeFalse();
            }
            finally
            {
                Task serverCloseTask = closeServerFunc();
                serverCloseTask.Wait(ShutdownTimeout);
            }
        }