public static async Task <CloudStampyParameters> TestRunner([QueueTrigger("test-jobs", Connection = "StampyStorageConnectionString")] CloudStampyParameters request) { var nextJob = request.Copy(); nextJob.JobId = Guid.NewGuid().ToString(); if ((request.JobType & StampyJobType.Test) == StampyJobType.Test && (request.FlowStatus == Status.InProgress || request.FlowStatus == default(Status))) { if (request.TestCategories.Any() && !string.IsNullOrWhiteSpace(request.BuildPath) && !string.IsNullOrWhiteSpace(request.CloudName)) { var resultTasks = new List <Task <JobResult> >(); var results = new List <JobResult>(); foreach (var testCategorySet in request.TestCategories) { foreach (var testCategory in testCategorySet) { var testJob = request.Copy(); testJob.JobId = Guid.NewGuid().ToString(); testJob.TestCategories = new List <List <string> > { new List <string> { testCategory } }; //test should timeout after 180 minutes. //TODO double check if function runtime has default timeout resultTasks.Add(ExecuteJob(testJob, StampyJobType.Test, TimeSpan.FromHours(5))); } var testCategoryResults = await Task.WhenAll(resultTasks); resultTasks.Clear(); results.AddRange(testCategoryResults); } nextJob.FlowStatus = JobStatusHelper.DetermineOverallJobStatus(results); if ((nextJob.JobType & StampyJobType.RemoveResources) != StampyJobType.RemoveResources) { nextJob.JobType = nextJob.JobType | StampyJobType.RemoveResources; } nextJob.ExpiryDate = DateTime.UtcNow.AddHours(1).ToString(); } } return(nextJob); }