Skip to content

Commit 547d750

Browse files
committed
Formatting
1 parent 284973c commit 547d750

8 files changed

Lines changed: 902 additions & 382 deletions

File tree

src/FSharp.Control.Websockets.TPL/FSharp.Control.Websockets.TPL.fs

Lines changed: 366 additions & 162 deletions
Large diffs are not rendered by default.

src/FSharp.Control.Websockets/FSharp.Control.Websockets.fs

Lines changed: 305 additions & 145 deletions
Large diffs are not rendered by default.

tests/FSharp.Control.Websockets.TPL.Tests/Main.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
module ExpectoTemplate
2+
23
open Expecto
34

45
[<EntryPoint>]

tests/FSharp.Control.Websockets.TPL.Tests/Tests.fs

Lines changed: 86 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,36 @@ open System.Threading
1818
open Infrastructure
1919

2020

21-
let testCaseTask name test = testCaseAsync name (test |> Async.AwaitTask)
22-
let ftestCaseTask name test = ftestCaseAsync name (test |> Async.AwaitTask)
23-
let ptestCaseTask name test = ptestCaseAsync name (test |> Async.AwaitTask)
21+
let testCaseTask name test =
22+
testCaseAsync
23+
name
24+
(test
25+
|> Async.AwaitTask)
2426

27+
let ftestCaseTask name test =
28+
ftestCaseAsync
29+
name
30+
(test
31+
|> Async.AwaitTask)
2532

