NewLife/NewLife.RocketMQ

test: 补充云厂商纯单元测试17个,覆盖四家Provider适配器逻辑
大石头 authored at 2026-07-20 01:28:58
f8f55f8
Tree
1 Parent(s) e5348e1
Summary: 3 changed files with 302 additions and 3 deletions.
Modified +1 -1
Modified +2 -2
Added +299 -0
Modified +1 -1
diff --git "a/Doc/\345\212\237\350\203\275\346\270\205\345\215\225.md" "b/Doc/\345\212\237\350\203\275\346\270\205\345\215\225.md"
index fbedf3b..d44b302 100644
--- "a/Doc/\345\212\237\350\203\275\346\270\205\345\215\225.md"
+++ "b/Doc/\345\212\237\350\203\275\346\270\205\345\215\225.md"
@@ -269,7 +269,7 @@
 
 ---
 
-> **测试数据**:基于 xUnit 测试项目 XUnitTestRocketMQ,529 个测试用例(523 通过,0 失败,6 跳过 AliCloud 集成测试)。测试框架 xUnit,目标框架 net10.0,39 个测试文件。
+> **测试数据**:基于 xUnit 测试项目 XUnitTestRocketMQ,546 个测试用例(540 通过,0 失败,6 跳过 AliCloud 集成测试)。测试框架 xUnit,目标框架 net10.0,40 个测试文件。较上一版新增 SupportCloudProviderTests(17 个纯单元测试覆盖四家云厂商适配器)。
 
 ---
 
Modified +2 -2
diff --git "a/Doc/\346\236\266\346\236\204\350\256\276\350\256\241.md" "b/Doc/\346\236\266\346\236\204\350\256\276\350\256\241.md"
index 8a752d5..58a0bdc 100644
--- "a/Doc/\346\236\266\346\236\204\350\256\276\350\256\241.md"
+++ "b/Doc/\346\236\266\346\236\204\350\256\276\350\256\241.md"
@@ -15,7 +15,7 @@ NewLife.RocketMQ 采用**分层清晰、职责单一、可扩展**的架构设
 - **双协议支持**:同时支持 Remoting 协议(4.x/5.x Broker)和 gRPC 协议(5.x Proxy)
 - **云厂商适配**:统一 ICloudProvider 接口,轻松接入各云服务商
 - **高性能优化**:连接复用、对象池、VIP 通道、消息压缩等优化手段
-- **可测试性**:39 个测试文件,529 个测试用例覆盖核心功能和边缘场景
+- **可测试性**:40 个测试文件,546 个测试用例覆盖核心功能和边缘场景
 
 ### 1.2 层次结构
 
@@ -352,7 +352,7 @@ sequenceDiagram
 
 ## 附录 D:测试覆盖
 
-测试框架:xUnit,目标框架 net10.0,39 个测试文件,529 个测试用例(523 通过,0 失败,6 跳过 AliCloud 集成测试)。
+测试框架:xUnit,目标框架 net10.0,40 个测试文件,546 个测试用例(540 通过,0 失败,6 跳过 AliCloud 集成测试)。
 
 | 分类 | 测试文件 | 覆盖功能 |
 |------|---------|---------|
