public void should_not_lose_messages_when_persistent_transport_goes_down_and_comes_back_up() { using (MessageId.PauseIdGeneration()) { // Stopping persistence InnerTransport.RaiseMessageReceived(new TransportMessage(MessageTypeId.PersistenceStopping, new MemoryStream(), PersistencePeer)); InnerTransport.ExpectExactly(new TransportMessageSent(new TransportMessage(MessageTypeId.PersistenceStoppingAck, new MemoryStream(), Self), PersistencePeer)); InnerTransport.Messages.Clear(); // should enqueue messages to persistence var message = new FakeCommand(123).ToTransportMessage(); var ackedMessage = new FakeCommand(456).ToTransportMessage(); Transport.Send(message, new[] { AnotherPersistentPeer }); Transport.AckMessage(ackedMessage); InnerTransport.AckedMessages.ShouldBeEmpty(); InnerTransport.ExpectExactly(new TransportMessageSent(message, AnotherPersistentPeer, true)); InnerTransport.Messages.Clear(); // starting persistence - should send enqueued messages Transport.OnPeerUpdated(PersistencePeer.Id, PeerUpdateAction.Started); InnerTransport.ExpectExactly(new[] { new TransportMessageSent(message.ToPersistTransportMessage(AnotherPersistentPeer.Id), PersistencePeer), new TransportMessageSent(new MessageHandled(ackedMessage.Id).ToTransportMessage(Self), PersistencePeer) }); InnerTransport.Messages.Clear(); InnerTransport.AckedMessages.Clear(); // should send messages without going through the queue Transport.Send(message, new[] { AnotherPersistentPeer }); Transport.AckMessage(ackedMessage); InnerTransport.ExpectExactly(new[] { new TransportMessageSent(message, AnotherPersistentPeer, true).ToPersistence(PersistencePeer), new TransportMessageSent(new MessageHandled(ackedMessage.Id).ToTransportMessage(Self), PersistencePeer), }); } }