Skip to content

Commit e9cbeab

Browse files
committed
Fixing tests leaking host
1 parent b1a8582 commit e9cbeab

File tree

3 files changed

+74
-23
lines changed

3 files changed

+74
-23
lines changed

test/WebJobs.Script.Tests/FunctionDescriptorProviderTests.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212

1313
namespace Microsoft.Azure.WebJobs.Script.Tests
1414
{
15-
public class FunctionDescriptorProviderTests
15+
public class FunctionDescriptorProviderTests : IDisposable
1616
{
1717
private readonly FunctionDescriptorProvider _provider;
18+
private readonly ScriptHost _host;
1819

1920
public FunctionDescriptorProviderTests()
2021
{
@@ -23,8 +24,9 @@ public FunctionDescriptorProviderTests()
2324
{
2425
RootScriptPath = rootPath
2526
};
26-
ScriptHost host = ScriptHost.Create(config);
27-
_provider = new TestDescriptorProvider(host, config);
27+
28+
_host = ScriptHost.Create(config);
29+
_provider = new TestDescriptorProvider(_host, config);
2830
}
2931

3032
[Fact]
@@ -89,6 +91,19 @@ public void ValidateBinding_EmptyName_Throws(string bindingName)
8991
Assert.Equal("A valid name must be assigned to the binding.", ex.Message);
9092
}
9193

94+
protected virtual void Dispose(bool disposing)
95+
{
96+
if (disposing)
97+
{
98+
_host?.Dispose();
99+
}
100+
}
101+
102+
public void Dispose()
103+
{
104+
Dispose(true);
105+
}
106+
92107
private class TestDescriptorProvider : FunctionDescriptorProvider
93108
{
94109
public TestDescriptorProvider(ScriptHost host, ScriptHostConfiguration config) : base(host, config)

test/WebJobs.Script.Tests/NodeFunctionGenerationTests.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.Collections.ObjectModel;
67
using System.IO;
78
using System.Linq;
89
using System.Net.Http;
@@ -192,13 +193,18 @@ private static MethodInfo GenerateMethod(BindingMetadata trigger)
192193
{
193194
RootScriptPath = rootPath
194195
};
195-
ScriptHost host = ScriptHost.Create(scriptConfig);
196-
FunctionDescriptorProvider[] descriptorProviders = new FunctionDescriptorProvider[]
196+
197+
Collection<FunctionDescriptor> functionDescriptors = null;
198+
using (ScriptHost host = ScriptHost.Create(scriptConfig))
197199
{
200+
FunctionDescriptorProvider[] descriptorProviders = new FunctionDescriptorProvider[]
201+
{
198202
new NodeFunctionDescriptorProvider(host, scriptConfig)
199-
};
203+
};
204+
205+
functionDescriptors = host.ReadFunctions(metadatas, descriptorProviders);
206+
}
200207

201-
var functionDescriptors = host.ReadFunctions(metadatas, descriptorProviders);
202208
Type t = FunctionGenerator.Generate("TestScriptHost", "Host.Functions", functionDescriptors);
203209

204210
MethodInfo method = t.GetMethods(BindingFlags.Public | BindingFlags.Static).First();

test/WebJobs.Script.Tests/TestScripts/PowerShellFunctionGenerationTests.cs

Lines changed: 46 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ public void GenerateHttpTriggerFunction()
3030
Type = "HttpTrigger",
3131
Name = inputBindingName
3232
};
33-
var scriptHostInfo = GetScriptHostInfo();
34-
MethodInfo method = GenerateMethod(trigger, scriptHostInfo);
3533

34+
MethodInfo method = GenerateMethod(trigger);
35+
3636
VerifyCommonProperties(method);
3737

3838
// verify trigger parameter
@@ -54,8 +54,8 @@ public void GenerateQueueTriggerFunction()
5454
{ "direction", "in" },
5555
{ "queueName", "test" }
5656
});
57-
var scriptHostInfo = GetScriptHostInfo();
58-
MethodInfo method = GenerateMethod(trigger, scriptHostInfo);
57+
58+
MethodInfo method = GenerateMethod(trigger);
5959

6060
VerifyCommonProperties(method);
6161

@@ -86,12 +86,14 @@ public void GenerateQueueTriggerFunction_WithInvalidInputName_Fails()
8686
{ "QueueName", "test" }
8787
};
8888

89-
var scriptHostInfo = GetScriptHostInfo();
90-
Exception ex = Assert.Throws<InvalidOperationException>(() => GenerateMethod(trigger, scriptHostInfo));
91-
Assert.Equal("Sequence contains no elements", ex.Message);
92-
93-
var functionError = scriptHostInfo.Host.FunctionErrors[FunctionName];
94-
Assert.True(functionError.Contains(expectedError));
89+
using (var scriptHostInfo = GetScriptHostInfo())
90+
{
91+
Exception ex = Assert.Throws<InvalidOperationException>(() => GenerateMethod(trigger, scriptHostInfo));
92+
Assert.Equal("Sequence contains no elements", ex.Message);
93+
94+
var functionError = scriptHostInfo.Host.FunctionErrors[FunctionName];
95+
Assert.True(functionError.Contains(expectedError));
96+
}
9597
}
9698

9799
private static void VerifyCommonProperties(MethodInfo method)
@@ -117,6 +119,14 @@ private static void VerifyCommonProperties(MethodInfo method)
117119
Assert.Equal(typeof(ExecutionContext), parameter.ParameterType);
118120
}
119121

122+
private static MethodInfo GenerateMethod(BindingMetadata trigger)
123+
{
124+
using (var scriptHostInfo = GetScriptHostInfo())
125+
{
126+
return GenerateMethod(trigger, scriptHostInfo);
127+
}
128+
}
129+
120130
private static MethodInfo GenerateMethod(BindingMetadata trigger, ScriptHostInfo scriptHostInfo)
121131
{
122132
FunctionMetadata metadata = new FunctionMetadata();
@@ -146,18 +156,38 @@ private static ScriptHostInfo GetScriptHostInfo()
146156
{
147157
RootScriptPath = rootPath
148158
};
149-
ScriptHost host = ScriptHost.Create(scriptConfig);
150-
return new ScriptHostInfo { Host = host, Configuration = scriptConfig, RootPath = rootPath };
159+
var host = ScriptHost.Create(scriptConfig);
160+
return new ScriptHostInfo(host, scriptConfig, rootPath);
151161
}
152162
}
153163

154164
[SuppressMessage("Microsoft.StyleCop.CSharp.MaintainabilityRules", "SA1402:FileMayOnlyContainASingleClass")]
155-
internal class ScriptHostInfo
165+
internal class ScriptHostInfo : IDisposable
156166
{
157-
public ScriptHost Host { get; set; }
167+
public ScriptHostInfo(ScriptHost host, ScriptHostConfiguration config, string rootPath)
168+
{
169+
Host = host;
170+
Configuration = config;
171+
RootPath = rootPath;
172+
}
158173

159-
public ScriptHostConfiguration Configuration { get; set; }
174+
public ScriptHost Host { get; }
160175

161-
public string RootPath { get; set; }
176+
public ScriptHostConfiguration Configuration { get; }
177+
178+
public string RootPath { get; }
179+
180+
protected virtual void Dispose(bool disposing)
181+
{
182+
if (disposing)
183+
{
184+
Host.Dispose();
185+
}
186+
}
187+
188+
public void Dispose()
189+
{
190+
Dispose(true);
191+
}
162192
}
163193
}

0 commit comments

Comments
 (0)