コード例 #1
0
        public void FunctionMetadataManager_ThrowsError_DuplicateFunctions_FromFunctionProviders()
        {
            var functionMetadataCollection    = new Collection <FunctionMetadata>();
            var mockFunctionErrors            = new Dictionary <string, ImmutableArray <string> >();
            var mockFunctionMetadataProvider  = new Mock <IFunctionMetadataProvider>();
            var mockFunctionProvider          = new Mock <IFunctionProvider>();
            var mockFunctionProviderDuplicate = new Mock <IFunctionProvider>();
            var workerConfigs = TestHelpers.GetTestWorkerConfigs();

            mockFunctionMetadataProvider.Setup(m => m.GetFunctionMetadataAsync(workerConfigs, SystemEnvironment.Instance, false)).Returns(Task.FromResult(new Collection <FunctionMetadata>().ToImmutableArray()));
            mockFunctionMetadataProvider.Setup(m => m.FunctionErrors).Returns(new Dictionary <string, ICollection <string> >().ToImmutableDictionary(kvp => kvp.Key, kvp => kvp.Value.ToImmutableArray()));

            functionMetadataCollection.Add(GetTestFunctionMetadata("somefile.dll", name: "duplicateFunction"));

            mockFunctionProvider.Setup(m => m.GetFunctionMetadataAsync()).ReturnsAsync(functionMetadataCollection.ToImmutableArray());
            mockFunctionProvider.Setup(m => m.FunctionErrors).Returns(mockFunctionErrors.ToImmutableDictionary());

            mockFunctionProviderDuplicate.Setup(m => m.GetFunctionMetadataAsync()).ReturnsAsync(functionMetadataCollection.ToImmutableArray());
            mockFunctionProviderDuplicate.Setup(m => m.FunctionErrors).Returns(mockFunctionErrors.ToImmutableDictionary());

            FunctionMetadataManager testFunctionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(_scriptJobHostOptions),
                                                                                                                         mockFunctionMetadataProvider.Object, new List <IFunctionProvider>()
            {
                mockFunctionProvider.Object, mockFunctionProviderDuplicate.Object
            },
                                                                                                                         new OptionsWrapper <HttpWorkerOptions>(_defaultHttpWorkerOptions), MockNullLoggerFactory.CreateLoggerFactory(),
                                                                                                                         new OptionsWrapper <LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions()));

            var ex = Assert.Throws <InvalidOperationException>(() => testFunctionMetadataManager.LoadFunctionMetadata());

            Assert.Equal("Found duplicate FunctionMetadata with the name duplicateFunction", ex.Message);
        }
コード例 #2
0
        public void FunctionMetadataManager_IgnoresMetadata_FromFunctionProviders()
        {
            var functionMetadataCollection = new Collection <FunctionMetadata>();
            var mockFunctionErrors         = new Dictionary <string, ImmutableArray <string> >();

            var mockFunctionMetadataProvider = new Mock <IFunctionMetadataProvider>();
            var mockFunctionProvider         = new Mock <IFunctionProvider>();
            var workerConfigs = TestHelpers.GetTestWorkerConfigs();

            mockFunctionMetadataProvider.Setup(m => m.GetFunctionMetadataAsync(workerConfigs, SystemEnvironment.Instance, false)).Returns(Task.FromResult(new Collection <FunctionMetadata>().ToImmutableArray()));
            mockFunctionMetadataProvider.Setup(m => m.FunctionErrors).Returns(new Dictionary <string, ICollection <string> >().ToImmutableDictionary(kvp => kvp.Key, kvp => kvp.Value.ToImmutableArray()));

            functionMetadataCollection.Add(GetTestFunctionMetadata("somefile.dll", name: "anotherFunction"));

            mockFunctionProvider.Setup(m => m.GetFunctionMetadataAsync()).ReturnsAsync(functionMetadataCollection.ToImmutableArray());
            mockFunctionProvider.Setup(m => m.FunctionErrors).Returns(mockFunctionErrors.ToImmutableDictionary());

            FunctionMetadataManager testFunctionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(_scriptJobHostOptions),
                                                                                                                         mockFunctionMetadataProvider.Object, new List <IFunctionProvider>()
            {
                mockFunctionProvider.Object
            }, new OptionsWrapper <HttpWorkerOptions>(_defaultHttpWorkerOptions), MockNullLoggerFactory.CreateLoggerFactory(), new OptionsWrapper <LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions()));

            Assert.Equal(0, testFunctionMetadataManager.GetFunctionMetadata(true, includeCustomProviders: false).Length);
            Assert.Equal(0, testFunctionMetadataManager.Errors.Count);
        }
