private async Task EnsureInitialized() { SynchronizationContext.SetSynchronizationContext(null); await Task.Run(() => HostManager.RunAndBlock()).ConfigureAwait(false); await TestHelpers.Await(() => HostManager.State == ScriptHostState.Running, timeout : 30000).ConfigureAwait(false); // verify startup system trace logs string[] expectedPatterns = new string[] { "Info Reading host configuration file", "Info Host configuration file read", "Info Host lock lease acquired by instance ID '(.+)'", @"Info Generating ([0-9]+) job function\(s\)", @"Info Starting Host \(HostId=function-tests-node, Version=(.+), ProcessId=[0-9]+, AppDomainId=[0-9]+, Debug=False, ConsecutiveErrors=0, StartupCount=1, FunctionsExtensionVersion=\)", "Info WebJobs.Indexing Found the following functions:", "Info The next 5 occurrences of the schedule will be:", "Info WebJobs.Host Job host started", "Error The following 1 functions are in error:" }; foreach (string pattern in expectedPatterns) { Assert.True(EventGenerator.Events.Any(p => Regex.IsMatch(p, pattern)), $"Expected trace event {pattern} not found."); } }
public Fixture() { EventGenerator = new TestSystemEventGenerator(); _settingsManager = ScriptSettingsManager.Instance; TestFunctionRoot = Path.Combine(TestHelpers.FunctionsTestDirectory, "Functions"); TestLogsRoot = Path.Combine(TestHelpers.FunctionsTestDirectory, "Logs"); TestSecretsRoot = Path.Combine(TestHelpers.FunctionsTestDirectory, "Secrets"); string testRoot = Path.Combine(TestFunctionRoot, Guid.NewGuid().ToString()); SecretsPath = Path.Combine(TestSecretsRoot, Guid.NewGuid().ToString()); Directory.CreateDirectory(SecretsPath); string logRoot = Path.Combine(TestLogsRoot, Guid.NewGuid().ToString(), @"Functions"); Directory.CreateDirectory(logRoot); FunctionsLogDir = Path.Combine(logRoot, @"Function"); Directory.CreateDirectory(FunctionsLogDir); // Add some secret files (both old and valid) File.WriteAllText(Path.Combine(SecretsPath, ScriptConstants.HostMetadataFileName), string.Empty); File.WriteAllText(Path.Combine(SecretsPath, "WebHookTrigger.json"), string.Empty); File.WriteAllText(Path.Combine(SecretsPath, "QueueTriggerToBlob.json"), string.Empty); File.WriteAllText(Path.Combine(SecretsPath, "Foo.json"), string.Empty); File.WriteAllText(Path.Combine(SecretsPath, "Bar.json"), string.Empty); File.WriteAllText(Path.Combine(SecretsPath, "Invalid.json"), string.Empty); // Add some old file directories CreateTestFunctionLogs(FunctionsLogDir, "Foo"); CreateTestFunctionLogs(FunctionsLogDir, "Bar"); CreateTestFunctionLogs(FunctionsLogDir, "Baz"); CreateTestFunctionLogs(FunctionsLogDir, "Invalid"); ScriptHostConfiguration config = new ScriptHostConfiguration { RootScriptPath = @"TestScripts\Node", RootLogPath = logRoot, FileLoggingMode = FileLoggingMode.Always }; ISecretsRepository repository = new FileSystemSecretsRepository(SecretsPath); ISecretManager secretManager = new SecretManager(_settingsManager, repository, NullTraceWriter.Instance, null); WebHostSettings webHostSettings = new WebHostSettings(); webHostSettings.SecretsPath = SecretsPath; var hostConfig = config.HostConfig; var testEventGenerator = new TestSystemEventGenerator(); hostConfig.AddService <IEventGenerator>(EventGenerator); var mockEventManager = new Mock <IScriptEventManager>(); var mockHostManager = new WebScriptHostManager(config, new TestSecretManagerFactory(secretManager), mockEventManager.Object, _settingsManager, webHostSettings); HostManager = mockHostManager; Task task = Task.Run(() => { HostManager.RunAndBlock(); }); TestHelpers.Await(() => { return(HostManager.State == ScriptHostState.Running); }).GetAwaiter().GetResult(); // verify startup system trace logs string[] expectedPatterns = new string[] { "Info Reading host configuration file", "Info Host configuration file read", "Info Host lock lease acquired by instance ID '(.+)'", "Info Function 'Excluded' is marked as excluded", @"Info Generating ([0-9]+) job function\(s\)", @"Info Starting Host \(HostId=function-tests-node, Version=(.+), ProcessId=[0-9]+, Debug=False, Attempt=0\)", "Info WebJobs.Indexing Found the following functions:", "Info The next 5 occurrences of the schedule will be:", "Info WebJobs.Host Job host started", "Error The following 1 functions are in error:" }; foreach (string pattern in expectedPatterns) { Assert.True(EventGenerator.Events.Any(p => Regex.IsMatch(p, pattern)), $"Expected trace event {pattern} not found."); } }