diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml index 155122e2ce..63f2ce1360 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/pr-build.yml @@ -122,7 +122,7 @@ jobs: echo "Building $sln" dotnet build "$sln" --configuration Release echo "Testing $sln (no-op for folders with no test project)" - dotnet test "$sln" --configuration Release --no-build + dotnet test "$sln" --configuration Release --no-build --filter "FullyQualifiedName!~Live" # Stable, folder-independent name for branch protection to require -- the # build-and-test job's displayed name varies with the matrix (one leg per diff --git a/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp.csproj b/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp.csproj index f02677bf64..dfb40caafc 100644 --- a/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp.csproj +++ b/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp.csproj @@ -2,7 +2,7 @@ Exe - net7.0 + net10.0 enable enable diff --git a/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp/RegistryDemo.cs b/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp/RegistryDemo.cs index c2e251a157..872f2046b9 100644 --- a/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp/RegistryDemo.cs +++ b/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp/RegistryDemo.cs @@ -42,7 +42,7 @@ public static string ReadAndWriteRegistryValueUsingRegistryClass() return string.Empty; } - var subKeyToWrite = Path.Combine(Registry.CurrentUser.Name, CodeMazeRegistryDemoSubKey); + var subKeyToWrite = $@"{Registry.CurrentUser.Name}\{CodeMazeRegistryDemoSubKey}"; Registry.SetValue(subKeyToWrite, CodeMazeRegistryDemoName, CodeMazeRegistryDemoValue); var writtenValue = Registry.GetValue(subKeyToWrite, CodeMazeRegistryDemoName, string.Empty); @@ -64,9 +64,9 @@ public static string ReadAndWriteRegistryValueUsingRegistryKeyClass() using var subKey = baseKey.OpenSubKey(CodeMazeRegistryDemoSubKey, true) ?? baseKey.CreateSubKey(CodeMazeRegistryDemoSubKey); - subKey?.SetValue(CodeMazeRegistryDemoName, CodeMazeRegistryDemoValue); - var writtenValue = subKey?.GetValue(CodeMazeRegistryDemoName); - subKey?.DeleteValue(CodeMazeRegistryDemoName); + subKey.SetValue(CodeMazeRegistryDemoName, CodeMazeRegistryDemoValue); + var writtenValue = subKey.GetValue(CodeMazeRegistryDemoName); + subKey.DeleteValue(CodeMazeRegistryDemoName); baseKey.DeleteSubKey(CodeMazeRegistryDemoSubKey); @@ -77,37 +77,37 @@ public static string[] GetSubKeyNames() { if (!OperatingSystem.IsWindows()) { - return Array.Empty(); + return []; } using var subKey = Registry.CurrentUser.CreateSubKey(CodeMazeRegistryDemoSubKey); - subKey?.CreateSubKey("SubKey1"); - subKey?.CreateSubKey("SubKey2"); + subKey.CreateSubKey("SubKey1"); + subKey.CreateSubKey("SubKey2"); - var subKeyNames = subKey?.GetSubKeyNames(); + var subKeyNames = subKey.GetSubKeyNames(); Registry.CurrentUser.DeleteSubKeyTree(CodeMazeRegistryDemoSubKey); - return subKeyNames ?? Array.Empty(); + return subKeyNames; } public static string[] GetValueNames() { if (!OperatingSystem.IsWindows()) { - return Array.Empty(); + return []; } using var subKey = Registry.CurrentUser.CreateSubKey(CodeMazeRegistryDemoSubKey); - using var subKey1 = subKey?.CreateSubKey("SubKey1"); - subKey1?.SetValue("Name1", "Value1"); - subKey1?.SetValue("Name2", "Value2"); + using var subKey1 = subKey.CreateSubKey("SubKey1"); + subKey1.SetValue("Name1", "Value1"); + subKey1.SetValue("Name2", "Value2"); - var subKeyNames = subKey1?.GetValueNames(); + var subKeyNames = subKey1.GetValueNames(); Registry.CurrentUser.DeleteSubKeyTree(CodeMazeRegistryDemoSubKey); - return subKeyNames ?? Array.Empty(); + return subKeyNames; } public static string GetValueKind() @@ -118,14 +118,14 @@ public static string GetValueKind() } using var subKey = Registry.CurrentUser.CreateSubKey(CodeMazeRegistryDemoSubKey); - using var subKey1 = subKey?.CreateSubKey("SubKey1"); - subKey1?.SetValue("Name1", "Value1"); + using var subKey1 = subKey.CreateSubKey("SubKey1"); + subKey1.SetValue("Name1", "Value1"); - var valueKind = subKey1?.GetValueKind("Name1"); + var valueKind = subKey1.GetValueKind("Name1"); Registry.CurrentUser.DeleteSubKeyTree(CodeMazeRegistryDemoSubKey); - return valueKind.ToString() ?? string.Empty; + return valueKind.ToString(); } public static bool SetRegistryKeyAccessPermissions() @@ -135,7 +135,7 @@ public static bool SetRegistryKeyAccessPermissions() return false; } - var user = Path.Combine(Environment.UserDomainName, Environment.UserName); + var user = $@"{Environment.UserDomainName}\{Environment.UserName}"; var registrySecurity = new RegistrySecurity(); var accessRule = new RegistryAccessRule(user, @@ -180,10 +180,16 @@ public static bool OpenRemoteBaseKey(string machineName) try { - var remoteBaseKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.CurrentUser, machineName); + using var remoteBaseKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.CurrentUser, machineName); + return true; } - catch + catch (ArgumentException) + { + // An unreachable machine and a stopped Remote Registry service both surface here. + return false; + } + catch (IOException) { return false; } diff --git a/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/Tests/RegistryDemoTests.cs b/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/Tests/RegistryDemoTests.cs index 791d1bd589..0bcf327aed 100644 --- a/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/Tests/RegistryDemoTests.cs +++ b/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/Tests/RegistryDemoTests.cs @@ -1,81 +1,54 @@ namespace Tests { + // Every test in this class reads and writes the registry of the machine that runs it, + // so it can only pass on Windows. The names carry "Live" and CI excludes them with + // --filter "FullyQualifiedName!~Live". Run them locally on Windows. [TestClass] public class RegistryDemoTests { [TestMethod] - public void WhenGetCurrentUserRootKeyName_ResultIsRootKeyCurrentUserName() + public void WhenGetCurrentUserRootKeyName_ResultIsRootKeyCurrentUserName_Live() { - if (!OperatingSystem.IsWindows()) - { - return; - } - var currentUserRegistryName = RegistryDemo.GetCurrentUserRootKeyName(); Assert.AreEqual(currentUserRegistryName, Registry.CurrentUser.Name); } [TestMethod] - public void WhenGetCurrentUserRootKeyNameWithPlatformCheck_ResultIsRootKeyCurrentUserName() + public void WhenGetCurrentUserRootKeyNameWithPlatformCheck_ResultIsRootKeyCurrentUserName_Live() { - if (!OperatingSystem.IsWindows()) - { - return; - } - var currentUserRegistryName = RegistryDemo.GetCurrentUserRootKeyNameWithPlatformCheck(); Assert.AreEqual(currentUserRegistryName, Registry.CurrentUser.Name); } [TestMethod] - public void WhenGetCurrentUserRootKeySubkeyCount_ResultIsGreaterThanZero() + public void WhenGetCurrentUserRootKeySubkeyCount_ResultIsGreaterThanZero_Live() { - if (!OperatingSystem.IsWindows()) - { - return; - } - var subKeyCount = RegistryDemo.GetCurrentUserRootKeySubkeyCount(); Assert.IsTrue(subKeyCount > 0); } [TestMethod] - public void WhenReadAndWriteRegistryValueUsingRegistryClass_ResultIsCodeMazeRegistryDemoValue() + public void WhenReadAndWriteRegistryValueUsingRegistryClass_ResultIsCodeMazeRegistryDemoValue_Live() { - if (!OperatingSystem.IsWindows()) - { - return; - } - var writtenValue = RegistryDemo.ReadAndWriteRegistryValueUsingRegistryClass(); Assert.AreEqual(writtenValue, RegistryDemo.CodeMazeRegistryDemoValue); } [TestMethod] - public void WhenReadAndWriteRegistryValueUsingRegistryKeyClass_ResultIsCodeMazeRegistryDemoValue() + public void WhenReadAndWriteRegistryValueUsingRegistryKeyClass_ResultIsCodeMazeRegistryDemoValue_Live() { - if (!OperatingSystem.IsWindows()) - { - return; - } - var writtenValue = RegistryDemo.ReadAndWriteRegistryValueUsingRegistryKeyClass(); Assert.AreEqual(writtenValue, RegistryDemo.CodeMazeRegistryDemoValue); } [TestMethod] - public void WhenGetSubKeyNames_ResultAreTwoSpecificNames() + public void WhenGetSubKeyNames_ResultAreTwoSpecificNames_Live() { - if (!OperatingSystem.IsWindows()) - { - return; - } - var subKeyNames = RegistryDemo.GetSubKeyNames(); Assert.IsTrue(subKeyNames.Length == 2); @@ -84,13 +57,8 @@ public void WhenGetSubKeyNames_ResultAreTwoSpecificNames() } [TestMethod] - public void WhenGetValueNames_ResultAreTwoSpecificValues() + public void WhenGetValueNames_ResultAreTwoSpecificValues_Live() { - if (!OperatingSystem.IsWindows()) - { - return; - } - var valueNames = RegistryDemo.GetValueNames(); Assert.IsTrue(valueNames.Length == 2); @@ -99,42 +67,27 @@ public void WhenGetValueNames_ResultAreTwoSpecificValues() } [TestMethod] - public void WhenGetValueKind_ResultIsString() + public void WhenGetValueKind_ResultIsString_Live() { - if (!OperatingSystem.IsWindows()) - { - return; - } - var valueKind = RegistryDemo.GetValueKind(); Assert.IsTrue(valueKind.Equals("String")); } [TestMethod] - public void WhenSetRegistryKeyAccessPermissions_ResultIsTrue() + public void WhenSetRegistryKeyAccessPermissions_ResultIsTrue_Live() { - if (!OperatingSystem.IsWindows()) - { - return; - } - var setPermission = RegistryDemo.SetRegistryKeyAccessPermissions(); Assert.IsTrue(setPermission); } [TestMethod] - public void WhenOpenRemoteBaseKey_ResultIsFalse() + public void WhenOpenRemoteBaseKey_ResultIsFalse_Live() { - if (!OperatingSystem.IsWindows()) - { - return; - } - var openRemote = RegistryDemo.OpenRemoteBaseKey("machineName"); Assert.IsFalse(openRemote); } } -} \ No newline at end of file +} diff --git a/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/Tests/Tests.csproj b/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/Tests/Tests.csproj index 45f2533ac4..b6b1b17c18 100644 --- a/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/Tests/Tests.csproj +++ b/dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/Tests/Tests.csproj @@ -1,7 +1,7 @@ - net7.0 + net10.0 enable enable @@ -10,10 +10,10 @@ - - - - + + + +