コード例 #3
0
        public static FunctionMetadata GetFunctionMetadata(string functionName)
        {
            var functionErrors    = new Dictionary <string, Collection <string> >();
            var scriptHostOptions = new ScriptJobHostOptions
            {
                RootScriptPath = Environment.CurrentDirectory
            };

            var loggerFactory         = new LoggerFactory();
            var languageWorkerOptions = new LanguageWorkerOptions {
            };

            loggerFactory.AddProvider(new ColoredConsoleLoggerProvider((cat, level) => level >= LogLevel.Information));
            var metadataManager = new FunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(scriptHostOptions), new OptionsWrapper <LanguageWorkerOptions>(languageWorkerOptions), loggerFactory);
            var function        = metadataManager.Functions.FirstOrDefault(f => f.Name.Equals(functionName, StringComparison.OrdinalIgnoreCase));

            if (function == null)
            {
                var error = metadataManager.Errors
                            .FirstOrDefault(f => f.Key.Equals(functionName, StringComparison.OrdinalIgnoreCase))
                            .Value
                            .Aggregate(string.Empty, (a, b) => string.Join(Environment.NewLine, a, b));
                throw new FunctionNotFoundException($"Unable to get metadata for function {functionName}. Error: {error}");
            }
            else
            {
                return(function);
            }
        }
コード例 #4
0
        public void FunctionMetadataManager_Verify_FunctionErrors(string scriptFile)
        {
            Collection <FunctionMetadata> functionMetadataCollection = new Collection <FunctionMetadata>();

            functionMetadataCollection.Add(GetTestFunctionMetadata(scriptFile));

            ImmutableDictionary <string, ImmutableArray <string> > mockFunctionErrors = new Dictionary <string, ICollection <string> >().ToImmutableDictionary(kvp => kvp.Key, kvp => kvp.Value.ToImmutableArray());
            Mock <IFunctionMetadataProvider> mockFunctionMetadataProvider             = new Mock <IFunctionMetadataProvider>();

            mockFunctionMetadataProvider.Setup(m => m.GetFunctionMetadataAsync(It.IsAny <IEnumerable <RpcWorkerConfig> >(), SystemEnvironment.Instance, false)).Returns(Task.FromResult(functionMetadataCollection.ToImmutableArray()));
            mockFunctionMetadataProvider.Setup(m => m.FunctionErrors).Returns(mockFunctionErrors);

            var managerMock = new Mock <IScriptHostManager>();
            FunctionMetadataManager testFunctionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(_scriptJobHostOptions), managerMock,
                                                                                                                         mockFunctionMetadataProvider.Object, new List <IFunctionProvider>(), new OptionsWrapper <HttpWorkerOptions>(_defaultHttpWorkerOptions), MockNullLoggerFactory.CreateLoggerFactory(), new OptionsWrapper <LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions()));

            managerMock.Raise(m => m.HostInitializing += null, new EventArgs());
            Assert.Empty(testFunctionMetadataManager.LoadFunctionMetadata());

            Assert.True(testFunctionMetadataManager.Errors.Count == 1);
            ImmutableArray <string> functionErrors = testFunctionMetadataManager.Errors["testFunction"];

            Assert.True(functionErrors.Length == 1);
            Assert.Equal(_expectedErrorMessage, functionErrors[0]);
        }
