Skip to content

Commit 39ea3fe

Browse files
Registry sample: retarget net10.0, MSTest 4.3.3, and honest CI for the Windows-only tests (#2166)
* Registry sample: retarget net10.0, MSTest 4.3.3, Live-named registry tests, CI Live filter * Restore pr-build.yml to main: the Live-test filter already merged in #2162
1 parent 10d533a commit 39ea3fe

4 files changed

Lines changed: 48 additions & 89 deletions

File tree

‎dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp.csproj‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net7.0</TargetFramework>
5+
<TargetFramework>net10.0</TargetFramework>
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
</PropertyGroup>

‎dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/ReadWriteWindowsRegistryInCSharp/RegistryDemo.cs‎

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public static string ReadAndWriteRegistryValueUsingRegistryClass()
4242
return string.Empty;
4343
}
4444

45-
var subKeyToWrite = Path.Combine(Registry.CurrentUser.Name, CodeMazeRegistryDemoSubKey);
45+
var subKeyToWrite = $@"{Registry.CurrentUser.Name}\{CodeMazeRegistryDemoSubKey}";
4646

4747
Registry.SetValue(subKeyToWrite, CodeMazeRegistryDemoName, CodeMazeRegistryDemoValue);
4848
var writtenValue = Registry.GetValue(subKeyToWrite, CodeMazeRegistryDemoName, string.Empty);
@@ -64,9 +64,9 @@ public static string ReadAndWriteRegistryValueUsingRegistryKeyClass()
6464
using var subKey = baseKey.OpenSubKey(CodeMazeRegistryDemoSubKey, true) ??
6565
baseKey.CreateSubKey(CodeMazeRegistryDemoSubKey);
6666

67-
subKey?.SetValue(CodeMazeRegistryDemoName, CodeMazeRegistryDemoValue);
68-
var writtenValue = subKey?.GetValue(CodeMazeRegistryDemoName);
69-
subKey?.DeleteValue(CodeMazeRegistryDemoName);
67+
subKey.SetValue(CodeMazeRegistryDemoName, CodeMazeRegistryDemoValue);
68+
var writtenValue = subKey.GetValue(CodeMazeRegistryDemoName);
69+
subKey.DeleteValue(CodeMazeRegistryDemoName);
7070

7171
baseKey.DeleteSubKey(CodeMazeRegistryDemoSubKey);
7272

@@ -77,37 +77,37 @@ public static string[] GetSubKeyNames()
7777
{
7878
if (!OperatingSystem.IsWindows())
7979
{
80-
return Array.Empty<string>();
80+
return [];
8181
}
8282

8383
using var subKey = Registry.CurrentUser.CreateSubKey(CodeMazeRegistryDemoSubKey);
84-
subKey?.CreateSubKey("SubKey1");
85-
subKey?.CreateSubKey("SubKey2");
84+
subKey.CreateSubKey("SubKey1");
85+
subKey.CreateSubKey("SubKey2");
8686

87-
var subKeyNames = subKey?.GetSubKeyNames();
87+
var subKeyNames = subKey.GetSubKeyNames();
8888

8989
Registry.CurrentUser.DeleteSubKeyTree(CodeMazeRegistryDemoSubKey);
9090

91-
return subKeyNames ?? Array.Empty<string>();
91+
return subKeyNames;
9292
}
9393

9494
public static string[] GetValueNames()
9595
{
9696
if (!OperatingSystem.IsWindows())
9797
{
98-
return Array.Empty<string>();
98+
return [];
9999
}
100100

101101
using var subKey = Registry.CurrentUser.CreateSubKey(CodeMazeRegistryDemoSubKey);
102-
using var subKey1 = subKey?.CreateSubKey("SubKey1");
103-
subKey1?.SetValue("Name1", "Value1");
104-
subKey1?.SetValue("Name2", "Value2");
102+
using var subKey1 = subKey.CreateSubKey("SubKey1");
103+
subKey1.SetValue("Name1", "Value1");
104+
subKey1.SetValue("Name2", "Value2");
105105

106-
var subKeyNames = subKey1?.GetValueNames();
106+
var subKeyNames = subKey1.GetValueNames();
107107

108108
Registry.CurrentUser.DeleteSubKeyTree(CodeMazeRegistryDemoSubKey);
109109

110-
return subKeyNames ?? Array.Empty<string>();
110+
return subKeyNames;
111111
}
112112

