Join GitHub today
GitHub is home to over 20 million developers working together to host and review code, manage projects, and build software together.
fix set-service failing test #4802
Conversation
SteveL-MSFT
assigned
iSazonov
Sep 10, 2017
SteveL-MSFT
requested a review
from
iSazonov
Sep 10, 2017
msftclas
added
the
cla-not-required
label
Sep 10, 2017
SteveL-MSFT
referenced this pull request
Sep 10, 2017
Merged
Set-Service and New-Service test coverage #4785
|
Blocked by #4803. |
SteveL-MSFT
added some commits
Sep 10, 2017
SteveL-MSFT
requested review from
adityapatwardhan and
daxian-dbw
as
code owners
Sep 11, 2017
SteveL-MSFT
added
the
Breaking-Change
label
Sep 11, 2017
|
@SteveL-MSFT something should probably be done about Set-Service.Tests.ps1#L25. That will continue to fail on Linux and macOS as the literal will still be parsed even though the |
|
@markekraus I see. will fix. |
| - break; | ||
| + WriteNonTerminatingError(StartupType.ToString(), DisplayName, Name, | ||
| + new ArgumentException(), "CouldNotNewService", | ||
| + ServiceResources.UnsupportedStartupType, |
daxian-dbw
Sep 11, 2017
Member
There is another instance of Assert(((ServiceStartMode)(-1)) == StartupType, "bad StartupType" in Set-Service. It would be the best if all can be fixed here.
| @@ -201,4 +201,7 @@ | ||
| <data name="ComputerAccessDenied" xml:space="preserve"> | ||
| <value>The command cannot be used to configure the service '{0}' because access to computer '{1}' is denied. Run PowerShell as admin and run your command again.</value> | ||
| </data> | ||
| + <data name="UnsupportedStartupType" xml:space="preserve"> | ||
| + <value>The startup type '{0}' is not supported by New-Service.</value> |
daxian-dbw
Sep 11, 2017
Member
by New-Service needs to be changed since the same applies to set-service as well.
| @@ -163,8 +166,7 @@ Describe "Set/New-Service cmdlet tests" -Tags "Feature", "RequireAdminOnWindows" | ||
| [System.Management.Automation.PSCredential]::new("username", | ||
| (ConvertTo-SecureString "PlainTextPassword" -AsPlainText -Force))) | ||
| }, | ||
| - # This test case fails due to #4803. Disabled for now. | ||
| - # @{name = 'badstarttype'; parameter = "StartupType"; value = "System"}, | ||
| + @{name = 'badstarttype'; parameter = "StartupType"; value = "System"}, |
iSazonov
Sep 12, 2017
Collaborator
Should we add "Boot" too?
Should we check valid and invalid values from System.ServiceProcess.ServiceStartMode? If yes it is better refactor the tests. And for Set-Service too.
|
@iSazonov @daxian-dbw feedback addressed |
| @@ -1684,22 +1682,14 @@ protected override void ProcessRecord() | ||
| || (ServiceStartMode)(-1) != StartupType) | ||
| { | ||
| DWORD dwStartType = NativeMethods.SERVICE_NO_CHANGE; |
iSazonov
Sep 13, 2017
Collaborator
We do the initialiazation in GetNativeStartupType. So we could remove this and below call by C# 7.0 pattern NativeMethods.GetNativeStartupType(StartupType, out DWORD dwStartType)).
SteveL-MSFT
Sep 13, 2017
Owner
I can make that change for New-Service, but for Set-Service, I need to use dwStartType on line 1697 so it has to be initialized.
daxian-dbw
Sep 14, 2017
Member
In New-Service, dwStartType is also used in line 2045 when calling NativeMethods.CreateServiceW.
It turns out the following code works:
static void Blah ()
{
if (!int.TryParse("1", out int result))
{
Console.WriteLine("Failed");
}
Console.WriteLine(result);
}
It would be the best if we can do it in a consistent way in those 2 places.
| + /// <returns> | ||
| + /// If a supported StartupType is provided, funciton returns true, otherwise false. | ||
| + /// </returns> | ||
| + internal static bool GetNativeStartupType(ServiceStartMode StartupType, out DWORD dwStartType) |
| @@ -1684,22 +1682,14 @@ protected override void ProcessRecord() | ||
| || (ServiceStartMode)(-1) != StartupType) | ||
| { | ||
| DWORD dwStartType = NativeMethods.SERVICE_NO_CHANGE; | ||
| - switch (StartupType) | ||
| + if ((ServiceStartMode)(-1) != StartupType && |
SteveL-MSFT
Sep 13, 2017
Owner
Will change, but will need to change some other code to make this work. Seems like -1 shouldn't be needed at all.
SteveL-MSFT
Sep 13, 2017
Owner
Actually, still need -1 which will be treated as equivalent to SERVICE_NO_CHANGE
daxian-dbw
Sep 13, 2017
Member
By looking at the original code, for New-Service, SERVICE_AUTO_START would be used in case StartupType is -1. So it seems we cannot just use dwStartType = NativeMethods.SERVICE_NO_CHANGE for (ServiceStartMode)(-1)
daxian-dbw
Sep 14, 2017
•
Member
Is it possible that the value of StartupType can be set to (-1)?
In the original code, dwStartType will still be SERVICE_AUTO_START even if StartupType is (-1), while it will be SERVICE_NO_CHANGE after the change.
Turns out we can't do [System.ServiceProcess.ServiceStartMode]-1 in PowerShell, so we are good.
SteveL-MSFT
Sep 14, 2017
Owner
I'll fix it so if it's (-1), it should default to Auto for New-Service
|
@daxian-dbw feedback addressed |
SteveL-MSFT
referenced this pull request
Sep 14, 2017
Merged
Added WSMan Config provider tests #4756
| @@ -1684,22 +1682,14 @@ protected override void ProcessRecord() | ||
| || (ServiceStartMode)(-1) != StartupType) | ||
| { | ||
| DWORD dwStartType = NativeMethods.SERVICE_NO_CHANGE; |
iSazonov
Sep 13, 2017
Collaborator
We do the initialiazation in GetNativeStartupType. So we could remove this and below call by C# 7.0 pattern NativeMethods.GetNativeStartupType(StartupType, out DWORD dwStartType)).
SteveL-MSFT
Sep 13, 2017
Owner
I can make that change for New-Service, but for Set-Service, I need to use dwStartType on line 1697 so it has to be initialized.
daxian-dbw
Sep 14, 2017
Member
In New-Service, dwStartType is also used in line 2045 when calling NativeMethods.CreateServiceW.
It turns out the following code works:
static void Blah ()
{
if (!int.TryParse("1", out int result))
{
Console.WriteLine("Failed");
}
Console.WriteLine(result);
}
It would be the best if we can do it in a consistent way in those 2 places.
|
@daxian-dbw can you review latest change? |
|
@SteveL-MSFT we cannot pass the value (-1) to |
|
@daxian-dbw yeah, I went through the code and for |
|
Last commit was reverted. We should be good to go. |
|
@SteveL-MSFT @daxian-dbw Is the PR ready to merge? |
|
@iSazonov Yes, it's good to go. |


SteveL-MSFT commentedSep 10, 2017
•
Edited 1 time
-
SteveL-MSFT
Sep 11, 2017
missed -ErrorAction Stop
changed new-service to return error when given unsupported startuptype
Fix #4800
Fix #4803