Skip to content

Commit 5df489b

Browse files
authored
Merge pull request #306 from zapcannon87/developer
fix(IM): conversation decode binary last message is incorrect
2 parents 8cc1600 + 3f96bb2 commit 5df489b

File tree

3 files changed

+150
-6
lines changed

3 files changed

+150
-6
lines changed

LeanCloudTests/IMMessageTestCase.swift

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,80 @@ class IMMessageTestCase: RTMBaseTestCase {
757757
XCTAssertTrue(success)
758758
}
759759

760+
func testBinaryMessage() {
761+
guard let tuples = convenienceInit(),
762+
let clientA = tuples.first?.client,
763+
let clientB = tuples.last?.client,
764+
let delegatorB = tuples.last?.delegator,
765+
let conversation = tuples.first?.conversation else {
766+
XCTFail()
767+
return
768+
}
769+
770+
let binaryData = "bin".data(using: .utf8)!
771+
let message = IMMessage()
772+
try! message.set(content: .data(binaryData))
773+
774+
expecting(count: 4) { (exp) in
775+
delegatorB.conversationEvent = { client, conv, event in
776+
switch event {
777+
case .unreadMessageCountUpdated:
778+
exp.fulfill() // 2 times
779+
case let .message(event: messageEvent):
780+
if case let .received(message: rMessage) = messageEvent {
781+
XCTAssertEqual(rMessage.content?.data, binaryData)
782+
conv.read()
783+
exp.fulfill()
784+
}
785+
default:
786+
break
787+
}
788+
}
789+
try! conversation.send(message: message, options: [.needReceipt]) { (result) in
790+
XCTAssertTrue(result.isSuccess)
791+
XCTAssertNil(result.error)
792+
exp.fulfill()
793+
}
794+
}
795+
796+
delay()
797+
delegatorB.reset()
798+
799+
expecting { (exp) in
800+
let newMessage = IMMessage()
801+
try! newMessage.set(content: .data(binaryData))
802+
newMessage.isAllMembersMentioned = true
803+
newMessage.mentionedMembers = [clientB.ID]
804+
try! conversation.update(oldMessage: message, to: newMessage) { (result) in
805+
XCTAssertTrue(result.isSuccess)
806+
XCTAssertNil(result.error)
807+
exp.fulfill()
808+
}
809+
}
810+
811+
delay()
812+
813+
expecting { (exp) in
814+
let query = clientA.conversationQuery
815+
query.options = [.containLastMessage]
816+
try! query.getConversation(by: conversation.ID) { (result) in
817+
XCTAssertTrue(result.isSuccess)
818+
XCTAssertNil(result.error)
819+
XCTAssertEqual(conversation.lastMessage?.content?.data, binaryData)
820+
exp.fulfill()
821+
}
822+
}
823+
824+
expecting { (exp) in
825+
try! conversation.queryMessage { (result) in
826+
XCTAssertTrue(result.isSuccess)
827+
XCTAssertNil(result.error)
828+
XCTAssertEqual(result.value?.first?.content?.data, binaryData)
829+
exp.fulfill()
830+
}
831+
}
832+
}
833+
760834
func testMessageUpdating() {
761835
let oldMessage = IMMessage()
762836
let oldContent: String = "old"
@@ -1326,7 +1400,6 @@ class IMMessageTestCase: RTMBaseTestCase {
13261400
XCTAssertEqual(conversation.lastMessage?.ID, sentTuples.last?.0)
13271401
XCTAssertEqual(conversation.lastMessage?.sentTimestamp, sentTuples.last?.1)
13281402
}
1329-
13301403
}
13311404

