11using System . IO . Pipelines ;
2- using System . Net ;
32using System . Net . WebSockets ;
43using System . Text ;
54using Xunit ;
65using Xunit . Abstractions ;
76
8- namespace Devlooped
7+ namespace Devlooped . Net ;
8+
9+ public record EndToEnd ( ITestOutputHelper Output )
910{
10- public record EndToEnd ( ITestOutputHelper Output )
11+ [ Fact ]
12+ public async Task RunAsync ( )
1113 {
12- [ Fact ]
13- public async Task RunAsync ( )
14- {
15- await using var server = WebSocketServer . Create ( Echo , null , Output ) ;
14+ await using var server = WebSocketServer . Create ( Echo , null , Output ) ;
1615
17- var client = new ClientWebSocket ( ) ;
16+ var client = new ClientWebSocket ( ) ;
1817
19- await client . ConnectAsync ( server . Uri , CancellationToken . None ) ;
20- using var pipe = WebSocketPipe . Create ( client , closeWhenCompleted : true ) ;
18+ await client . ConnectAsync ( server . Uri , CancellationToken . None ) ;
19+ using var pipe = WebSocketPipe . Create ( client , closeWhenCompleted : true ) ;
2120
22- var read = Task . Run ( async ( ) =>
23- {
24- var read = await pipe . Input . ReadAsync ( ) ;
25- Output . WriteLine ( "Client: " + Encoding . UTF8 . GetString ( read . Buffer ) ) ;
26- await pipe . CompleteAsync ( WebSocketCloseStatus . NormalClosure , "Client Done" ) ;
27- } ) ;
21+ var read = Task . Run ( async ( ) =>
22+ {
23+ var read = await pipe . Input . ReadAsync ( ) ;
24+ Output . WriteLine ( "Client: " + Encoding . UTF8 . GetString ( read . Buffer ) ) ;
25+ await pipe . CompleteAsync ( WebSocketCloseStatus . NormalClosure , "Client Done" ) ;
26+ } ) ;
2827
29- var run = pipe . RunAsync ( ) ;
28+ var run = pipe . RunAsync ( ) ;
3029
31- pipe . Output . Advance ( Encoding . UTF8 . GetBytes ( "hello" , pipe . Output . GetSpan ( ) ) ) ;
32- await pipe . Output . FlushAsync ( ) ;
30+ pipe . Output . Advance ( Encoding . UTF8 . GetBytes ( "hello" , pipe . Output . GetSpan ( ) ) ) ;
31+ await pipe . Output . FlushAsync ( ) ;
3332
34- //await pipe.Output.WriteAsync(Encoding.UTF8.GetBytes("hello").AsMemory());
33+ //await pipe.Output.WriteAsync(Encoding.UTF8.GetBytes("hello").AsMemory());
3534
36- await read ;
37- await run ;
35+ await read ;
36+ await run ;
3837
39- Assert . NotEqual ( WebSocketState . Open , pipe . State ) ;
40- Assert . Equal ( "Client Done" , pipe . CloseStatusDescription ) ;
41- }
38+ Assert . NotEqual ( WebSocketState . Open , pipe . State ) ;
39+ Assert . Equal ( "Client Done" , pipe . CloseStatusDescription ) ;
40+ }
4241
43- async Task Echo ( IDuplexPipe pipe )
42+ async Task Echo ( IDuplexPipe pipe )
43+ {
44+ while ( await pipe . Input . ReadAsync ( ) is var result && ! result . IsCompleted )
4445 {
45- while ( await pipe . Input . ReadAsync ( ) is var result && ! result . IsCompleted )
46- {
47- Output . WriteLine ( $ "Echoing: { Encoding . UTF8 . GetString ( result . Buffer ) } ") ;
48- // Just assume we get a single-segment entry, for simplicity
49- await pipe . Output . WriteAsync ( result . Buffer . First ) ;
50- pipe . Input . AdvanceTo ( result . Buffer . End ) ;
51- }
52- Output . WriteLine ( $ "Server: Done.") ;
46+ Output . WriteLine ( $ "Echoing: { Encoding . UTF8 . GetString ( result . Buffer ) } ") ;
47+ // Just assume we get a single-segment entry, for simplicity
48+ await pipe . Output . WriteAsync ( result . Buffer . First ) ;
49+ pipe . Input . AdvanceTo ( result . Buffer . End ) ;
5350 }
51+ Output . WriteLine ( $ "Server: Done.") ;
5452 }
5553}
0 commit comments