Skip to content

Commit 491f08b

Browse files
committed
Fixing ScriptHost SettingsManager bug
1 parent fc1cc04 commit 491f08b

File tree

5 files changed

+31
-40
lines changed

5 files changed

+31
-40
lines changed

src/WebJobs.Script/Host/ScriptHost.cs

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,24 @@ public class ScriptHost : JobHost
4949
private static readonly TimeSpan MinTimeout = TimeSpan.FromSeconds(1);
5050
private static readonly TimeSpan MaxTimeout = TimeSpan.FromMinutes(5);
5151
private static readonly Regex FunctionNameValidationRegex = new Regex(@"^[a-z][a-z0-9_\-]{0,127}$(?<!^host$)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
52-
private static ScriptSettingsManager _settingsManager;
52+
private ScriptSettingsManager _settingsManager;
5353

54-
protected ScriptHost(ScriptHostConfiguration scriptConfig)
54+
protected ScriptHost(ScriptHostConfiguration scriptConfig = null, ScriptSettingsManager settingsManager = null)
5555
: base(scriptConfig.HostConfig)
5656
{
57+
scriptConfig = scriptConfig ?? new ScriptHostConfiguration();
58+
if (!Path.IsPathRooted(scriptConfig.RootScriptPath))
59+
{
60+
scriptConfig.RootScriptPath = Path.Combine(Environment.CurrentDirectory, scriptConfig.RootScriptPath);
61+
}
5762
ScriptConfig = scriptConfig;
5863
FunctionErrors = new Dictionary<string, Collection<string>>(StringComparer.OrdinalIgnoreCase);
5964
#if FEATURE_NODE
6065
NodeFunctionInvoker.UnhandledException += OnUnhandledException;
6166
#endif
6267
TraceWriter = ScriptConfig.TraceWriter;
68+
69+
_settingsManager = settingsManager ?? ScriptSettingsManager.Instance;
6370
}
6471

6572
public static readonly string Version = GetAssemblyFileVersion(typeof(ScriptHost).Assembly);
@@ -474,23 +481,9 @@ private void PurgeOldLogDirectories()
474481

475482
public static ScriptHost Create(ScriptHostConfiguration scriptConfig = null, ScriptSettingsManager settingsManager = null)
476483
{
477-
if (scriptConfig == null)
478-
{
479-
scriptConfig = new ScriptHostConfiguration();
480-
}
481-
482-
_settingsManager = settingsManager;
483-
if (settingsManager == null)
484-
{
485-
_settingsManager = ScriptSettingsManager.Instance;
486-
}
487-
488-
if (!Path.IsPathRooted(scriptConfig.RootScriptPath))
489-
{
490-
scriptConfig.RootScriptPath = Path.Combine(Environment.CurrentDirectory, scriptConfig.RootScriptPath);
491-
}
484+
scriptConfig = scriptConfig ?? new ScriptHostConfiguration();
492485

493-
ScriptHost scriptHost = new ScriptHost(scriptConfig);
486+
ScriptHost scriptHost = new ScriptHost(scriptConfig, settingsManager);
494487
try
495488
{
496489
scriptHost.Initialize();
@@ -549,7 +542,7 @@ private static Collection<ScriptBindingProvider> LoadBindingProviders(ScriptHost
549542
return bindingProviders;
550543
}
551544

552-
private static FunctionMetadata ParseFunctionMetadata(string functionName, JObject configMetadata)
545+
private static FunctionMetadata ParseFunctionMetadata(string functionName, JObject configMetadata, ScriptSettingsManager settingsManager)
553546
{
554547
FunctionMetadata functionMetadata = new FunctionMetadata
555548
{
@@ -577,8 +570,8 @@ private static FunctionMetadata ParseFunctionMetadata(string functionName, JObje
577570
}
578571

579572
// A function can be disabled at the trigger or function level
580-
if (IsDisabled(triggerDisabledValue) ||
581-
IsDisabled((JValue)configMetadata["disabled"]))
573+
if (IsDisabled(triggerDisabledValue, settingsManager) ||
574+
IsDisabled((JValue)configMetadata["disabled"], settingsManager))
582575
{
583576
functionMetadata.IsDisabled = true;
584577
}
@@ -593,9 +586,10 @@ private static FunctionMetadata ParseFunctionMetadata(string functionName, JObje
593586
return functionMetadata;
594587
}
595588

596-
public static Collection<FunctionMetadata> ReadFunctionMetadata(ScriptHostConfiguration config, TraceWriter traceWriter, Dictionary<string, Collection<string>> functionErrors)
589+
public static Collection<FunctionMetadata> ReadFunctionMetadata(ScriptHostConfiguration config, TraceWriter traceWriter, Dictionary<string, Collection<string>> functionErrors, ScriptSettingsManager settingsManager = null)
597590
{
598591
var functions = new Collection<FunctionMetadata>();
592+
settingsManager = settingsManager ?? ScriptSettingsManager.Instance;
599593

600594
foreach (var scriptDir in Directory.EnumerateDirectories(config.RootScriptPath))
601595
{
@@ -629,7 +623,7 @@ public static Collection<FunctionMetadata> ReadFunctionMetadata(ScriptHostConfig
629623
string functionError = null;
630624
FunctionMetadata functionMetadata = null;
631625
var mappedHttpFunctions = new Dictionary<string, HttpTriggerBindingMetadata>();
632-
if (!TryParseFunctionMetadata(functionName, functionConfig, mappedHttpFunctions, traceWriter, scriptDir, out functionMetadata, out functionError))
626+
if (!TryParseFunctionMetadata(functionName, functionConfig, mappedHttpFunctions, traceWriter, scriptDir, settingsManager, out functionMetadata, out functionError))
633627
{
634628
// for functions in error, log the error and don't
635629
// add to the functions collection
@@ -652,12 +646,12 @@ public static Collection<FunctionMetadata> ReadFunctionMetadata(ScriptHostConfig
652646
}
653647

654648
internal static bool TryParseFunctionMetadata(string functionName, JObject functionConfig, Dictionary<string, HttpTriggerBindingMetadata> mappedHttpFunctions,
655-
TraceWriter traceWriter, string scriptDirectory, out FunctionMetadata functionMetadata, out string error, IFileSystem fileSystem = null)
649+
TraceWriter traceWriter, string scriptDirectory, ScriptSettingsManager settingsManager, out FunctionMetadata functionMetadata, out string error, IFileSystem fileSystem = null)
656650
{
657651
fileSystem = fileSystem ?? new FileSystem();
658652

659653
error = null;
660-
functionMetadata = ParseFunctionMetadata(functionName, functionConfig);
654+
functionMetadata = ParseFunctionMetadata(functionName, functionConfig, settingsManager);
661655

662656
if (functionMetadata.IsExcluded)
663657
{
@@ -839,7 +833,7 @@ private static ScriptType ParseScriptType(string scriptFilePath)
839833

840834
private Collection<FunctionDescriptor> GetFunctionDescriptors()
841835
{
842-
var functions = ReadFunctionMetadata(ScriptConfig, TraceWriter, FunctionErrors);
836+
var functions = ReadFunctionMetadata(ScriptConfig, TraceWriter, FunctionErrors, _settingsManager);
843837

844838
var descriptorProviders = new List<FunctionDescriptorProvider>()
845839
{
@@ -1155,7 +1149,7 @@ internal static string GetRelativeDirectory(string path, string scriptRoot)
11551149
return string.Empty;
11561150
}
11571151

1158-
private static bool IsDisabled(JToken isDisabledValue)
1152+
private static bool IsDisabled(JToken isDisabledValue, ScriptSettingsManager settingsManager)
11591153
{
11601154
if (isDisabledValue != null)
11611155
{
@@ -1166,7 +1160,7 @@ private static bool IsDisabled(JToken isDisabledValue)
11661160
else
11671161
{
11681162
string settingName = (string)isDisabledValue;
1169-
string value = _settingsManager.GetSetting(settingName);
1163+
string value = settingsManager.GetSetting(settingName);
11701164
if (!string.IsNullOrEmpty(value) &&
11711165
(string.Compare(value, "1", StringComparison.OrdinalIgnoreCase) == 0 ||
11721166
string.Compare(value, "true", StringComparison.OrdinalIgnoreCase) == 0))

test/WebJobs.Script.Tests.Integration/Host/ScriptHostManagerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ public void RunAndBlock_DisposesOfHost_WhenExceptionIsThrown()
190190
RootScriptPath = Environment.CurrentDirectory
191191
};
192192

193-
var hostMock = new Mock<ScriptHost>(config);
193+
var hostMock = new Mock<ScriptHost>(config, null);
194194
var factoryMock = new Mock<IScriptHostFactory>();
195195
factoryMock.Setup(f => f.Create(_settingsManager, It.IsAny<ScriptHostConfiguration>()))
196196
.Returns(hostMock.Object);

test/WebJobs.Script.Tests/Controllers/Admin/AdminControllerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public AdminControllerTests()
3737
testFunctions = new Collection<FunctionDescriptor>();
3838

3939
var config = new ScriptHostConfiguration();
40-
hostMock = new Mock<ScriptHost>(MockBehavior.Strict, new object[] { config });
40+
hostMock = new Mock<ScriptHost>(MockBehavior.Strict, new object[] { config, null });
4141
hostMock.Setup(p => p.Functions).Returns(testFunctions);
4242

4343
WebHostSettings settings = new WebHostSettings();

test/WebJobs.Script.Tests/Description/DotNet/DotNetFunctionInvokerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ private RunDependencies CreateDependencies(TraceLevel traceLevel = TraceLevel.In
201201

202202
scriptHostConfiguration.HostConfig.Tracing.ConsoleLevel = System.Diagnostics.TraceLevel.Verbose;
203203

204-
var host = new Mock<ScriptHost>(scriptHostConfiguration);
204+
var host = new Mock<ScriptHost>(scriptHostConfiguration, null);
205205
host.SetupGet(h => h.IsPrimary).Returns(true);
206206

207207
var entrypointResolver = new Mock<IFunctionEntryPointResolver>();

test/WebJobs.Script.Tests/ScriptHostTests.cs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -853,7 +853,7 @@ public void TryParseFunctionMetadata_ValidatesHttpRoutes()
853853
fileSystem.AddFile(@"c:\functions\test3\run.csx", new MockFileData(string.Empty));
854854
fileSystem.AddFile(@"c:\functions\test4\run.csx", new MockFileData(string.Empty));
855855
fileSystem.AddFile(@"c:\functions\test5\run.csx", new MockFileData(string.Empty));
856-
bool result = ScriptHost.TryParseFunctionMetadata("test", functionConfig, mappedHttpFunctions, traceWriter, @"c:\functions\test", out functionMetadata, out functionError, fileSystem);
856+
bool result = ScriptHost.TryParseFunctionMetadata("test", functionConfig, mappedHttpFunctions, traceWriter, @"c:\functions\test", ScriptSettingsManager.Instance, out functionMetadata, out functionError, fileSystem);
857857
Assert.True(result);
858858
Assert.NotNull(functionMetadata);
859859
Assert.Null(functionError);
@@ -872,7 +872,7 @@ public void TryParseFunctionMetadata_ValidatesHttpRoutes()
872872
});
873873
functionMetadata = null;
874874
functionError = null;
875-
result = ScriptHost.TryParseFunctionMetadata("test2", functionConfig, mappedHttpFunctions, traceWriter, @"c:\functions\test2", out functionMetadata, out functionError, fileSystem);
875+
result = ScriptHost.TryParseFunctionMetadata("test2", functionConfig, mappedHttpFunctions, traceWriter, @"c:\functions\test2", ScriptSettingsManager.Instance, out functionMetadata, out functionError, fileSystem);
876876
Assert.True(result);
877877
Assert.NotNull(functionMetadata);
878878
Assert.Null(functionError);
@@ -890,7 +890,7 @@ public void TryParseFunctionMetadata_ValidatesHttpRoutes()
890890
});
891891
functionMetadata = null;
892892
functionError = null;
893-
result = ScriptHost.TryParseFunctionMetadata("test3", functionConfig, mappedHttpFunctions, traceWriter, @"c:\functions\test3", out functionMetadata, out functionError, fileSystem);
893+
result = ScriptHost.TryParseFunctionMetadata("test3", functionConfig, mappedHttpFunctions, traceWriter, @"c:\functions\test3", ScriptSettingsManager.Instance, out functionMetadata, out functionError, fileSystem);
894894
Assert.True(result);
895895
Assert.NotNull(functionMetadata);
896896
Assert.Null(functionError);
@@ -908,7 +908,7 @@ public void TryParseFunctionMetadata_ValidatesHttpRoutes()
908908
});
909909
functionMetadata = null;
910910
functionError = null;
911-
result = ScriptHost.TryParseFunctionMetadata("test4", functionConfig, mappedHttpFunctions, traceWriter, @"c:\functions\test4", out functionMetadata, out functionError, fileSystem);
911+
result = ScriptHost.TryParseFunctionMetadata("test4", functionConfig, mappedHttpFunctions, traceWriter, @"c:\functions\test4", ScriptSettingsManager.Instance, out functionMetadata, out functionError, fileSystem);
912912
Assert.False(result);
913913
Assert.NotNull(functionMetadata);
914914
Assert.True(functionError.StartsWith("The route specified conflicts with the route defined by function"));
@@ -924,7 +924,7 @@ public void TryParseFunctionMetadata_ValidatesHttpRoutes()
924924
});
925925
functionMetadata = null;
926926
functionError = null;
927-
result = ScriptHost.TryParseFunctionMetadata("test5", functionConfig, mappedHttpFunctions, traceWriter, @"c:\functions\test5", out functionMetadata, out functionError, fileSystem);
927+
result = ScriptHost.TryParseFunctionMetadata("test5", functionConfig, mappedHttpFunctions, traceWriter, @"c:\functions\test5", ScriptSettingsManager.Instance, out functionMetadata, out functionError, fileSystem);
928928
Assert.False(result);
929929
Assert.NotNull(functionMetadata);
930930
Assert.Equal(3, mappedHttpFunctions.Count);
@@ -941,14 +941,11 @@ public override object[] GetCustomAttributes(Type attributeType, bool inherit)
941941

942942
public class TestFixture
943943
{
944-
private readonly ScriptSettingsManager _settingsManager;
945-
946944
public TestFixture()
947945
{
948946
ScriptHostConfiguration config = new ScriptHostConfiguration();
949947
config.HostConfig.HostId = ID;
950-
_settingsManager = ScriptSettingsManager.Instance;
951-
Host = ScriptHost.Create(config, _settingsManager);
948+
Host = ScriptHost.Create(config);
952949
}
953950

954951
public ScriptHost Host { get; private set; }

0 commit comments

Comments
 (0)