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(); }
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()); }
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(); }
#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()); }