diff --git a/.travis.yml b/.travis.yml index cf8521a8f1b..31ed7dc96c8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -720,10 +720,6 @@ jobs: - PROJECT=Firestore PLATFORM=iOS METHOD=xcodebuild SANITIZERS=tsan - env: - PROJECT=GoogleDataTransportIntegrationTest PLATFORM=iOS METHOD=xcodebuild - - env: - - PROJECT=Messaging METHOD=pod-lib-lint - - env: - - PROJECT=MessagingCron METHOD=pod-lib-lint # TODO(varconst): enable if it's possible to make this flag work on build # stages. It's supposed to avoid waiting for jobs that are allowed to fail diff --git a/Example/Messaging/Tests/FIRInstanceIDWithFCMTest.m b/Example/Messaging/Tests/FIRInstanceIDWithFCMTest.m index 742ad1cb98b..441a2bdc38e 100644 --- a/Example/Messaging/Tests/FIRInstanceIDWithFCMTest.m +++ b/Example/Messaging/Tests/FIRInstanceIDWithFCMTest.m @@ -27,17 +27,15 @@ @interface FIRInstanceID (ExposedForTest) - (BOOL)isFCMAutoInitEnabled; - (instancetype)initPrivately; -- (void)start; -@end - -@interface FIRMessaging () -+ (FIRMessaging *)messagingForTests; @end @interface FIRInstanceIDTest : XCTestCase @property(nonatomic, readwrite, strong) FIRInstanceID *instanceID; @property(nonatomic, readwrite, strong) id mockFirebaseApp; +@property(nonatomic, readwrite, strong) FIRMessagingTestUtilities *testUtil; +@property(nonatomic, strong) FIRMessaging *messaging; + @end @@ -45,37 +43,36 @@ @implementation FIRInstanceIDTest - (void)setUp { [super setUp]; - _instanceID = [[FIRInstanceID alloc] initPrivately]; - [_instanceID start]; + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + _testUtil = [[FIRMessagingTestUtilities alloc] initWithUserDefaults:defaults withRMQManager:NO]; + _instanceID = _testUtil.instanceID; + _messaging = _testUtil.messaging; _mockFirebaseApp = OCMClassMock([FIRApp class]); OCMStub([_mockFirebaseApp defaultApp]).andReturn(_mockFirebaseApp); } - (void)tearDown { - self.instanceID = nil; + [_testUtil cleanupAfterTest]; + _instanceID = nil; + _messaging = nil; [_mockFirebaseApp stopMocking]; [super tearDown]; } - (void)testFCMAutoInitEnabled { - // Use the standardUserDefaults since that's what IID expects and depends on. - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - FIRMessaging *messaging = [FIRMessagingTestUtilities messagingForTestsWithUserDefaults:defaults]; - id classMock = OCMClassMock([FIRMessaging class]); OCMStub([_mockFirebaseApp isDataCollectionDefaultEnabled]).andReturn(YES); - messaging.autoInitEnabled = YES; + _messaging.autoInitEnabled = YES; XCTAssertTrue( [_instanceID isFCMAutoInitEnabled], @"When FCM is available, FCM Auto Init Enabled should be FCM's autoInitEnable property."); - messaging.autoInitEnabled = NO; + _messaging.autoInitEnabled = NO; XCTAssertFalse( [_instanceID isFCMAutoInitEnabled], @"When FCM is available, FCM Auto Init Enabled should be FCM's autoInitEnable property."); - messaging.autoInitEnabled = YES; + _messaging.autoInitEnabled = YES; XCTAssertTrue([_instanceID isFCMAutoInitEnabled]); - [classMock stopMocking]; } @end diff --git a/Example/Messaging/Tests/FIRMessagingHandlingTest.m b/Example/Messaging/Tests/FIRMessagingHandlingTest.m index 63233b3a6ba..8ed3e8417eb 100644 --- a/Example/Messaging/Tests/FIRMessagingHandlingTest.m +++ b/Example/Messaging/Tests/FIRMessagingHandlingTest.m @@ -38,7 +38,6 @@ @interface FIRMessaging () @property(nonatomic, readwrite, strong) NSString *defaultFcmToken; @property(nonatomic, readwrite, strong) FIRInstanceID *instanceID; -@property(nonatomic, readwrite, strong) FIRMessagingRmqManager *rmq2Manager; - (BOOL)handleContextManagerMessage:(NSDictionary *)message; - (void)handleIncomingLinkIfNeededFromMessage:(NSDictionary *)message; @@ -52,12 +51,10 @@ - (void)handleIncomingLinkIfNeededFromMessage:(NSDictionary *)message; */ @interface FIRMessagingHandlingTest : XCTestCase -@property(nonatomic, readonly, strong) FIRMessaging *messaging; @property(nonatomic, strong) FIRMessagingAnalytics *messageAnalytics; -@property(nonatomic, strong) id mockMessaging; -@property(nonatomic, strong) id mockInstanceID; @property(nonatomic, strong) id mockFirebaseApp; @property(nonatomic, strong) id mockMessagingAnalytics; +@property(nonatomic, strong) FIRMessagingTestUtilities *testUtil; @end @@ -69,30 +66,23 @@ - (void)setUp { // Create the messaging instance with all the necessary dependencies. NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kFIRMessagingDefaultsTestDomain]; - _messaging = [FIRMessagingTestUtilities messagingForTestsWithUserDefaults:defaults]; + _testUtil = [[FIRMessagingTestUtilities alloc] initWithUserDefaults:defaults withRMQManager:YES]; _mockFirebaseApp = OCMClassMock([FIRApp class]); OCMStub([_mockFirebaseApp defaultApp]).andReturn(_mockFirebaseApp); - _mockInstanceID = OCMPartialMock(self.messaging.instanceID); [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[NSBundle mainBundle].bundleIdentifier]; - _mockMessaging = OCMPartialMock(_messaging); _mockMessagingAnalytics = OCMClassMock([FIRMessagingAnalytics class]); } - (void)tearDown { - [self.messaging.messagingUserDefaults removePersistentDomainForName:kFIRMessagingDefaultsTestDomain]; - self.messaging.shouldEstablishDirectChannel = NO; - self.messaging.defaultFcmToken = nil; + [_testUtil cleanupAfterTest]; [_mockMessagingAnalytics stopMocking]; - [_mockMessaging stopMocking]; - [_mockInstanceID stopMocking]; [_mockFirebaseApp stopMocking]; - _messaging = nil; [super tearDown]; } -(void)testEmptyNotification { - XCTAssertEqualObjects(@(FIRMessagingMessageStatusUnknown), @([_mockMessaging appDidReceiveMessage:@{}].status)); + XCTAssertEqualObjects(@(FIRMessagingMessageStatusUnknown), @([_testUtil.mockMessaging appDidReceiveMessage:@{}].status)); } -(void)testAPNSDisplayNotification { @@ -110,22 +100,21 @@ -(void)testAPNSDisplayNotification { @"google.c.a.ts" : @1566515009, @"google.c.a.udt" : @0 }; - OCMExpect([_mockMessaging handleContextManagerMessage:notificationPayload]); - OCMExpect([_mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); + OCMExpect([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]); + OCMExpect([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); OCMExpect([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]); XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew), - @([_messaging appDidReceiveMessage:notificationPayload].status)); - OCMVerifyAll(_mockMessaging); + @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status)); + OCMVerifyAll(_testUtil.mockMessaging); - OCMReject([_mockMessaging handleContextManagerMessage:notificationPayload]); - OCMReject([_mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); + OCMReject([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]); + OCMReject([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); OCMReject([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]); XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew), - @([_messaging appDidReceiveMessage:notificationPayload].status)); - OCMVerifyAll(_mockMessaging); - // Clear database - [_messaging.rmq2Manager deleteSyncMessageWithRmqID:@"1566515013484879"]; + @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status)); + OCMVerifyAll(_testUtil.mockMessaging); + } -(void)testAPNSContentAvailableNotification { @@ -137,25 +126,25 @@ -(void)testAPNSContentAvailableNotification { @"image" : @"bunny.png", @"google.c.a.e" : @1 }; - OCMExpect([_mockMessaging handleContextManagerMessage:notificationPayload]); - OCMExpect([_mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); + OCMExpect([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]); + OCMExpect([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); OCMExpect([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]); XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew), - @([_messaging appDidReceiveMessage:notificationPayload].status)); - OCMVerifyAll(_mockMessaging); + @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status)); + OCMVerifyAll(_testUtil.mockMessaging); - OCMReject([_mockMessaging handleContextManagerMessage:notificationPayload]); - OCMReject([_mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); + OCMReject([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]); + OCMReject([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); OCMReject([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]); XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew), - @([_messaging appDidReceiveMessage:notificationPayload].status)); - OCMVerifyAll(_mockMessaging); - [_messaging.rmq2Manager deleteSyncMessageWithRmqID:@"1566513591299872"]; + @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status)); + OCMVerifyAll(_testUtil.mockMessaging); } -(void)testAPNSContentAvailableContextualNotification { + NSDictionary *notificationPayload = @{ @"aps" : @{ @"content-available": @1 @@ -173,21 +162,20 @@ -(void)testAPNSContentAvailableContextualNotification { @"google.c.cm.lt_end" : @"2019-09-20 13:12:00", @"google.c.cm.lt_start" : @"2019-08-23 13:12:00", }; - OCMExpect([_mockMessaging handleContextManagerMessage:notificationPayload]); - OCMExpect([_mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); + OCMExpect([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]); + OCMExpect([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); OCMExpect([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]); XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew), - @([_messaging appDidReceiveMessage:notificationPayload].status)); - OCMVerifyAll(_mockMessaging); + @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status)); + OCMVerifyAll(_testUtil.mockMessaging); - OCMReject([_mockMessaging handleContextManagerMessage:notificationPayload]); - OCMReject([_mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); + OCMReject([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]); + OCMReject([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); OCMReject([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]); XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew), - @([_messaging appDidReceiveMessage:notificationPayload].status)); - OCMVerifyAll(_mockMessaging); - [_messaging.rmq2Manager deleteSyncMessageWithRmqID:@"1566515531287827"]; + @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status)); + OCMVerifyAll(_testUtil.mockMessaging); } @@ -203,21 +191,20 @@ -(void)testContextualLocalNotification { @"google.c.a.ts" : @1566565920, @"google.c.a.udt" : @1, }; - OCMExpect([_mockMessaging handleContextManagerMessage:notificationPayload]); - OCMExpect([_mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); + OCMExpect([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]); + OCMExpect([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); OCMExpect([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]); XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew), - @([_messaging appDidReceiveMessage:notificationPayload].status)); - OCMVerifyAll(_mockMessaging); + @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status)); + OCMVerifyAll(_testUtil.mockMessaging); - OCMReject([_mockMessaging handleContextManagerMessage:notificationPayload]); - OCMReject([_mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); + OCMReject([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]); + OCMReject([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); OCMReject([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]); XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew), - @([_messaging appDidReceiveMessage:notificationPayload].status)); - OCMVerifyAll(_mockMessaging); - [_messaging.rmq2Manager deleteSyncMessageWithRmqID:@"1566515531281975"]; + @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status)); + OCMVerifyAll(_testUtil.mockMessaging); } -(void)testMCSNotification { @@ -225,20 +212,20 @@ -(void)testMCSNotification { @"from" : @"35006771263", @"image" : @"bunny.png" }; - OCMExpect([_mockMessaging handleContextManagerMessage:notificationPayload]); - OCMExpect([_mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); + OCMExpect([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]); + OCMExpect([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); OCMExpect([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]); XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew), - @([_messaging appDidReceiveMessage:notificationPayload].status)); - OCMVerifyAll(_mockMessaging); + @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status)); + OCMVerifyAll(_testUtil.mockMessaging); - OCMExpect([_mockMessaging handleContextManagerMessage:notificationPayload]); - OCMExpect([_mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); + OCMExpect([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]); + OCMExpect([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]); OCMExpect([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]); XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew), - @([_messaging appDidReceiveMessage:notificationPayload].status)); - OCMVerifyAll(_mockMessaging); + @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status)); + OCMVerifyAll(_testUtil.mockMessaging); } @end diff --git a/Example/Messaging/Tests/FIRMessagingLinkHandlingTest.m b/Example/Messaging/Tests/FIRMessagingLinkHandlingTest.m index 215ae5bbb4e..53953710d7c 100644 --- a/Example/Messaging/Tests/FIRMessagingLinkHandlingTest.m +++ b/Example/Messaging/Tests/FIRMessagingLinkHandlingTest.m @@ -35,6 +35,8 @@ - (NSURL *)linkURLFromMessage:(NSDictionary *)message; @interface FIRMessagingLinkHandlingTest : XCTestCase @property(nonatomic, readonly, strong) FIRMessaging *messaging; +@property(nonatomic, strong) FIRMessagingTestUtilities * testUtil; + @end @@ -44,11 +46,12 @@ - (void)setUp { [super setUp]; NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kFIRMessagingTestsLinkHandlingSuiteName]; - _messaging = [FIRMessagingTestUtilities messagingForTestsWithUserDefaults:defaults]; + _testUtil = [[FIRMessagingTestUtilities alloc] initWithUserDefaults:defaults withRMQManager:NO]; + _messaging = _testUtil.messaging; } - (void)tearDown { - [self.messaging.messagingUserDefaults removePersistentDomainForName:kFIRMessagingTestsLinkHandlingSuiteName]; + [_testUtil cleanupAfterTest]; _messaging = nil; [super tearDown]; } @@ -58,7 +61,7 @@ - (void)tearDown { - (void)testNonExistentLinkInMessage { NSMutableDictionary *notification = [FIRMessagingTestNotificationUtilities createBasicNotificationWithUniqueMessageID]; - NSURL *url = [self.messaging linkURLFromMessage:notification]; + NSURL *url = [_messaging linkURLFromMessage:notification]; XCTAssertNil(url); } @@ -66,7 +69,7 @@ - (void)testEmptyLinkInMessage { NSMutableDictionary *notification = [FIRMessagingTestNotificationUtilities createBasicNotificationWithUniqueMessageID]; notification[kFIRMessagingMessageLinkKey] = @""; - NSURL *url = [self.messaging linkURLFromMessage:notification]; + NSURL *url = [_messaging linkURLFromMessage:notification]; XCTAssertNil(url); } @@ -74,7 +77,7 @@ - (void)testNonStringLinkInMessage { NSMutableDictionary *notification = [FIRMessagingTestNotificationUtilities createBasicNotificationWithUniqueMessageID]; notification[kFIRMessagingMessageLinkKey] = @(5); - NSURL *url = [self.messaging linkURLFromMessage:notification]; + NSURL *url = [_messaging linkURLFromMessage:notification]; XCTAssertNil(url); } @@ -82,7 +85,7 @@ - (void)testInvalidURLStringLinkInMessage { NSMutableDictionary *notification = [FIRMessagingTestNotificationUtilities createBasicNotificationWithUniqueMessageID]; notification[kFIRMessagingMessageLinkKey] = @"This is not a valid url string"; - NSURL *url = [self.messaging linkURLFromMessage:notification]; + NSURL *url = [_messaging linkURLFromMessage:notification]; XCTAssertNil(url); } @@ -90,7 +93,7 @@ - (void)testValidURLStringLinkInMessage { NSMutableDictionary *notification = [FIRMessagingTestNotificationUtilities createBasicNotificationWithUniqueMessageID]; notification[kFIRMessagingMessageLinkKey] = @"https://www.google.com/"; - NSURL *url = [self.messaging linkURLFromMessage:notification]; + NSURL *url = [_messaging linkURLFromMessage:notification]; XCTAssertTrue([url.absoluteString isEqualToString:@"https://www.google.com/"]); } diff --git a/Example/Messaging/Tests/FIRMessagingServiceTest.m b/Example/Messaging/Tests/FIRMessagingServiceTest.m index 384487c1174..84140443609 100644 --- a/Example/Messaging/Tests/FIRMessagingServiceTest.m +++ b/Example/Messaging/Tests/FIRMessagingServiceTest.m @@ -59,7 +59,9 @@ @interface FIRMessagingServiceTest : XCTestCase { FIRMessaging *_messaging; FIRInstanceIDResult *_result; id _mockInstanceID; + id _mockMessaging; id _mockPubSub; + FIRMessagingTestUtilities *_testUtil; } @end @@ -69,21 +71,20 @@ @implementation FIRMessagingServiceTest - (void)setUp { [super setUp]; NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kFIRMessagingTestsServiceSuiteName]; - _messaging = [FIRMessagingTestUtilities messagingForTestsWithUserDefaults:defaults]; - _messaging.defaultFcmToken = kFakeToken; - _mockPubSub = OCMPartialMock(_messaging.pubsub); + _testUtil = [[FIRMessagingTestUtilities alloc] initWithUserDefaults:defaults withRMQManager:NO]; + _mockMessaging = _testUtil.mockMessaging; + _messaging = _testUtil.messaging; + OCMStub([_mockMessaging defaultFcmToken]).andReturn(kFakeToken); + _mockPubSub = _testUtil.mockPubsub; [_mockPubSub setClient:nil]; - - _mockInstanceID = OCMPartialMock(_messaging.instanceID); + _mockInstanceID = _testUtil.mockInstanceID; _result = [[FIRInstanceIDResult alloc] init]; _result.token = kFakeToken; _result.instanceID = kFakeID; } - (void)tearDown { - [_mockInstanceID stopMocking]; - [_mockPubSub stopMocking]; - [_messaging.messagingUserDefaults removePersistentDomainForName:kFIRMessagingTestsServiceSuiteName]; + [_testUtil cleanupAfterTest]; _messaging = nil; [super tearDown]; } @@ -152,7 +153,6 @@ - (void)testUnsubscribe { topic:topic options:nil handler:^(NSError *error){ - }]; // should call updateSubscription diff --git a/Example/Messaging/Tests/FIRMessagingTest.m b/Example/Messaging/Tests/FIRMessagingTest.m index 2a491dca0c2..5b92f34e678 100644 --- a/Example/Messaging/Tests/FIRMessagingTest.m +++ b/Example/Messaging/Tests/FIRMessagingTest.m @@ -52,6 +52,7 @@ @interface FIRMessagingTest : XCTestCase @property(nonatomic, readwrite, strong) id mockMessaging; @property(nonatomic, readwrite, strong) id mockInstanceID; @property(nonatomic, readwrite, strong) id mockFirebaseApp; +@property(nonatomic, strong) FIRMessagingTestUtilities *testUtil; @end @@ -63,21 +64,19 @@ - (void)setUp { // Create the messaging instance with all the necessary dependencies. NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kFIRMessagingDefaultsTestDomain]; - _messaging = [FIRMessagingTestUtilities messagingForTestsWithUserDefaults:defaults]; + _testUtil = [[FIRMessagingTestUtilities alloc] initWithUserDefaults:defaults withRMQManager:NO]; + _mockMessaging = _testUtil.mockMessaging; + _messaging = _testUtil.messaging; + _mockFirebaseApp = OCMClassMock([FIRApp class]); OCMStub([_mockFirebaseApp defaultApp]).andReturn(_mockFirebaseApp); - _mockInstanceID = OCMPartialMock(self.messaging.instanceID); + _mockInstanceID = _testUtil.mockInstanceID; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[NSBundle mainBundle].bundleIdentifier]; } - (void)tearDown { - [self.messaging.messagingUserDefaults removePersistentDomainForName:kFIRMessagingDefaultsTestDomain]; - self.messaging.shouldEstablishDirectChannel = NO; - self.messaging.defaultFcmToken = nil; - self.messaging.apnsTokenData = nil; - [_mockMessaging stopMocking]; - [_mockInstanceID stopMocking]; + [_testUtil cleanupAfterTest]; [_mockFirebaseApp stopMocking]; _messaging = nil; [super tearDown]; diff --git a/Example/Messaging/Tests/FIRMessagingTestUtilities.h b/Example/Messaging/Tests/FIRMessagingTestUtilities.h index e1d0829a58e..7d38dee5c42 100644 --- a/Example/Messaging/Tests/FIRMessagingTestUtilities.h +++ b/Example/Messaging/Tests/FIRMessagingTestUtilities.h @@ -17,27 +17,28 @@ #import #import +#import NS_ASSUME_NONNULL_BEGIN @interface FIRMessaging (TestUtilities) // Surface the user defaults instance to clean up after tests. @property(nonatomic, strong) NSUserDefaults *messagingUserDefaults; + @end @interface FIRMessagingTestUtilities : NSObject -/** - Creates an instance of FIRMessaging to use with tests, and will instantiate a new instance of - InstanceID. +@property(nonatomic, strong) id mockInstanceID; +@property(nonatomic, strong) id mockPubsub; +@property(nonatomic, strong) id mockMessaging; +@property(nonatomic, readonly, strong) FIRMessaging *messaging; +@property(nonatomic, readonly, strong) FIRInstanceID *instanceID; - Note: This does not create a FIRApp instance and call `configureWithApp:`. If required, it's up to - each test to do so. - @param userDefaults The user defaults to be used for Messaging. - @return An instance of FIRMessaging with everything initialized. - */ -+ (FIRMessaging *)messagingForTestsWithUserDefaults:(NSUserDefaults *)userDefaults; +- (instancetype)initWithUserDefaults:(NSUserDefaults *)userDefaults withRMQManager:(BOOL)withRMQManager; + +- (void)cleanupAfterTest; @end diff --git a/Example/Messaging/Tests/FIRMessagingTestUtilities.m b/Example/Messaging/Tests/FIRMessagingTestUtilities.m index 51ccb86f98c..071d6309ead 100644 --- a/Example/Messaging/Tests/FIRMessagingTestUtilities.m +++ b/Example/Messaging/Tests/FIRMessagingTestUtilities.m @@ -14,13 +14,20 @@ * limitations under the License. */ +#import + #import "Example/Messaging/Tests/FIRMessagingTestUtilities.h" #import #import #import +#import "Firebase/Messaging/FIRMessagingPubSub.h" +#import "Firebase/Messaging/FIRMessagingRmqManager.h" + + NS_ASSUME_NONNULL_BEGIN +static NSString *const kFIRMessagingDefaultsTestDomain = @"com.messaging.tests"; @interface FIRInstanceID (ExposedForTest) @@ -35,6 +42,9 @@ - (void)start; @interface FIRMessaging (ExposedForTest) +@property(nonatomic, readwrite, strong) FIRMessagingPubSub *pubsub; +@property(nonatomic, readwrite, strong) FIRMessagingRmqManager *rmq2Manager; + /// Surface internal initializer to avoid singleton usage during tests. - (instancetype)initWithAnalytics:(nullable id)analytics withInstanceID:(FIRInstanceID *)instanceID @@ -42,22 +52,50 @@ - (instancetype)initWithAnalytics:(nullable id)analytics /// Kicks off required calls for some messaging tests. - (void)start; +- (void)setupRmqManager; + +@end + +@interface FIRMessagingRmqManager (ExposedForTest) + +- (void)removeDatabase; @end @implementation FIRMessagingTestUtilities -+ (FIRMessaging *)messagingForTestsWithUserDefaults:(GULUserDefaults *)userDefaults { - // Create the messaging instance with all the necessary dependencies. - FIRInstanceID *instanceID = [[FIRInstanceID alloc] initPrivately]; - [instanceID start]; - - // Create the messaging instance and call `start`. - FIRMessaging *messaging = [[FIRMessaging alloc] initWithAnalytics:nil - withInstanceID:instanceID - withUserDefaults:userDefaults]; - [messaging start]; - return messaging; +- (instancetype)initWithUserDefaults:(GULUserDefaults *)userDefaults withRMQManager:(BOOL)withRMQManager { + self = [super init]; + if (self) { + _instanceID = [[FIRInstanceID alloc] initPrivately]; + [_instanceID start]; + + // Create the messaging instance and call `start`. + _messaging = [[FIRMessaging alloc] initWithAnalytics:nil + withInstanceID:_instanceID + withUserDefaults:userDefaults]; + if (withRMQManager) { + [_messaging start]; + } + _mockMessaging = OCMPartialMock(_messaging); + if (!withRMQManager) { + OCMStub([_mockMessaging setupRmqManager]).andDo(nil); + [(FIRMessaging *)_mockMessaging start]; + + } + _mockInstanceID = OCMPartialMock(_instanceID); + _mockPubsub = OCMPartialMock(_messaging.pubsub); + } + return self; +} + +- (void)cleanupAfterTest { + [_messaging.rmq2Manager removeDatabase]; + [_messaging.messagingUserDefaults removePersistentDomainForName:kFIRMessagingDefaultsTestDomain]; + _messaging.shouldEstablishDirectChannel = NO; + [_mockPubsub stopMocking]; + [_mockMessaging stopMocking]; + [_mockInstanceID stopMocking]; } @end diff --git a/Firebase/Messaging/FIRMessagingRmqManager.m b/Firebase/Messaging/FIRMessagingRmqManager.m index f8a28188355..17d025cbcfa 100644 --- a/Firebase/Messaging/FIRMessagingRmqManager.m +++ b/Firebase/Messaging/FIRMessagingRmqManager.m @@ -584,8 +584,11 @@ - (void)dropTableWithName:(NSString *)tableName { } - (void)removeDatabase { - NSString *path = [self pathForDatabase]; - [[NSFileManager defaultManager] removeItemAtPath:path error:nil]; + // Ensure database is removed in a sync queue as this sometimes makes test have race conditions. + dispatch_sync(_databaseOperationQueue, ^{ + NSString *path = [self pathForDatabase]; + [[NSFileManager defaultManager] removeItemAtPath:path error:nil]; + }); } - (void)openDatabase {