113113
public static string GetValueKind()
@@ -118,14 +118,14 @@ public static string GetValueKind()
118118
}
119119

120120
using var subKey = Registry.CurrentUser.CreateSubKey(CodeMazeRegistryDemoSubKey);
121-
using var subKey1 = subKey?.CreateSubKey("SubKey1");
122-
subKey1?.SetValue("Name1", "Value1");
121+
using var subKey1 = subKey.CreateSubKey("SubKey1");
122+
subKey1.SetValue("Name1", "Value1");
123123

124-
var valueKind = subKey1?.GetValueKind("Name1");
124+
var valueKind = subKey1.GetValueKind("Name1");
125125

126126
Registry.CurrentUser.DeleteSubKeyTree(CodeMazeRegistryDemoSubKey);
127127

128-
return valueKind.ToString() ?? string.Empty;
128+
return valueKind.ToString();
129129
}
130130

131131
public static bool SetRegistryKeyAccessPermissions()
@@ -135,7 +135,7 @@ public static bool SetRegistryKeyAccessPermissions()
135135
return false;
136136
}
137137

138-
var user = Path.Combine(Environment.UserDomainName, Environment.UserName);
138+
var user = $@"{Environment.UserDomainName}\{Environment.UserName}";
139139
var registrySecurity = new RegistrySecurity();
140140

