Skip to content

Commit 6cd27cf

Browse files
authored
Updating the TryGetFunctions to refresh cache and allowing for an empty match. (#5101)
1 parent d589668 commit 6cd27cf

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

src/WebJobs.Script.WebHost/Management/WebFunctionsManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ await functionMetadata
164164
public async Task<(bool, FunctionMetadataResponse)> TryGetFunction(string name, HttpRequest request)
165165
{
166166
var hostOptions = _applicationHostOptions.CurrentValue.ToHostOptions();
167-
var functionMetadata = _functionMetadataProvider.GetFunctionMetadata().First(metadata => metadata.Name == name);
167+
var functionMetadata = _functionMetadataProvider.GetFunctionMetadata(false).FirstOrDefault(metadata => metadata.Name == name);
168168
if (functionMetadata != null)
169169
{
170170
string routePrefix = await GetRoutePrefix(hostOptions.RootScriptPath);

test/WebJobs.Script.Tests/Managment/WebFunctionsManagerTests.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,21 @@
77
using System.IO;
88
using System.IO.Abstractions;
99
using System.Linq;
10+
using System.Net;
1011
using System.Net.Http;
1112
using System.Text;
1213
using System.Threading;
1314
using System.Threading.Tasks;
15+
using Microsoft.AspNetCore.Http;
1416
using Microsoft.Azure.WebJobs.Host.Executors;
17+
using Microsoft.Azure.WebJobs.Script.Binding;
1518
using Microsoft.Azure.WebJobs.Script.Description;
1619
using Microsoft.Azure.WebJobs.Script.Management.Models;
1720
using Microsoft.Azure.WebJobs.Script.Rpc;
1821
using Microsoft.Azure.WebJobs.Script.WebHost;
1922
using Microsoft.Azure.WebJobs.Script.WebHost.Extensions;
2023
using Microsoft.Azure.WebJobs.Script.WebHost.Management;
24+
using Microsoft.CodeAnalysis.VisualBasic.Syntax;
2125
using Microsoft.Extensions.Configuration;
2226
using Microsoft.Extensions.Logging;
2327
using Microsoft.Extensions.Logging.Abstractions;
@@ -38,6 +42,7 @@ public class WebFunctionsManagerTests : IDisposable
3842
private readonly ScriptApplicationHostOptions _hostOptions;
3943
private readonly WebFunctionsManager _webFunctionsManager;
4044
private readonly Mock<IEnvironment> _mockEnvironment;
45+
private readonly IFileSystem _fileSystem;
4146

4247
public WebFunctionsManagerTests()
4348
{
@@ -84,6 +89,7 @@ public WebFunctionsManagerTests()
8489

8590
var workerOptions = new LanguageWorkerOptions();
8691
FileUtility.Instance = fileSystem;
92+
_fileSystem = fileSystem;
8793
var languageWorkerOptions = new OptionsWrapper<LanguageWorkerOptions>(CreateLanguageWorkerConfigSettings());
8894
var metadataProvider = new FunctionMetadataProvider(optionsMonitor, languageWorkerOptions, NullLogger<FunctionMetadataProvider>.Instance);
8995
var functionsSyncManager = new FunctionsSyncManager(configurationMock.Object, hostIdProviderMock.Object, optionsMonitor, languageWorkerOptions, loggerFactory.CreateLogger<FunctionsSyncManager>(), httpClient, secretManagerProviderMock.Object, mockWebHostEnvironment.Object, _mockEnvironment.Object, hostNameProvider, metadataProvider);
@@ -101,6 +107,28 @@ public async Task ReadFunctionsMetadataSucceeds()
101107
Assert.Equal(1, unknownFunctions.Count());
102108
}
103109

110+
[Fact]
111+
public async Task TryGetFunction_NoMatchingFunction_ReturnsEmpty()
112+
{
113+
var result = await _webFunctionsManager.TryGetFunction("non-function", null);
114+
Assert.False(result.Item1);
115+
}
116+
117+
[Fact]
118+
public async Task TryGetFunction_NoFunction_ReturnsEmpty()
119+
{
120+
try
121+
{
122+
FileUtility.Instance = CreateEmptyFileSystem(_hostOptions);
123+
var action = await _webFunctionsManager.TryGetFunction("function1", null);
124+
Assert.False(action.Item1);
125+
}
126+
finally
127+
{
128+
FileUtility.Instance = _fileSystem;
129+
}
130+
}
131+
104132
[Theory]
105133
[InlineData(null, "api")]
106134
[InlineData("", "api")]
@@ -177,6 +205,31 @@ private static LanguageWorkerOptions CreateLanguageWorkerConfigSettings()
177205
};
178206
}
179207

208+
private static IFileSystem CreateEmptyFileSystem(ScriptApplicationHostOptions options)
209+
{
210+
string rootPath = options.ScriptPath;
211+
string testDataPath = options.TestDataPath;
212+
213+
var fullFileSystem = new FileSystem();
214+
var fileSystem = new Mock<IFileSystem>();
215+
var fileBase = new Mock<FileBase>();
216+
var dirBase = new Mock<DirectoryBase>();
217+
218+
fileSystem.SetupGet(f => f.Path).Returns(fullFileSystem.Path);
219+
fileSystem.SetupGet(f => f.File).Returns(fileBase.Object);
220+
fileBase.Setup(f => f.Exists(Path.Combine(rootPath, "host.json"))).Returns(true);
221+
222+
var hostJson = new MemoryStream(Encoding.UTF8.GetBytes(@"{ ""durableTask"": { ""HubName"": ""TestHubValue"", ""azureStorageConnectionStringName"": ""DurableStorage"" }}"));
223+
hostJson.Position = 0;
224+
fileBase.Setup(f => f.Open(Path.Combine(rootPath, @"host.json"), It.IsAny<FileMode>(), It.IsAny<FileAccess>(), It.IsAny<FileShare>())).Returns(hostJson);
225+
226+
fileSystem.SetupGet(f => f.Directory).Returns(dirBase.Object);
227+
228+
dirBase.Setup(d => d.Exists(options.ScriptPath)).Returns(true);
229+
dirBase.Setup(d => d.EnumerateDirectories(rootPath)).Returns(new string[0]);
230+
return fileSystem.Object;
231+
}
232+
180233
private static IFileSystem CreateFileSystem(ScriptApplicationHostOptions options)
181234
{
182235
string rootPath = options.ScriptPath;

0 commit comments

Comments
 (0)