Skip to content

Commit 67de928

Browse files
move database operation off main thread (#4053)
1 parent 1930f0e commit 67de928

13 files changed

+577
-654
lines changed

Example/Messaging/Tests/FIRMessagingDataMessageManagerTest.m

Lines changed: 30 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,10 @@ - (void)setUp {
7373
[super setUp];
7474
_mockClient = OCMClassMock([FIRMessagingClient class]);
7575
_mockReceiver = OCMClassMock([FIRMessagingReceiver class]);
76-
_mockRmqManager = OCMClassMock([FIRMessagingRmqManager class]);
76+
FIRMessagingRmqManager *newRmqManager =
77+
[[FIRMessagingRmqManager alloc] initWithDatabaseName:kRmqDatabaseName];
78+
[newRmqManager loadRmqId];
79+
_mockRmqManager = OCMPartialMock(newRmqManager);
7780
_mockSyncMessageManager = OCMClassMock([FIRMessagingSyncMessageManager class]);
7881
_dataMessageManager = [[FIRMessagingDataMessageManager alloc]
7982
initWithDelegate:_mockReceiver
@@ -110,9 +113,8 @@ - (void)testSendValidMessage_withNoConnection {
110113
};
111114
OCMExpect([self.mockReceiver willSendDataMessageWithID:[OCMArg isEqual:messageID]
112115
error:[OCMArg isNil]]);
113-
[[[self.mockRmqManager stub] andReturnValue:@YES]
114-
saveRmqMessage:[OCMArg checkWithBlock:isValidStanza]
115-
error:[OCMArg anyObjectRef]];
116+
[[self.mockRmqManager stub] saveRmqMessage:[OCMArg checkWithBlock:isValidStanza]
117+
withCompletionHandler:[OCMArg invokeBlockWithArgs:@(YES), nil]];
116118

117119
// should be logged into the service
118120
[self.dataMessageManager setDeviceAuthID:@"auth-id" secretToken:@"secret-token"];
@@ -204,8 +206,8 @@ - (void)testSendInvalidMessage_withSizeExceeded {
204206
- (void)testSendValidMessage_withRmqSaveError {
205207
NSString *messageID = @"1";
206208
NSMutableDictionary *message = [self standardFIRMessagingMessageWithMessageID:messageID];
207-
[[[self.mockRmqManager stub] andReturnValue:@NO]
208-
saveRmqMessage:[OCMArg any] error:[OCMArg anyObjectRef]];
209+
[[self.mockRmqManager stub] saveRmqMessage:[OCMArg any]
210+
withCompletionHandler:[OCMArg invokeBlockWithArgs:@(NO), nil]];
209211

210212
OCMExpect([self.mockReceiver
211213
willSendDataMessageWithID:[OCMArg isEqual:messageID]
@@ -261,7 +263,6 @@ - (void)XXX_testSendValidMessage_withTTL0AndNoFIRMessagingConnection {
261263
NSString *messageID = @"1";
262264
NSMutableDictionary *message = [self upstreamMessageWithID:messageID ttl:0 delay:0];
263265

264-
265266
BOOL(^isValidStanza)(id obj) = ^BOOL(id obj) {
266267
if ([obj isKindOfClass:[GtalkDataMessageStanza class]]) {
267268
GtalkDataMessageStanza *stanza = (GtalkDataMessageStanza *)obj;
@@ -283,8 +284,7 @@ - (void)XXX_testSendValidMessage_withTTL0AndNoFIRMessagingConnection {
283284
OCMVerifyAll(self.mockClient);
284285
}
285286

286-
// TODO: Investigate why this test is flaky
287-
- (void)xxx_testSendValidMessage_withTTL0AndNoNetwork {
287+
- (void)testSendValidMessage_withTTL0AndNoNetwork {
288288
// simulate a invalid connection
289289
[[[self.mockClient stub] andReturnValue:@NO] isConnectionActive];
290290

@@ -321,27 +321,17 @@ - (void)XXX_testDelayedMessagesBeingResentOnReconnect {
321321
NSMutableDictionary *message = [self upstreamMessageWithID:messageID ttl:ttl delay:1];
322322

323323
__block GtalkDataMessageStanza *firstMessageStanza;
324-
325-
OCMStub([self.mockRmqManager saveRmqMessage:[OCMArg any]
326-
error:[OCMArg anyObjectRef]]).andReturn(YES);
324+
[[self.mockRmqManager stub] saveRmqMessage:[OCMArg any]
325+
withCompletionHandler:[OCMArg invokeBlockWithArgs:@(YES), nil]];
327326

328327
OCMExpect([self.mockReceiver willSendDataMessageWithID:[OCMArg isEqual:messageID]
329328
error:[OCMArg isNil]]);
330329

331330
[self.dataMessageManager setDeviceAuthID:@"auth-id" secretToken:@"secret-token"];
332331
[self.dataMessageManager sendDataMessageStanza:message];
333332

334-
__block FIRMessagingDataMessageHandler dataMessageHandler;
335-
336-
[[[self.mockRmqManager stub] andDo:^(NSInvocation *invocation) {
337-
dataMessageHandler([FIRMessagingGetRmq2Id(firstMessageStanza) longLongValue],
338-
firstMessageStanza);
339-
}]
340-
scanWithRmqMessageHandler:[OCMArg isNil]
341-
dataMessageHandler:[OCMArg checkWithBlock:^BOOL(id obj) {
342-
dataMessageHandler = obj;
343-
return YES;
344-
}]];
333+
[[self.mockRmqManager stub] scanWithRmqMessageHandler:
334+
[OCMArg invokeBlockWithArgs:@{FIRMessagingGetRmq2Id(firstMessageStanza): firstMessageStanza}, nil]];
345335

346336
// expect both 1 and 2 messages to be sent once we regain connection
347337
__block BOOL firstMessageSent = NO;
@@ -481,20 +471,12 @@ - (void)testReceivingDuplicateDuplexMessage {
481471
* the client receives a Streaming ACK which should result in resending RMQ messages.
482472
*/
483473
- (void)testResendSavedMessages {
484-
static BOOL isClientConnected = NO;
485-
[[[self.mockClient stub] andDo:^(NSInvocation *invocation) {
486-
[invocation setReturnValue:&isClientConnected];
487-
}] isConnectionActive];
474+
XCTestExpectation *expectation = [self expectationWithDescription:@"scan is complete"];
488475

476+
static BOOL isClientConnected = NO;
477+
[[[self.mockClient stub] andReturnValue:@(isClientConnected)] isConnectionActive];
489478
// Set a fake, valid bundle identifier
490479
[[[self.mockDataMessageManager stub] andReturn:@"gcm-dmm-test"] categoryForUpstreamMessages];
491-
492-
FIRMessagingRmqManager *newRmqManager =
493-
[[FIRMessagingRmqManager alloc] initWithDatabaseName:kRmqDatabaseName];
494-
[newRmqManager loadRmqId];
495-
// have a real RMQ store
496-
[self.dataMessageManager setRmq2Manager:newRmqManager];
497-
498480
[self.dataMessageManager setDeviceAuthID:@"auth-id" secretToken:@"secret-token"];
499481

500482
// send a couple of message with no connection should be saved to RMQ
@@ -517,23 +499,25 @@ - (void)testResendSavedMessages {
517499
NSLog(@"hello resending %@, %d", message.id_p, didRecieveMessages);
518500
if ([@"1" isEqualToString:message.id_p]) {
519501
didRecieveMessages |= 1; // right most bit for 1st message
520-
return YES;
521502
} else if ([@"2" isEqualToString:message.id_p]) {
522503
didRecieveMessages |= (1<<1); // second from RMB for 2nd message
523-
return YES;
504+
} else {
505+
return NO;
506+
}
507+
if (didRecieveMessages == 3) {
508+
[expectation fulfill];
524509
}
510+
return YES;
525511
}
526512
return NO;
527513
};
528-
[[[mockConnection stub] andDo:^(NSInvocation *invocation) {
529-
// pass
530-
}] sendProto:[OCMArg checkWithBlock:resendMessageBlock]];
531-
514+
[[mockConnection stub] sendProto:[OCMArg checkWithBlock:resendMessageBlock]];
532515
[self.dataMessageManager resendMessagesWithConnection:mockConnection];
533516

534517
// should send both messages
535-
XCTAssert(didRecieveMessages == 3);
536518
OCMVerifyAll(mockConnection);
519+
520+
[self waitForExpectationsWithTimeout:5.0 handler:nil];
537521
}
538522

539523
- (void)testResendingExpiredMessagesFails {
@@ -546,12 +530,6 @@ - (void)testResendingExpiredMessagesFails {
546530
// Set a fake, valid bundle identifier
547531
[[[self.mockDataMessageManager stub] andReturn:@"gcm-dmm-test"] categoryForUpstreamMessages];
548532

549-
FIRMessagingRmqManager *newRmqManager =
550-
[[FIRMessagingRmqManager alloc] initWithDatabaseName:kRmqDatabaseName];
551-
[newRmqManager loadRmqId];
552-
// have a real RMQ store
553-
[self.dataMessageManager setRmq2Manager:newRmqManager];
554-
555533
[self.dataMessageManager setDeviceAuthID:@"auth-id" secretToken:@"secret-token"];
556534
// send a message that expires in 1 sec
557535
[self.dataMessageManager sendDataMessageStanza:
@@ -562,15 +540,13 @@ - (void)testResendingExpiredMessagesFails {
562540
isClientConnected = YES;
563541

564542
id mockConnection = OCMClassMock([FIRMessagingConnection class]);
565-
566543
[[mockConnection reject] sendProto:[OCMArg any]];
567-
[self.dataMessageManager resendMessagesWithConnection:mockConnection];
544+
[[self.mockRmqManager stub] scanWithRmqMessageHandler:[OCMArg checkWithBlock:^BOOL(id obj) {
545+
return YES;
546+
}]];
568547

569-
// rmq should not have any pending messages
570-
[newRmqManager scanWithRmqMessageHandler:^(int64_t rmqId, int8_t tag, NSData *data) {
571-
XCTFail(@"RMQ should not have any message");
572-
}
573-
dataMessageHandler:nil];
548+
[self.dataMessageManager resendMessagesWithConnection:mockConnection];
549+
OCMVerifyAll(self.mockRmqManager);
574550
}
575551

576552
#pragma mark - Create Packet

0 commit comments

Comments
 (0)