Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion LeanCloud.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -585,7 +585,7 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1120;
LastUpgradeCheck = 1120;
LastUpgradeCheck = 1200;
ORGANIZATIONNAME = LeanCloud;
TargetAttributes = {
8342FCBA1C7B13A700C3CF15 = {
Expand Down Expand Up @@ -842,6 +842,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
Expand Down Expand Up @@ -902,6 +903,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
Expand Down
2 changes: 1 addition & 1 deletion LeanCloud.xcodeproj/xcshareddata/xcschemes/CLI.xcscheme
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1120"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1120"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1120"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1120"
LastUpgradeVersion = "1200"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
173 changes: 93 additions & 80 deletions LeanCloudTests/IMMessageTestCase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -489,96 +489,103 @@ class IMMessageTestCase: RTMBaseTestCase {
}

func testSendMessageToChatRoom() {
guard
let clientA = newOpenedClient(),
let clientB = newOpenedClient()
else
{
guard let client1 = newOpenedClient(clientIDSuffix: "1"),
let client2 = newOpenedClient(clientIDSuffix: "2", options: []),
let client3 = newOpenedClient(clientIDSuffix: "3", options: []) else {
XCTFail()
return
}

let delegatorA = IMClientTestCase.Delegator()
clientA.delegate = delegatorA
let delegatorB = IMClientTestCase.Delegator()
clientB.delegate = delegatorB

var chatRoomA: IMChatRoom? = nil
var chatRoomB: IMChatRoom? = nil
let delegator1 = IMClientTestCase.Delegator()
client1.delegate = delegator1
let delegator2 = IMClientTestCase.Delegator()
client2.delegate = delegator2
let delegator3 = IMClientTestCase.Delegator()
client3.delegate = delegator3
var chatRoom1: IMChatRoom?
var chatRoom2: IMChatRoom?
var chatRoom3: IMChatRoom?

let prepareExp = expectation(description: "create chat room")
prepareExp.expectedFulfillmentCount = 3
try? clientA.createChatRoom(completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
chatRoomA = result.value
prepareExp.fulfill()
if let ID = chatRoomA?.ID {
try? clientB.conversationQuery.getConversation(by: ID, completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
chatRoomB = result.value as? IMChatRoom
prepareExp.fulfill()
try? chatRoomB?.join(completion: { (result) in
expecting(count: 5) { (exp) in
try? client1.createChatRoom(completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
chatRoom1 = result.value
exp.fulfill()
if let ID = chatRoom1?.ID {
try? client2.conversationQuery.getConversation(by: ID) { result in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
prepareExp.fulfill()
})
})
}
})
wait(for: [prepareExp], timeout: timeout)
chatRoom2 = result.value as? IMChatRoom
exp.fulfill()
try? chatRoom2?.join(completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
exp.fulfill()
})
}
try? client3.conversationQuery.getConversation(by: ID) { result in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
chatRoom3 = result.value as? IMChatRoom
exp.fulfill()
try? chatRoom3?.join(completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
exp.fulfill()
})
}
}
})
}

