using Common.Utils; namespace Common.Test; /// /// SystemHelper 测试 /// 展示系统相关的实用工具方法 /// [TestClass] public class SystemHelperTests { #region GetAvailablePort 测试 /// /// 测试:获取可用端口返回有效端口号 /// [TestMethod] public void GetAvailablePort_ReturnsValidPort() { // Act var port = SystemHelper.GetAvailablePort(); // Assert: 端口应该在有效范围内 Assert.IsTrue(port > 0); Assert.IsTrue(port <= 65535); } /// /// 测试:多次调用获取不同的可用端口 /// [TestMethod] public void GetAvailablePort_MultipleCallsReturnDifferentPorts() { // Act: 多次获取端口 var port1 = SystemHelper.GetAvailablePort(); var port2 = SystemHelper.GetAvailablePort(); var port3 = SystemHelper.GetAvailablePort(); // Assert: 每次应该返回不同的端口(由操作系统分配) var ports = new[] { port1, port2, port3 }; Assert.AreEqual(3, ports.Distinct().Count(), "Should get different ports"); } /// /// 测试:获取的端口确实可用 /// 演示如何验证端口是否真的可以使用 /// [TestMethod] public void GetAvailablePort_PortIsActuallyAvailable() { // Act: 获取可用端口 var port = SystemHelper.GetAvailablePort(); // Assert: 尝试在该端口上创建监听器 using var listener = new System.Net.Sockets.TcpListener( System.Net.IPAddress.Loopback, port ); // 如果端口被占用,Start 会抛出异常 listener.Start(); listener.Stop(); // 如果没有抛出异常,说明端口确实可用 Assert.IsTrue(true); } #endregion #region IsAdministrator 测试 /// /// 测试:IsAdministrator 在 Windows 上正常工作 /// 注意:此测试在非 Windows 平台会被跳过 /// [TestMethod] public void IsAdministrator_OnWindows_ReturnsBoolean() { // Arrange: 检查是否为 Windows 平台 if (!OperatingSystem.IsWindows()) { Assert.Inconclusive("This test only runs on Windows"); return; } // Act var isAdmin = SystemHelper.IsAdministrator(); // Assert: 应该返回布尔值(无论是 true 还是 false 都是有效的) Assert.IsInstanceOfType(isAdmin, typeof(bool)); // 输出结果供参考 Console.WriteLine($"Running as administrator: {isAdmin}"); } /// /// 测试:IsAdministrator 在非 Windows 平台抛出异常 /// 注意:此测试在 Windows 平台会被跳过 /// [TestMethod] public void IsAdministrator_OnNonWindows_ThrowsException() { // Arrange: 检查是否为非 Windows 平台 if (OperatingSystem.IsWindows()) { Assert.Inconclusive("This test only runs on non-Windows platforms"); return; } // Act & Assert: 在非 Windows 平台应该抛出异常 var exception = Assert.ThrowsException(() => { SystemHelper.IsAdministrator(); }); Assert.IsTrue(exception.Message.Contains("Windows")); } #endregion #region 实际应用场景测试 /// /// 场景测试:为开发服务器分配端口 /// 演示如何在启动服务器时动态分配端口 /// [TestMethod] public void Scenario_AllocatePortForDevelopmentServer() { // Arrange: 需要启动多个开发服务器 var serverCount = 3; var allocatedPorts = new List(); // Act: 为每个服务器分配端口 for (var i = 0; i < serverCount; i++) { var port = SystemHelper.GetAvailablePort(); allocatedPorts.Add(port); Console.WriteLine($"Server {i + 1} allocated port: {port}"); } // Assert: 所有端口都应该是唯一的 Assert.AreEqual(serverCount, allocatedPorts.Distinct().Count()); Assert.IsTrue(allocatedPorts.All(p => p > 0 && p <= 65535)); } /// /// 场景测试:检查权限后执行特权操作 /// 演示如何在需要管理员权限的功能中使用 IsAdministrator /// [TestMethod] public void Scenario_CheckAdminBeforePrivilegedOperation() { // 跳过非 Windows 平台 if (!OperatingSystem.IsWindows()) { Assert.Inconclusive("This test only runs on Windows"); return; } // Arrange: 定义需要管理员权限的操作 void PrivilegedOperation() { if (!SystemHelper.IsAdministrator()) throw new UnauthorizedAccessException( "This operation requires administrator privileges" ); // 执行需要管理员权限的操作... Console.WriteLine("Executing privileged operation"); } // Act & Assert: 根据当前权限决定行为 if (SystemHelper.IsAdministrator()) { // 如果是管理员,操作应该成功 PrivilegedOperation(); Assert.IsTrue(true); } else { // 如果不是管理员,应该抛出异常 Assert.ThrowsException(() => { PrivilegedOperation(); }); } } /// /// 场景测试:动态端口绑定用于测试 /// 演示如何在集成测试中使用动态端口避免冲突 /// [TestMethod] public void Scenario_DynamicPortForIntegrationTesting() { // Arrange: 模拟需要启动测试服务器的场景 var testServers = new List(); try { // Act: 启动多个测试服务器 for (var i = 0; i < 3; i++) { var port = SystemHelper.GetAvailablePort(); var server = new TestServer($"TestServer{i + 1}", port); server.Start(); testServers.Add(server); Console.WriteLine($"{server.Name} started on port {server.Port}"); } // Assert: 所有服务器都应该成功启动 Assert.AreEqual(3, testServers.Count); Assert.IsTrue(testServers.All(s => s.IsRunning)); // 验证端口都不相同 var ports = testServers.Select(s => s.Port).ToList(); Assert.AreEqual(3, ports.Distinct().Count()); } finally { // Cleanup: 停止所有测试服务器 foreach (var server in testServers) server.Stop(); } } /// /// 场景测试:端口范围检查 /// 演示验证分配的端口在合理范围内 /// [TestMethod] public void Scenario_VerifyPortRange() { // Arrange: 获取多个端口样本 var sampleSize = 10; var ports = new List(); // Act: 收集端口样本 for (var i = 0; i < sampleSize; i++) ports.Add(SystemHelper.GetAvailablePort()); // Assert: 验证所有端口都在合理范围内 // 动态端口范围通常是 49152-65535 Assert.IsTrue(ports.All(p => p > 0), "All ports should be positive"); Assert.IsTrue(ports.All(p => p <= 65535), "All ports should be <= 65535"); // 统计信息 Console.WriteLine($"Port range: {ports.Min()} - {ports.Max()}"); Console.WriteLine($"Average port: {ports.Average():F0}"); } /// /// 场景测试:跨平台兼容性处理 /// 演示如何编写跨平台友好的代码 /// [TestMethod] public void Scenario_CrossPlatformCompatibility() { // Act: 尝试检查管理员权限,优雅处理不同平台 bool? isAdmin = null; Exception? caughtException = null; try { isAdmin = SystemHelper.IsAdministrator(); } catch (PlatformNotSupportedException ex) { caughtException = ex; } // Assert: 根据平台验证行为 if (OperatingSystem.IsWindows()) { // Windows: 应该返回结果 Assert.IsNotNull(isAdmin); Assert.IsNull(caughtException); Console.WriteLine($"Windows platform - Is Admin: {isAdmin}"); } else { // 非 Windows: 应该抛出异常 Assert.IsNull(isAdmin); Assert.IsNotNull(caughtException); Console.WriteLine($"Non-Windows platform - Exception caught: {caughtException.Message}"); } } #endregion #region 测试辅助类型 /// /// 测试用的简单服务器模拟 /// private class TestServer { public string Name { get; } public int Port { get; } public bool IsRunning { get; private set; } private System.Net.Sockets.TcpListener? _listener; public TestServer(string name, int port) { Name = name; Port = port; } public void Start() { _listener = new System.Net.Sockets.TcpListener( System.Net.IPAddress.Loopback, Port ); _listener.Start(); IsRunning = true; } public void Stop() { _listener?.Stop(); IsRunning = false; } } #endregion }