コード例 #5
0
        public void IsScriptFileDetermined_ScriptFile_Emtpy_HttpWorker_Returns_True(string scriptFile)
        {
            FunctionMetadata        functionMetadata            = GetTestFunctionMetadata(scriptFile);
            FunctionMetadataManager testFunctionMetadataManager = new FunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(_scriptJobHostOptions), _mockFunctionMetadataProvider.Object, new OptionsWrapper <LanguageWorkerOptions>(GetTestLanguageWorkerOptions()), new OptionsWrapper <HttpWorkerOptions>(GetTestHttpWorkerOptions()), MockNullLoggerFactory.CreateLoggerFactory());

            Assert.True(testFunctionMetadataManager.IsScriptFileDetermined(functionMetadata));
        }
コード例 #6
0
        public void ValidateFunctionName_ThrowsOnInvalidName(string functionName)
        {
            var ex = Assert.Throws <InvalidOperationException>(() =>
            {
                FunctionMetadataManager.ValidateName(functionName);
            });

            Assert.Equal(string.Format("'{0}' is not a valid function name.", functionName), ex.Message);
        }
コード例 #7
0
        public void ReadFunctionMetadata_Succeeds()
        {
            string functionsPath       = Path.Combine(Environment.CurrentDirectory, @"..\..\..\..\..\sample\node");
            var    functionErrors      = new Dictionary <string, ICollection <string> >();
            var    functionDirectories = Directory.EnumerateDirectories(functionsPath);
            var    metadata            = FunctionMetadataManager.ReadFunctionsMetadata(functionDirectories, null, TestHelpers.GetTestWorkerConfigs(), NullLogger.Instance, functionErrors);

            Assert.Equal(17, metadata.Count);
        }
コード例 #8
0
        public FunctionMetadataManagerTests()
        {
            _mockFunctionMetadataProvider = new Mock <IFunctionMetadataProvider>();
            string functionsPath = Path.Combine(Environment.CurrentDirectory, @"..\..\..\..\..\sample\node");

            _defaultHttpWorkerOptions            = new HttpWorkerOptions();
            _scriptJobHostOptions.RootScriptPath = functionsPath;
            _testFunctionMetadataManager         = new FunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(_scriptJobHostOptions), _mockFunctionMetadataProvider.Object, new OptionsWrapper <LanguageWorkerOptions>(GetTestLanguageWorkerOptions()), new OptionsWrapper <HttpWorkerOptions>(_defaultHttpWorkerOptions), MockNullLoggerFactory.CreateLoggerFactory());
        }
コード例 #9
0
        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>(() => FunctionMetadataManager.DeterminePrimaryScriptFile(functionConfig, @"c:\functions", fileSystem));
        }
コード例 #10
0
 public void ValidateFunctionName_DoesNotThrowOnValidName(string functionName)
 {
     try
     {
         FunctionMetadataManager.ValidateName(functionName);
     }
     catch (InvalidOperationException)
     {
         Assert.True(false, $"Valid function name {functionName} failed validation.");
     }
 }
コード例 #11
0
        public void DeterminePrimaryScriptFile_SingleFile()
        {
            var functionConfig = new JObject();
            var files          = new Dictionary <string, MockFileData>
            {
                { @"c:\functions\Run.csx", new MockFileData(string.Empty) }
            };
            var fileSystem = new MockFileSystem(files);

            string scriptFile = FunctionMetadataManager.DeterminePrimaryScriptFile(functionConfig, @"c:\functions", fileSystem);

            Assert.Equal(@"c:\functions\Run.csx", scriptFile);
        }
