|
6 | 6 | using Microsoft.Extensions.Logging; |
7 | 7 | using System.Net; |
8 | 8 | using System.Net.Sockets; |
| 9 | +using System.Reflection; |
| 10 | +using System.Security.AccessControl; |
9 | 11 | using System.Text; |
10 | 12 |
|
11 | 13 | namespace UnitTest.Services; |
@@ -193,7 +195,7 @@ public async Task ReceiveAsync_Cancel() |
193 | 195 | var baseType = client.GetType().BaseType; |
194 | 196 | Assert.NotNull(baseType); |
195 | 197 |
|
196 | | - var fieldInfo = baseType.GetField("_receiveCancellationTokenSource", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); |
| 198 | + var fieldInfo = baseType.GetField("_receiveCancellationTokenSource", BindingFlags.NonPublic | BindingFlags.Instance); |
197 | 199 | Assert.NotNull(fieldInfo); |
198 | 200 | var tokenSource = fieldInfo.GetValue(client) as CancellationTokenSource; |
199 | 201 | Assert.NotNull(tokenSource); |
@@ -249,7 +251,7 @@ public async Task ReceiveAsync_Error() |
249 | 251 | var baseType = client.GetType().BaseType; |
250 | 252 | Assert.NotNull(baseType); |
251 | 253 |
|
252 | | - var methodInfo = baseType.GetMethod("AutoReceiveAsync", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); |
| 254 | + var methodInfo = baseType.GetMethod("AutoReceiveAsync", BindingFlags.NonPublic | BindingFlags.Instance); |
253 | 255 | Assert.NotNull(methodInfo); |
254 | 256 |
|
255 | 257 | var task = (ValueTask)methodInfo.Invoke(client, null)!; |
@@ -462,9 +464,51 @@ public async Task DelimiterDataPackageHandler_Ok() |
462 | 464 | public void Logger_Null() |
463 | 465 | { |
464 | 466 | // 测试 Logger 为 null 的情况 |
465 | | - var client = new MockTcpSocketClient(); |
466 | | - client.TestLog(); |
467 | | - Assert.Null(client.Logger); |
| 467 | + var client = CreateClient(); |
| 468 | + var baseType = client.GetType().BaseType; |
| 469 | + Assert.NotNull(baseType); |
| 470 | + |
| 471 | + // 获取 Logger 字段设置为 null 测试 Log 不会抛出异常 |
| 472 | + var propertyInfo = baseType.GetProperty("Logger", BindingFlags.Public | BindingFlags.Instance); |
| 473 | + Assert.NotNull(propertyInfo); |
| 474 | + |
| 475 | + propertyInfo.SetValue(client, null); |
| 476 | + |
| 477 | + var methodInfo = baseType.GetMethod("Log", BindingFlags.NonPublic | BindingFlags.Instance); |
| 478 | + Assert.NotNull(methodInfo); |
| 479 | + methodInfo.Invoke(client, [LogLevel.Information, null!, "Test log message"]); |
| 480 | + } |
| 481 | + |
| 482 | + [Fact] |
| 483 | + public async Task DefaultSocketClient_Ok() |
| 484 | + { |
| 485 | + var port = 8894; |
| 486 | + var server = StartTcpServer(port, MockDelimiterPackageAsync); |
| 487 | + var client = CreateClient(); |
| 488 | + |
| 489 | + // 获得 Client 泛型属性 |
| 490 | + var baseType = client.GetType().BaseType; |
| 491 | + Assert.NotNull(baseType); |
| 492 | + |
| 493 | + // 建立连接 |
| 494 | + var connect = await client.ConnectAsync("localhost", port); |
| 495 | + Assert.True(connect); |
| 496 | + |
| 497 | + var propertyInfo = baseType.GetProperty("Client", BindingFlags.NonPublic | BindingFlags.Instance); |
| 498 | + Assert.NotNull(propertyInfo); |
| 499 | + var instance = propertyInfo.GetValue(client); |
| 500 | + Assert.NotNull(instance); |
| 501 | + |
| 502 | + ISocketClient socketClient = (ISocketClient)instance; |
| 503 | + Assert.NotNull(socketClient); |
| 504 | + Assert.True(socketClient.IsConnected); |
| 505 | + |
| 506 | + await socketClient.CloseAsync(); |
| 507 | + Assert.False(socketClient.IsConnected); |
| 508 | + |
| 509 | + var buffer = new byte[10]; |
| 510 | + var len = await socketClient.ReceiveAsync(buffer); |
| 511 | + Assert.Equal(0, len); |
468 | 512 | } |
469 | 513 |
|
470 | 514 | private static TcpListener StartTcpServer(int port, Func<TcpClient, Task> handler) |
@@ -677,21 +721,4 @@ public override async ValueTask ReceiveAsync(ReadOnlyMemory<byte> data, Cancella |
677 | 721 | await base.ReceiveAsync(data, token); |
678 | 722 | } |
679 | 723 | } |
680 | | - |
681 | | - class MockSoketClient(IPEndPoint localEndPoint) : SocketClientBase(localEndPoint) |
682 | | - { |
683 | | - } |
684 | | - |
685 | | - class MockTcpSocketClient : TcpSocketClientBase<MockSoketClient> |
686 | | - { |
687 | | - protected override MockSoketClient CreateSocketClient(IPEndPoint localEndPoint) |
688 | | - { |
689 | | - return new MockSoketClient(localEndPoint); |
690 | | - } |
691 | | - |
692 | | - public void TestLog() |
693 | | - { |
694 | | - Log(LogLevel.Information, null, "test"); |
695 | | - } |
696 | | - } |
697 | 724 | } |
0 commit comments