@@ -43,7 +43,7 @@ public async Task CanStartStopSSETransport()
43
43
. Setup ( s => s . CopyToAsync ( It . IsAny < Stream > ( ) , It . IsAny < int > ( ) , It . IsAny < CancellationToken > ( ) ) )
44
44
. Returns ( copyToAsyncTcs . Task ) ;
45
45
mockStream . Setup ( s => s . CanRead ) . Returns ( true ) ;
46
- return new HttpResponseMessage { Content = new StreamContent ( mockStream . Object ) } ;
46
+ return new HttpResponseMessage { Content = new StreamContent ( mockStream . Object ) } ;
47
47
} ) ;
48
48
49
49
try
@@ -76,15 +76,17 @@ public async Task SSETransportStopsSendAndReceiveLoopsWhenTransportStopped()
76
76
{
77
77
var mockStream = new Mock < Stream > ( ) ;
78
78
mockStream
79
- . Setup ( s => s . CopyToAsync ( It . IsAny < Stream > ( ) , It . IsAny < int > ( ) , It . IsAny < CancellationToken > ( ) ) )
80
- . Returns < Stream , int , CancellationToken > ( async ( stream , bufferSize , t ) =>
79
+ . Setup ( s => s . ReadAsync ( It . IsAny < Memory < byte > > ( ) , It . IsAny < CancellationToken > ( ) ) )
80
+ . Returns < Memory < byte > , CancellationToken > ( async ( data , t ) =>
81
81
{
82
- var buffer = Encoding . ASCII . GetBytes ( "data: 3:abc\r \n \r \n " ) ;
83
- while ( ! t . IsCancellationRequested )
82
+ if ( t . IsCancellationRequested )
84
83
{
85
- await stream . WriteAsync ( buffer , 0 , buffer . Length ) . OrTimeout ( ) ;
86
- await Task . Delay ( 100 ) ;
84
+ return 0 ;
87
85
}
86
+
87
+ int count = Encoding . ASCII . GetBytes ( "data: 3:abc\r \n \r \n " , data . Span ) ;
88
+ await Task . Delay ( 100 ) ;
89
+ return count ;
88
90
} ) ;
89
91
mockStream . Setup ( s => s . CanRead ) . Returns ( true ) ;
90
92
@@ -120,6 +122,7 @@ await sseTransport.StartAsync(
120
122
public async Task SSETransportStopsWithErrorIfServerSendsIncompleteResults ( )
121
123
{
122
124
var mockHttpHandler = new Mock < HttpMessageHandler > ( ) ;
125
+ var calls = 0 ;
123
126
mockHttpHandler . Protected ( )
124
127
. Setup < Task < HttpResponseMessage > > ( "SendAsync" , ItExpr . IsAny < HttpRequestMessage > ( ) , ItExpr . IsAny < CancellationToken > ( ) )
125
128
. Returns < HttpRequestMessage , CancellationToken > ( async ( request , cancellationToken ) =>
@@ -128,11 +131,15 @@ public async Task SSETransportStopsWithErrorIfServerSendsIncompleteResults()
128
131
129
132
var mockStream = new Mock < Stream > ( ) ;
130
133
mockStream
131
- . Setup ( s => s . CopyToAsync ( It . IsAny < Stream > ( ) , It . IsAny < int > ( ) , It . IsAny < CancellationToken > ( ) ) )
132
- . Returns < Stream , int , CancellationToken > ( async ( stream , bufferSize , t ) =>
134
+ . Setup ( s => s . ReadAsync ( It . IsAny < Memory < byte > > ( ) , It . IsAny < CancellationToken > ( ) ) )
135
+ . Returns < Memory < byte > , CancellationToken > ( ( data , t ) =>
133
136
{
134
- var buffer = Encoding . ASCII . GetBytes ( "data: 3:a" ) ;
135
- await stream . WriteAsync ( buffer , 0 , buffer . Length ) ;
137
+ if ( calls == 0 )
138
+ {
139
+ calls ++ ;
140
+ return new ValueTask < int > ( Encoding . ASCII . GetBytes ( "data: 3:a" , data . Span ) ) ;
141
+ }
142
+ return new ValueTask < int > ( 0 ) ;
136
143
} ) ;
137
144
mockStream . Setup ( s => s . CanRead ) . Returns ( true ) ;
138
145
@@ -165,7 +172,7 @@ bool ExpectedErrors(WriteContext writeContext)
165
172
}
166
173
167
174
var eventStreamTcs = new TaskCompletionSource < object > ( ) ;
168
- var copyToAsyncTcs = new TaskCompletionSource < int > ( ) ;
175
+ var readTcs = new TaskCompletionSource < int > ( ) ;
169
176
170
177
var mockHttpHandler = new Mock < HttpMessageHandler > ( ) ;
171
178
mockHttpHandler . Protected ( )
@@ -182,8 +189,14 @@ bool ExpectedErrors(WriteContext writeContext)
182
189
// returns unfinished task to block pipelines
183
190
var mockStream = new Mock < Stream > ( ) ;
184
191
mockStream
185
- . Setup ( s => s . CopyToAsync ( It . IsAny < Stream > ( ) , It . IsAny < int > ( ) , It . IsAny < CancellationToken > ( ) ) )
186
- . Returns ( copyToAsyncTcs . Task ) ;
192
+ . Setup ( s => s . ReadAsync ( It . IsAny < Memory < byte > > ( ) , It . IsAny < CancellationToken > ( ) ) )
193
+ . Returns < Memory < byte > , CancellationToken > ( async ( data , ct ) =>
194
+ {
195
+ using ( ct . Register ( ( ) => readTcs . TrySetCanceled ( ) ) )
196
+ {
197
+ return await readTcs . Task ;
198
+ }
199
+ } ) ;
187
200
mockStream . Setup ( s => s . CanRead ) . Returns ( true ) ;
188
201
return new HttpResponseMessage { Content = new StreamContent ( mockStream . Object ) } ;
189
202
}
@@ -214,7 +227,7 @@ await sseTransport.StartAsync(
214
227
public async Task SSETransportStopsIfChannelClosed ( )
215
228
{
216
229
var eventStreamTcs = new TaskCompletionSource < object > ( ) ;
217
- var copyToAsyncTcs = new TaskCompletionSource < int > ( ) ;
230
+ var readTcs = new TaskCompletionSource < int > ( ) ;
218
231
219
232
var mockHttpHandler = new Mock < HttpMessageHandler > ( ) ;
220
233
mockHttpHandler . Protected ( )
@@ -229,8 +242,14 @@ public async Task SSETransportStopsIfChannelClosed()
229
242
// returns unfinished task to block pipelines
230
243
var mockStream = new Mock < Stream > ( ) ;
231
244
mockStream
232
- . Setup ( s => s . CopyToAsync ( It . IsAny < Stream > ( ) , It . IsAny < int > ( ) , It . IsAny < CancellationToken > ( ) ) )
233
- . Returns ( copyToAsyncTcs . Task ) ;
245
+ . Setup ( s => s . ReadAsync ( It . IsAny < Memory < byte > > ( ) , It . IsAny < CancellationToken > ( ) ) )
246
+ . Returns < Memory < byte > , CancellationToken > ( async ( data , ct ) =>
247
+ {
248
+ using ( ct . Register ( ( ) => readTcs . TrySetCanceled ( ) ) )
249
+ {
250
+ return await readTcs . Task ;
251
+ }
252
+ } ) ;
234
253
mockStream . Setup ( s => s . CanRead ) . Returns ( true ) ;
235
254
return new HttpResponseMessage { Content = new StreamContent ( mockStream . Object ) } ;
236
255
} ) ;
@@ -281,7 +300,7 @@ await sseTransport.StartAsync(
281
300
public async Task SSETransportCancelsSendOnStop ( )
282
301
{
283
302
var eventStreamTcs = new TaskCompletionSource < object > ( ) ;
284
- var copyToAsyncTcs = new TaskCompletionSource < object > ( ) ;
303
+ var readTcs = new TaskCompletionSource < object > ( ) ;
285
304
var sendSyncPoint = new SyncPoint ( ) ;
286
305
287
306
var mockHttpHandler = new Mock < HttpMessageHandler > ( ) ;
@@ -299,10 +318,10 @@ public async Task SSETransportCancelsSendOnStop()
299
318
// returns unfinished task to block pipelines
300
319
var mockStream = new Mock < Stream > ( ) ;
301
320
mockStream
302
- . Setup ( s => s . CopyToAsync ( It . IsAny < Stream > ( ) , It . IsAny < int > ( ) , It . IsAny < CancellationToken > ( ) ) )
303
- . Returns < Stream , int , CancellationToken > ( async ( stream , bufferSize , t ) =>
321
+ . Setup ( s => s . ReadAsync ( It . IsAny < Memory < byte > > ( ) , It . IsAny < CancellationToken > ( ) ) )
322
+ . Returns ( async ( ) =>
304
323
{
305
- await copyToAsyncTcs . Task ;
324
+ await readTcs . Task ;
306
325
307
326
throw new TaskCanceledException ( ) ;
308
327
} ) ;
@@ -332,7 +351,7 @@ await sseTransport.StartAsync(
332
351
333
352
var stopTask = sseTransport . StopAsync ( ) ;
334
353
335
- copyToAsyncTcs . SetResult ( null ) ;
354
+ readTcs . SetResult ( null ) ;
336
355
sendSyncPoint . Continue ( ) ;
337
356
338
357
await stopTask ;
0 commit comments