コード例 #12
0
        public void IsScriptFileDetermined_ScriptFile_Emtpy_HttpWorker_Returns_True(string scriptFile)
        {
            FunctionMetadata functionMetadata = GetTestFunctionMetadata(scriptFile);

            var managerMock = new Mock <IScriptHostManager>();

            FunctionMetadataManager testFunctionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(_scriptJobHostOptions), managerMock,
                                                                                                                         _mockFunctionMetadataProvider.Object, new List <IFunctionProvider>(), new OptionsWrapper <HttpWorkerOptions>(GetTestHttpWorkerOptions()), MockNullLoggerFactory.CreateLoggerFactory(), new OptionsWrapper <LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions()));

            managerMock.Raise(m => m.HostInitializing += null, new EventArgs());

            Assert.True(testFunctionMetadataManager.IsScriptFileDetermined(functionMetadata));
        }
コード例 #13
0
        public void DeterminePrimaryScriptFile_MultipleFiles_IndexFilePresent()
        {
            var functionConfig = new JObject();
            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 = FunctionMetadataManager.DeterminePrimaryScriptFile(functionConfig, @"c:\functions", fileSystem);

            Assert.Equal(@"c:\functions\index.js", scriptFile);
        }
コード例 #14
0
        public void DeterminePrimaryScriptFile_MultipleFiles_NoClearPrimary_ReturnsNull()
        {
            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.Throws <FunctionConfigurationException>(() => FunctionMetadataManager.DeterminePrimaryScriptFile(functionConfig, @"c:\functions", fileSystem));
        }
コード例 #15
0
        /// <summary>
        /// maps a functionName to its FunctionMetadataResponse
        /// </summary>
        /// <param name="name">Function name to retrieve</param>
        /// <param name="request">Current HttpRequest</param>
        /// <returns>(success, FunctionMetadataResponse)</returns>
        public async Task <(bool, FunctionMetadataResponse)> TryGetFunction(string name, HttpRequest request, IWebJobsRouter router = null)
        {
            // TODO: DI (FACAVAL) Follow up with ahmels - Since loading of function metadata is no longer tied to the script host, we
            // should be able to inject an IFunctionMedatadaManager here and bypass this step.
            var functionMetadata = FunctionMetadataManager.ReadFunctionMetadata(Path.Combine(_config.RootScriptPath, name), null, _workerConfigs, new Dictionary <string, ICollection <string> >(), fileSystem: FileUtility.Instance);

            if (functionMetadata != null)
            {
                return(true, await functionMetadata.ToFunctionMetadataResponse(request, _config, router));
            }
            else
            {
                return(false, null);
            }
        }
コード例 #16
0
        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);
        }
コード例 #17
0
        public void InitializesEmptyOrMissingDirectorySnapshot(string rootScriptPath)
        {
            var scriptConfig = new ScriptJobHostOptions()
            {
                RootScriptPath = rootScriptPath
            };

            IOptions <ScriptJobHostOptions>  scriptOptions         = new OptionsManager <ScriptJobHostOptions>(new TestOptionsFactory <ScriptJobHostOptions>(scriptConfig));
            IOptions <LanguageWorkerOptions> languageWorkerOptions = new OptionsManager <LanguageWorkerOptions>(new TestOptionsFactory <LanguageWorkerOptions>(new LanguageWorkerOptions()));

            var functionMetadataManager = new FunctionMetadataManager(scriptOptions, languageWorkerOptions, NullLoggerFactory.Instance);

            Assert.False(functionMetadataManager.Functions.IsDefault);
            Assert.True(functionMetadataManager.Functions.IsEmpty);
        }