let sendExp = expectation(description: "send message")
sendExp.expectedFulfillmentCount = 12
delegatorA.messageEvent = { client, conv, event in
if conv === chatRoomA {
expecting(count: 6) { (exp) in
delegator1.messageEvent = { client, conv, event in
switch event {
case .received(message: let message):
XCTAssertEqual(message.content?.string, "test")
sendExp.fulfill()
case .received(message: _):
exp.fulfill()
default:
break
}
}
}
delegatorB.messageEvent = { client, conv, event in
if conv === chatRoomB {
delegator2.messageEvent = { client, conv, event in
switch event {
case .received(message: let message):
XCTAssertEqual(message.content?.string, "test")
sendExp.fulfill()
case .received(message: _):
exp.fulfill()
default:
break
}
}
}
for messagePriority in
[IMChatRoom.MessagePriority.high,
IMChatRoom.MessagePriority.normal,
IMChatRoom.MessagePriority.low]
{
let messageA = IMMessage()
try? messageA.set(content: .string("test"))
((try? chatRoomA?.send(message: messageA, priority: messagePriority, completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
sendExp.fulfill()
})) as ()??)
let messageB = IMMessage()
try? messageB.set(content: .string("test"))
((try? chatRoomB?.send(message: messageB, priority: messagePriority, completion: { (result) in
delegator3.messageEvent = { client, conv, event in
switch event {
case .received(message: _):
exp.fulfill()
default:
break
}
}
try? chatRoom1?.send(message: IMTextMessage(text: "1"), priority: .high, completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
sendExp.fulfill()
})) as ()??)
exp.fulfill()
try? chatRoom2?.send(message: IMTextMessage(text: "2"), priority: .high, completion: { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
exp.fulfill()
})
})
}
wait(for: [sendExp], timeout: timeout)

XCTAssertNil(chatRoomA?.lastMessage)
XCTAssertNil(chatRoomB?.lastMessage)
XCTAssertTrue((chatRoomA?.members ?? []).isEmpty)
XCTAssertTrue((chatRoomB?.members ?? []).isEmpty)
delegator1.reset()
delegator2.reset()
delegator3.reset()

XCTAssertNil(chatRoom1?.lastMessage)
XCTAssertNil(chatRoom2?.lastMessage)
XCTAssertNil(chatRoom3?.lastMessage)
XCTAssertTrue((chatRoom1?.members ?? []).isEmpty)
XCTAssertTrue((chatRoom2?.members ?? []).isEmpty)
XCTAssertTrue((chatRoom3?.members ?? []).isEmpty)
}

