public void TestListTableNamesLists()
        {
            var factory = new ValueFactory();
            var tables  = new List <string>()
            {
                "table1", "table2"
            };
            var ions = tables.Select(t => CreateValueHolder(factory.NewString(t))).ToList();

            var h1 = QldbHash.ToQldbHash(TestTransactionId);

            h1 = Transaction.Dot(h1, QldbDriverBase <QldbSession> .TableNameQuery, new List <IIonValue> {
            });

            mockClient.QueueResponse(StartSessionResponse(TestRequestId));
            mockClient.QueueResponse(StartTransactionResponse(TestTransactionId, TestRequestId));
            mockClient.QueueResponse(ExecuteResponse(TestRequestId, ions));
            mockClient.QueueResponse(CommitResponse(TestTransactionId, TestRequestId, h1.Hash));

            var result = testDriver.ListTableNames();

            Assert.IsNotNull(result);
            CollectionAssert.AreEqual(tables, result.ToList());

            mockClient.Clear();
        }
Esempio n. 2
0
        public async Task Execute_HaveOCCExceptionsAndAbortFailuresWithinRetryLimit_Succeeded()
        {
            var mockCreator = new Mock <Func <Task <Session> > >();
            var mockSession = new Mock <Session>(null, null, null, null, null);

            mockCreator.Setup(x => x()).ReturnsAsync(mockSession.Object);
            var retry = new Mock <Func <int, Task> >();

            var sendCommandResponseStart = new StartTransactionResult
            {
                TransactionId = "testTransactionIdddddd"
            };

            var h1 = QldbHash.ToQldbHash("testTransactionIdddddd");

            var sendCommandResponseCommit = new CommitTransactionResult
            {
                CommitDigest  = new MemoryStream(h1.Hash),
                TransactionId = "testTransactionIdddddd"
            };

            var abortResponse    = new AbortTransactionResult {
            };
            var serviceException = new AmazonServiceException();

            mockSession.Setup(x => x.StartTransaction(It.IsAny <CancellationToken>()))
            .ReturnsAsync(sendCommandResponseStart);
            mockSession.Setup(x => x.CommitTransaction(It.IsAny <string>(), It.IsAny <MemoryStream>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(sendCommandResponseCommit);
            mockSession.SetupSequence(x => x.AbortTransaction(It.IsAny <CancellationToken>()))
            .ThrowsAsync(serviceException)
            .ReturnsAsync(abortResponse)
            .ThrowsAsync(serviceException);

            var mockFunction = new Mock <Func <TransactionExecutor, Task <int> > >();

            mockFunction.SetupSequence(f => f.Invoke(It.IsAny <TransactionExecutor>()))
            .ThrowsAsync(new OccConflictException("occ"))
            .ThrowsAsync(new OccConflictException("occ"))
            .ThrowsAsync(new OccConflictException("occ"))
            .ReturnsAsync(1);
            var mockRetry = new Mock <Action <int> >();

            var pool = new SessionPool(mockCreator.Object, QldbDriverBuilder.CreateDefaultRetryHandler(NullLogger.Instance), 2, NullLogger.Instance);

            var session1 = await pool.GetSession();

            var session2 = await pool.GetSession();

            session1.Release();
            session2.Release();

            await pool.Execute(mockFunction.Object, Driver.RetryPolicy.Builder().Build(), retry.Object);

            mockCreator.Verify(x => x(), Times.Exactly(2));
            retry.Verify(r => r.Invoke(It.IsAny <int>()), Times.Exactly(3));
            Assert.AreEqual(2, pool.AvailablePermit());
        }
Esempio n. 3
0
        private CommitTransactionResult GetTransactionResult(string txnId)
        {
            var hashBytes = QldbHash.ToQldbHash(txnId).Hash;
            CommitTransactionResult commitTransactionResult = new CommitTransactionResult
            {
                TransactionId = txnId,
                CommitDigest  = new MemoryStream(hashBytes)
            };

            return(commitTransactionResult);
        }
        public void TestExecute_RetryOnExceptions(
            Driver.RetryPolicy policy,
            IList <Exception> exceptions,
            bool expectThrow,
            Times retryActionCalledTimes)
        {
            string statement = "DELETE FROM table;";
            var    h1        = QldbHash.ToQldbHash(TestTransactionId);

            h1 = Transaction.Dot(h1, statement, new List <IIonValue> {
            });

            mockClient.QueueResponse(StartSessionResponse(TestRequestId));
            mockClient.QueueResponse(StartTransactionResponse(TestTransactionId, TestRequestId));
            foreach (var ex in exceptions)
            {
                mockClient.QueueResponse(ex);

                // OccConflictException reuses the session so no need for another start session.
                if (ex is not OccConflictException)
                {
                    mockClient.QueueResponse(StartSessionResponse(TestRequestId));
                }

                mockClient.QueueResponse(StartTransactionResponse(TestTransactionId, TestRequestId));
            }
            mockClient.QueueResponse(ExecuteResponse(TestRequestId, null));
            mockClient.QueueResponse(CommitResponse(TestTransactionId, TestRequestId, h1.Hash));

            var retry = new Mock <Action <int> >();

            try
            {
                testDriver.Execute(txn => txn.Execute(statement), policy, retry.Object);

                Assert.IsFalse(expectThrow);
            }
            catch (Exception e)
            {
                Assert.IsTrue(expectThrow);

                Assert.IsTrue(exceptions.Count > 0);

                // The exception should be the same type as the last exception in our exception list.
                Exception finalException        = exceptions[exceptions.Count - 1];
                Type      expectedExceptionType = finalException.GetType();
                Assert.IsInstanceOfType(e, expectedExceptionType);
            }

            retry.Verify(r => r.Invoke(It.IsAny <int>()), retryActionCalledTimes);

            mockClient.Clear();
        }
Esempio n. 5
0
#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
        internal static async Task <CommitTransactionResult> GetAsyncTransactionResult(string txnId)
#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
        {
            var hashBytes = QldbHash.ToQldbHash(txnId).Hash;
            CommitTransactionResult commitTransactionResult = new CommitTransactionResult
            {
                TransactionId = txnId,
                CommitDigest  = new MemoryStream(hashBytes)
            };

            return(commitTransactionResult);
        }
        public void Execute_HaveISE_Succeeded()
        {
            var mockCreator = new Mock <Func <Session> >();
            var mockSession = new Mock <Session>(null, null, null, null, null);

            mockCreator.Setup(x => x()).Returns(mockSession.Object);
            var retry = new Mock <Action <int> >();

            var sendCommandResponseStart = new StartTransactionResult
            {
                TransactionId = "testTransactionIdddddd"
            };

            var h1 = QldbHash.ToQldbHash("testTransactionIdddddd");

            var sendCommandResponseCommit = new CommitTransactionResult
            {
                CommitDigest  = new MemoryStream(h1.Hash),
                TransactionId = "testTransactionIdddddd"
            };

            mockSession.Setup(x => x.StartTransaction())
            .Returns(sendCommandResponseStart);
            mockSession.Setup(x => x.CommitTransaction(It.IsAny <string>(), It.IsAny <MemoryStream>()))
            .Returns(sendCommandResponseCommit);

            var mockFunction = new Mock <Func <TransactionExecutor, int> >();

            mockFunction.SetupSequence(f => f.Invoke(It.IsAny <TransactionExecutor>()))
            .Throws(new InvalidSessionException("invalid"))
            .Throws(new InvalidSessionException("invalid"))
            .Throws(new InvalidSessionException("invalid"))
            .Throws(new InvalidSessionException("invalid"))
            .Returns(1);
            var mockRetry = new Mock <Action <int> >();

            var pool = new SessionPool(mockCreator.Object, QldbDriverBuilder.CreateDefaultRetryHandler(NullLogger.Instance), 2, NullLogger.Instance);

            var session1 = pool.GetSession();
            var session2 = pool.GetSession();

            session1.Release();
            session2.Release();

            pool.Execute(mockFunction.Object, Driver.RetryPolicy.Builder().Build(), retry.Object);

            mockCreator.Verify(x => x(), Times.Exactly(6));
            retry.Verify(r => r.Invoke(It.IsAny <int>()), Times.Exactly(4));
            Assert.AreEqual(2, pool.AvailablePermit());
        }
        public void Execute_HaveOCCExceptionsAboveRetryLimit_ThrowOCC()
        {
            var mockCreator = new Mock <Func <Session> >();
            var mockSession = new Mock <Session>(null, null, null, null, null);

            mockCreator.Setup(x => x()).Returns(mockSession.Object);
            var retry = new Mock <Action <int> >();

            var sendCommandResponseStart = new StartTransactionResult
            {
                TransactionId = "testTransactionIdddddd"
            };

            var h1 = QldbHash.ToQldbHash("testTransactionIdddddd");

            var sendCommandResponseCommit = new CommitTransactionResult
            {
                CommitDigest  = new MemoryStream(h1.Hash),
                TransactionId = "testTransactionIdddddd"
            };

            mockSession.Setup(x => x.StartTransaction())
            .Returns(sendCommandResponseStart);
            mockSession.Setup(x => x.CommitTransaction(It.IsAny <string>(), It.IsAny <MemoryStream>()))
            .Returns(sendCommandResponseCommit);

            var mockFunction = new Mock <Func <TransactionExecutor, int> >();

            mockFunction.SetupSequence(f => f.Invoke(It.IsAny <TransactionExecutor>()))
            .Throws(new OccConflictException("occ"))
            .Throws(new OccConflictException("occ"))
            .Throws(new OccConflictException("occ"))
            .Throws(new OccConflictException("occ"))
            .Throws(new OccConflictException("occ"));
            var mockRetry = new Mock <Action <int> >();

            var pool = new SessionPool(mockCreator.Object, QldbDriverBuilder.CreateDefaultRetryHandler(NullLogger.Instance), 1, NullLogger.Instance);

            Assert.ThrowsException <OccConflictException>(() => pool.Execute(mockFunction.Object, Driver.RetryPolicy.Builder().Build(), retry.Object));

            mockCreator.Verify(x => x(), Times.Once);
            retry.Verify(r => r.Invoke(It.IsAny <int>()), Times.Exactly(4));
        }
        public void Execute_NoException_ReturnFunctionValue()
        {
            var mockCreator = new Mock <Func <Session> >();
            var mockSession = new Mock <Session>(null, null, null, null, null);

            mockCreator.Setup(x => x()).Returns(mockSession.Object);
            var retry = new Mock <Action <int> >();

            var sendCommandResponseStart = new StartTransactionResult
            {
                TransactionId = "testTransactionIdddddd"
            };

            var h1 = QldbHash.ToQldbHash("testTransactionIdddddd");

            var sendCommandResponseCommit = new CommitTransactionResult
            {
                CommitDigest  = new MemoryStream(h1.Hash),
                TransactionId = "testTransactionIdddddd"
            };

            mockSession.Setup(x => x.StartTransaction())
            .Returns(sendCommandResponseStart);
            mockSession.Setup(x => x.CommitTransaction(It.IsAny <string>(), It.IsAny <MemoryStream>()))
            .Returns(sendCommandResponseCommit);

            var mockFunction = new Mock <Func <TransactionExecutor, int> >();

            mockFunction.Setup(f => f.Invoke(It.IsAny <TransactionExecutor>())).Returns(1);
            var mockRetry = new Mock <Action <int> >();

            var pool = new SessionPool(mockCreator.Object, QldbDriverBuilder.CreateDefaultRetryHandler(NullLogger.Instance), 1, NullLogger.Instance);

            pool.Execute(mockFunction.Object, Driver.RetryPolicy.Builder().Build(), retry.Object);

            mockCreator.Verify(x => x(), Times.Once);
            retry.Verify(r => r.Invoke(It.IsAny <int>()), Times.Never);
        }
        public async Task Execute_ExceptionOnExecute_ShouldOnlyRetryOnISEAndTAOE(Exception exception, bool expectThrow)
        {
            var statement = "DELETE FROM table;";
            var h1        = QldbHash.ToQldbHash(TestTransactionId);

            h1 = Transaction.Dot(h1, statement, new List <IIonValue> {
            });

            var sendCommandResponseWithStartSession = new SendCommandResponse
            {
                StartTransaction = new StartTransactionResult
                {
                    TransactionId = TestTransactionId
                },
                ResponseMetadata = new ResponseMetadata
                {
                    RequestId = "testId"
                }
            };

            var sendCommandResponseExecute = new SendCommandResponse
            {
                ExecuteStatement = new ExecuteStatementResult
                {
                    FirstPage = new Page
                    {
                        NextPageToken = null
                    }
                },
                ResponseMetadata = new ResponseMetadata
                {
                    RequestId = "testId"
                }
            };

            var sendCommandResponseCommit = new SendCommandResponse
            {
                CommitTransaction = new CommitTransactionResult
                {
                    TransactionId = TestTransactionId,
                    CommitDigest  = new MemoryStream(h1.Hash),
                },
                ResponseMetadata = new ResponseMetadata
                {
                    RequestId = "testId"
                }
            };
            var mockCreator = new Mock <Func <Task <Session> > >();
            var mockSession = new Mock <Session>(null, null, null, null, null);

            mockSession.Setup(x => x.StartTransaction(It.IsAny <CancellationToken>())).ReturnsAsync(sendCommandResponseWithStartSession.StartTransaction);
            mockSession.SetupSequence(x => x.ExecuteStatement(It.IsAny <String>(), It.IsAny <String>(), It.IsAny <List <IIonValue> >(), It.IsAny <CancellationToken>()))
            .ThrowsAsync(exception)
            .ThrowsAsync(exception)
            .ReturnsAsync(sendCommandResponseExecute.ExecuteStatement);
            mockSession.Setup(x => x.CommitTransaction(It.IsAny <String>(), It.IsAny <MemoryStream>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(sendCommandResponseCommit.CommitTransaction);

            mockCreator.Setup(x => x()).ReturnsAsync(mockSession.Object);

            var driver = new QldbDriver(
                new SessionPool(mockCreator.Object, QldbDriverBuilder.CreateDefaultRetryHandler(NullLogger.Instance), 4, NullLogger.Instance));

            try
            {
                await driver.Execute(txn => txn.Execute(statement));
            }
            catch (Exception e)
            {
                Assert.AreEqual(exception, e);
                Assert.IsTrue(expectThrow);
                return;
            }

            Assert.IsFalse(expectThrow);
        }
        public async Task TestListTableNamesLists()
        {
            var factory = new ValueFactory();
            var tables  = new List <string>()
            {
                "table1", "table2"
            };
            var ions = tables.Select(t => CreateValueHolder(factory.NewString(t))).ToList();

            var h1 = QldbHash.ToQldbHash(TestTransactionId);

            h1 = Transaction.Dot(h1, QldbDriver.TableNameQuery, new List <IIonValue> {
            });

            var sendCommandResponseWithStartSession = new SendCommandResponse
            {
                StartSession = new StartSessionResult
                {
                    SessionToken = "testToken"
                },
                ResponseMetadata = new ResponseMetadata
                {
                    RequestId = "testId"
                }
            };
            var sendCommandResponseStartTransaction = new SendCommandResponse
            {
                StartTransaction = new StartTransactionResult
                {
                    TransactionId = TestTransactionId
                },
                ResponseMetadata = new ResponseMetadata
                {
                    RequestId = "testId"
                }
            };
            var sendCommandResponseExecute = new SendCommandResponse
            {
                ExecuteStatement = new ExecuteStatementResult
                {
                    FirstPage = new Page
                    {
                        NextPageToken = null,
                        Values        = ions
                    }
                },
                ResponseMetadata = new ResponseMetadata
                {
                    RequestId = "testId"
                }
            };
            var sendCommandResponseCommit = new SendCommandResponse
            {
                CommitTransaction = new CommitTransactionResult
                {
                    CommitDigest  = new MemoryStream(h1.Hash),
                    TransactionId = TestTransactionId
                },
                ResponseMetadata = new ResponseMetadata
                {
                    RequestId = "testId"
                }
            };

            mockClient.SetupSequence(x => x.SendCommandAsync(It.IsAny <SendCommandRequest>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(sendCommandResponseWithStartSession))
            .Returns(Task.FromResult(sendCommandResponseStartTransaction))
            .Returns(Task.FromResult(sendCommandResponseExecute))
            .Returns(Task.FromResult(sendCommandResponseCommit));

            var driver = new QldbDriver(
                new SessionPool(() => Session.StartSession("ledgerName", mockClient.Object, NullLogger.Instance),
                                QldbDriverBuilder.CreateDefaultRetryHandler(NullLogger.Instance), 4, NullLogger.Instance));

            var result = await driver.ListTableNames();

            Assert.IsNotNull(result);
            CollectionAssert.AreEqual(tables, result.ToList());
        }