141141
var accessRule = new RegistryAccessRule(user,
@@ -180,10 +180,16 @@ public static bool OpenRemoteBaseKey(string machineName)
180180

181181
try
182182
{
183-
var remoteBaseKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.CurrentUser, machineName);
183+
using var remoteBaseKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.CurrentUser, machineName);
184+
184185
return true;
185186
}
186-
catch
187+
catch (ArgumentException)
188+
{
189+
// An unreachable machine and a stopped Remote Registry service both surface here.
190+
return false;
191+
}
192+
catch (IOException)
187193
{
188194
return false;
189195
}
Lines changed: 14 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,54 @@
11
namespace Tests
22
{
3+
// Every test in this class reads and writes the registry of the machine that runs it,
4+
// so it can only pass on Windows. The names carry "Live" and CI excludes them with
5+
// --filter "FullyQualifiedName!~Live". Run them locally on Windows.
36
[TestClass]
47
public class RegistryDemoTests
58
{
69
[TestMethod]
7-
public void WhenGetCurrentUserRootKeyName_ResultIsRootKeyCurrentUserName()
10+
public void WhenGetCurrentUserRootKeyName_ResultIsRootKeyCurrentUserName_Live()
811
{
9-
if (!OperatingSystem.IsWindows())
10-
{
11-
return;
12-
}
13-
1412
var currentUserRegistryName = RegistryDemo.GetCurrentUserRootKeyName();
1513

1614
Assert.AreEqual(currentUserRegistryName, Registry.CurrentUser.Name);
1715
}
1816

1917
[TestMethod]
20-
public void WhenGetCurrentUserRootKeyNameWithPlatformCheck_ResultIsRootKeyCurrentUserName()
18+
public void WhenGetCurrentUserRootKeyNameWithPlatformCheck_ResultIsRootKeyCurrentUserName_Live()
2119
{
22-
if (!OperatingSystem.IsWindows())
23-
{
24-
return;
25-
}
26-
2720
var currentUserRegistryName = RegistryDemo.GetCurrentUserRootKeyNameWithPlatformCheck();
2821

2922
Assert.AreEqual(currentUserRegistryName, Registry.CurrentUser.Name);
3023
}
3124

3225
[TestMethod]
33-
public void WhenGetCurrentUserRootKeySubkeyCount_ResultIsGreaterThanZero()
26+
public void WhenGetCurrentUserRootKeySubkeyCount_ResultIsGreaterThanZero_Live()
3427
{
35-
if (!OperatingSystem.IsWindows())
36-
{
37-
return;
38-
}
39-
4028
var subKeyCount = RegistryDemo.GetCurrentUserRootKeySubkeyCount();
4129

4230
Assert.IsTrue(subKeyCount > 0);
4331
}
4432

4533
[TestMethod]
46-
public void WhenReadAndWriteRegistryValueUsingRegistryClass_ResultIsCodeMazeRegistryDemoValue()
34+
public void WhenReadAndWriteRegistryValueUsingRegistryClass_ResultIsCodeMazeRegistryDemoValue_Live()
4735
{
48-
if (!OperatingSystem.IsWindows())
49-
{
50-
return;
51-
}
52-
5336
var writtenValue = RegistryDemo.ReadAndWriteRegistryValueUsingRegistryClass();
5437

5538
Assert.AreEqual(writtenValue, RegistryDemo.CodeMazeRegistryDemoValue);
5639
}
5740

5841
[TestMethod]
59-
public void WhenReadAndWriteRegistryValueUsingRegistryKeyClass_ResultIsCodeMazeRegistryDemoValue()
42+
public void WhenReadAndWriteRegistryValueUsingRegistryKeyClass_ResultIsCodeMazeRegistryDemoValue_Live()
6043
{
61-
if (!OperatingSystem.IsWindows())
62-
{
63-
return;
64-
}
65-
6644
var writtenValue = RegistryDemo.ReadAndWriteRegistryValueUsingRegistryKeyClass();
6745

6846
Assert.AreEqual(writtenValue, RegistryDemo.CodeMazeRegistryDemoValue);
6947
}
7048

7149
[TestMethod]
72-
public void WhenGetSubKeyNames_ResultAreTwoSpecificNames()
50+
public void WhenGetSubKeyNames_ResultAreTwoSpecificNames_Live()
7351
{
74-
if (!OperatingSystem.IsWindows())
75-
{
76-
return;
77-
}
78-
7952
var subKeyNames = RegistryDemo.GetSubKeyNames();
8053

8154
Assert.IsTrue(subKeyNames.Length == 2);
@@ -84,13 +57,8 @@ public void WhenGetSubKeyNames_ResultAreTwoSpecificNames()
8457
}
8558

8659
[TestMethod]
87-
public void WhenGetValueNames_ResultAreTwoSpecificValues()
60+
public void WhenGetValueNames_ResultAreTwoSpecificValues_Live()
8861
{
89-
if (!OperatingSystem.IsWindows())
90-
{
91-
return;
92-
}
93-
9462
var valueNames = RegistryDemo.GetValueNames();
9563

9664
Assert.IsTrue(valueNames.Length == 2);
@@ -99,42 +67,27 @@ public void WhenGetValueNames_ResultAreTwoSpecificValues()
9967
}
10068

10169
[TestMethod]
102-
public void WhenGetValueKind_ResultIsString()
70+
public void WhenGetValueKind_ResultIsString_Live()
10371
{
104-
if (!OperatingSystem.IsWindows())
105-
{
106-
return;
107-
}
108-
10972
var valueKind = RegistryDemo.GetValueKind();
11073

11174
Assert.IsTrue(valueKind.Equals("String"));
11275
}
11376

11477
[TestMethod]
115-
public void WhenSetRegistryKeyAccessPermissions_ResultIsTrue()
78+
public void WhenSetRegistryKeyAccessPermissions_ResultIsTrue_Live()
11679
{
117-
if (!OperatingSystem.IsWindows())
118-
{
119-
return;
120-
}
121-
12280
var setPermission = RegistryDemo.SetRegistryKeyAccessPermissions();
12381

12482
Assert.IsTrue(setPermission);
12583
}
12684

12785
[TestMethod]
128-
public void WhenOpenRemoteBaseKey_ResultIsFalse()
86+
public void WhenOpenRemoteBaseKey_ResultIsFalse_Live()
12987
{
130-
if (!OperatingSystem.IsWindows())
131-
{
132-
return;
133-
}
134-
13588
var openRemote = RegistryDemo.OpenRemoteBaseKey("machineName");
13689

13790
Assert.IsFalse(openRemote);
13891
}
13992
}
140-
}
93+
}

‎dotnet-platform-specific/ReadWriteWindowsRegistryInCSharp/Tests/Tests.csproj‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net7.0</TargetFramework>
4+
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
77

@@ -10,10 +10,10 @@
1010
</PropertyGroup>
1111

1212
<ItemGroup>
13-
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
14-
<PackageReference Include="MSTest.TestAdapter" Version="2.2.10" />
15-
<PackageReference Include="MSTest.TestFramework" Version="2.2.10" />
16-
<PackageReference Include="coverlet.collector" Version="3.2.0" />
13+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.9.0" />
14+
<PackageReference Include="MSTest.TestAdapter" Version="4.3.3" />
15+
<PackageReference Include="MSTest.TestFramework" Version="4.3.3" />
16+
<PackageReference Include="coverlet.collector" Version="10.0.1" />
1717
</ItemGroup>
1818

1919
<ItemGroup>

0 commit comments

Comments
 (0)