Repository navigation
Expand file tree
/
Copy pathMultiProcessControlStepDefinitions.cs
More file actions
138 lines (116 loc) · 3.93 KB
/
Copy pathMultiProcessControlStepDefinitions.cs
File metadata and controls
138 lines (116 loc) · 3.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System;
using System.Collections.Generic;
using System.Linq;
using TechTalk.SpecFlow;
using Xunit;
using Xunit.Abstractions;
namespace TestProcessWrapper.Acceptance.Tests.Steps.Common
{
[Binding]
public sealed class MultiProcessControlStepDefinitions : IDisposable
{
private readonly ITestOutputHelper _testOutputHelper;
private bool _isDisposed;
public MultiProcessControlStepDefinitions(ITestOutputHelper testOutputHelper) =>
_testOutputHelper = testOutputHelper;
public static List<TestProcessWrapper> Clients { get; } = new();
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
[Given(@"(.*) long lived application is running with coverlet '(enabled|disabled)'")]
[Given(@"(.*) long lived applications are running with coverlet '(enabled|disabled)'")]
public void GivenLongLivedApplicationsAreRunningWithCoverlet(
int numberOfClients,
bool isCoverletEnabled
)
{
const string appProjectName = "TestProcessWrapper.LongLived.Application";
CreateAndStartAllApplications(numberOfClients, isCoverletEnabled, appProjectName);
Assert.True(Clients.All(c => c.IsRunning));
}
[Given(@"(.*) short lived application is running with coverlet '(enabled|disabled)'")]
[Given(@"(.*) short lived applications are running with coverlet '(enabled|disabled)'")]
public void GivenShortLivedApplicationsAreRunningWithCoverlet(
int numberOfClients,
bool isCoverletEnabled
)
{
const string appProjectName = "TestProcessWrapper.ShortLived.Application";
CreateAndStartAllApplications(numberOfClients, isCoverletEnabled, appProjectName);
}
[When(@"all applications had enough time to finish")]
public static void WhenAllApplicationsHadEnoughTimeToFinish()
{
foreach (var client in Clients)
{
client.WaitForProcessExit();
}
}
[When(@"all applications are shut down gracefully")]
public static void WhenAllApplicationsAreShutDownGracefully()
{
ShutdownProcessesGracefully();
}
[Then]
public static void ThenAllApplicationsShutDown()
{
Assert.True(Clients.All(c => c.HasExited));
}
private void CreateAndStartAllApplications(
int numberOfClients,
bool isCoverletEnabled,
string appProjectName
)
{
for (var clientIndex = 0; clientIndex < numberOfClients; clientIndex++)
{
var client = new TestProcessWrapper(
appProjectName,
isCoverletEnabled,
BuildConfiguration.Debug
);
client.TestOutputHelper = _testOutputHelper;
client.Start();
Clients.Add(client);
}
}
private static void ShutdownProcessesGracefully()
{
foreach (var client in Clients)
{
client.ShutdownGracefully();
}
}
[AfterScenario]
public static void ForceProcessTermination()
{
foreach (var client in Clients)
{
client.ForceTermination();
client.Dispose();
}
Clients.Clear();
}
~MultiProcessControlStepDefinitions()
{
Dispose(false);
}
private void Dispose(bool disposing)
{
if (_isDisposed)
{
return;
}
if (disposing)
{
foreach (var client in Clients)
{
client?.Dispose();
}
}
_isDisposed = true;
}
}
}