コード例 #18
0
        public void FunctionMetadataManager_ResetProviders_OnRefresh()
        {
            var functionMetadataCollection   = new Collection <FunctionMetadata>();
            var mockFunctionErrors           = new Dictionary <string, ImmutableArray <string> >();
            var mockFunctionMetadataProvider = new Mock <IFunctionMetadataProvider>();
            var mockFunctionProvider         = new Mock <IFunctionProvider>();
            var workerConfigs = TestHelpers.GetTestWorkerConfigs();

            mockFunctionMetadataProvider.Setup(m => m.GetFunctionMetadataAsync(workerConfigs, SystemEnvironment.Instance, false)).Returns(Task.FromResult(new Collection <FunctionMetadata>().ToImmutableArray()));
            mockFunctionMetadataProvider.Setup(m => m.FunctionErrors).Returns(new Dictionary <string, ICollection <string> >().ToImmutableDictionary(kvp => kvp.Key, kvp => kvp.Value.ToImmutableArray()));

            functionMetadataCollection.Add(GetTestFunctionMetadata("somefile.dll", name: "myFunction"));

            mockFunctionProvider.Setup(m => m.GetFunctionMetadataAsync()).ReturnsAsync(functionMetadataCollection.ToImmutableArray());
            mockFunctionProvider.Setup(m => m.FunctionErrors).Returns(mockFunctionErrors.ToImmutableDictionary());

            var managerMock = new Mock <IScriptHostManager>();

            FunctionMetadataManager testFunctionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(_scriptJobHostOptions), managerMock,
                                                                                                                         mockFunctionMetadataProvider.Object, new List <IFunctionProvider>()
            {
                mockFunctionProvider.Object
            }, new OptionsWrapper <HttpWorkerOptions>(_defaultHttpWorkerOptions), MockNullLoggerFactory.CreateLoggerFactory(), new OptionsWrapper <LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions()));

            testFunctionMetadataManager.LoadFunctionMetadata();

            Assert.Equal(0, testFunctionMetadataManager.Errors.Count);
            Assert.Equal(1, testFunctionMetadataManager.GetFunctionMetadata(true).Length);
            Assert.Equal("myFunction", testFunctionMetadataManager.GetFunctionMetadata(true).FirstOrDefault()?.Name);

            functionMetadataCollection = new Collection <FunctionMetadata>
            {
                GetTestFunctionMetadata("somefile.dll", name: "newFunction")
            };

            mockFunctionProvider = new Mock <IFunctionProvider>();
            mockFunctionProvider.Setup(m => m.GetFunctionMetadataAsync()).ReturnsAsync(functionMetadataCollection.ToImmutableArray());

            managerMock.As <IServiceProvider>().Setup(m => m.GetService(typeof(IEnumerable <IFunctionProvider>))).Returns(new List <IFunctionProvider>()
            {
                mockFunctionProvider.Object
            });
            testFunctionMetadataManager.LoadFunctionMetadata();

            Assert.Equal(0, testFunctionMetadataManager.Errors.Count);
            Assert.Equal(1, testFunctionMetadataManager.GetFunctionMetadata(true).Length);
            Assert.Equal("newFunction", testFunctionMetadataManager.GetFunctionMetadata(true).FirstOrDefault()?.Name);
        }
コード例 #19
0
        /// <summary>
        /// maps a functionName to its FunctionMetadataResponse
        /// </summary>
        /// <param name="name">Function name to retrieve</param>
        /// <param name="request">Current HttpRequest</param>
        /// <returns>(success, FunctionMetadataResponse)</returns>
        public async Task <(bool, FunctionMetadataResponse)> TryGetFunction(string name, HttpRequest request)
        {
            // TODO: DI (FACAVAL) Follow up with ahmels - Since loading of function metadata is no longer tied to the script host, we
            // should be able to inject an IFunctionMetadataManager here and bypass this step.
            var hostOptions      = _applicationHostOptions.CurrentValue.ToHostOptions();
            var functionMetadata = FunctionMetadataManager.ReadFunctionMetadata(Path.Combine(hostOptions.RootScriptPath, name), null, _workerConfigs, new Dictionary <string, ICollection <string> >(), fileSystem: FileUtility.Instance);

            if (functionMetadata != null)
            {
                string routePrefix = await GetRoutePrefix(hostOptions.RootScriptPath);

                return(true, await functionMetadata.ToFunctionMetadataResponse(request, hostOptions, routePrefix));
            }
            else
            {
                return(false, null);
            }
        }
