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);
        }
Esempio n. 2
0
            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));
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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));
        }