Added +299 -0
diff --git a/XUnitTestRocketMQ/Cloud/SupportCloudProviderTests.cs b/XUnitTestRocketMQ/Cloud/SupportCloudProviderTests.cs
new file mode 100644
index 0000000..68e2e17
--- /dev/null
+++ b/XUnitTestRocketMQ/Cloud/SupportCloudProviderTests.cs
@@ -0,0 +1,299 @@
+using System;
+using NewLife.RocketMQ;
+using NewLife.RocketMQ.Protocol;
+using Xunit;
+
+namespace XUnitTest.Cloud;
+
+/// <summary>云厂商适配器单元测试。不依赖 RocketMQ 服务器,测试 Provider 自身的逻辑</summary>
+[System.ComponentModel.DisplayName("云厂商适配器单元测试")]
+public class SupportCloudProviderTests
+{
+    [Fact]
+    [System.ComponentModel.DisplayName("AclProvider_ACL2.0属性_默认Disabled")]
+    public void AclProvider_DefaultAclEnabled_False()
+    {
+        var provider = new AclProvider
+        {
+            AccessKey = "testKey",
+            SecretKey = "testSecret",
+        };
+
+        Assert.False(provider.AclEnabled);
+        Assert.Equal(0, provider.ResourceType);
+        Assert.Null(provider.ResourceName);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("AclProvider_ACL2.0属性_设置后生效")]
+    public void AclProvider_AclEnabled_PropertiesSet()
+    {
+        var provider = new AclProvider
+        {
+            AccessKey = "testKey",
+            SecretKey = "testSecret",
+            AclEnabled = true,
+            ResourceType = 1,
+            ResourceName = "testTopic",
+        };
+
+        Assert.True(provider.AclEnabled);
+        Assert.Equal(1, provider.ResourceType);
+        Assert.Equal("testTopic", provider.ResourceName);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("AclProvider_Name_非空")]
+    public void AclProvider_Name_NotEmpty()
+    {
+        var provider = new AclProvider
+        {
+            AccessKey = "testKey",
+            SecretKey = "testSecret",
+        };
+
+        Assert.False(String.IsNullOrEmpty(provider.Name));
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("AclProvider_TransformTopic_不转换")]
+    public void AclProvider_TransformTopic_NoChange()
+    {
+        var provider = new AclProvider
+        {
+            AccessKey = "testKey",
+            SecretKey = "testSecret",
+        };
+
+        var topic = "test_topic";
+        var result = provider.TransformTopic(topic);
+
+        Assert.Equal(topic, result);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("AclProvider_TransformGroup_不转换")]
+    public void AclProvider_TransformGroup_NoChange()
+    {
+        var provider = new AclProvider
+        {
+            AccessKey = "testKey",
+            SecretKey = "testSecret",
+        };
+
+        var group = "test_group";
+        var result = provider.TransformGroup(group);
+
+        Assert.Equal(group, result);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("AclProvider_GetNameServerAddress_返回null")]
+    public void AclProvider_GetNameServerAddress_ReturnsNull()
+    {
+        var provider = new AclProvider
+        {
+            AccessKey = "testKey",
+            SecretKey = "testSecret",
+        };
+
+        Assert.Null(provider.GetNameServerAddress());
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("AliyunProvider_实例ID前缀_转换Topic")]
+    public void AliyunProvider_InstanceId_TransformsTopic()
+    {
+        var provider = new AliyunProvider
+        {
+            AccessKey = "testKey",
+            SecretKey = "testSecret",
+            InstanceId = "MQ_INST_1234",
+        };
+
+        var topic = "test_topic";
+        var result = provider.TransformTopic(topic);
+
+        Assert.Equal("MQ_INST_1234%test_topic", result);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("AliyunProvider_实例ID前缀_转换Group")]
+    public void AliyunProvider_InstanceId_TransformsGroup()
+    {
+        var provider = new AliyunProvider
+        {
+            AccessKey = "testKey",
+            SecretKey = "testSecret",
+            InstanceId = "MQ_INST_1234",
+        };
+
+        var group = "GID_test";
+        var result = provider.TransformGroup(group);
+
+        Assert.Equal("MQ_INST_1234%GID_test", result);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("AliyunProvider_无实例ID_不转换Topic")]
+    public void AliyunProvider_NoInstanceId_NoTransform()
+    {
+        var provider = new AliyunProvider
+        {
+            AccessKey = "testKey",
+            SecretKey = "testSecret",
+        };
+
+        var topic = "test_topic";
+        var result = provider.TransformTopic(topic);
+
+        Assert.Equal(topic, result);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("HuaweiProvider_实例ID_不转换Topic")]
+    public void HuaweiProvider_InstanceId_NoTransform()
+    {
+        var provider = new HuaweiProvider
+        {
+            AccessKey = "testKey",
+            SecretKey = "testSecret",
+            InstanceId = "HW_INST_5678",
+        };
+
+        var topic = "test_topic";
+        var result = provider.TransformTopic(topic);
+
+        // 华为云文档说明不转换 Topic/Group
+        Assert.Equal(topic, result);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("TencentProvider_Namespace前缀_转换Topic")]
+    public void TencentProvider_Namespace_TransformsTopic()
+    {
+        var provider = new TencentProvider
+        {
+            AccessKey = "testSecretId",
+            SecretKey = "testSecretKey",
+            Namespace = "ns_test",
+        };
+
+        var topic = "test_topic";
+        var result = provider.TransformTopic(topic);
+
+        Assert.Equal("ns_test%test_topic", result);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("TencentProvider_Namespace前缀_转换Group")]
+    public void TencentProvider_Namespace_TransformsGroup()
+    {
+        var provider = new TencentProvider
+        {
+            AccessKey = "testSecretId",
+            SecretKey = "testSecretKey",
+            Namespace = "ns_test",
+        };
+
+        var group = "GID_test";
+        var result = provider.TransformGroup(group);
+
+        Assert.Equal("ns_test%GID_test", result);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("TencentProvider_无Namespace_不转换Topic")]
+    public void TencentProvider_NoNamespace_NoTransform()
+    {
+        var provider = new TencentProvider
+        {
+            AccessKey = "testSecretId",
+            SecretKey = "testSecretKey",
+        };
+
+        var topic = "test_topic";
+        var result = provider.TransformTopic(topic);
+
+        Assert.Equal(topic, result);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("HuaweiProvider_EnableSsl_默认False")]
+    public void HuaweiProvider_EnableSsl_DefaultFalse()
+    {
+        var provider = new HuaweiProvider
+        {
+            AccessKey = "testKey",
+            SecretKey = "testSecret",
+        };
+
+        // 华为云 EnableSsl 默认 false,由用户按需开启
+        Assert.False(provider.EnableSsl);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("ICloudProvider_接口一致性_所有Provider实现")]
+    public void AllProviders_ImplementInterface()
+    {
+        var providers = new ICloudProvider[]
+        {
+            new AliyunProvider { AccessKey = "ak", SecretKey = "sk" },
+            new HuaweiProvider { AccessKey = "ak", SecretKey = "sk" },
+            new TencentProvider { AccessKey = "ak", SecretKey = "sk" },
+            new AclProvider { AccessKey = "ak", SecretKey = "sk" },
+        };
+
+        foreach (var provider in providers)
+        {
+            Assert.NotNull(provider.Name);
+            Assert.Equal("ak", provider.AccessKey);
+            Assert.Equal("sk", provider.SecretKey);
+        }
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("AliyunOptions_AliyunProvider_桥接一致性")]
+    public void AliyunOptions_Bridge_Consistency()
+    {
+        var options = new AliyunOptions
+        {
+            AccessKey = "bridgeAk",
+            SecretKey = "bridgeSk",
+            InstanceId = "MQ_INST_BRIDGE",
+            OnsChannel = "ALIYUN",
+        };
+
+        var provider = new AliyunProvider
+        {
+            AccessKey = options.AccessKey,
+            SecretKey = options.SecretKey,
+            InstanceId = options.InstanceId,
+        };
+
+        Assert.Equal(options.AccessKey, provider.AccessKey);
+        Assert.Equal(options.SecretKey, provider.SecretKey);
+        Assert.Equal(options.InstanceId, provider.InstanceId);
+    }
+
+    [Fact]
+    [System.ComponentModel.DisplayName("AclOptions_AclProvider_桥接一致性")]
+    public void AclOptions_Bridge_Consistency()
+    {
+        var options = new AclOptions
+        {
+            AccessKey = "bridgeAk",
+            SecretKey = "bridgeSk",
+            OnsChannel = "LOCAL",
+        };
+
+        var provider = new AclProvider
+        {
+            AccessKey = options.AccessKey,
+            SecretKey = options.SecretKey,
+        };
+
+        Assert.Equal(options.AccessKey, provider.AccessKey);
+        Assert.Equal(options.SecretKey, provider.SecretKey);
+    }
+}