コード例 #20
0
        internal IEnumerable <FunctionMetadata> GetFunctionsMetadata(bool includeProxies = false)
        {
            // get functions metadata
            var functionDirectories = FileUtility.EnumerateDirectories(_hostOptions.RootScriptPath);
            IEnumerable <FunctionMetadata> functionsMetadata = FunctionMetadataManager.ReadFunctionsMetadata(functionDirectories, null, _workerConfigs, _logger, fileSystem: FileUtility.Instance);

            if (includeProxies)
            {
                // get proxies metadata
                var proxyMetadata = _proxyMetadataManager.ProxyMetadata;
                if (!proxyMetadata.Functions.IsDefaultOrEmpty)
                {
                    functionsMetadata = proxyMetadata.Functions.Concat(functionsMetadata);
                }
            }

            return(functionsMetadata);
        }
コード例 #21
0
        internal static IEnumerable <FunctionMetadata> GetFunctionsMetadata(ScriptJobHostOptions hostOptions, IEnumerable <WorkerConfig> workerConfigs, ILogger logger, bool includeProxies = false)
        {
            var functionDirectories = FileUtility.EnumerateDirectories(hostOptions.RootScriptPath);
            IEnumerable <FunctionMetadata> functionsMetadata = FunctionMetadataManager.ReadFunctionsMetadata(functionDirectories, null, workerConfigs, logger, fileSystem: FileUtility.Instance);

            if (includeProxies)
            {
                // get proxies metadata
                var values = ProxyMetadataManager.ReadProxyMetadata(hostOptions.RootScriptPath, logger);
                var proxyFunctionsMetadata = values.Item1;
                if (proxyFunctionsMetadata?.Count > 0)
                {
                    functionsMetadata = proxyFunctionsMetadata.Concat(functionsMetadata);
                }
            }

            return(functionsMetadata);
        }
コード例 #22
0
        internal IEnumerable <FunctionMetadata> GetFunctionsMetadata(bool includeProxies = false)
        {
            var hostOptions         = _applicationHostOptions.CurrentValue.ToHostOptions();
            var functionDirectories = FileUtility.EnumerateDirectories(hostOptions.RootScriptPath);
            IEnumerable <FunctionMetadata> functionsMetadata = FunctionMetadataManager.ReadFunctionsMetadata(functionDirectories, null, _workerConfigs, _logger, fileSystem: FileUtility.Instance);

            if (includeProxies)
            {
                // get proxies metadata
                var values = ProxyMetadataManager.ReadProxyMetadata(hostOptions.RootScriptPath, _logger);
                var proxyFunctionsMetadata = values.Item1;
                if (proxyFunctionsMetadata?.Count > 0)
                {
                    functionsMetadata = proxyFunctionsMetadata.Concat(functionsMetadata);
                }
            }

            return(functionsMetadata);
        }
コード例 #23
0
        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 = FunctionMetadataManager.DeterminePrimaryScriptFile(functionConfig, @"c:\functions", fileSystem);

            Assert.Equal(@"c:\functions\queueTrigger.py", scriptFile);
        }
コード例 #24
0
        public void DeterminePrimaryScriptFile_MultipleFiles_SourceFileSpecified(string scriptFileName)
        {
            JObject functionConfig = new JObject()
            {
                { "scriptFile", 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 = FunctionMetadataManager.DeterminePrimaryScriptFile(functionConfig, @"c:\functions", fileSystem);

            Assert.Equal(@"c:\functions\queueTrigger.py", scriptFile, StringComparer.OrdinalIgnoreCase);
        }
コード例 #25
0
        public void FunctionMetadataManager_DoesNotError_MissingScriptFile_InWebHostMode()
        {
            var mockFunctionMetadataProvider = new Mock <IFunctionMetadataProvider>();
            var mockFunctionProvider         = new Mock <IFunctionProvider>();

            var testMetadata = GetTestFunctionMetadata(null);

            var managerMock = new Mock <IScriptHostManager>();
            FunctionMetadataManager testFunctionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(_scriptJobHostOptions), managerMock,
                                                                                                                         mockFunctionMetadataProvider.Object, new List <IFunctionProvider>()
            {
                mockFunctionProvider.Object
            }, new OptionsWrapper <HttpWorkerOptions>(_defaultHttpWorkerOptions), MockNullLoggerFactory.CreateLoggerFactory(), new OptionsWrapper <LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions()));

            Assert.True(testFunctionMetadataManager.IsScriptFileDetermined(testMetadata));

            managerMock.Raise(m => m.HostInitializing += null, new EventArgs());

            Assert.False(testFunctionMetadataManager.IsScriptFileDetermined(testMetadata));
        }
