|
1 | 1 | namespace Emulsion.Tests.Xmpp |
2 | 2 |
|
3 | 3 | open System |
| 4 | +open System.Threading |
| 5 | +open System.Threading.Channels |
4 | 6 | open System.Threading.Tasks |
5 | 7 | open System.Xml.Linq |
6 | 8 |
|
7 | | -open Emulsion.TestFramework |
8 | | -open JetBrains.Collections.Viewable |
9 | 9 | open JetBrains.Lifetimes |
10 | 10 | open SharpXMPP.XMPP |
11 | 11 | open SharpXMPP.XMPP.Client.Elements |
@@ -82,23 +82,24 @@ type XmppClientRoomTests(output: ITestOutputHelper) = |
82 | 82 |
|
83 | 83 | let pingWaitTime = TimeSpan.FromMilliseconds 100.0 |
84 | 84 | let iqWaitTimeout = TimeSpan.FromSeconds 10.0 |
85 | | - let assertNoPingSent(iqMessages: ResizeArray<XMPPIq>) = async { |
| 85 | + let assertNoPingSent(iqMessages: Channel<XMPPIq>) = async { |
86 | 86 | 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.") |
90 | 89 | } |
91 | 90 |
|
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 |
100 | 98 | } |
101 | 99 |
|
| 100 | + let writeChannel (channel: Channel<_>) data = |
| 101 | + channel.Writer.TryWrite data |> Assert.True |
| 102 | + |
102 | 103 | [<Fact>] |
103 | 104 | member _.``enterRoom function calls JoinMultiUserChat``(): unit = |
104 | 105 | let mutable called = false |
@@ -155,53 +156,49 @@ type XmppClientRoomTests(output: ITestOutputHelper) = |
155 | 156 | [<Fact>] |
156 | 157 | member _.``Client sends a ping after room connection``(): Task = |
157 | 158 | let presenceHandlers = ResizeArray() |
158 | | - let iqMessages = ResizeArray() |
159 | | - let iqSent = Signal<Unit>() |
| 159 | + let iqMessages = Channel.CreateUnbounded() |
160 | 160 | let client = |
161 | 161 | XmppClientFactory.create( |
162 | 162 | addPresenceHandler = (fun _ -> presenceHandlers.Add), |
163 | 163 | joinMultiUserChat = (fun roomJid nickname _ -> |
164 | 164 | sendPresence (createSelfPresence roomJid nickname 110) presenceHandlers), |
165 | 165 | sendIqQuery = fun _ iq _ -> |
166 | | - lock iqMessages (fun() -> iqMessages.Add iq) |
167 | | - iqSent.Fire(()) |
| 166 | + writeChannel iqMessages iq |
168 | 167 | ) |
169 | 168 |
|
170 | 169 | Lifetime.UsingAsync(fun lt -> |
171 | 170 | task { |
172 | | - let waiter = waitForIqSent lt iqSent |
173 | 171 | let! _ = XmppClient.enterRoom logger client lt roomInfoWithPing |
174 | | - do! assertPingSent waiter iqMessages |
| 172 | + do! assertPingSent iqMessages |
175 | 173 | } |
176 | 174 | ) |
177 | 175 |
|
178 | 176 | [<Fact>] |
179 | 177 | member _.``Client doesn't send ping before finishing joining the room``(): Task = |
180 | 178 | 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() |
184 | 181 | let client = |
185 | 182 | XmppClientFactory.create( |
186 | 183 | addPresenceHandler = (fun _ h -> lock presenceHandlers (fun() -> presenceHandlers.Add h)), |
187 | 184 | 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 | + ), |
193 | 187 | sendIqQuery = fun _ iq _ -> |
194 | | - lock iqMessages (fun() -> iqMessages.Add iq) |
195 | | - iqSent.Fire(()) |
| 188 | + writeChannel iqMessages iq |
196 | 189 | ) |
197 | 190 | Lifetime.UsingAsync(fun lt -> |
198 | 191 | task { |
199 | | - let waiter = waitForIqSent lt iqSent |
200 | 192 | let! connection = Async.StartChild <| XmppClient.enterRoom logger client lt roomInfoWithPing |
201 | 193 | 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 | + |
203 | 200 | let! _ = connection |
204 | | - do! assertPingSent waiter iqMessages |
| 201 | + do! assertPingSent iqMessages |
205 | 202 | } |
206 | 203 | ) |
207 | 204 |
|
|
0 commit comments