public TestFunctionHost(string scriptPath, string logPath, Action <IServiceCollection> configureWebHostServices = null, Action <IWebJobsBuilder> configureScriptHostWebJobsBuilder = null, Action <IConfigurationBuilder> configureScriptHostAppConfiguration = null, Action <ILoggingBuilder> configureScriptHostLogging = null, Action <IServiceCollection> configureScriptHostServices = null) { _appRoot = scriptPath; _hostOptions = new ScriptApplicationHostOptions { IsSelfHost = true, ScriptPath = _appRoot, LogPath = logPath, SecretsPath = Environment.CurrentDirectory, // not used HasParentScope = true }; var optionsMonitor = TestHelpers.CreateOptionsMonitor(_hostOptions); var serviceProvider = new TestServiceProvider(_hostOptions, optionsMonitor); _hostOptions.RootServiceProvider = serviceProvider; var builder = new WebHostBuilder() .ConfigureLogging(b => { b.AddProvider(_webHostLoggerProvider); }) .ConfigureServices(services => { services.Replace(new ServiceDescriptor(typeof(ISecretManagerProvider), new TestSecretManagerProvider(new TestSecretManager()))); services.Replace(ServiceDescriptor.Singleton <IServiceProviderFactory <IServiceCollection> >(new WebHostServiceProviderFactory())); services.Replace(new ServiceDescriptor(typeof(IOptions <ScriptApplicationHostOptions>), new OptionsWrapper <ScriptApplicationHostOptions>(_hostOptions))); services.Replace(new ServiceDescriptor(typeof(IOptionsMonitor <ScriptApplicationHostOptions>), optionsMonitor)); services.Replace(new ServiceDescriptor(typeof(IExtensionBundleManager), new TestExtensionBundleManager())); // Allows us to configure services as the last step, thereby overriding anything services.AddSingleton(new PostConfigureServices(configureWebHostServices)); }) .ConfigureScriptHostWebJobsBuilder(scriptHostWebJobsBuilder => { scriptHostWebJobsBuilder.AddAzureStorage(); configureScriptHostWebJobsBuilder?.Invoke(scriptHostWebJobsBuilder); }) .ConfigureScriptHostAppConfiguration(scriptHostConfigurationBuilder => { scriptHostConfigurationBuilder.AddTestSettings(); configureScriptHostAppConfiguration?.Invoke(scriptHostConfigurationBuilder); }) .ConfigureScriptHostLogging(scriptHostLoggingBuilder => { scriptHostLoggingBuilder.AddProvider(_scriptHostLoggerProvider); scriptHostLoggingBuilder.AddFilter <TestLoggerProvider>(_ => true); configureScriptHostLogging?.Invoke(scriptHostLoggingBuilder); }) .ConfigureScriptHostServices(scriptHostServices => { configureScriptHostServices?.Invoke(scriptHostServices); }) .UseStartup <TestStartup>(); _testServer = new TestServer(builder); HttpClient = new HttpClient(new UpdateContentLengthHandler(_testServer.CreateHandler())) { BaseAddress = new Uri("https://localhost/") }; var manager = _testServer.Host.Services.GetService <IScriptHostManager>(); _hostService = manager as WebJobsScriptHostService; StartAsync().GetAwaiter().GetResult(); }
public async Task QueueTriggerToBlobTest() { TestHelpers.ClearFunctionLogs("QueueTriggerToBlob"); string id = Guid.NewGuid().ToString(); string messageContent = string.Format("{{ \"id\": \"{0}\" }}", id); CloudQueueMessage message = new CloudQueueMessage(messageContent); await Fixture.TestQueue.AddMessageAsync(message); var resultBlob = Fixture.TestOutputContainer.GetBlockBlobReference(id); string result = await TestHelpers.WaitForBlobAndGetStringAsync(resultBlob); Assert.Equal(TestHelpers.RemoveByteOrderMarkAndWhitespace(messageContent), TestHelpers.RemoveByteOrderMarkAndWhitespace(result)); TraceEvent traceEvent = await WaitForTraceAsync(p => p.Message.Contains(id)); Assert.Equal(TraceLevel.Info, traceEvent.Level); string trace = traceEvent.Message; Assert.True(trace.Contains("script processed queue message")); Assert.True(trace.Replace(" ", string.Empty).Contains(messageContent.Replace(" ", string.Empty))); }