13321405
extension IMMessageTestCase {

LeanCloudTests/LCFileTestCase.swift

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,3 +246,72 @@ class LCFileTestCase: BaseTestCase {
246246
}
247247
}
248248
}
249+
250+
extension LCFileTestCase {
251+
252+
static let usOldTestApp = try! LCApplication(
253+
id: "kknqydxqd9wdq4cboy1dvvug5ha0ce3i2mrerrdrmr6pla1p",
254+
key: "fate582pwsfh97s9o99nw91a152i7ndm9tsy866e6wpezth4",
255+
serverURL: "https://beta-us.leancloud.cn"
256+
)
257+
258+
func testSaveUSOldTestApp() {
259+
let fileURL = bundleResourceURL(name: "test", ext: "png")
260+
let application = LCFileTestCase.usOldTestApp
261+
262+
var file1: LCFile! = LCFile(
263+
application: application,
264+
payload: .fileURL(fileURL: fileURL))
265+
XCTAssertTrue(file1.save().isSuccess)
266+
XCTAssertNotNil(file1.mimeType)
267+
XCTAssertNotNil(file1.key)
268+
XCTAssertNotNil(file1.name)
269+
XCTAssertNotNil(file1.metaData?.size as? LCNumber)
270+
XCTAssertNotNil(file1.bucket)
271+
XCTAssertNotNil(file1.provider)
272+
XCTAssertNotNil(file1.url)
273+
XCTAssertNotNil(file1.objectId)
274+
XCTAssertNotNil(file1.createdAt)
275+
XCTAssertNotNil(file1.save().error)
276+
277+
var file2: LCFile! = LCFile(
278+
application: application,
279+
payload: .data(data: try! Data(contentsOf: fileURL)))
280+
file2.name = "image.png"
281+
XCTAssertTrue(file2.save().isSuccess)
282+
XCTAssertNotNil(file2.mimeType)
283+
XCTAssertNotNil(file2.key)
284+
XCTAssertNotNil(file2.name)
285+
XCTAssertNotNil(file2.metaData?.size as? LCNumber)
286+
XCTAssertNotNil(file2.bucket)
287+
XCTAssertNotNil(file2.provider)
288+
XCTAssertNotNil(file2.url)
289+
XCTAssertNotNil(file2.objectId)
290+
XCTAssertNotNil(file2.createdAt)
291+
XCTAssertNotNil(file2.save().error)
292+
293+
var file3: LCFile! = LCFile(
294+
application: application,
295+
url: file2.url!)
296+
XCTAssertTrue(file3.save().isSuccess)
297+
XCTAssertNotNil(file3.mimeType)
298+
XCTAssertNotNil(file3.name)
299+
XCTAssertEqual(file3.metaData?.__source as? LCString, LCString("external"))
300+
XCTAssertNotNil(file3.url)
301+
XCTAssertNotNil(file3.objectId)
302+
XCTAssertNotNil(file3.createdAt)
303+
XCTAssertNotNil(file3.save().error)
304+
305+
delay()
306+
307+
weak var wFile1 = file1
308+
weak var wFile2 = file2
309+
weak var wFile3 = file3
310+
file1 = nil
311+
file2 = nil
312+
file3 = nil
313+
XCTAssertNil(wFile1)
314+
XCTAssertNil(wFile2)
315+
XCTAssertNil(wFile3)
316+
}
317+
}

Sources/RTM/IMConversation.swift

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2491,11 +2491,13 @@ extension IMConversation {
24912491
return nil
24922492
}
24932493
var content: IMMessage.Content? = nil
2494-
/* always check `binaryMsg` firstly */
2495-
if let data: Data = IMConversation.decoding(key: .lastMessageBinary, from: data) {
2496-
content = .data(data)
2497-
} else if let string: String = IMConversation.decoding(key: .lastMessageString, from: data) {
2498-
content = .string(string)
2494+
if let msg: String = IMConversation.decoding(key: .lastMessageString, from: data) {
2495+
if let isBinary: Bool = IMConversation.decoding(key: .lastMessageBinary, from: data), isBinary,
2496+
let data = Data(base64Encoded: msg) {
2497+
content = .data(data)
2498+
} else {
2499+
content = .string(msg)
2500+
}
24992501
}
25002502
return IMMessage.instance(
25012503
application: client.application,

0 commit comments

Comments
 (0)