@@ -103,9 +103,12 @@ public async Task Send_Timeout()
103103 var port = 8887 ;
104104 var server = StartTcpServer ( port , MockSplitPackageAsync ) ;
105105
106- var client = CreateClient ( ) ;
107- client . Options . SendTimeout = 100 ;
108- client . SetDataHandler ( new MockSendTimeoutHandler ( ) ) ;
106+ var client = CreateClient ( builder =>
107+ {
108+ // 增加发送报错 MockSocket
109+ builder . AddTransient < ISocketClientProvider , MockSendTimeoutSocketProvider > ( ) ;
110+ } ) ;
111+ client . Options . SendTimeout = 10 ;
109112
110113 await client . ConnectAsync ( "localhost" , port ) ;
111114
@@ -117,7 +120,11 @@ public async Task Send_Timeout()
117120 [ Fact ]
118121 public async Task SendAsync_Error ( )
119122 {
120- var client = CreateClient ( ) ;
123+ var client = CreateClient ( builder =>
124+ {
125+ // 增加发送报错 MockSocket
126+ builder . AddTransient < ISocketClientProvider , MockSendErrorSocketProvider > ( ) ;
127+ } ) ;
121128
122129 // 测试未建立连接前调用 SendAsync 方法报异常逻辑
123130 var data = new ReadOnlyMemory < byte > ( [ 1 , 2 , 3 , 4 , 5 ] ) ;
@@ -128,7 +135,6 @@ public async Task SendAsync_Error()
128135 var port = 8892 ;
129136 var server = StartTcpServer ( port , MockSplitPackageAsync ) ;
130137
131- client . SetDataHandler ( new MockSendErrorHandler ( ) ) ;
132138 await client . ConnectAsync ( "localhost" , port ) ;
133139 Assert . True ( client . IsConnected ) ;
134140
@@ -156,25 +162,6 @@ public async Task SendAsync_Cancel()
156162 var result = await client . SendAsync ( "test" , null , cst . Token ) ;
157163 Assert . False ( result ) ;
158164
159- // 设置延时发送适配器
160- // 延时发送期间关闭 Socket 连接导致内部报错
161- client . SetDataHandler ( new MockSendCancelHandler ( )
162- {
163- Socket = client
164- } ) ;
165-
166- var tcs = new TaskCompletionSource ( ) ;
167- bool ? sendResult = null ;
168- // 测试发送失败逻辑
169- _ = Task . Run ( async ( ) =>
170- {
171- sendResult = await client . SendAsync ( "test" , Encoding . UTF8 ) ;
172- tcs . SetResult ( ) ;
173- } ) ;
174-
175- await tcs . Task ;
176- Assert . False ( sendResult ) ;
177-
178165 // 关闭连接
179166 StopTcpServer ( server ) ;
180167 }
@@ -439,15 +426,15 @@ public async Task DelimiterDataPackageHandler_Ok()
439426 ReadOnlyMemory < byte > receivedBuffer = ReadOnlyMemory < byte > . Empty ;
440427
441428 // 增加数据库处理适配器
442- client . SetDataHandler ( new DelimiterDataPackageHandler ( [ 0x13 , 0x10 ] )
443- {
444- ReceivedCallBack = buffer =>
445- {
446- receivedBuffer = buffer ;
447- tcs . SetResult ( ) ;
448- return ValueTask . CompletedTask ;
449- }
450- } ) ;
429+ // client.SetDataHandler(new DelimiterDataPackageHandler([0x13, 0x10])
430+ // {
431+ // ReceivedCallBack = buffer =>
432+ // {
433+ // receivedBuffer = buffer;
434+ // tcs.SetResult();
435+ // return ValueTask.CompletedTask;
436+ // }
437+ // });
451438
452439 // 发送数据
453440 var data = new ReadOnlyMemory < byte > ( [ 1 , 2 , 3 , 4 , 5 ] ) ;
@@ -584,14 +571,18 @@ private static void StopTcpServer(TcpListener server)
584571 server ? . Stop ( ) ;
585572 }
586573
587- private static ITcpSocketClient CreateClient ( )
574+ private static ITcpSocketClient CreateClient ( Action < ServiceCollection > ? builder = null )
588575 {
589576 var sc = new ServiceCollection ( ) ;
590577 sc . AddLogging ( builder =>
591578 {
592579 builder . AddProvider ( new MockLoggerProvider ( ) ) ;
593580 } ) ;
594581 sc . AddBootstrapBlazorTcpSocketFactory ( ) ;
582+ if ( builder != null )
583+ {
584+ builder ( sc ) ;
585+ }
595586 var provider = sc . BuildServiceProvider ( ) ;
596587 var factory = provider . GetRequiredService < ITcpSocketFactory > ( ) ;
597588 var client = factory . GetOrCreate ( "test" , op => op . LocalEndPoint = Utility . ConvertToIpEndPoint ( "localhost" , 0 ) ) ;
@@ -689,4 +680,62 @@ public override async ValueTask ReceiveAsync(ReadOnlyMemory<byte> data, Cancella
689680 await base . ReceiveAsync ( data , token ) ;
690681 }
691682 }
683+
684+ class MockSendErrorSocketProvider : ISocketClientProvider
685+ {
686+ public bool IsConnected { get ; private set ; }
687+
688+ public IPEndPoint LocalEndPoint { get ; set ; }
689+
690+ public ValueTask CloseAsync ( )
691+ {
692+ return ValueTask . CompletedTask ;
693+ }
694+
695+ public ValueTask < bool > ConnectAsync ( IPEndPoint endPoint , CancellationToken token = default )
696+ {
697+ IsConnected = true ;
698+ return ValueTask . FromResult ( true ) ;
699+ }
700+
701+ public ValueTask < int > ReceiveAsync ( Memory < byte > buffer , CancellationToken token = default )
702+ {
703+ return ValueTask . FromResult ( 0 ) ;
704+ }
705+
706+ public ValueTask < bool > SendAsync ( ReadOnlyMemory < byte > data , CancellationToken token = default )
707+ {
708+ throw new Exception ( "Mock send error" ) ;
709+ }
710+ }
711+
712+ class MockSendTimeoutSocketProvider : ISocketClientProvider
713+ {
714+ public bool IsConnected { get ; private set ; }
715+
716+ public IPEndPoint LocalEndPoint { get ; set ; }
717+
718+ public ValueTask CloseAsync ( )
719+ {
720+ return ValueTask . CompletedTask ;
721+ }
722+
723+ public ValueTask < bool > ConnectAsync ( IPEndPoint endPoint , CancellationToken token = default )
724+ {
725+ IsConnected = true ;
726+ return ValueTask . FromResult ( true ) ;
727+ }
728+
729+ public ValueTask < int > ReceiveAsync ( Memory < byte > buffer , CancellationToken token = default )
730+ {
731+ return ValueTask . FromResult ( 0 ) ;
732+ }
733+
734+ public async ValueTask < bool > SendAsync ( ReadOnlyMemory < byte > data , CancellationToken token = default )
735+ {
736+ // 模拟超时发送
737+ await Task . Delay ( 100 , token ) ;
738+ return false ;
739+ }
740+ }
692741}
0 commit comments