public void ValidateFunctionName_ThrowsOnInvalidName(string functionName) { var ex = Assert.Throws <InvalidOperationException>(() => { FunctionMetadataProvider.ValidateName(functionName); }); Assert.Equal(string.Format("'{0}' is not a valid function name.", functionName), ex.Message); }
public WebFunctionsManagerTests() { _testRootScriptPath = Path.GetTempPath(); _testHostConfigFilePath = Path.Combine(_testRootScriptPath, ScriptConstants.HostMetadataFileName); FileUtility.DeleteFileSafe(_testHostConfigFilePath); _hostOptions = new ScriptApplicationHostOptions { ScriptPath = @"x:\root", IsSelfHost = false, LogPath = @"x:\tmp\log", SecretsPath = @"x:\secrets", TestDataPath = @"x:\test" }; string functionsPath = Path.Combine(Environment.CurrentDirectory, @"..\..\..\..\..\sample"); var fileSystem = CreateFileSystem(_hostOptions); var loggerFactory = MockNullLoggerFactory.CreateLoggerFactory(); var contentBuilder = new StringBuilder(); var httpClient = CreateHttpClient(contentBuilder); var factory = new TestOptionsFactory <ScriptApplicationHostOptions>(_hostOptions); var tokenSource = new TestChangeTokenSource(); var changeTokens = new[] { tokenSource }; var optionsMonitor = new OptionsMonitor <ScriptApplicationHostOptions>(factory, changeTokens, factory); var secretManagerProviderMock = new Mock <ISecretManagerProvider>(MockBehavior.Strict); var secretManagerMock = new Mock <ISecretManager>(MockBehavior.Strict); secretManagerProviderMock.SetupGet(p => p.Current).Returns(secretManagerMock.Object); var hostSecretsInfo = new HostSecretsInfo(); secretManagerMock.Setup(p => p.GetHostSecretsAsync()).ReturnsAsync(hostSecretsInfo); Dictionary <string, string> functionSecrets = new Dictionary <string, string>(); secretManagerMock.Setup(p => p.GetFunctionSecretsAsync("httptrigger", false)).ReturnsAsync(functionSecrets); var configurationMock = new Mock <IConfiguration>(MockBehavior.Strict); var hostIdProviderMock = new Mock <IHostIdProvider>(MockBehavior.Strict); var mockWebHostEnvironment = new Mock <IScriptWebHostEnvironment>(MockBehavior.Strict); mockWebHostEnvironment.SetupGet(p => p.InStandbyMode).Returns(false); _mockEnvironment = new Mock <IEnvironment>(MockBehavior.Strict); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteContainerReady)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.CoreToolsEnvironment)).Returns((string)null); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteHostName)).Returns(TestHostName); var hostNameProvider = new HostNameProvider(_mockEnvironment.Object, loggerFactory.CreateLogger <HostNameProvider>()); var workerOptions = new LanguageWorkerOptions(); FileUtility.Instance = fileSystem; _fileSystem = fileSystem; var languageWorkerOptions = new OptionsWrapper <LanguageWorkerOptions>(CreateLanguageWorkerConfigSettings()); var metadataProvider = new FunctionMetadataProvider(optionsMonitor, languageWorkerOptions, NullLogger <FunctionMetadataProvider> .Instance); var functionsSyncManager = new FunctionsSyncManager(configurationMock.Object, hostIdProviderMock.Object, optionsMonitor, languageWorkerOptions, loggerFactory.CreateLogger <FunctionsSyncManager>(), httpClient, secretManagerProviderMock.Object, mockWebHostEnvironment.Object, _mockEnvironment.Object, hostNameProvider, metadataProvider); _webFunctionsManager = new WebFunctionsManager(optionsMonitor, new OptionsWrapper <LanguageWorkerOptions>(CreateLanguageWorkerConfigSettings()), loggerFactory, httpClient, secretManagerProviderMock.Object, functionsSyncManager, hostNameProvider, metadataProvider); }
public void DeterminePrimaryScriptFile_NoFiles_Returns_Null() { string[] functionFiles = new string[0]; var fileSystem = new MockFileSystem(); fileSystem.AddDirectory(@"c:\functions"); Assert.Null(FunctionMetadataProvider.DeterminePrimaryScriptFile(null, @"c:\functions", fileSystem)); }
public void DeterminePrimaryScriptFile_NoFiles_ReturnsNull() { var functionConfig = new JObject(); string[] functionFiles = new string[0]; var fileSystem = new MockFileSystem(); fileSystem.AddDirectory(@"c:\functions"); Assert.Throws <FunctionConfigurationException>(() => FunctionMetadataProvider.DeterminePrimaryScriptFile(functionConfig, @"c:\functions", fileSystem)); }
public void ValidateFunctionName_DoesNotThrowOnValidName(string functionName) { try { FunctionMetadataProvider.ValidateName(functionName); } catch (InvalidOperationException) { Assert.True(false, $"Valid function name {functionName} failed validation."); } }
public void ReadFunctionMetadata_Succeeds() { string functionsPath = Path.Combine(Environment.CurrentDirectory, @"..\..\..\..\..\sample\node"); _scriptApplicationHostOptions.ScriptPath = functionsPath; var optionsMonitor = TestHelpers.CreateOptionsMonitor(_scriptApplicationHostOptions); var metadataProvider = new FunctionMetadataProvider(optionsMonitor, new OptionsWrapper <LanguageWorkerOptions>(_languageWorkerOptions), NullLogger <FunctionMetadataProvider> .Instance, _testMetricsLogger); Assert.Equal(17, metadataProvider.GetFunctionMetadata(false).Length); Assert.True(AreRequiredMetricsEmitted(_testMetricsLogger)); }
public void DeterminePrimaryScriptFile_SingleFile() { var files = new Dictionary <string, MockFileData> { { @"c:\functions\Run.csx", new MockFileData(string.Empty) } }; var fileSystem = new MockFileSystem(files); string scriptFile = FunctionMetadataProvider.DeterminePrimaryScriptFile(null, @"c:\functions", fileSystem); Assert.Equal(@"c:\functions\Run.csx", scriptFile); }
public void DeterminePrimaryScriptFile_MultipleFiles_ConfigTrumpsConvention(string scriptFileProperty, string expedtedScriptFilePath) { var files = new Dictionary <string, MockFileData> { { expedtedScriptFilePath, new MockFileData(string.Empty) } }; var fileSystem = new MockFileSystem(files); string actualScriptFilePath = FunctionMetadataProvider.DeterminePrimaryScriptFile(scriptFileProperty, @"c:\functions", fileSystem); Assert.Equal(expedtedScriptFilePath, actualScriptFilePath); }
public void DeterminePrimaryScriptFile_MultipleFiles_IndexFilePresent() { var files = new Dictionary <string, MockFileData> { { @"c:\functions\index.js", new MockFileData(string.Empty) }, { @"c:\functions\test.txt", new MockFileData(string.Empty) } }; var fileSystem = new MockFileSystem(files); string scriptFile = FunctionMetadataProvider.DeterminePrimaryScriptFile("index.js", @"c:\functions", fileSystem); Assert.Equal(@"c:\functions\index.js", scriptFile); }
public void DeterminePrimaryScriptFile_MultipleFiles_SourceFileSpecified(string scriptFileName) { var files = new Dictionary <string, MockFileData> { { @"c:\functions\queueTrigger.py", new MockFileData(string.Empty) }, { @"c:\functions\helper.py", new MockFileData(string.Empty) }, { @"c:\functions\test.txt", new MockFileData(string.Empty) } }; var fileSystem = new MockFileSystem(files); string scriptFile = FunctionMetadataProvider.DeterminePrimaryScriptFile(scriptFileName, @"c:\functions", fileSystem); Assert.Equal(@"c:\functions\queueTrigger.py", scriptFile, StringComparer.OrdinalIgnoreCase); }
public TestFixture() { // copy test files to temp directory, since accessing the metadata APIs will result // in file creations (for test data files) var scriptSource = Path.Combine(Environment.CurrentDirectory, @"..\..\..\TestScripts\WarmupFunction"); _testHome = Path.Combine(Path.GetTempPath(), @"WarmupFunction"); var scriptRoot = Path.Combine(_testHome, @"site\wwwroot"); FileUtility.CopyDirectory(scriptSource, scriptRoot); HostOptions = new ScriptApplicationHostOptions { IsSelfHost = true, ScriptPath = scriptRoot, LogPath = Path.Combine(_testHome, @"LogFiles\Application\Functions"), SecretsPath = Path.Combine(_testHome, @"data\Functions\Secrets"), TestDataPath = Path.Combine(_testHome, @"data\Functions\SampleData") }; FileUtility.EnsureDirectoryExists(HostOptions.TestDataPath); var optionsMonitor = TestHelpers.CreateOptionsMonitor(HostOptions); var workerOptions = new LanguageWorkerOptions { WorkerConfigs = TestHelpers.GetTestWorkerConfigs() }; var provider = new FunctionMetadataProvider(optionsMonitor, NullLogger <FunctionMetadataProvider> .Instance, new TestMetricsLogger()); var builder = AspNetCore.WebHost.CreateDefaultBuilder() .UseStartup <Startup>() .ConfigureServices(services => { services.Replace(new ServiceDescriptor(typeof(IOptions <ScriptApplicationHostOptions>), new OptionsWrapper <ScriptApplicationHostOptions>(HostOptions))); services.Replace(new ServiceDescriptor(typeof(ISecretManagerProvider), new TestSecretManagerProvider(new TestSecretManager()))); services.Replace(new ServiceDescriptor(typeof(IOptionsMonitor <ScriptApplicationHostOptions>), optionsMonitor)); services.Replace(new ServiceDescriptor(typeof(IFunctionMetadataProvider), provider)); }); // TODO: https://github.com/Azure/azure-functions-host/issues/4876 _testServer = new TestServer(builder); HostOptions.RootServiceProvider = _testServer.Host.Services; var scriptConfig = _testServer.Host.Services.GetService <IOptions <ScriptJobHostOptions> >().Value; HttpClient = _testServer.CreateClient(); HttpClient.BaseAddress = new Uri("https://localhost/"); TestHelpers.WaitForWebHost(HttpClient); }
public void DeterminePrimaryScriptFile_MultipleFiles_NoClearPrimary_Returns_Null() { var functionConfig = new JObject(); var files = new Dictionary <string, MockFileData> { { @"c:\functions\foo.py", new MockFileData(string.Empty) }, { @"c:\functions\queueTrigger.py", new MockFileData(string.Empty) }, { @"c:\functions\helper.py", new MockFileData(string.Empty) }, { @"c:\functions\test.txt", new MockFileData(string.Empty) } }; var fileSystem = new MockFileSystem(files); Assert.Null(FunctionMetadataProvider.DeterminePrimaryScriptFile(null, @"c:\functions", fileSystem)); }
private static IServiceCollection AddFunctionMetadataProvider(this IServiceCollection services, ScriptApplicationHostOptions options) { var factory = new TestOptionsFactory <ScriptApplicationHostOptions>(options); var source = new TestChangeTokenSource(); var changeTokens = new[] { source }; var optionsMonitor = new OptionsMonitor <ScriptApplicationHostOptions>(factory, changeTokens, factory); var workerOptions = new LanguageWorkerOptions { WorkerConfigs = TestHelpers.GetTestWorkerConfigs() }; var metadataProvider = new FunctionMetadataProvider(optionsMonitor, new OptionsWrapper <LanguageWorkerOptions>(workerOptions), NullLogger <FunctionMetadataProvider> .Instance); return(services.AddSingleton <IFunctionMetadataProvider>(metadataProvider)); }
private FunctionMetadataManager GetMetadataManager(IOptionsMonitor <ScriptApplicationHostOptions> optionsMonitor, IScriptHostManager manager, ILoggerFactory factory) { var workerOptions = new LanguageWorkerOptions { WorkerConfigs = TestHelpers.GetTestWorkerConfigs() }; var managerServiceProvider = manager as IServiceProvider; var metadataProvider = new FunctionMetadataProvider(optionsMonitor, NullLogger <FunctionMetadataProvider> .Instance, new TestMetricsLogger()); var metadataManager = new FunctionMetadataManager(managerServiceProvider.GetService <IOptions <ScriptJobHostOptions> >(), metadataProvider, managerServiceProvider.GetService <IOptions <HttpWorkerOptions> >(), manager, factory, new OptionsWrapper <LanguageWorkerOptions>(workerOptions)); return(metadataManager); }
public void DeterminePrimaryScriptFile_MultipleFiles_RunTrumpsIndex() { var functionConfig = new JObject(); var files = new Dictionary <string, MockFileData> { { @"c:\functions\run.js", new MockFileData(string.Empty) }, { @"c:\functions\index.js", new MockFileData(string.Empty) }, { @"c:\functions\test.txt", new MockFileData(string.Empty) } }; var fileSystem = new MockFileSystem(files); string scriptFile = FunctionMetadataProvider.DeterminePrimaryScriptFile(functionConfig, @"c:\functions", fileSystem); Assert.Equal(@"c:\functions\run.js", scriptFile); }
public void ValidateFunctionName_ThrowsOnInvalidName(string functionName) { string functionsPath = "c:\testdir"; _scriptApplicationHostOptions.ScriptPath = functionsPath; var optionsMonitor = TestHelpers.CreateOptionsMonitor(_scriptApplicationHostOptions); var metadataProvider = new FunctionMetadataProvider(optionsMonitor, NullLogger <FunctionMetadataProvider> .Instance, _testMetricsLogger); var ex = Assert.Throws <InvalidOperationException>(() => { metadataProvider.ValidateName(functionName); }); Assert.Equal(string.Format("'{0}' is not a valid function name.", functionName), ex.Message); }
public void DeterminePrimaryScriptFile_MultipleFiles_RunFilePresent() { var functionConfig = new JObject(); var files = new Dictionary <string, MockFileData> { { @"c:\functions\Run.csx", new MockFileData(string.Empty) }, { @"c:\functions\Helper.csx", new MockFileData(string.Empty) }, { @"c:\functions\test.txt", new MockFileData(string.Empty) } }; var fileSystem = new MockFileSystem(files); string scriptFile = FunctionMetadataProvider.DeterminePrimaryScriptFile(null, @"c:\functions", fileSystem); Assert.Equal(@"c:\functions\Run.csx", scriptFile); }
private static IServiceCollection AddFunctionMetadataManager(this IServiceCollection services, ScriptApplicationHostOptions options, IMetricsLogger metricsLogger) { var factory = new TestOptionsFactory <ScriptApplicationHostOptions>(options); var source = new TestChangeTokenSource <ScriptApplicationHostOptions>(); var changeTokens = new[] { source }; var optionsMonitor = new OptionsMonitor <ScriptApplicationHostOptions>(factory, changeTokens, factory); var metadataProvider = new FunctionMetadataProvider(optionsMonitor, NullLogger <FunctionMetadataProvider> .Instance, metricsLogger); var metadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(new ScriptJobHostOptions()), metadataProvider, new List <IFunctionProvider>(), new OptionsWrapper <HttpWorkerOptions>(new HttpWorkerOptions()), new NullLoggerFactory(), new OptionsWrapper <LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions())); services.AddSingleton <IFunctionMetadataManager>(metadataManager); services.AddSingleton <IFunctionMetadataProvider>(metadataProvider); return(services); }
public void ValidateFunctionName_DoesNotThrowOnValidName(string functionName) { string functionsPath = "c:\testdir"; _scriptApplicationHostOptions.ScriptPath = functionsPath; var optionsMonitor = TestHelpers.CreateOptionsMonitor(_scriptApplicationHostOptions); var metadataProvider = new FunctionMetadataProvider(optionsMonitor, NullLogger <FunctionMetadataProvider> .Instance, _testMetricsLogger); try { metadataProvider.ValidateName(functionName); } catch (InvalidOperationException) { Assert.True(false, $"Valid function name {functionName} failed validation."); } }
public void ReadFunctionMetadata_Succeeds() { string functionsPath = Path.Combine(Environment.CurrentDirectory, @"..\..\..\..\..\sample\node"); var scriptApplicationHostOptions = new ScriptApplicationHostOptions() { ScriptPath = functionsPath }; var optionsMonitor = TestHelpers.CreateOptionsMonitor(scriptApplicationHostOptions); var workerOptions = new LanguageWorkerOptions { WorkerConfigs = TestHelpers.GetTestWorkerConfigs() }; var metadataProvider = new FunctionMetadataProvider(optionsMonitor, new OptionsWrapper <LanguageWorkerOptions>(workerOptions), NullLogger <FunctionMetadataProvider> .Instance); Assert.Equal(17, metadataProvider.GetFunctionMetadata(false).Length); }
public void DeterminePrimaryScriptFile_MultipleFiles_ConfigTrumpsConvention() { JObject functionConfig = new JObject() { { "scriptFile", "queueTrigger.py" } }; var files = new Dictionary <string, MockFileData> { { @"c:\functions\run.py", new MockFileData(string.Empty) }, { @"c:\functions\queueTrigger.py", new MockFileData(string.Empty) }, { @"c:\functions\helper.py", new MockFileData(string.Empty) }, { @"c:\functions\test.txt", new MockFileData(string.Empty) } }; var fileSystem = new MockFileSystem(files); string scriptFile = FunctionMetadataProvider.DeterminePrimaryScriptFile(functionConfig, @"c:\functions", fileSystem); Assert.Equal(@"c:\functions\queueTrigger.py", scriptFile); }
public void DeterminePrimaryScriptFile_RelativeSourceFileSpecified() { JObject functionConfig = new JObject() { { "scriptFile", @"..\shared\queuetrigger.py" } }; var files = new Dictionary <string, MockFileData> { { @"c:\shared\queueTrigger.py", new MockFileData(string.Empty) }, { @"c:\functions\queueTrigger.py", new MockFileData(string.Empty) }, { @"c:\functions\helper.py", new MockFileData(string.Empty) }, { @"c:\functions\test.txt", new MockFileData(string.Empty) } }; var fileSystem = new MockFileSystem(files); string scriptFile = FunctionMetadataProvider.DeterminePrimaryScriptFile(functionConfig, @"c:\functions", fileSystem); Assert.Equal(@"c:\shared\queueTrigger.py", scriptFile, StringComparer.OrdinalIgnoreCase); }
public FunctionsSyncManagerTests() { _testRootScriptPath = Path.GetTempPath(); _testHostConfigFilePath = Path.Combine(_testRootScriptPath, ScriptConstants.HostMetadataFileName); FileUtility.DeleteFileSafe(_testHostConfigFilePath); _hostOptions = new ScriptApplicationHostOptions { ScriptPath = @"x:\root", IsSelfHost = false, LogPath = @"x:\tmp\log", SecretsPath = @"x:\secrets", TestDataPath = @"x:\sampledata" }; var jobHostOptions = new ScriptJobHostOptions { RootScriptPath = _hostOptions.ScriptPath, RootLogPath = _hostOptions.LogPath }; string testHostName = "appName.azurewebsites.net"; _vars = new Dictionary <string, string> { { EnvironmentSettingNames.WebSiteAuthEncryptionKey, TestHelpers.GenerateKeyHexString() }, { EnvironmentSettingNames.AzureWebsiteHostName, testHostName } }; ResetMockFileSystem(); _loggerProvider = new TestLoggerProvider(); var loggerFactory = new LoggerFactory(); loggerFactory.AddProvider(_loggerProvider); _contentBuilder = new StringBuilder(); _mockHttpHandler = new MockHttpHandler(_contentBuilder); var httpClient = CreateHttpClient(_mockHttpHandler); var factory = new TestOptionsFactory <ScriptApplicationHostOptions>(_hostOptions); var tokenSource = new TestChangeTokenSource <ScriptApplicationHostOptions>(); var changeTokens = new[] { tokenSource }; var optionsMonitor = new OptionsMonitor <ScriptApplicationHostOptions>(factory, changeTokens, factory); var secretManagerProviderMock = new Mock <ISecretManagerProvider>(MockBehavior.Strict); var secretManagerMock = new Mock <ISecretManager>(MockBehavior.Strict); secretManagerProviderMock.SetupGet(p => p.Current).Returns(secretManagerMock.Object); var hostSecretsInfo = new HostSecretsInfo(); hostSecretsInfo.MasterKey = "aaa"; hostSecretsInfo.FunctionKeys = new Dictionary <string, string> { { "TestHostFunctionKey1", "aaa" }, { "TestHostFunctionKey2", "bbb" } }; hostSecretsInfo.SystemKeys = new Dictionary <string, string> { { "TestSystemKey1", "aaa" }, { "TestSystemKey2", "bbb" } }; secretManagerMock.Setup(p => p.GetHostSecretsAsync()).ReturnsAsync(hostSecretsInfo); Dictionary <string, string> functionSecretsResponse = new Dictionary <string, string>() { { "TestFunctionKey1", "aaa" }, { "TestFunctionKey2", "bbb" } }; secretManagerMock.Setup(p => p.GetFunctionSecretsAsync("function1", false)).ReturnsAsync(functionSecretsResponse); var configuration = ScriptSettingsManager.BuildDefaultConfiguration(); var hostIdProviderMock = new Mock <IHostIdProvider>(MockBehavior.Strict); hostIdProviderMock.Setup(p => p.GetHostIdAsync(CancellationToken.None)).ReturnsAsync("testhostid123"); _mockWebHostEnvironment = new Mock <IScriptWebHostEnvironment>(MockBehavior.Strict); _mockWebHostEnvironment.SetupGet(p => p.InStandbyMode).Returns(false); _mockEnvironment = new Mock <IEnvironment>(MockBehavior.Strict); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteArmCacheEnabled)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteContainerReady)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.CoreToolsEnvironment)).Returns((string)null); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.WebSiteAuthEncryptionKey)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteInstanceId)).Returns("1"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteHostName)).Returns(testHostName); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.SkipSslValidation)).Returns((string)null); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebJobsSecretStorageType)).Returns("blob"); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.KubernetesServiceHost)).Returns(""); _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.PodNamespace)).Returns(""); _hostNameProvider = new HostNameProvider(_mockEnvironment.Object); var functionMetadataProvider = new FunctionMetadataProvider(optionsMonitor, NullLogger <FunctionMetadataProvider> .Instance, new TestMetricsLogger()); var functionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(jobHostOptions), functionMetadataProvider, null, new OptionsWrapper <HttpWorkerOptions>(new HttpWorkerOptions()), loggerFactory, new OptionsWrapper <LanguageWorkerOptions>(CreateLanguageWorkerConfigSettings())); _functionsSyncManager = new FunctionsSyncManager(configuration, hostIdProviderMock.Object, optionsMonitor, loggerFactory.CreateLogger <FunctionsSyncManager>(), httpClient, secretManagerProviderMock.Object, _mockWebHostEnvironment.Object, _mockEnvironment.Object, _hostNameProvider, functionMetadataManager); }
public void ParseLanguage_Returns_ExpectedLanguage(string language, string scriptFile, bool includeDllWorker) { Assert.Equal(language, FunctionMetadataProvider.ParseLanguage(scriptFile, TestHelpers.GetTestWorkerConfigs(includeDllWorker: includeDllWorker))); }
public void ParseLanguage_HttpWorker_Returns_Null(string scriptFile) { Assert.Null(FunctionMetadataProvider.ParseLanguage(scriptFile, TestHelpers.GetTestWorkerConfigsNoLanguage())); }