コード例 #26
0
        public void FunctionMetadataManager_Verify_FunctionErrors_FromFunctionProviders(string scriptFile)
        {
            var functionMetadataCollection   = new Collection <FunctionMetadata>();
            var mockFunctionErrors           = new Dictionary <string, ImmutableArray <string> >();
            var mockFunctionMetadataProvider = new Mock <IFunctionMetadataProvider>();
            var mockFunctionProvider         = new Mock <IFunctionProvider>();
            var workerConfigs = TestHelpers.GetTestWorkerConfigs();

            mockFunctionMetadataProvider.Setup(m => m.GetFunctionMetadataAsync(workerConfigs, SystemEnvironment.Instance, false)).Returns(Task.FromResult(new Collection <FunctionMetadata>().ToImmutableArray()));
            mockFunctionMetadataProvider.Setup(m => m.FunctionErrors).Returns(new Dictionary <string, ICollection <string> >().ToImmutableDictionary(kvp => kvp.Key, kvp => kvp.Value.ToImmutableArray()));

            functionMetadataCollection.Add(GetTestFunctionMetadata(scriptFile));
            functionMetadataCollection.Add(GetTestFunctionMetadata(scriptFile, name: "anotherFunction"));
            mockFunctionErrors["anotherFunction"] = new List <string>()
            {
                "error"
            }.ToImmutableArray();

            mockFunctionProvider.Setup(m => m.GetFunctionMetadataAsync()).ReturnsAsync(functionMetadataCollection.ToImmutableArray());
            mockFunctionProvider.Setup(m => m.FunctionErrors).Returns(mockFunctionErrors.ToImmutableDictionary());

            var managerMock = new Mock <IScriptHostManager>();
            FunctionMetadataManager testFunctionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(_scriptJobHostOptions), managerMock,
                                                                                                                         mockFunctionMetadataProvider.Object, new List <IFunctionProvider>()
            {
                mockFunctionProvider.Object
            }, new OptionsWrapper <HttpWorkerOptions>(_defaultHttpWorkerOptions), MockNullLoggerFactory.CreateLoggerFactory(), new OptionsWrapper <LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions()));

            managerMock.Raise(m => m.HostInitializing += null, new EventArgs());

            testFunctionMetadataManager.LoadFunctionMetadata();

            Assert.Equal(2, testFunctionMetadataManager.Errors.Count);
            ImmutableArray <string> functionErrors = testFunctionMetadataManager.Errors["anotherFunction"];

            Assert.Equal(2, functionErrors.Length);
            Assert.True(functionErrors.Contains("error"));
        }