func testReceiveMessageFromServiceConversation() {
Expand Down Expand Up @@ -678,10 +685,10 @@ class IMMessageTestCase: RTMBaseTestCase {
func testTextMessageSendingAndReceiving() {
let message = IMTextMessage()
message.text = "test"
let success = sendingAndReceiving(sentMessage: message) { (rMessage) in
let success = sendingAndReceiving(sentMessage: message, receivedMessageChecker: { (rMessage) in
XCTAssertNotNil(rMessage?.text)
XCTAssertEqual(rMessage?.text, message.text)
}
})
XCTAssertTrue(success)
}

Expand All @@ -692,7 +699,7 @@ class IMMessageTestCase: RTMBaseTestCase {
filePath: bundleResourceURL(name: "test", ext: format).path,
format: format
)
XCTAssertTrue(sendingAndReceiving(sentMessage: outMessage) { (inMessage) in
XCTAssertTrue(sendingAndReceiving(sentMessage: outMessage, receivedMessageChecker: { (inMessage) in
XCTAssertNotNil(inMessage?.file?.objectId?.value)
XCTAssertEqual(inMessage?.format, format)
XCTAssertNotNil(inMessage?.size)
Expand All @@ -705,7 +712,7 @@ class IMMessageTestCase: RTMBaseTestCase {
XCTAssertEqual(inMessage?.height, outMessage.height)
XCTAssertEqual(inMessage?.width, outMessage.width)
XCTAssertEqual(inMessage?.url, outMessage.url)
})
}))
}
}

Expand Down Expand Up @@ -763,7 +770,7 @@ class IMMessageTestCase: RTMBaseTestCase {
file.keepFileName = true
file.name = name.lcString
message.file = file
let success = sendingAndReceiving(sentMessage: message) { (rMessage) in
let success = sendingAndReceiving(sentMessage: message, receivedMessageChecker: { (rMessage) in
XCTAssertNotNil(rMessage?.file?.objectId?.value)
XCTAssertEqual(rMessage?.name, name)
XCTAssertEqual(rMessage?.format, format)
Expand All @@ -773,7 +780,7 @@ class IMMessageTestCase: RTMBaseTestCase {
XCTAssertEqual(rMessage?.format, message.format)
XCTAssertEqual(rMessage?.size, message.size)
XCTAssertEqual(rMessage?.url, message.url)
}
})
XCTAssertEqual(message.name, name)
XCTAssertEqual(message.url?.absoluteString.hasSuffix(name), true)
XCTAssertTrue(success)
Expand All @@ -782,12 +789,12 @@ class IMMessageTestCase: RTMBaseTestCase {
func testLocationMessageSendingAndReceiving() {
let message = IMLocationMessage()
message.location = LCGeoPoint(latitude: 180.0, longitude: 90.0)
let success = sendingAndReceiving(sentMessage: message) { (rMessage) in
let success = sendingAndReceiving(sentMessage: message, receivedMessageChecker: { (rMessage) in
XCTAssertEqual(rMessage?.latitude, 180.0)
XCTAssertEqual(rMessage?.longitude, 90.0)
XCTAssertEqual(rMessage?.latitude, message.latitude)
XCTAssertEqual(rMessage?.longitude, message.longitude)
}
})
XCTAssertTrue(success)
}

Expand Down Expand Up @@ -1463,15 +1470,21 @@ extension IMMessageTestCase {

func newOpenedClient(
clientID: String? = nil,
options: IMClient.Options = [.receiveUnreadMessageCountAfterSessionDidOpen])
-> IMClient?
clientIDSuffix: String? = nil,
options: IMClient.Options = [.receiveUnreadMessageCountAfterSessionDidOpen]) -> IMClient?
{
var client: IMClient? = try? IMClient(ID: clientID ?? uuid, options:options)
var ID = clientID ?? uuid
if let suffix = clientIDSuffix {
ID += "-\(suffix)"
}
var client: IMClient? = try? IMClient(ID: ID, options:options)
let exp = expectation(description: "open")
client?.open { (result) in
XCTAssertTrue(result.isSuccess)
XCTAssertNil(result.error)
if result.isFailure { client = nil }
if result.isFailure {
client = nil
}
exp.fulfill()
}
wait(for: [exp], timeout: timeout)
Expand Down
2 changes: 1 addition & 1 deletion LeanCloudTests/RTMBaseTestCase.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@ class RTMBaseTestCase: BaseTestCase {

static let useTestableRTMURL = false
static let testableRTMURL = RTMBaseTestCase.useTestableRTMURL
? URL(string: "wss://cn-n1-core-k8s-cell-12.leancloud.cn")!
? URL(string: "wss://cn-n1-prod-k8s-cell-12.leancloud.cn")!
: nil
}
22 changes: 12 additions & 10 deletions Sources/RTM/IMClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -147,24 +147,26 @@ public class IMClient {
}
}

/// ref: `https://github.com/leancloud/avoscloud-push/blob/develop/push-server/doc/protocol.md`
/// ref: https://github.com/leancloud/avoscloud-push/tree/master/doc/protocols
struct SessionConfigs: OptionSet {
let rawValue: Int64

static let patchMessage = SessionConfigs(rawValue: 1 << 0)
static let temporaryConversationMessage = SessionConfigs(rawValue: 1 << 1)
static let autoBindDeviceidAndInstallation = SessionConfigs(rawValue: 1 << 2)
static let transientMessageACK = SessionConfigs(rawValue: 1 << 3)
static let notification = SessionConfigs(rawValue: 1 << 4)
static let partialFailedMessage = SessionConfigs(rawValue: 1 << 5)
static let groupChatRCP = SessionConfigs(rawValue: 1 << 6)
static let patchMessage = SessionConfigs(rawValue: 1 << 0)
static let temporaryConversationMessage = SessionConfigs(rawValue: 1 << 1)
static let autoBindDeviceIDAndInstallation = SessionConfigs(rawValue: 1 << 2)
static let transientMessageACK = SessionConfigs(rawValue: 1 << 3)
static let keepNotification = SessionConfigs(rawValue: 1 << 4)
static let partialFailedMessage = SessionConfigs(rawValue: 1 << 5)
static let groupChatReceipt = SessionConfigs(rawValue: 1 << 6)
static let omitPeerID = SessionConfigs(rawValue: 1 << 7)

static let support: SessionConfigs = [
.patchMessage,
.temporaryConversationMessage,
.transientMessageACK,
.notification,
.partialFailedMessage
.keepNotification,
.partialFailedMessage,
.omitPeerID,
]
}

Expand Down
Loading