private void AddProxyProvider(IServiceCollection services, string rootPath)
        {
            var jobHostOptions = new ScriptJobHostOptions
            {
                RootLogPath    = rootPath,
                RootScriptPath = rootPath
            };
            var jobHostOptionsWrapped   = new OptionsWrapper <ScriptJobHostOptions>(jobHostOptions);
            var nullLogger              = new NullLoggerFactory();
            var proxyMetadataProvider   = new ProxyFunctionProvider(jobHostOptionsWrapped, new Mock <IEnvironment>().Object, new Mock <IScriptEventManager>().Object, nullLogger);
            var functionMetadataManager = TestFunctionMetadataManager.GetFunctionMetadataManager(jobHostOptionsWrapped, new Mock <IFunctionMetadataProvider>().Object,
                                                                                                 new List <IFunctionProvider>()
            {
                proxyMetadataProvider
            }, new OptionsWrapper <HttpWorkerOptions>(new HttpWorkerOptions()), nullLogger, new OptionsWrapper <LanguageWorkerOptions>(TestHelpers.GetTestLanguageWorkerOptions()));

            services.AddSingleton <IFunctionMetadataManager>(functionMetadataManager);
        }
        public async Task ProxyMetadata_WhenProxyFileChanges_IsRefreshed()
        {
            using (var tempDirectory = new TempDirectory())
            {
                var testProxiesPath = Path.Combine(Environment.CurrentDirectory, @"TestScripts\Proxies");
                var options         = new OptionsWrapper <ScriptJobHostOptions>(new ScriptJobHostOptions
                {
                    RootScriptPath = tempDirectory.Path
                });

                var environment  = new TestEnvironment();
                var eventManager = new ScriptEventManager();

                var provider = new ProxyFunctionProvider(options, environment, eventManager, NullLoggerFactory.Instance);

                // Get metadata before proxies exist
                ImmutableArray <FunctionMetadata> proxyMetadata1 = await provider.GetFunctionMetadataAsync();

                ImmutableArray <FunctionMetadata> proxyMetadata2 = await provider.GetFunctionMetadataAsync();

                Assert.True(proxyMetadata2.IsDefaultOrEmpty);
                Assert.True(proxyMetadata1.IsDefaultOrEmpty);

                // Update our proxies definition
                FileUtility.CopyDirectory(testProxiesPath, tempDirectory.Path);

                // Simulate a file change notification
                eventManager.Publish(new FileEvent(EventSources.ScriptFiles,
                                                   new FileSystemEventArgs(WatcherChangeTypes.Changed, tempDirectory.Path, ScriptConstants.ProxyMetadataFileName)));

                ImmutableArray <FunctionMetadata> proxyMetadata3 = await provider.GetFunctionMetadataAsync();

                var proxyClient = (proxyMetadata3.FirstOrDefault() as ProxyFunctionMetadata).ProxyClient;

                Assert.True(proxyMetadata3.Select(p => (p as ProxyFunctionMetadata).ProxyClient).All(c => c.Equals(proxyClient)));
                Assert.Equal(20, proxyMetadata3.Length);
            }
        }