public async Task ExecuteScheduleFailedGoldenPathTest()
        {
            // given
            var testVstsMessage = CreateValidTestVstsMessage();

            testVstsMessage.CompleteSychronously = true;
            var mockMessage         = CreateMockMessage(testVstsMessage);
            var mockTaskClient      = new MockTaskClient();
            var mockReportingHelper = new MockJobStatusReportingHelper(testVstsMessage);
            var executeCalled       = false;
            var handler             = new MockVstsHandler
            {
                MockExecuteFunc = (vstsMessage) =>
                {
                    executeCalled = true;
                    return(Task.FromResult(new VstsScheduleResult()
                    {
                        Message = "some error message", ScheduleFailed = true
                    }));
                }
            };

            // when
            await ProcessTestMessage(mockMessage, null, mockTaskClient, handler, mockReportingHelper);

            // then - executed successfully
            Assert.IsTrue(executeCalled);

            // then - job assigned & job completed was called
            Assert.AreEqual(1, mockTaskClient.EventsReceived.Count);
            var assignedEvent = mockTaskClient.EventsReceived[0] as JobAssignedEvent;

            Assert.IsNotNull(assignedEvent);

            Assert.AreEqual(2, mockReportingHelper.JobStatusReceived.Count);
            var startedMessage = mockReportingHelper.JobStatusReceived[0];

            Assert.AreEqual(MockJobStatusReportingHelper.JobStatusEnum.Started, startedMessage);
            var completedMessage = mockReportingHelper.JobStatusReceived[1];

            Assert.AreEqual(MockJobStatusReportingHelper.JobStatusEnum.Completed, completedMessage);
            Assert.AreEqual(testVstsMessage.JobId, mockReportingHelper.VstsMessage.JobId);
            Assert.IsFalse(mockReportingHelper.JobStatusSuccess);
        }
        private static async Task ProcessTestMessage(MockServiceBusMessage mockServiceBusMessage = null, MockServiceBusQueueMessageListener mockMessageListener = null, MockTaskClient mockTaskClient = null, MockVstsHandler handler = null, MockJobStatusReportingHelper mockReportingHelper = null, ILogger logger = null, int maxRetryAttempts = 1, IBuildClient mockBuildClient = null)
        {
            mockServiceBusMessage = mockServiceBusMessage ?? CreateMockMessage(CreateValidTestVstsMessage());
            mockTaskClient        = mockTaskClient ?? new MockTaskClient();
            mockBuildClient       = mockBuildClient ?? new MockBuildClient()
            {
                MockBuild = new Build()
                {
                    Status = BuildStatus.InProgress
                }
            };
            mockReportingHelper = mockReportingHelper ?? new MockJobStatusReportingHelper(new TestVstsMessage());
            var mockReleaseClient = new MockReleaseClient()
            {
                MockRelease = new Release()
                {
                    Status = ReleaseStatus.Active
                }
            };

            handler = handler ?? new MockVstsHandler {
                MockExecuteFunc = (vstsMessage) => Task.FromResult(new VstsScheduleResult()
                {
                    Message = "(test) mock execute requested", ScheduledId = "someId", ScheduleFailed = false
                })
            };
            logger = logger ?? new TraceLogger();
            var settings = new ServiceBusQueueMessageHandlerSettings {
                MaxRetryAttempts = maxRetryAttempts, TimeLineNamePrefix = "someTimeline", WorkerName = "someWorker"
            };

            mockMessageListener = mockMessageListener ?? new MockServiceBusQueueMessageListener();
            var schedulingBroker = new TestableServiceBusQueueMessageHandler(mockMessageListener, handler, settings, logger, mockTaskClient, mockBuildClient, mockReportingHelper, mockReleaseClient);
            var cancelSource     = new CancellationTokenSource();
            await schedulingBroker.ReceiveAsync(mockServiceBusMessage, cancelSource.Token);
        }