Ejemplo n.º 1
0
 public BlobTriggerExecutor(string hostId, string functionId, IBlobPathSource input,
                            IBlobETagReader eTagReader, IBlobReceiptManager receiptManager, IBlobTriggerQueueWriter queueWriter)
 {
     _hostId         = hostId;
     _functionId     = functionId;
     _input          = input;
     _queueWriter    = queueWriter;
     _eTagReader     = eTagReader;
     _receiptManager = receiptManager;
 }
Ejemplo n.º 2
0
 public BlobTriggerExecutor(string hostId, FunctionDescriptor functionDescriptor, IBlobPathSource input,
                            IBlobReceiptManager receiptManager, IBlobTriggerQueueWriter queueWriter, ILogger <BlobListener> logger)
 {
     _hostId             = hostId;
     _functionDescriptor = functionDescriptor;
     _input          = input;
     _queueWriter    = queueWriter;
     _receiptManager = receiptManager;
     _logger         = logger ?? throw new ArgumentNullException(nameof(logger));
 }
Ejemplo n.º 3
0
        public void ExecuteAsync_IfLeasedIncompleteReceipt_EnqueuesMessageMarksCompletedReleasesLeaseAndReturnsTrue()
        {
            // Arrange
            string          expectedFunctionId = "FunctionId";
            string          expectedETag       = "ETag";
            IStorageBlob    blob       = CreateBlobReference("container", "blob");
            IBlobPathSource input      = CreateBlobPath(blob);
            IBlobETagReader eTagReader = CreateStubETagReader(expectedETag);

            Mock <IBlobReceiptManager> managerMock = CreateReceiptManagerReferenceMock();

            managerMock
            .Setup(m => m.TryReadAsync(It.IsAny <IStorageBlockBlob>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(BlobReceipt.Incomplete));
            managerMock
            .Setup(m => m.TryAcquireLeaseAsync(It.IsAny <IStorageBlockBlob>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult("LeaseId"));
            managerMock
            .Setup(m => m.MarkCompletedAsync(It.IsAny <IStorageBlockBlob>(), It.IsAny <string>(),
                                             It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(0))
            .Verifiable();
            managerMock
            .Setup(m => m.ReleaseLeaseAsync(It.IsAny <IStorageBlockBlob>(), It.IsAny <string>(),
                                            It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(0))
            .Verifiable();
            IBlobReceiptManager receiptManager = managerMock.Object;

            Mock <IBlobTriggerQueueWriter> queueWriterMock = new Mock <IBlobTriggerQueueWriter>(MockBehavior.Strict);

            queueWriterMock
            .Setup(w => w.EnqueueAsync(It.IsAny <BlobTriggerMessage>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(0));
            IBlobTriggerQueueWriter queueWriter = queueWriterMock.Object;

            ITriggerExecutor <IStorageBlob> product = CreateProductUnderTest(expectedFunctionId, input, eTagReader,
                                                                             receiptManager, queueWriter);

            // Act
            Task <bool> task = product.ExecuteAsync(blob, CancellationToken.None);

            // Assert
            task.WaitUntilCompleted();
            queueWriterMock
            .Verify(
                w => w.EnqueueAsync(It.Is <BlobTriggerMessage>(m =>
                                                               m != null && m.FunctionId == expectedFunctionId && m.BlobType == StorageBlobType.BlockBlob &&
                                                               m.BlobName == blob.Name && m.ContainerName == blob.Container.Name && m.ETag == expectedETag),
                                    It.IsAny <CancellationToken>()),
                Times.Once());
            managerMock.Verify();
            Assert.True(task.Result);
        }
Ejemplo n.º 4
0
        public void ExecuteAsync_IfEnqueueAsyncThrows_ReleasesLease()
        {
            // Arrange
            IStorageBlob              blob              = CreateBlobReference();
            IBlobPathSource           input             = CreateBlobPath(blob);
            IBlobETagReader           eTagReader        = CreateStubETagReader("ETag");
            InvalidOperationException expectedException = new InvalidOperationException();

            Mock <IBlobReceiptManager> mock = CreateReceiptManagerReferenceMock();

            mock.Setup(m => m.TryReadAsync(It.IsAny <IStorageBlockBlob>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(BlobReceipt.Incomplete));
            mock.Setup(m => m.TryAcquireLeaseAsync(It.IsAny <IStorageBlockBlob>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult("LeaseId"));
            mock.Setup(m => m.ReleaseLeaseAsync(It.IsAny <IStorageBlockBlob>(), It.IsAny <string>(),
                                                It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(0))
            .Verifiable();
            IBlobReceiptManager receiptManager = mock.Object;

            Mock <IBlobTriggerQueueWriter> queueWriterMock = new Mock <IBlobTriggerQueueWriter>(MockBehavior.Strict);

            queueWriterMock
            .Setup(w => w.EnqueueAsync(It.IsAny <BlobTriggerMessage>(), It.IsAny <CancellationToken>()))
            .Throws(expectedException);
            IBlobTriggerQueueWriter queueWriter = queueWriterMock.Object;

            ITriggerExecutor <IStorageBlob> product = CreateProductUnderTest(input, eTagReader, receiptManager,
                                                                             queueWriter);

            // Act
            Task <bool> task = product.ExecuteAsync(blob, CancellationToken.None);

            // Assert
            task.WaitUntilCompleted();
            mock.Verify();
            InvalidOperationException exception = Assert.Throws <InvalidOperationException>(
                () => task.GetAwaiter().GetResult());

            Assert.Same(expectedException, exception);
        }
 private static BlobTriggerExecutor CreateProductUnderTest(string functionId, IBlobPathSource input,
     IBlobETagReader eTagReader, IBlobReceiptManager receiptManager, IBlobTriggerQueueWriter queueWriter)
 {
     return new BlobTriggerExecutor(String.Empty, functionId, input, eTagReader, receiptManager, queueWriter);
 }
 private static BlobTriggerExecutor CreateProductUnderTest(IBlobPathSource input, IBlobETagReader eTagReader,
     IBlobReceiptManager receiptManager, IBlobTriggerQueueWriter queueWriter)
 {
     return CreateProductUnderTest("FunctionId", input, eTagReader, receiptManager, queueWriter);
 }
Ejemplo n.º 7
0
 private static BlobTriggerExecutor CreateProductUnderTest(string functionId, IBlobPathSource input,
                                                           IBlobETagReader eTagReader, IBlobReceiptManager receiptManager, IBlobTriggerQueueWriter queueWriter)
 {
     return(new BlobTriggerExecutor(String.Empty, functionId, input, eTagReader, receiptManager, queueWriter));
 }
Ejemplo n.º 8
0
 private static BlobTriggerExecutor CreateProductUnderTest(IBlobPathSource input, IBlobETagReader eTagReader,
                                                           IBlobReceiptManager receiptManager, IBlobTriggerQueueWriter queueWriter)
 {
     return(CreateProductUnderTest("FunctionId", input, eTagReader, receiptManager, queueWriter));
 }
        private BlobTriggerExecutor CreateProductUnderTest(string functionId, IBlobPathSource input,
                                                           IBlobReceiptManager receiptManager, IBlobTriggerQueueWriter queueWriter)
        {
            var descriptor = new FunctionDescriptor
            {
                Id      = functionId,
                LogName = functionId + "LogName"
            };

            return(new BlobTriggerExecutor(String.Empty, descriptor, input, receiptManager, queueWriter, _logger));
        }
        public void ExecuteAsync_IfLeasedIncompleteReceipt_EnqueuesMessageMarksCompletedReleasesLeaseAndReturnsSuccessResult()
        {
            // Arrange
            string expectedFunctionId          = "FunctionId";
            BlobTriggerExecutorContext context = CreateExecutorContext();
            string          expectedETag       = context.Blob.BlobClient.GetProperties().Value.ETag.ToString();
            IBlobPathSource input = CreateBlobPath(context.Blob);

            Mock <IBlobReceiptManager> managerMock = CreateReceiptManagerReferenceMock();

            managerMock
            .Setup(m => m.TryReadAsync(It.IsAny <BlockBlobClient>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(BlobReceipt.Incomplete));
            managerMock
            .Setup(m => m.TryAcquireLeaseAsync(It.IsAny <BlockBlobClient>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult("LeaseId"));
            managerMock
            .Setup(m => m.MarkCompletedAsync(It.IsAny <BlockBlobClient>(), It.IsAny <string>(),
                                             It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(0))
            .Verifiable();
            managerMock
            .Setup(m => m.ReleaseLeaseAsync(It.IsAny <BlockBlobClient>(), It.IsAny <string>(),
                                            It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(0))
            .Verifiable();
            IBlobReceiptManager receiptManager = managerMock.Object;

            Mock <IBlobTriggerQueueWriter> queueWriterMock = new Mock <IBlobTriggerQueueWriter>(MockBehavior.Strict);

            queueWriterMock
            .Setup(w => w.EnqueueAsync(It.IsAny <BlobTriggerMessage>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(("testQueueName", "testMessageId")));
            IBlobTriggerQueueWriter queueWriter = queueWriterMock.Object;

            ITriggerExecutor <BlobTriggerExecutorContext> product = CreateProductUnderTest(expectedFunctionId, input,
                                                                                           receiptManager, queueWriter);

            // Act
            Task <FunctionResult> task = product.ExecuteAsync(context, CancellationToken.None);

            // Assert
            task.WaitUntilCompleted();
            queueWriterMock
            .Verify(
                w => w.EnqueueAsync(It.Is <BlobTriggerMessage>(m =>
                                                               m != null && m.FunctionId == expectedFunctionId /*&& m.BlobType == StorageBlobType.BlockBlob $$$ */ &&
                                                               m.BlobName == context.Blob.BlobClient.Name && m.ContainerName == context.Blob.BlobClient.BlobContainerName && m.ETag == expectedETag),
                                    It.IsAny <CancellationToken>()),
                Times.Once());
            managerMock.Verify();
            Assert.True(task.Result.Succeeded);

            // Validate log is written
            var logMessage = _loggerProvider.GetAllLogMessages().Single();

            Assert.AreEqual("BlobMessageEnqueued", logMessage.EventId.Name);
            Assert.AreEqual(LogLevel.Debug, logMessage.Level);
            Assert.AreEqual(7, logMessage.State.Count());
            Assert.AreEqual("FunctionIdLogName", logMessage.GetStateValue <string>("functionName"));
            Assert.AreEqual(context.Blob.BlobClient.Name, logMessage.GetStateValue <string>("blobName"));
            Assert.AreEqual("testQueueName", logMessage.GetStateValue <string>("queueName"));
            Assert.AreEqual("testMessageId", logMessage.GetStateValue <string>("messageId"));
            Assert.AreEqual(context.PollId, logMessage.GetStateValue <string>("pollId"));
            Assert.AreEqual(context.TriggerSource, logMessage.GetStateValue <BlobTriggerScanSource>("triggerSource"));
            Assert.True(!string.IsNullOrWhiteSpace(logMessage.GetStateValue <string>("{OriginalFormat}")));
        }