using CoreAgent.WebSocketTransport.Interfaces;
using CoreAgent.WebSocketTransport.Services;
using Microsoft.Extensions.Logging;
namespace CoreAgent.WebSocketTransport.Examples;
///
/// 消息通道管理器测试示例
/// 验证 MessageChannelManager 和 ChannelMessageChannel 的修复
///
public class ChannelManagerTestExample
{
private readonly IMessageChannelManager _channelManager;
private readonly ILogger _logger;
public ChannelManagerTestExample(IMessageChannelManager channelManager, ILogger logger)
{
_channelManager = channelManager;
_logger = logger;
}
///
/// 测试基本功能
///
public async Task TestBasicFunctionalityAsync()
{
_logger.LogInformation("开始测试基本功能");
try
{
// 测试发送消息
await _channelManager.SendChannel.WriteAsync("Test message 1");
await _channelManager.SendChannel.WriteAsync("Test message 2");
//await _channelManager.PriorityChannel.WriteAsync("Priority message");
_logger.LogInformation("消息发送成功");
// 测试读取消息
if (_channelManager.SendChannel.TryRead(out var message1))
{
_logger.LogInformation($"读取到发送消息: {message1}");
}
if (_channelManager.PriorityChannel.TryRead(out var priorityMessage))
{
_logger.LogInformation($"读取到优先级消息: {priorityMessage}");
}
// 测试状态信息
var statusInfo = _channelManager.GetStatusInfo();
_logger.LogInformation($"通道状态: 发送={statusInfo.SendChannelCount}, 接收={statusInfo.ReceiveChannelCount}, 优先级={statusInfo.PriorityChannelCount}");
_logger.LogInformation("基本功能测试通过");
}
catch (Exception ex)
{
_logger.LogError(ex, "基本功能测试失败");
throw;
}
}
///
/// 测试异步操作
///
public async Task TestAsyncOperationsAsync()
{
_logger.LogInformation("开始测试异步操作");
try
{
// 启动异步接收任务
var receiveTask = Task.Run(async () =>
{
try
{
// 等待消息可读
var hasData = await _channelManager.ReceiveChannel.WaitToReadAsync(CancellationToken.None);
if (hasData)
{
var message = await _channelManager.ReceiveChannel.ReadAsync(CancellationToken.None);
_logger.LogInformation($"异步接收到消息: {message}");
}
}
catch (OperationCanceledException)
{
_logger.LogInformation("异步接收被取消");
}
});
// 发送消息到接收通道
await _channelManager.ReceiveChannel.WriteAsync("Async test message");
// 等待接收任务完成
await receiveTask;
_logger.LogInformation("异步操作测试通过");
}
catch (Exception ex)
{
_logger.LogError(ex, "异步操作测试失败");
throw;
}
}
///
/// 测试批量操作
///
public async Task TestBatchOperationsAsync()
{
_logger.LogInformation("开始测试批量操作");
try
{
// 批量发送消息
for (int i = 0; i < 10; i++)
{
await _channelManager.SendChannel.WriteAsync($"Batch message {i}");
}
// 检查状态
var statusBefore = _channelManager.GetStatusInfo();
_logger.LogInformation($"批量发送后状态: 发送队列={statusBefore.SendChannelCount}");
// 清空通道
_channelManager.ClearAllChannels();
// 检查清空后状态
var statusAfter = _channelManager.GetStatusInfo();
_logger.LogInformation($"清空后状态: 发送队列={statusAfter.SendChannelCount}");
if (statusAfter.SendChannelCount == 0)
{
_logger.LogInformation("批量操作测试通过");
}
else
{
throw new Exception("清空操作失败");
}
}
catch (Exception ex)
{
_logger.LogError(ex, "批量操作测试失败");
throw;
}
}
///
/// 测试错误处理
///
public async Task TestErrorHandlingAsync()
{
_logger.LogInformation("开始测试错误处理");
try
{
// 测试空消息
try
{
await _channelManager.SendChannel.WriteAsync(null!);
throw new Exception("应该抛出 ArgumentNullException");
}
catch (ArgumentNullException)
{
_logger.LogInformation("空消息检查通过");
}
// 测试已释放的通道
_channelManager.Dispose();
try
{
await _channelManager.SendChannel.WriteAsync("test");
throw new Exception("应该抛出 ObjectDisposedException");
}
catch (ObjectDisposedException)
{
_logger.LogInformation("已释放检查通过");
}
_logger.LogInformation("错误处理测试通过");
}
catch (Exception ex)
{
_logger.LogError(ex, "错误处理测试失败");
throw;
}
}
///
/// 测试性能
///
public async Task TestPerformanceAsync()
{
_logger.LogInformation("开始测试性能");
try
{
const int messageCount = 1000;
const int batchSize = 100;
// 清空通道,确保测试环境干净
_channelManager.ClearAllChannels();
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
var memoryBefore = GC.GetTotalMemory(false);
// 批量发送 - 使用更高效的方式
var sendTasks = new List(batchSize);
for (int i = 0; i < messageCount; i++)
{
sendTasks.Add(_channelManager.SendChannel.WriteAsync($"Performance test message {i}"));
// 每 batchSize 个任务等待一次,避免创建过多任务
if (sendTasks.Count >= batchSize || i == messageCount - 1)
{
// 等待所有 ValueTask 完成
foreach (var task in sendTasks)
{
await task;
}
sendTasks.Clear();
}
}
stopwatch.Stop();
var sendTime = stopwatch.ElapsedMilliseconds;
var memoryAfterSend = GC.GetTotalMemory(false);
_logger.LogInformation($"发送 {messageCount} 条消息耗时: {sendTime}ms, 内存增长: {memoryAfterSend - memoryBefore} bytes");
// 验证发送的消息数量
var statusAfterSend = _channelManager.GetStatusInfo();
if (statusAfterSend.SendChannelCount != messageCount)
{
throw new Exception($"发送后消息数量不匹配: 期望={messageCount}, 实际={statusAfterSend.SendChannelCount}");
}
// 批量读取 - 使用更高效的方式
stopwatch.Restart();
var readCount = 0;
var readMessages = new List