Skip to content

Commit 599b914

Browse files
committed
(#242) XMPP: migrate IQ tests to channels
1 parent 2ea4498 commit 599b914

1 file changed

Lines changed: 30 additions & 33 deletions

File tree

Emulsion.Tests/Xmpp/XmppClientRoomTests.fs

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
namespace Emulsion.Tests.Xmpp
22

33
open System
4+
open System.Threading
5+
open System.Threading.Channels
46
open System.Threading.Tasks
57
open System.Xml.Linq
68

7-
open Emulsion.TestFramework
8-
open JetBrains.Collections.Viewable
99
open JetBrains.Lifetimes
1010
open SharpXMPP.XMPP
1111
open SharpXMPP.XMPP.Client.Elements
@@ -82,23 +82,24 @@ type XmppClientRoomTests(output: ITestOutputHelper) =
8282

8383
let pingWaitTime = TimeSpan.FromMilliseconds 100.0
8484
let iqWaitTimeout = TimeSpan.FromSeconds 10.0
85-
let assertNoPingSent(iqMessages: ResizeArray<XMPPIq>) = async {
85+
let assertNoPingSent(iqMessages: Channel<XMPPIq>) = async {
8686
do! Async.Sleep(int pingWaitTime.TotalMilliseconds)
87-
lock iqMessages (fun() ->
88-
Assert.Empty iqMessages
89-
)
87+
let hasMessages, _ = iqMessages.Reader.TryRead()
88+
Assert.False(hasMessages, "No iq messages should be sent before room enter.")
9089
}
9190

92-
let waitForIqSent lt signal = Signals.WaitWithTimeout lt signal iqWaitTimeout "IQ sent"
93-
let assertPingSent (waitForIqSent: Task) (iqMessages: ResizeArray<XMPPIq>) = task {
94-
do! waitForIqSent
95-
lock iqMessages (fun() ->
96-
let iq = Seq.exactlyOne iqMessages
97-
let ping = iq.Element Ping
98-
Assert.NotNull ping
99-
)
91+
let assertPingSent(iqMessages: Channel<XMPPIq>) = task {
92+
use cts = new CancellationTokenSource()
93+
cts.CancelAfter(int iqWaitTimeout.TotalMilliseconds)
94+
95+
let! iq = iqMessages.Reader.ReadAsync(cts.Token)
96+
let ping = iq.Element Ping
97+
Assert.NotNull ping
10098
}
10199

100+
let writeChannel (channel: Channel<_>) data =
101+
channel.Writer.TryWrite data |> Assert.True
102+
102103
[<Fact>]
103104
member _.``enterRoom function calls JoinMultiUserChat``(): unit =
104105
let mutable called = false
@@ -155,53 +156,49 @@ type XmppClientRoomTests(output: ITestOutputHelper) =
155156
[<Fact>]
156157
member _.``Client sends a ping after room connection``(): Task =
157158
let presenceHandlers = ResizeArray()
158-
let iqMessages = ResizeArray()
159-
let iqSent = Signal<Unit>()
159+
let iqMessages = Channel.CreateUnbounded()
160160
let client =
161161
XmppClientFactory.create(
162162
addPresenceHandler = (fun _ -> presenceHandlers.Add),
163163
joinMultiUserChat = (fun roomJid nickname _ ->
164164
sendPresence (createSelfPresence roomJid nickname 110) presenceHandlers),
165165
sendIqQuery = fun _ iq _ ->
166-
lock iqMessages (fun() -> iqMessages.Add iq)
167-
iqSent.Fire(())
166+
writeChannel iqMessages iq
168167
)
169168

170169
Lifetime.UsingAsync(fun lt ->
171170
task {
172-
let waiter = waitForIqSent lt iqSent
173171
let! _ = XmppClient.enterRoom logger client lt roomInfoWithPing
174-
do! assertPingSent waiter iqMessages
172+
do! assertPingSent iqMessages
175173
}
176174
)
177175

178176
[<Fact>]
179177
member _.``Client doesn't send ping before finishing joining the room``(): Task =
180178
let presenceHandlers = ResizeArray()
181-
let iqMessages = ResizeArray()
182-
let mutable join = ref Unchecked.defaultof<_>
183-
let iqSent = Signal<_>()
179+
let iqMessages = Channel.CreateUnbounded()
180+
let joinRequests = Channel.CreateUnbounded()
184181
let client =
185182
XmppClientFactory.create(
186183
addPresenceHandler = (fun _ h -> lock presenceHandlers (fun() -> presenceHandlers.Add h)),
187184
joinMultiUserChat = (fun roomJid nickname _ ->
188-
lock join (fun() ->
189-
join.Value <- fun () -> lock presenceHandlers (fun() ->
190-
sendPresence (createSelfPresence roomJid nickname 110) presenceHandlers)
191-
)
192-
),
185+
writeChannel joinRequests (roomJid, nickname)
186+
),
193187
sendIqQuery = fun _ iq _ ->
194-
lock iqMessages (fun() -> iqMessages.Add iq)
195-
iqSent.Fire(())
188+
writeChannel iqMessages iq
196189
)
197190
Lifetime.UsingAsync(fun lt ->
198191
task {
199-
let waiter = waitForIqSent lt iqSent
200192
let! connection = Async.StartChild <| XmppClient.enterRoom logger client lt roomInfoWithPing
201193
do! assertNoPingSent iqMessages
202-
lock join (fun() -> join.Value())
194+
195+
let! roomJid, nickname = joinRequests.Reader.ReadAsync()
196+
lock presenceHandlers (fun() ->
197+
sendPresence (createSelfPresence roomJid nickname 110) presenceHandlers
198+
)
199+
203200
let! _ = connection
204-
do! assertPingSent waiter iqMessages
201+
do! assertPingSent iqMessages
205202
}
206203
)
207204

0 commit comments

Comments
 (0)