From 979abfe0285f95786ca37ca68808b04b1b9340bd Mon Sep 17 00:00:00 2001 From: Santiago Fernandez Date: Thu, 14 Sep 2017 10:50:00 -0700 Subject: [PATCH 1/3] Disable ServiceProcessTest that has been failing on CI and official builds --- .../tests/ServiceBaseTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/System.ServiceProcess.ServiceController/tests/ServiceBaseTests.cs b/src/System.ServiceProcess.ServiceController/tests/ServiceBaseTests.cs index daf0ccc49e1b..a03023c9fa59 100644 --- a/src/System.ServiceProcess.ServiceController/tests/ServiceBaseTests.cs +++ b/src/System.ServiceProcess.ServiceController/tests/ServiceBaseTests.cs @@ -69,6 +69,7 @@ public void Cleanup() } } + [ActiveIssue(23388)] [ConditionalFact(nameof(IsProcessElevated))] public void TestOnStartThenStop() { From 64a012797c743667e1c1a332c85f2ae1aece92f7 Mon Sep 17 00:00:00 2001 From: Santiago Fernandez Date: Mon, 18 Sep 2017 13:21:27 -0700 Subject: [PATCH 2/3] Prevent dispose from been called when already disposed --- .../tests/ServiceBaseTests.cs | 9 +++++++-- .../tests/ServiceControllerTests.cs | 7 ++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/System.ServiceProcess.ServiceController/tests/ServiceBaseTests.cs b/src/System.ServiceProcess.ServiceController/tests/ServiceBaseTests.cs index a03023c9fa59..96fd00329527 100644 --- a/src/System.ServiceProcess.ServiceController/tests/ServiceBaseTests.cs +++ b/src/System.ServiceProcess.ServiceController/tests/ServiceBaseTests.cs @@ -21,6 +21,8 @@ public class ServiceBaseTests : IDisposable private static readonly Lazy s_isElevated = new Lazy(() => AdminHelpers.IsProcessElevated()); protected static bool IsProcessElevated => s_isElevated.Value; + private bool _disposed; + public ServiceBaseTests() { _testService = new TestServiceProvider(); @@ -69,7 +71,6 @@ public void Cleanup() } } - [ActiveIssue(23388)] [ConditionalFact(nameof(IsProcessElevated))] public void TestOnStartThenStop() { @@ -175,7 +176,11 @@ public void TestOnContinueBeforePause() public void Dispose() { - _testService.DeleteTestServices(); + if (!_disposed) + { + _testService.DeleteTestServices(); + _disposed = true; + } } } } diff --git a/src/System.ServiceProcess.ServiceController/tests/ServiceControllerTests.cs b/src/System.ServiceProcess.ServiceController/tests/ServiceControllerTests.cs index 2511ca5e1817..11978dfe0676 100644 --- a/src/System.ServiceProcess.ServiceController/tests/ServiceControllerTests.cs +++ b/src/System.ServiceProcess.ServiceController/tests/ServiceControllerTests.cs @@ -19,6 +19,7 @@ public class ServiceControllerTests : IDisposable protected static bool IsProcessElevated => s_isElevated.Value; private const int ExpectedDependentServiceCount = 3; + private bool _disposed; public ServiceControllerTests() { @@ -190,7 +191,11 @@ public void ServicesStartMode() public void Dispose() { - _testService.DeleteTestServices(); + if (!_disposed) + { + _testService.DeleteTestServices(); + _disposed = true; + } } private static ServiceController AssertHasDependent(ServiceController controller, string serviceName, string displayName) From 59e82637bebc3d81324e60c3d03d651f08fc2c7e Mon Sep 17 00:00:00 2001 From: Santiago Fernandez Date: Mon, 18 Sep 2017 13:25:49 -0700 Subject: [PATCH 3/3] Add logging to repro if RemoveService is been called twice on the same ServiceController --- .../TestServiceInstaller.cs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/System.ServiceProcess.ServiceController/tests/System.ServiceProcess.ServiceController.TestService/TestServiceInstaller.cs b/src/System.ServiceProcess.ServiceController/tests/System.ServiceProcess.ServiceController.TestService/TestServiceInstaller.cs index 9bd9c128073a..878f560386a0 100644 --- a/src/System.ServiceProcess.ServiceController/tests/System.ServiceProcess.ServiceController.TestService/TestServiceInstaller.cs +++ b/src/System.ServiceProcess.ServiceController/tests/System.ServiceProcess.ServiceController.TestService/TestServiceInstaller.cs @@ -14,6 +14,8 @@ public class TestServiceInstaller { public const string LocalServiceName = "NT AUTHORITY\\LocalService"; + private string _removalStack; + public TestServiceInstaller() { } @@ -128,6 +130,19 @@ public unsafe void Install() public void RemoveService() { + if (ServiceName == null) + throw new InvalidOperationException($"Already removed service at stack ${_removalStack}"); + + // Store the stack for logging in case we're called twice + try + { + throw new Exception(); + } + catch (Exception e) + { + _removalStack = e.StackTrace; + } + // Stop the service using (ServiceController svc = new ServiceController(ServiceName)) { @@ -161,6 +176,8 @@ public void RemoveService() Interop.Advapi32.CloseServiceHandle(serviceManagerHandle); } + + ServiceName = null; } } -} +} \ No newline at end of file