From 16cc3576a5dd7eb230fa76d216dbc4bbc032ceb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20C=C3=A1rdenas?= Date: Fri, 15 Sep 2017 13:23:34 +0200 Subject: [PATCH] Implement RTP11d. (#636) Fixes #630. --- Source/ARTPresenceMap.h | 2 + Source/ARTRealtimePresence.m | 10 ++-- Spec/RealtimeClientPresence.swift | 76 +++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 3 deletions(-) diff --git a/Source/ARTPresenceMap.h b/Source/ARTPresenceMap.h index f9e99b234..2b97650a1 100644 --- a/Source/ARTPresenceMap.h +++ b/Source/ARTPresenceMap.h @@ -55,6 +55,8 @@ ART_ASSUME_NONNULL_BEGIN - (void)onceSyncEnds:(void (^)(__GENERIC(NSArray, ARTPresenceMessage *) *))callback; - (void)onceSyncFails:(void (^)(ARTErrorInfo *))callback; +- (void)internalAdd:(ARTPresenceMessage *)message; + @end ART_ASSUME_NONNULL_END diff --git a/Source/ARTRealtimePresence.m b/Source/ARTRealtimePresence.m index 1ddf5c61f..e2801be96 100644 --- a/Source/ARTRealtimePresence.m +++ b/Source/ARTRealtimePresence.m @@ -69,13 +69,17 @@ - (void)get:(ARTRealtimePresenceQuery *)query callback:(void (^)(NSArray (ARTRealtimeChannel, ARTRealtime) { + let options = AblyTests.commonAppSetup() + + let client = ARTRealtime(options: options) + let channel = client.channels.get("test") + + waitUntil(timeout: testTimeout) { done in + channel.once(.suspended) { _ in + done() + } + client.onSuspended() + } + + return (channel, client) + } + + for (name, getPresence) in [ + ("by default", { channel, callback in + channel.presence.get(callback) + }), + ("if waitForSync is true", { channel, callback in + let params = ARTRealtimePresenceQuery() + params.waitForSync = true + channel.presence.get(params, callback: callback) + }) + ] as [(String, (ARTRealtimeChannel, @escaping ([ARTPresenceMessage]?, ARTErrorInfo?) -> Void) -> Void)] { + context(name) { + it("results in an error") { + let (channel, client) = getSuspendedChannel() + defer { client.dispose(); client.close() } + + getPresence(channel) { result, err in + expect(result).to(beNil()) + expect(err).toNot(beNil()) + guard let err = err else { + return + } + expect(err.code).to(equal(91005)) + } + } + } + } + + context("if waitForSync is false") { + let getParams = ARTRealtimePresenceQuery() + getParams.waitForSync = false + + it("returns the members in the current PresenceMap") { + let (channel, client) = getSuspendedChannel() + defer { client.dispose(); client.close() } + + var msgs = [String: ARTPresenceMessage]() + for i in 0..<3 { + let msg = ARTPresenceMessage(clientId: "client\(i)", action: .present, connectionId: "foo", id: "foo:0:0") + msgs[msg.clientId!] = msg + channel.presenceMap.internalAdd(msg) + } + + channel.presence.get(getParams) { result, err in + expect(err).to(beNil()) + expect(result).toNot(beNil()) + guard let result = result else { + return + } + var resultByClient = [String: ARTPresenceMessage]() + for msg in result { + resultByClient[msg.clientId ?? "(no clientId)"] = msg + } + expect(resultByClient).to(equal(msgs)) + } + } + } + } // RTP11c context("Query (set of params)") {