diff --git a/Emulsion.Tests/Emulsion.Tests.fsproj b/Emulsion.Tests/Emulsion.Tests.fsproj index 75939ad..0137ce4 100644 --- a/Emulsion.Tests/Emulsion.Tests.fsproj +++ b/Emulsion.Tests/Emulsion.Tests.fsproj @@ -5,7 +5,8 @@ - + + diff --git a/Emulsion.Tests/MessageSenderTests.fs b/Emulsion.Tests/MessageSenderTests.fs new file mode 100644 index 0000000..293d1ce --- /dev/null +++ b/Emulsion.Tests/MessageSenderTests.fs @@ -0,0 +1,59 @@ +module Emulsion.Tests.MessageSenderTests + +open System +open System.Threading + +open Xunit +open Emulsion +open Emulsion.MessageSender + +let private testContext = { + send = fun _ -> async { return () } + logError = ignore + cooldown = TimeSpan.Zero +} + +[] +let ``Message sender sends the messages sequentially``() = + use cts = new CancellationTokenSource() + let messagesReceived = ResizeArray() + let context = { + testContext with + send = fun m -> async { + lock messagesReceived (fun () -> + messagesReceived.Add m + ) + } + } + let sender = MessageSender.startActivity(context, cts.Token) + + let messagesSent = [| 1..100 |] |> Array.map (fun i -> + OutgoingMessage { + author = "author" + text = string i + } + ) + messagesSent |> Array.iter(MessageSender.send sender) + + SpinWait.SpinUntil((fun () -> messagesReceived.Count = messagesSent.Length), TimeSpan.FromSeconds 30.0) + |> Assert.True + + Assert.Equal(messagesSent, messagesReceived) + +[] +let ``Message sender should be cancellable``() = + use cts = new CancellationTokenSource() + let errors = ResizeArray() + let context = { + testContext with + send = fun _ -> failwith "Should not be called" + logError = fun e -> lock errors (fun () -> errors.Add e) + } + let sender = MessageSender.startActivity(context, cts.Token) + cts.Cancel() + + let msg = OutgoingMessage { author = "author"; text = "xx" } + MessageSender.send sender msg + + SpinWait.SpinUntil((fun () -> errors.Count > 0), TimeSpan.FromMilliseconds 100.0) |> ignore + Assert.Empty errors diff --git a/Emulsion.Tests/MessageSystem.fs b/Emulsion.Tests/MessageSystemTests.fs similarity index 96% rename from Emulsion.Tests/MessageSystem.fs rename to Emulsion.Tests/MessageSystemTests.fs index b929e51..e6c6d57 100644 --- a/Emulsion.Tests/MessageSystem.fs +++ b/Emulsion.Tests/MessageSystemTests.fs @@ -1,4 +1,4 @@ -module Emulsion.Tests.MessageSystem +module Emulsion.Tests.MessageSystemTests open System open System.Threading diff --git a/Emulsion/MessageSender.fs b/Emulsion/MessageSender.fs index 6fe0970..5138b2b 100644 --- a/Emulsion/MessageSender.fs +++ b/Emulsion/MessageSender.fs @@ -32,4 +32,3 @@ let startActivity(ctx: MessageSenderContext, token: CancellationToken): Sender = MailboxProcessor.Start(receiver ctx, token) let send(activity: Sender): OutgoingMessage -> unit = activity.Post -// TODO[F]: Tests for this module.