Ejemplo n.º 1
0
        public void WithAutoConnectFalse_LeavesStateAsInitialized()
        {
            var client = GetClientWithFakeTransport(opts => opts.AutoConnect = false);

            client.ConnectionManager.ConnectionState.Should().Be(ConnectionState.Initialized);
            LastCreatedTransport.Should().BeNull("Transport shouldn't be created without calling connect when AutoConnect is false");
        }
Ejemplo n.º 2
0
        public void WhenTransportCloses_ShouldResumeConnection()
        {
            var client = SetupConnectedClient();

            List <ConnectionState> states = new List <ConnectionState>();
            var errors = new List <ErrorInfo>();

            client.Connection.InternalStateChanged += (sender, args) =>
            {
                if (args.HasError)
                {
                    errors.Add(args.Reason);
                }

                states.Add(args.Current);
                if (args.Current == ConnectionState.Connecting)
                {
                    client.FakeProtocolMessageReceived(new ProtocolMessage(ProtocolMessage.MessageAction.Connected));
                }
            };

            var firstTransport = LastCreatedTransport;
            var connectionKey  = client.Connection.Key;
            var serial         = client.Connection.Serial.Value;

            LastCreatedTransport.Listener.OnTransportEvent(TransportState.Closed);

            var urlParams = LastCreatedTransport.Parameters.GetParams();

            urlParams.Should().ContainKey("resume")
            .WhichValue.Should().Be(connectionKey);
            urlParams.Should().ContainKey("connection_serial")
            .WhichValue.Should().Be(serial.ToString());
            LastCreatedTransport.Should().NotBeSameAs(firstTransport);
        }
Ejemplo n.º 3
0
        public async Task WhenClosingAConnection_ItShouldRaiseClosingAndClosedEvents()
        {
            var client = await GetConnectedClient();

            var states = new List <ConnectionStateChange>();

            client.Connection.On((args) =>
            {
                // (TA1) Whenever the connection state changes,
                // a ConnectionStateChange object is emitted on the Connection object
                args.Should().BeOfType <ConnectionStateChange>();
                states.Add(args);
            });

            LastCreatedTransport.SetSendAction(message =>
            {
                if (message.Original.Action == ProtocolMessage.MessageAction.Close)
                {
                    LastCreatedTransport.Close(false);
                }
            });

            client.Close();

            await client.WaitForState(ConnectionState.Closed);

            states.Count.Should().Be(2);
            (from s in states select s.Current).Should().BeEquivalentTo(new[] { ConnectionState.Closing, ConnectionState.Closed });
            states[1].Previous.Should().Be(ConnectionState.Closing);
            states[1].Current.Should().Be(ConnectionState.Closed);
            states[1].Event.Should().Be(ConnectionEvent.Closed);
            client.Connection.State.Should().Be(ConnectionState.Closed);
        }
Ejemplo n.º 4
0
            public async Task ShouldCreateTransport()
            {
                // Arrange
                var client = GetClientWithFakeTransport(opts => opts.AutoConnect = false);

                LastCreatedTransport.Should().BeNull();

                client.ExecuteCommand(SetConnectingStateCommand.Create());
                await client.ProcessCommands();

                // Assert
                LastCreatedTransport.Should().NotBeNull();
            }
        public async Task WhenTransportCloses_ShouldResumeConnection()
        {
            var client = await SetupConnectedClient();

            var states = new List <ConnectionState>();
            var errors = new List <ErrorInfo>();

            client.Connection.On((args) =>
            {
                if (args.HasError)
                {
                    errors.Add(args.Reason);
                }

                states.Add(args.Current);
                if (args.Current == ConnectionState.Connecting)
                {
                    client.FakeProtocolMessageReceived(new ProtocolMessage(ProtocolMessage.MessageAction.Connected));
                }
            });

            var firstTransport = LastCreatedTransport;
            var connectionKey  = client.Connection.Key;

            Debug.Assert(client.Connection.Serial.HasValue, "Expected a serial number, got null");
            var serial = client.Connection.Serial.Value;

            LastCreatedTransport.Listener.OnTransportEvent(LastCreatedTransport.Id, TransportState.Closed);

            await client.WaitForState(ConnectionState.Connecting);

            await client.ProcessCommands();

            states.Should().NotBeEmpty();
            errors.Should().NotBeEmpty();

            var urlParams = LastCreatedTransport.Parameters.GetParams();

            urlParams.Should().ContainKey("resume")
            .WhoseValue.Should().Be(connectionKey);
            urlParams.Should().ContainKey("connection_serial")
            .WhoseValue.Should().Be(serial.ToString());
            LastCreatedTransport.Should().NotBeSameAs(firstTransport);
        }
Ejemplo n.º 6
0
        public void WhenClosingAConnection_ItShouldRaiseClosingAndClosedEvents()
        {
            var client = GetClientWithFakeTransport();

            //Start collecting events after the connection is open
            var states = new List <ConnectionState>();

            client.Connection.InternalStateChanged += (sender, args) =>
            {
                args.Should().BeOfType <ConnectionStateChange>();
                states.Add(args.Current);
            };
            LastCreatedTransport.SendAction = message =>
            {
                if (message.Original.Action == ProtocolMessage.MessageAction.Close)
                {
                    LastCreatedTransport.Close(false);
                }
            };

            client.Close();
            states.Should().BeEquivalentTo(new[] { ConnectionState.Closing, ConnectionState.Closed });
            client.Connection.State.Should().Be(ConnectionState.Closed);
        }