public async Task ProcessMessageAsync_Success() { CancellationToken cancellationToken = new CancellationToken(); FunctionResult result = new FunctionResult(true); _mockQueueProcessor.Setup(p => p.BeginProcessingMessageAsync(_storageMessage.SdkObject, cancellationToken)).ReturnsAsync(true); _mockTriggerExecutor.Setup(p => p.ExecuteAsync(_storageMessage, cancellationToken)).ReturnsAsync(result); _mockQueueProcessor.Setup(p => p.CompleteProcessingMessageAsync(_storageMessage.SdkObject, result, cancellationToken)).Returns(Task.FromResult(true)); await _listener.ProcessMessageAsync(_storageMessage, TimeSpan.FromMinutes(10), cancellationToken); }
public async Task UpdatedQueueMessage_RetainsOriginalProperties() { TraceWriter trace = new TestTraceWriter(TraceLevel.Verbose); CloudQueue queue = Fixture.CreateNewQueue(); CloudQueue poisonQueue = Fixture.CreateNewQueue(); JobHostQueuesConfiguration queuesConfig = new JobHostQueuesConfiguration { MaxDequeueCount = 2 }; StorageQueue storageQueue = new StorageQueue(new StorageQueueClient(Fixture.QueueClient), queue); StorageQueue storagePoisonQueue = new StorageQueue(new StorageQueueClient(Fixture.QueueClient), poisonQueue); Mock <ITriggerExecutor <IStorageQueueMessage> > mockTriggerExecutor = new Mock <ITriggerExecutor <IStorageQueueMessage> >(MockBehavior.Strict); string messageContent = Guid.NewGuid().ToString(); CloudQueueMessage message = new CloudQueueMessage(messageContent); await queue.AddMessageAsync(message, null, null, null, null, CancellationToken.None); CloudQueueMessage messageFromCloud = await queue.GetMessageAsync(); QueueListener listener = new QueueListener(storageQueue, storagePoisonQueue, mockTriggerExecutor.Object, new WebJobsExceptionHandler(), trace, null, null, queuesConfig); mockTriggerExecutor .Setup(m => m.ExecuteAsync(It.IsAny <IStorageQueueMessage>(), CancellationToken.None)) .ReturnsAsync(new FunctionResult(false)); await listener.ProcessMessageAsync(new StorageQueueMessage(messageFromCloud), TimeSpan.FromMinutes(10), CancellationToken.None); // pull the message and process it again (to have it go through the poison queue flow) messageFromCloud = await queue.GetMessageAsync(); Assert.Equal(2, messageFromCloud.DequeueCount); await listener.ProcessMessageAsync(new StorageQueueMessage(messageFromCloud), TimeSpan.FromMinutes(10), CancellationToken.None); // Make sure the message was processed and deleted. await queue.FetchAttributesAsync(); Assert.Equal(0, queue.ApproximateMessageCount); // The Listener has inserted a message to the poison queue. await poisonQueue.FetchAttributesAsync(); Assert.Equal(1, poisonQueue.ApproximateMessageCount); mockTriggerExecutor.Verify(m => m.ExecuteAsync(It.IsAny <IStorageQueueMessage>(), CancellationToken.None), Times.Exactly(2)); }
public async Task UpdatedQueueMessage_RetainsOriginalProperties() { CloudQueue queue = Fixture.CreateNewQueue(); CloudQueue poisonQueue = Fixture.CreateNewQueue(); var queuesOptions = new QueuesOptions { MaxDequeueCount = 2 }; Mock <ITriggerExecutor <CloudQueueMessage> > mockTriggerExecutor = new Mock <ITriggerExecutor <CloudQueueMessage> >(MockBehavior.Strict); string messageContent = Guid.NewGuid().ToString(); CloudQueueMessage message = new CloudQueueMessage(messageContent); await queue.AddMessageAsync(message, null, null, null, null, CancellationToken.None); CloudQueueMessage messageFromCloud = await queue.GetMessageAsync(); var queueProcessorFactory = new DefaultQueueProcessorFactory(); QueueListener listener = new QueueListener(queue, poisonQueue, mockTriggerExecutor.Object, new WebJobsExceptionHandler(null), null, null, queuesOptions, queueProcessorFactory); mockTriggerExecutor .Setup(m => m.ExecuteAsync(It.IsAny <CloudQueueMessage>(), CancellationToken.None)) .ReturnsAsync(new FunctionResult(false)); await listener.ProcessMessageAsync(messageFromCloud, TimeSpan.FromMinutes(10), CancellationToken.None); // pull the message and process it again (to have it go through the poison queue flow) messageFromCloud = await queue.GetMessageAsync(); Assert.Equal(2, messageFromCloud.DequeueCount); await listener.ProcessMessageAsync(messageFromCloud, TimeSpan.FromMinutes(10), CancellationToken.None); // Make sure the message was processed and deleted. await queue.FetchAttributesAsync(); Assert.Equal(0, queue.ApproximateMessageCount); // The Listener has inserted a message to the poison queue. await poisonQueue.FetchAttributesAsync(); Assert.Equal(1, poisonQueue.ApproximateMessageCount); mockTriggerExecutor.Verify(m => m.ExecuteAsync(It.IsAny <CloudQueueMessage>(), CancellationToken.None), Times.Exactly(2)); }
public async Task RenewedQueueMessage_DeletesCorrectly() { TraceWriter trace = new TestTraceWriter(TraceLevel.Verbose); CloudQueue queue = Fixture.CreateNewQueue(); StorageQueue storageQueue = new StorageQueue(new StorageQueueClient(Fixture.QueueClient), queue); Mock <ITriggerExecutor <IStorageQueueMessage> > mockTriggerExecutor = new Mock <ITriggerExecutor <IStorageQueueMessage> >(MockBehavior.Strict); string messageContent = Guid.NewGuid().ToString(); CloudQueueMessage message = new CloudQueueMessage(messageContent); await queue.AddMessageAsync(message, null, null, null, null, CancellationToken.None); CloudQueueMessage messageFromCloud = await queue.GetMessageAsync(); QueueListener listener = new QueueListener(storageQueue, null, mockTriggerExecutor.Object, new WebJobsExceptionHandler(), trace, null, null, new JobHostQueuesConfiguration()); listener.MinimumVisibilityRenewalInterval = TimeSpan.FromSeconds(1); // Set up a function that sleeps to allow renewal mockTriggerExecutor .Setup(m => m.ExecuteAsync(It.Is <IStorageQueueMessage>(msg => msg.DequeueCount == 1), CancellationToken.None)) .ReturnsAsync(() => { Thread.Sleep(4000); return(new FunctionResult(true)); }); var previousNextVisibleTime = messageFromCloud.NextVisibleTime; var previousPopReceipt = messageFromCloud.PopReceipt; // Renewal should happen at 2 seconds await listener.ProcessMessageAsync(new StorageQueueMessage(messageFromCloud), TimeSpan.FromSeconds(4), CancellationToken.None); // Check to make sure the renewal occurred. Assert.NotEqual(messageFromCloud.NextVisibleTime, previousNextVisibleTime); Assert.NotEqual(messageFromCloud.PopReceipt, previousPopReceipt); // Make sure the message was processed and deleted. await queue.FetchAttributesAsync(); Assert.Equal(0, queue.ApproximateMessageCount); }