コード例 #27
0
        public void FunctionMetadataManager_SortsMetadata_FromFunctionProviders()
        {
            var functionMetadataCollection   = new Collection <FunctionMetadata>();
            var mockFunctionMetadataProvider = new Mock <IFunctionMetadataProvider>();
            var mockFunctionProvider         = new Mock <IFunctionProvider>();

            var workerConfigs = TestHelpers.GetTestWorkerConfigs();

            mockFunctionMetadataProvider.Setup(m => m.GetFunctionMetadataAsync(workerConfigs, SystemEnvironment.Instance, false)).Returns(Task.FromResult(new Collection <FunctionMetadata>().ToImmutableArray()));
            mockFunctionMetadataProvider.Setup(m => m.FunctionErrors).Returns(new Dictionary <string, ICollection <string> >().ToImmutableDictionary(kvp => kvp.Key, kvp => kvp.Value.ToImmutableArray()));

            const string aFunction = "aFunction";
            const string bFunction = "bFunction";
            const string cFunction = "cFunction";

            // Add in unsorted order
            functionMetadataCollection.Add(GetTestFunctionMetadata("b.dll", name: bFunction));
            functionMetadataCollection.Add(GetTestFunctionMetadata("a.dll", name: aFunction));
            functionMetadataCollection.Add(GetTestFunctionMetadata("c.dll", name: cFunction));
            functionMetadataCollection.Add(GetTestFunctionMetadata("null.dll", name: null));

            mockFunctionProvider.Setup(m => m.GetFunctionMetadataAsync()).ReturnsAsync(functionMetadataCollection.ToImmutableArray());

            FunctionMetadataManager testFunctionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(_scriptJobHostOptions),
                                                                                                                         mockFunctionMetadataProvider.Object, new List <IFunctionProvider>()
            {
                mockFunctionProvider.Object
            }, new OptionsWrapper <HttpWorkerOptions>(_defaultHttpWorkerOptions), MockNullLoggerFactory.CreateLoggerFactory(), new OptionsWrapper <LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions()));
            var functionMetadata = testFunctionMetadataManager.LoadFunctionMetadata();

            Assert.Equal(4, functionMetadata.Length);

            Assert.Null(functionMetadata[0].Name);
            Assert.True(string.Equals(aFunction, functionMetadata[1].Name));
            Assert.True(string.Equals(bFunction, functionMetadata[2].Name));
            Assert.True(string.Equals(cFunction, functionMetadata[3].Name));
        }
コード例 #28
0
        public void FunctionMetadataManager_Verify_FunctionErrors(string scriptFile)
        {
            Collection <FunctionMetadata> functionMetadataCollection = new Collection <FunctionMetadata>();

            functionMetadataCollection.Add(GetTestFunctionMetadata(scriptFile));

            ImmutableDictionary <string, ImmutableArray <string> > mockFunctionErrors = new Dictionary <string, ICollection <string> >().ToImmutableDictionary(kvp => kvp.Key, kvp => kvp.Value.ToImmutableArray());
            Mock <IFunctionMetadataProvider> mockFunctionMetadataProvider             = new Mock <IFunctionMetadataProvider>();

            mockFunctionMetadataProvider.Setup(m => m.GetFunctionMetadata(false)).Returns(functionMetadataCollection.ToImmutableArray());
            mockFunctionMetadataProvider.Setup(m => m.FunctionErrors).Returns(mockFunctionErrors);

            FunctionMetadataManager testFunctionMetadataManager = new FunctionMetadataManager(new OptionsWrapper <ScriptJobHostOptions>(_scriptJobHostOptions), mockFunctionMetadataProvider.Object, new OptionsWrapper <LanguageWorkerOptions>(GetTestLanguageWorkerOptions()), new OptionsWrapper <HttpWorkerOptions>(_defaultHttpWorkerOptions), MockNullLoggerFactory.CreateLoggerFactory());

            var validatedFunctionMetadataArray = testFunctionMetadataManager.LoadFunctionMetadata();

            Assert.Empty(validatedFunctionMetadataArray);

            Assert.True(testFunctionMetadataManager.Errors.Count == 1);
            ImmutableArray <string> functionErrors = testFunctionMetadataManager.Errors["testFunction"];

            Assert.True(functionErrors.Length == 1);
            Assert.Equal(_expectedErrorMessage, functionErrors[0]);
        }
コード例 #29
0
 public void ParseLanguage_Returns_ExpectedLanguage(string language, string scriptFile)
 {
     Assert.Equal(language, FunctionMetadataManager.ParseLanguage(scriptFile, TestHelpers.GetTestWorkerConfigs()));
 }
コード例 #30
0
 internal IEnumerable <FunctionMetadata> GetFunctionsMetadata()
 {
     return(FunctionMetadataManager
            .ReadFunctionsMetadata(FileUtility.EnumerateDirectories(_config.RootScriptPath), null, _workerConfigs, _logger, fileSystem: FileUtility.Instance));
 }