Skip to content

Commit 74e3ca7

Browse files
authored
Return metadata provider task whether it is successful or not (#10598)
1 parent 287ceac commit 74e3ca7

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

src/WebJobs.Script/Host/FunctionMetadataManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ private void AddMetadataFromCustomProviders(IEnumerable<IFunctionProvider> funct
236236

237237
var completedTask = Task.WhenAny(getFunctionMetadataFromProviderTask, delayTask).ContinueWith(t =>
238238
{
239-
if (t.Result == getFunctionMetadataFromProviderTask && getFunctionMetadataFromProviderTask.IsCompletedSuccessfully)
239+
if (t.Result == getFunctionMetadataFromProviderTask)
240240
{
241241
return getFunctionMetadataFromProviderTask.Result;
242242
}

test/WebJobs.Script.Tests/FunctionMetadataManagerTests.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using System.Collections.ObjectModel;
88
using System.IO;
99
using System.Linq;
10+
using System.Threading;
1011
using System.Threading.Tasks;
1112
using Microsoft.Azure.WebJobs.Script.Description;
1213
using Microsoft.Azure.WebJobs.Script.Workers.Http;
@@ -222,6 +223,34 @@ public void FunctionMetadataManager_LoadFunctionMetadata_Throws_WhenFunctionProv
222223
Assert.DoesNotContain(traces, t => t.FormattedMessage.Contains("2 functions found (Custom)"));
223224
}
224225

226+
[Fact]
227+
public void FunctionMetadataManager_LoadFunctionMetadata_BadMetadataProvider_ReturnsFailedTask()
228+
{
229+
var functionMetadataCollection = new Collection<FunctionMetadata>();
230+
var mockFunctionErrors = new Dictionary<string, ImmutableArray<string>>();
231+
var mockFunctionMetadataProvider = new Mock<IFunctionMetadataProvider>();
232+
var badFunctionMetadataProvider = new Mock<IFunctionProvider>();
233+
var workerConfigs = TestHelpers.GetTestWorkerConfigs();
234+
var testLoggerProvider = new TestLoggerProvider();
235+
var loggerFactory = new LoggerFactory();
236+
loggerFactory.AddProvider(testLoggerProvider);
237+
238+
mockFunctionMetadataProvider.Setup(m => m.GetFunctionMetadataAsync(workerConfigs, SystemEnvironment.Instance, false)).Returns(Task.FromResult(new Collection<FunctionMetadata>().ToImmutableArray()));
239+
mockFunctionMetadataProvider.Setup(m => m.FunctionErrors).Returns(new Dictionary<string, ICollection<string>>().ToImmutableDictionary(kvp => kvp.Key, kvp => kvp.Value.ToImmutableArray()));
240+
241+
// A bad provider that returns a faulty task
242+
var tcs = new TaskCompletionSource<ImmutableArray<FunctionMetadata>>();
243+
badFunctionMetadataProvider
244+
.Setup(m => m.GetFunctionMetadataAsync())
245+
.Returns(Task.FromException<ImmutableArray<FunctionMetadata>>(new Exception("Simulated failure")));
246+
247+
FunctionMetadataManager testFunctionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper<ScriptJobHostOptions>(_scriptJobHostOptions),
248+
mockFunctionMetadataProvider.Object, new List<IFunctionProvider>() { badFunctionMetadataProvider.Object }, new OptionsWrapper<HttpWorkerOptions>(_defaultHttpWorkerOptions), loggerFactory, new TestOptionsMonitor<LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions()));
249+
250+
var exception = Assert.Throws<AggregateException>(() => testFunctionMetadataManager.LoadFunctionMetadata());
251+
Assert.Contains("Simulated failure", exception.InnerException.Message);
252+
}
253+
225254
[Fact]
226255
public void FunctionMetadataManager_LoadFunctionMetadata_Throws_WhenFunctionProvidersTimesOut()
227256
{

0 commit comments

Comments
 (0)