26-
let echoWebSocket (httpContext : HttpContext) (next : unit -> Task) = task {
33+
let ptestCaseTask name test =
34+
ptestCaseAsync
35+
name
36+
(test
37+
|> Async.AwaitTask)
38+
39+
40+
let echoWebSocket (httpContext: HttpContext) (next: unit -> Task) = task {
2741

2842
if httpContext.WebSockets.IsWebSocketRequest then
29-
let! (websocket : WebSocket) = httpContext.WebSockets.AcceptWebSocketAsync() |> Async.AwaitTask
43+
let! (websocket: WebSocket) =
44+
httpContext.WebSockets.AcceptWebSocketAsync()
45+
|> Async.AwaitTask
46+
3047
while websocket.State = WebSocketState.Open do
3148
try
32-
let! result =WebSocket.receiveMessageAsUTF8 websocket CancellationToken.None
49+
let! result = WebSocket.receiveMessageAsUTF8 websocket CancellationToken.None
50+
3351
match result with
3452
| WebSocket.ReceiveUTF8Result.String text ->
3553
do! WebSocket.sendMessageAsUTF8 websocket CancellationToken.None text
@@ -40,11 +58,11 @@ let echoWebSocket (httpContext : HttpContext) (next : unit -> Task) = task {
4058

4159
()
4260
else
43-
do! next()
61+
do! next ()
4462

4563
}
4664

47-
let configureEchoServer (appBuilder : IApplicationBuilder) =
65+
let configureEchoServer (appBuilder: IApplicationBuilder) =
4866
appBuilder.UseWebSockets()
4967
|> Server.tuse (echoWebSocket)
5068
|> ignore
@@ -55,31 +73,78 @@ let configureEchoServer (appBuilder : IApplicationBuilder) =
5573
let tests =
5674

5775
testList "Tests" [
58-
testCaseTask (sprintf "Full normal websocket interaction" ) <| task {
76+
testCaseTask (sprintf "Full normal websocket interaction")
77+
<| task {
5978
use! wss = Server.getServerAndWs configureEchoServer
60-
use clientWebSocket = ThreadSafeWebSocket.createFromWebSocket (Dataflow.DataflowBlockOptions()) wss.clientWebSocket
79+
80+
use clientWebSocket =
81+
ThreadSafeWebSocket.createFromWebSocket
82+
(Dataflow.DataflowBlockOptions())
83+
wss.clientWebSocket
84+
6185
Expect.equal clientWebSocket.State WebSocketState.Open "Should be open"
6286
let expected = Generator.genStr 2000
63-
let! _ = expected |> ThreadSafeWebSocket.sendMessageAsUTF8 clientWebSocket CancellationToken.None
64-
let! actual = ThreadSafeWebSocket.receiveMessageAsUTF8 clientWebSocket CancellationToken.None
65-
Expect.equal actual (Ok <| WebSocket.ReceiveUTF8Result.String expected) "did not echo"
6687

88+
let! _ =
89+
expected
90+
|> ThreadSafeWebSocket.sendMessageAsUTF8 clientWebSocket CancellationToken.None
91+
92+
let! actual =
93+
ThreadSafeWebSocket.receiveMessageAsUTF8 clientWebSocket CancellationToken.None
94+
95+
Expect.equal
96+
actual
97+
(Ok
98+
<| WebSocket.ReceiveUTF8Result.String expected)
99+
"did not echo"
100+
101+
102+
let! _ =
103+
ThreadSafeWebSocket.close
104+
clientWebSocket
105+
WebSocketCloseStatus.NormalClosure
106+
"Closing"
107+
CancellationToken.None
67108

68-
let! _ = ThreadSafeWebSocket.close clientWebSocket WebSocketCloseStatus.NormalClosure "Closing" CancellationToken.None
69109
Expect.equal clientWebSocket.State WebSocketState.Closed "Should be closed"
70110
}
71111

72-
testCaseTask (sprintf "Full close output websocket interaction" ) <| task {
112+
testCaseTask (sprintf "Full close output websocket interaction")
113+
<| task {
73114
use! wss = Server.getServerAndWs configureEchoServer
74-
use clientWebSocket = ThreadSafeWebSocket.createFromWebSocket (Dataflow.DataflowBlockOptions()) wss.clientWebSocket
115+
116+
use clientWebSocket =
117+
ThreadSafeWebSocket.createFromWebSocket
118+
(Dataflow.DataflowBlockOptions())
119+
wss.clientWebSocket
120+
75121
Expect.equal clientWebSocket.State WebSocketState.Open "Should be open"
76122
let expected = Generator.genStr 2000
77-
let! _ = expected |> ThreadSafeWebSocket.sendMessageAsUTF8 clientWebSocket CancellationToken.None
78-
let! actual = ThreadSafeWebSocket.receiveMessageAsUTF8 clientWebSocket CancellationToken.None
79-
Expect.equal actual (Ok <| WebSocket.ReceiveUTF8Result.String expected) "did not echo"
80123

124+
let! _ =
125+
expected
126+
|> ThreadSafeWebSocket.sendMessageAsUTF8 clientWebSocket CancellationToken.None
127+
128+
let! actual =
129+
ThreadSafeWebSocket.receiveMessageAsUTF8 clientWebSocket CancellationToken.None
130+
131+
Expect.equal
132+
actual
133+
(Ok
134+
<| WebSocket.ReceiveUTF8Result.String expected)
135+
"did not echo"
136+
137+
138+
let! _ =
139+
ThreadSafeWebSocket.closeOutput
140+
clientWebSocket
141+
WebSocketCloseStatus.NormalClosure
142+
"Closing"
143+
CancellationToken.None
81144

82-
let! _ = ThreadSafeWebSocket.closeOutput clientWebSocket WebSocketCloseStatus.NormalClosure "Closing" CancellationToken.None
83-
Expect.equal clientWebSocket.State WebSocketState.CloseSent "Should have sent closed without waiting acknowledgement"
145+
Expect.equal
146+
clientWebSocket.State
147+
WebSocketState.CloseSent
148+
"Should have sent closed without waiting acknowledgement"
84149
}
85150
]
Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,43 @@
11
namespace Infrastructure
2+
23
open Expecto
34
open FSharp.Control.Websockets
45

56

67
module Expect =
7-
let exceptionEquals exType message (ex : exn) =
8+
let exceptionEquals exType message (ex: exn) =
89
let actualExType = ex.GetType().ToString()
9-
if exType <> actualExType then
10+
11+
if
12+
exType
13+
<> actualExType
14+
then
1015
Tests.failtestf "Expected exception of %s but got %s" exType actualExType
11-
if ex.Message <> message then
16+
17+
if
18+
ex.Message
19+
<> message
20+
then
1221
Tests.failtestf "Expected message %s but got %s" message ex.Message
1322

14-
let exceptionExists exType message (exns : exn seq) =
23+
let exceptionExists exType message (exns: exn seq) =
1524
let exnTypes =
1625
exns
1726
|> Seq.map (fun ex -> ex.GetType().ToString())
18-
let exnTypes = exnTypes |> Seq.distinct
27+
28+
let exnTypes =
29+
exnTypes
30+
|> Seq.distinct
31+
1932
let typesFound = String.concat "; " exnTypes
20-
Expect.contains exnTypes exType (sprintf "No exception matching that type found, only [%s]" typesFound)
33+
34+
Expect.contains
35+
exnTypes
36+
exType
37+
(sprintf "No exception matching that type found, only [%s]" typesFound)
2138

2239
let exnMessages =
2340
exns
2441
|> Seq.map (fun ex -> ex.Message)
25-
Expect.contains exnMessages message "No exception message matching that string found"
42+
43+
Expect.contains exnMessages message "No exception message matching that string found"

tests/FSharp.Control.Websockets.Tests/Main.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
module ExpectoTemplate
2+
23
open Expecto
34

45
[<EntryPoint>]

tests/FSharp.Control.Websockets.Tests/ServerInfrastructure.fs

Lines changed: 59 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,15 @@ open Microsoft.Extensions.Configuration
1313

1414
module Generator =
1515
let random = Random(42)
16+
1617
let genStr =
1718
let chars = "ABCDEFGHIJKLMNOPQRSTUVWUXYZ0123456789"
1819
let charsLen = chars.Length
1920

2021

2122
fun len ->
22-
let randomChars = [|for _ in 0..len -> chars.[random.Next(charsLen)]|]
23-
new string(randomChars)
23+
let randomChars = [| for _ in 0..len -> chars.[random.Next(charsLen)] |]
24+
new string (randomChars)
2425

2526
module Server =
2627

@@ -33,70 +34,100 @@ module Server =
3334
// |> Hopac.startAsTask :> Task
3435
// ))
3536

36-
let ause (middlware : HttpContext -> (unit -> Async<unit>) -> Async<unit>) (app:IApplicationBuilder) =
37-
app.Use(fun (env: HttpContext) (next : Func<Task>) ->
38-
middlware env (next.Invoke >> Async.AwaitTask)
39-
|> Async.StartAsTask :> Task)
37+
let ause
38+
(middlware: HttpContext -> (unit -> Async<unit>) -> Async<unit>)
39+
(app: IApplicationBuilder)
40+
=
41+
app.Use(fun (env: HttpContext) (next: Func<Task>) ->
42+
middlware
43+
env
44+
(next.Invoke
45+
>> Async.AwaitTask)
46+
|> Async.StartAsTask
47+
:> Task
48+
)
4049

41-
let tuse (middlware : HttpContext -> (unit -> Task) -> Task<unit>) (app:IApplicationBuilder) =
42-
app.Use(fun (env: HttpContext) (next : Func<Task>) ->
43-
middlware env (next.Invoke)
44-
:> Task)
50+
let tuse (middlware: HttpContext -> (unit -> Task) -> Task<unit>) (app: IApplicationBuilder) =
51+
app.Use(fun (env: HttpContext) (next: Func<Task>) -> middlware env (next.Invoke) :> Task)
4552

46-
let constructLocalUri port =
47-
sprintf "http://127.0.0.1:%d" port
53+
let constructLocalUri port = sprintf "http://127.0.0.1:%d" port
4854

4955
let getKestrelServer configureServer uri = async {
5056
let configBuilder = new ConfigurationBuilder()
5157
let configBuilder = configBuilder.AddInMemoryCollection()
5258
let config = configBuilder.Build()
5359
config.["server.urls"] <- uri
54-
let host = WebHostBuilder()
55-
.UseConfiguration(config)
56-
.UseKestrel()
57-
.Configure(fun app -> configureServer app )
58-
.Build()
5960

60-
do! host.StartAsync() |> Async.AwaitTask
61+
let host =
62+
WebHostBuilder()
63+
.UseConfiguration(config)
64+
.UseKestrel()
65+
.Configure(fun app -> configureServer app)
66+
.Build()
67+
68+
do!
69+
host.StartAsync()
70+
|> Async.AwaitTask
71+
6172
return host
6273
}
6374

64-
let getOpenClientWebSocket (testServer : TestServer) = async {
75+
let getOpenClientWebSocket (testServer: TestServer) = async {
6576
let ws = testServer.CreateWebSocketClient()
6677
let! ct = Async.CancellationToken
67-
return! ws.ConnectAsync(testServer.BaseAddress, ct) |> Async.AwaitTask
78+
79+
return!
80+
ws.ConnectAsync(testServer.BaseAddress, ct)
81+
|> Async.AwaitTask
6882
}
6983

7084
let getOpenWebSocket uri = async {
7185
let ws = new ClientWebSocket()
7286
let! ct = Async.CancellationToken
73-
do! ws.ConnectAsync(uri, ct) |> Async.AwaitTask
87+
88+
do!
89+
ws.ConnectAsync(uri, ct)
90+
|> Async.AwaitTask
91+
7492
return ws
7593
}
7694

7795
// So we're able to tell the operating system to get a random free port by passing 0
7896
// and the system usually doesn't reuse a port until it has to
7997
// *pray*
8098
let getPort () =
81-
let listener = new Sockets.TcpListener(IPAddress.Loopback,0)
99+
let listener = new Sockets.TcpListener(IPAddress.Loopback, 0)
82100
listener.Start()
83-
let port = (listener.LocalEndpoint :?> IPEndPoint).Port
101+
let port = (listener.LocalEndpoint :?> IPEndPoint).Port
84102
listener.Stop()
85103
port
86104

87105
type WebSocketServer =
88-
{ webhost : IWebHost
89-
clientWebSocket : ClientWebSocket }
106+
{
107+
webhost: IWebHost
108+
clientWebSocket: ClientWebSocket
109+
}
110+
90111
interface IDisposable with
91112
member x.Dispose() =
92113
x.clientWebSocket.Dispose()
93114
x.webhost.Dispose()
94115

95116
let inline getServerAndWs configureServer = async {
96-
let uri = getPort () |> constructLocalUri
117+
let uri =
118+
getPort ()
119+
|> constructLocalUri
120+
97121
let builder = UriBuilder(uri)
98122
builder.Scheme <- "ws"
99123
let! server = getKestrelServer configureServer uri
100-
let! clientWebSocket = builder.Uri |> getOpenWebSocket
101-
return {webhost = server; clientWebSocket = clientWebSocket}
124+
125+
let! clientWebSocket =
126+
builder.Uri
127+
|> getOpenWebSocket
128+
129+
return {
130+
webhost = server
131+
clientWebSocket = clientWebSocket
132+
}
102133
}

0 commit comments

Comments
 (0)