public static Neo4jException ParseServerException(string code, string message) { Neo4jException error; var parts = code.Split('.'); var classification = parts[1].ToLowerInvariant(); switch (classification) { case "clienterror": if (AuthenticationException.IsAuthenticationError(code)) { error = new AuthenticationException(message); } else if (ProtocolException.IsProtocolError(code)) { error = new ProtocolException(code, message); } else { error = new ClientException(code, message); } break; case "transienterror": error = new TransientException(code, message); break; default: error = new DatabaseException(code, message); break; } return(error); }
public void TreatsDatabaseUnavailableAsConnectionError() { var connMock = new Mock <IConnection>(); var handlerMock = new Mock <IClusterErrorHandler>(); var clusterConn = new ClusterConnection(connMock.Object, Uri, AccessMode.Read, handlerMock.Object); var inError = new TransientException("Neo.TransientError.General.DatabaseUnavailable", "Store copying"); var outError = Record.Exception(() => clusterConn.OnError(inError)); outError.ShouldBeEquivalentTo(inError); handlerMock.Verify(x => x.OnConnectionError(Uri, inError)); }
public async Task TreatsDatabaseUnavailableAsConnectionError() { var handlerMock = new Mock <IClusterErrorHandler>(); var clusterConn = new ClusterConnection(CreateConnectionWithMode(AccessMode.Read), Uri, handlerMock.Object); var inError = new TransientException("Neo.TransientError.General.DatabaseUnavailable", "Store copying"); var outError = await Record.ExceptionAsync(() => clusterConn.OnErrorAsync(inError)); outError.Should().BeEquivalentTo(inError); handlerMock.Verify(x => x.OnConnectionErrorAsync(Uri, inError)); }
public void ShouldRetryAtLeastTwice() { var error = new TransientException("code", "message"); var logger = new Mock <IDriverLogger>(); var retryLogic = new RetryLogic(TimeSpan.FromSeconds(1), logger.Object); var work = CreateFailingWork(TimeSpan.FromSeconds(2), 1, error); var result = retryLogic.Retry(() => work.Work(null)); result.Should().Be(1); logger.Verify(x => x.Warn(error, It.Is <string>(s => s.StartsWith("Transaction failed and will be retried in"))), Times.Once); }
public void ShouldLogRetries(int errorCount) { var error = new TransientException("code", "message"); var logger = new Mock <IDriverLogger>(); var retryLogic = new RetryLogic(TimeSpan.FromMinutes(1), logger.Object); var work = CreateFailingWork(1, Enumerable.Range(1, errorCount).Select(x => error).Cast <Exception>().ToArray()); var result = retryLogic.Retry(() => work.Work(null)); result.Should().Be(1); logger.Verify(x => x.Warn(error, It.Is <string>(s => s.StartsWith("Transaction failed and will be retried in"))), Times.Exactly(errorCount)); }
public void ShouldRetryAtLeastTwice() { var error = new TransientException("code", "message"); var logger = new Mock <ILogger>(); var retryLogic = new RxRetryLogic(TimeSpan.FromSeconds(1), logger.Object); retryLogic .Retry(CreateFailingObservable(TimeSpan.FromSeconds(2), 1, error)) .WaitForCompletion() .AssertEqual( OnNext(0, 1), OnCompleted <int>(0)); logger.Verify(x => x.Warn(error, It.Is <string>(s => s.StartsWith("Transaction failed and will be retried in"))), Times.Once); }
public void ShouldLogRetries(int errorCount) { var error = new TransientException("code", "message"); var logger = new Mock <ILogger>(); var retryLogic = new RxRetryLogic(TimeSpan.FromMinutes(1), logger.Object); retryLogic .Retry(CreateFailingObservable(1, Enumerable.Range(1, errorCount).Select(x => error).Cast <Exception>().ToArray())) .WaitForCompletion() .AssertEqual( OnNext(0, 1), OnCompleted <int>(0)); logger.Verify(x => x.Warn(error, It.Is <string>(s => s.StartsWith("Transaction failed and will be retried in"))), Times.Exactly(errorCount)); }