public void recovery_is_started_after_connection_is_back()
        {
            _timeProvider.Now = new DateTime(2000, 1, 1, 12, 0, 0);
            var disconnectedTime = _timeProvider.Now - TimeSpan.FromHours(2);

            _producer.SetLastTimestampBeforeDisconnect(disconnectedTime);

            var recoveryOperation = new RecoveryOperation(_producer, _recoveryRequestIssuerMock.Object, new[] { DefaultInterest }, 0, false);
            var recoveryManager   = new ProducerRecoveryManager(_producer, recoveryOperation, _timestampTracker, 30);

            recoveryManager.ProcessSystemMessage(_messageBuilder.BuildAlive());
            _recoveryRequestIssuerMock.Verify(x => x.RequestRecoveryAfterTimestampAsync(_producer, disconnectedTime, 0), Times.Once);
            Assert.AreEqual(ProducerRecoveryStatus.Started, recoveryManager.Status);
            Debug.Assert(recoveryOperation.RequestId != null, "recoveryOperation.RequestId != null");
            recoveryManager.ProcessUserMessage(_messageBuilder.BuildSnapshotComplete(recoveryOperation.RequestId.Value), DefaultInterest);
            Assert.AreEqual(ProducerRecoveryStatus.Completed, recoveryManager.Status);
            recoveryManager.ProcessUserMessage(_messageBuilder.BuildAlive(_producer.Id, _timeProvider.Now), DefaultInterest);

            recoveryManager.ConnectionShutdown();
            Assert.AreEqual(ProducerRecoveryStatus.Error, recoveryManager.Status);
            recoveryManager.ConnectionRecovered();
            var time = _timeProvider.Now;

            _timeProvider.AddSeconds(40);
            recoveryManager.ProcessSystemMessage(_messageBuilder.BuildAlive());
            Assert.AreEqual(ProducerRecoveryStatus.Started, recoveryManager.Status);
            _recoveryRequestIssuerMock.Verify(x => x.RequestRecoveryAfterTimestampAsync(_producer, time, 0));
        }
Ejemplo n.º 2
0
        public void recovery_is_restarted_after_connection_is_shutdown()
        {
            var recoveryOperationMock = new Mock <IRecoveryOperation>();

            recoveryOperationMock.Setup(x => x.Start()).Returns(true);
            _producerRecoveryManager = new ProducerRecoveryManager(_producer, recoveryOperationMock.Object, _timestampTracker);
            _producerRecoveryManager.ProcessSystemMessage(_messageBuilder.BuildAlive());
            Assert.AreEqual(ProducerRecoveryStatus.Started, _producerRecoveryManager.Status);
            recoveryOperationMock.Verify(x => x.Start(), Times.Once);
            _producerRecoveryManager.ConnectionShutdown();
            Assert.AreEqual(ProducerRecoveryStatus.Error, _producerRecoveryManager.Status);
            recoveryOperationMock.Verify(x => x.Reset(), Times.Once);
            _producerRecoveryManager.ProcessSystemMessage(_messageBuilder.BuildAlive());
            recoveryOperationMock.Verify(x => x.Start(), Times.Exactly(2));
        }