public void DefaultLanguageWorkersDir() { var expectedWorkersDir = Path.Combine(Path.GetDirectoryName(new Uri(typeof(RpcWorkerConfigFactory).Assembly.CodeBase).LocalPath), RpcWorkerConstants.DefaultWorkersDirectoryName); var config = new ConfigurationBuilder().Build(); var testLogger = new TestLogger("test"); var configFactory = new RpcWorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment, new TestMetricsLogger()); Assert.Equal(expectedWorkersDir, configFactory.WorkersDirPath); }
public void ShouldAddProvider_Returns_Expected(string workerLanguage, string workerRuntime, bool expectedResult) { var expectedWorkersDir = Path.Combine(Path.GetDirectoryName(new Uri(typeof(RpcWorkerConfigFactory).Assembly.CodeBase).LocalPath), RpcWorkerConstants.DefaultWorkersDirectoryName); var config = new ConfigurationBuilder().Build(); var testLogger = new TestLogger("test"); RpcWorkerConfigFactory rpcWorkerConfigFactory = new RpcWorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment, new TestMetricsLogger()); _testEnvironment.SetEnvironmentVariable(RpcWorkerConstants.FunctionWorkerRuntimeSettingName, workerRuntime); Assert.Equal(expectedResult, rpcWorkerConfigFactory.ShouldAddWorkerConfig(workerLanguage)); }
public void GetWorkerProcessCount_Tests(bool defaultWorkerConfig, bool setProcessCountToNumberOfCpuCores, bool setWorkerCountInEnv, int minProcessCount, int maxProcessCount, string processStartupInterval) { JObject processCount = new JObject(); processCount["ProcessCount"] = minProcessCount; processCount["MaxProcessCount"] = maxProcessCount; processCount["ProcessStartupInterval"] = processStartupInterval; processCount["SetProcessCountToNumberOfCpuCores"] = setProcessCountToNumberOfCpuCores; JObject workerConfig = new JObject(); if (!defaultWorkerConfig) { workerConfig[WorkerConstants.ProcessCount] = processCount; } if (setWorkerCountInEnv) { _testEnvironment.SetEnvironmentVariable(RpcWorkerConstants.FunctionsWorkerProcessCountSettingName, "7"); } var config = new ConfigurationBuilder().Build(); var testLogger = new TestLogger("test"); RpcWorkerConfigFactory rpcWorkerConfigFactory = new RpcWorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment, new TestMetricsLogger()); var result = rpcWorkerConfigFactory.GetWorkerProcessCount(workerConfig); if (defaultWorkerConfig) { // Verify defaults Assert.Equal(10, result.MaxProcessCount); Assert.Equal(1, result.ProcessCount); Assert.Equal(TimeSpan.FromSeconds(10), result.ProcessStartupInterval); Assert.False(result.SetProcessCountToNumberOfCpuCores); return; } if (setWorkerCountInEnv) { Assert.Equal(7, result.ProcessCount); } else { if (setWorkerCountInEnv && setProcessCountToNumberOfCpuCores) { Assert.Equal(7, result.ProcessCount); } else if (setProcessCountToNumberOfCpuCores) { Assert.Equal(_testEnvironment.GetEffectiveCoresCount(), result.ProcessCount); } } Assert.Equal(TimeSpan.Parse(processStartupInterval), result.ProcessStartupInterval); Assert.Equal(maxProcessCount, result.MaxProcessCount); }
public void JavaPath_FromEnvVars() { var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder(); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new RpcWorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment, new TestMetricsLogger()); var workerConfigs = configFactory.GetConfigs(); var javaPath = workerConfigs.Where(c => c.Description.Language.Equals("java", StringComparison.OrdinalIgnoreCase)).FirstOrDefault().Description.DefaultExecutablePath; Assert.DoesNotContain(@"%JAVA_HOME%", javaPath); Assert.Contains(@"/bin/java", javaPath); }
public void ShouldAddProvider_Returns_Expected(string workerLanguage, string workerRuntime, bool placeholderMode, bool expectedResult) { if (placeholderMode) { _testEnvironment.SetEnvironmentVariable(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "1"); } var config = new ConfigurationBuilder().Build(); var testLogger = new TestLogger("test"); RpcWorkerConfigFactory rpcWorkerConfigFactory = new RpcWorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment, new TestMetricsLogger()); _testEnvironment.SetEnvironmentVariable(RpcWorkerConstants.FunctionWorkerRuntimeSettingName, workerRuntime); Assert.Equal(expectedResult, rpcWorkerConfigFactory.ShouldAddWorkerConfig(workerLanguage)); }
public void LanguageWorker_WorkersDir_Set() { var expectedWorkersDir = @"d:\testWorkersDir"; var config = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { [$"{RpcWorkerConstants.LanguageWorkersSectionName}:{WorkerConstants.WorkersDirectorySectionName}"] = expectedWorkersDir }) .Build(); var testLogger = new TestLogger("test"); var configFactory = new RpcWorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment, new TestMetricsLogger()); Assert.Equal(expectedWorkersDir, configFactory.WorkersDirPath); }
public void LanguageWorker_WorkersDir_NotSet() { var expectedWorkersDir = Path.Combine(Path.GetDirectoryName(new Uri(typeof(RpcWorkerConfigFactory).Assembly.CodeBase).LocalPath), RpcWorkerConstants.DefaultWorkersDirectoryName); var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new RpcWorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment, new TestMetricsLogger()); Assert.Equal(expectedWorkersDir, configFactory.WorkersDirPath); }
public void GetDefaultWorkersDirectory_Returns_Expected() { string assemblyLocalPath = Path.GetDirectoryName(new Uri(typeof(RpcWorkerConfigFactory).Assembly.CodeBase).LocalPath); string defaultWorkersDirPath = Path.Combine(assemblyLocalPath, RpcWorkerConstants.DefaultWorkersDirectoryName); Func <string, bool> testDirectoryExists = path => { return(false); }; var expectedWorkersDirIsCurrentDir = Path.Combine(assemblyLocalPath, RpcWorkerConstants.DefaultWorkersDirectoryName); var expectedWorkersDirIsParentDir = Path.Combine(Directory.GetParent(assemblyLocalPath).FullName, RpcWorkerConstants.DefaultWorkersDirectoryName); var config = new ConfigurationBuilder().Build(); var testLogger = new TestLogger("test"); Assert.Equal(expectedWorkersDirIsCurrentDir, RpcWorkerConfigFactory.GetDefaultWorkersDirectory(Directory.Exists)); Assert.Equal(expectedWorkersDirIsParentDir, RpcWorkerConfigFactory.GetDefaultWorkersDirectory(testDirectoryExists)); }
public void LanguageWorker_HydratedWorkerPath_UnsupportedArchitecture(Architecture unsupportedArch) { RpcWorkerDescription workerDescription = new RpcWorkerDescription() { Arguments = new List <string>(), DefaultExecutablePath = "python", DefaultWorkerPath = "{architecture}/worker.py", WorkerDirectory = string.Empty, SupportedArchitectures = new List <string>() { Architecture.X64.ToString(), Architecture.X86.ToString() }, SupportedRuntimeVersions = new List <string>() { "3.6", "3.7" }, SupportedOperatingSystems = new List <string>() { OSPlatform.Windows.ToString(), OSPlatform.OSX.ToString(), OSPlatform.Linux.ToString() }, Extensions = new List <string>() { ".py" }, Language = "python", DefaultRuntimeVersion = "3.7" }; var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); Mock <ISystemRuntimeInformation> mockRuntimeInfo = new Mock <ISystemRuntimeInformation>(); mockRuntimeInfo.Setup(r => r.GetOSArchitecture()).Returns(unsupportedArch); mockRuntimeInfo.Setup(r => r.GetOSPlatform()).Returns(OSPlatform.Linux); var configFactory = new RpcWorkerConfigFactory(config, testLogger, mockRuntimeInfo.Object, _testEnvironment, new TestMetricsLogger()); var ex = Assert.Throws <PlatformNotSupportedException>(() => configFactory.GetHydratedWorkerPath(workerDescription)); Assert.Equal(ex.Message, $"Architecture {unsupportedArch.ToString()} is not supported for language {workerDescription.Language}"); }
public void LanguageWorker_HydratedWorkerPath_EnvironmentVersionNotSet(string defaultWorkerPath, string expectedPath) { // We fall back to the default version when this is not set // Environment.SetEnvironmentVariable(LanguageWorkerConstants.FunctionWorkerRuntimeVersionSettingName, "3.7"); RpcWorkerDescription workerDescription = new RpcWorkerDescription() { Arguments = new List <string>(), DefaultExecutablePath = "python", SupportedArchitectures = new List <string>() { Architecture.X64.ToString(), Architecture.X86.ToString() }, SupportedRuntimeVersions = new List <string>() { "3.6", "3.7" }, SupportedOperatingSystems = new List <string>() { OSPlatform.Windows.ToString(), OSPlatform.OSX.ToString(), OSPlatform.Linux.ToString() }, DefaultWorkerPath = defaultWorkerPath, WorkerDirectory = string.Empty, Extensions = new List <string>() { ".py" }, Language = "python", DefaultRuntimeVersion = "3.6" }; var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new RpcWorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment, new TestMetricsLogger()); Assert.Equal(expectedPath, configFactory.GetHydratedWorkerPath(workerDescription)); Assert.Collection(testLogger.GetLogMessages(), p => Assert.Equal("EnvironmentVariable FUNCTIONS_WORKER_RUNTIME_VERSION: 3.6", p.FormattedMessage)); }
public void DefaultWorkerConfigs_Overrides_VersionAppSetting() { var testEnvironment = new TestEnvironment(); testEnvironment.SetEnvironmentVariable("FUNCTIONS_WORKER_RUNTIME_VERSION", "7.0"); testEnvironment.SetEnvironmentVariable("FUNCTIONS_WORKER_RUNTIME", "powerShell"); var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder(); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new RpcWorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, testEnvironment, new TestMetricsLogger()); var workerConfigs = configFactory.GetConfigs(); var powershellWorkerConfig = workerConfigs.Where(w => w.Description.Language.Equals("powershell", StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); Assert.Equal(1, workerConfigs.Count); Assert.NotNull(powershellWorkerConfig); Assert.Equal("7", powershellWorkerConfig.Description.DefaultRuntimeVersion); }
public void JavaPath_JavaHome_NotSet() { var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new RpcWorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment, new TestMetricsLogger()); var testEnvVariables = new Dictionary <string, string> { { "JAVA_HOME", string.Empty } }; using (var variables = new TestScopedSettings(scriptSettingsManager, testEnvVariables)) { var javaPath = configFactory.GetExecutablePathForJava("java"); Assert.Equal("java", javaPath); } }
private IEnumerable <RpcWorkerConfig> TestReadWorkerProviderFromConfig(IEnumerable <TestRpcWorkerConfig> configs, ILogger testLogger, TestMetricsLogger testMetricsLogger, string language = null, Dictionary <string, string> keyValuePairs = null, bool appSvcEnv = false) { Mock <IEnvironment> mockEnvironment = new Mock <IEnvironment>(); var workerPathSection = $"{RpcWorkerConstants.LanguageWorkersSectionName}:{WorkerConstants.WorkersDirectorySectionName}"; try { foreach (var workerConfig in configs) { RpcWorkerConfigTestUtilities.CreateWorkerFolder(rootPath, workerConfig); } IConfigurationRoot config = TestConfigBuilder(workerPathSection, keyValuePairs); var scriptHostOptions = new ScriptJobHostOptions(); var scriptSettingsManager = new ScriptSettingsManager(config); var configFactory = new RpcWorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment, testMetricsLogger); if (appSvcEnv) { var testEnvVariables = new Dictionary <string, string> { { EnvironmentSettingNames.AzureWebsiteInstanceId, "123" }, }; using (var variables = new TestScopedSettings(scriptSettingsManager, testEnvVariables)) { configFactory.BuildWorkerProviderDictionary(); return(configFactory.GetConfigs()); } } configFactory.BuildWorkerProviderDictionary(); return(configFactory.GetConfigs()); } finally { RpcWorkerConfigTestUtilities.DeleteTestDir(rootPath); RpcWorkerConfigTestUtilities.DeleteTestDir(customRootPath); } }
public void AddArgumentsFromAppSettings_JavaOpts(string expectedArgument, string javaOpts) { RpcWorkerDescription workerDescription = new RpcWorkerDescription() { Arguments = new List <string>() { "-jar" }, DefaultExecutablePath = "java", DefaultWorkerPath = "javaworker.jar", Extensions = new List <string>() { ".jar" }, Language = "java" }; var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test", ["languageWorkers:java:arguments"] = "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var languageSection = config.GetSection("languageWorkers:java"); var testEnvVariables = new Dictionary <string, string> { { "JAVA_OPTS", javaOpts } }; using (var variables = new TestScopedSettings(scriptSettingsManager, testEnvVariables)) { RpcWorkerConfigFactory.AddArgumentsFromAppSettings(workerDescription, languageSection); Assert.Equal(2, workerDescription.Arguments.Count); Assert.Equal(expectedArgument, workerDescription.Arguments[1]); } }
public void JavaPath_AppServiceEnv() { var configBuilder = ScriptSettingsManager.CreateDefaultConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string> { ["languageWorker"] = "test" }); var config = configBuilder.Build(); var scriptSettingsManager = new ScriptSettingsManager(config); var testLogger = new TestLogger("test"); var configFactory = new RpcWorkerConfigFactory(config, testLogger, _testSysRuntimeInfo, _testEnvironment, new TestMetricsLogger()); var testEnvVariables = new Dictionary <string, string> { { EnvironmentSettingNames.AzureWebsiteInstanceId, "123" }, { "JAVA_HOME", @"D:\Program Files\Java\jdk1.7.0_51" } }; using (var variables = new TestScopedSettings(scriptSettingsManager, testEnvVariables)) { var javaPath = configFactory.GetExecutablePathForJava("../../zulu8.23.0.3-jdk8.0.144-win_x64/bin/java"); Assert.Equal(@"D:\Program Files\Java\zulu8.23.0.3-jdk8.0.144-win_x64\bin\java", javaPath); } }