| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- /*
- * Copyright 2017 Google
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #import <XCTest/XCTest.h>
- #import "XCTestCase+FIRMessagingRmqManagerTests.h"
- #import "Firebase/Messaging/FIRMessagingConstants.h"
- #import "Firebase/Messaging/FIRMessagingPersistentSyncMessage.h"
- #import "Firebase/Messaging/FIRMessagingRmqManager.h"
- #import "Firebase/Messaging/FIRMessagingSyncMessageManager.h"
- #import "Firebase/Messaging/FIRMessagingUtilities.h"
- static NSString *const kRmqSqliteFilename = @"rmq-sync-manager-test";
- @interface FIRMessagingRmqManager (ExposedForTest)
- - (void)removeDatabase;
- @end
- @interface FIRMessagingSyncMessageManagerTest : XCTestCase
- @property(nonatomic, readwrite, strong) FIRMessagingRmqManager *rmqManager;
- @property(nonatomic, readwrite, strong) FIRMessagingSyncMessageManager *syncMessageManager;
- @end
- @implementation FIRMessagingSyncMessageManagerTest
- - (void)setUp {
- [super setUp];
- // Make sure the db state is clean before we begin.
- _rmqManager = [[FIRMessagingRmqManager alloc] initWithDatabaseName:kRmqSqliteFilename];
- self.syncMessageManager =
- [[FIRMessagingSyncMessageManager alloc] initWithRmqManager:self.rmqManager];
- }
- - (void)tearDown {
- [_rmqManager removeDatabase];
- [self waitForDrainDatabaseQueueForRmqManager:_rmqManager];
- [super tearDown];
- }
- /**
- * Test receiving a new sync message via APNS should be added to SYNC_RMQ.
- */
- - (void)testNewAPNSMessage {
- int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
- NSDictionary *oldMessage = @{
- kFIRMessagingMessageIDKey : @"fake-rmq-1",
- kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:oldMessage]);
- NSDictionary *newMessage = @{
- kFIRMessagingMessageIDKey : @"fake-rmq-2",
- kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
- }
- /**
- * Test receiving a new sync message via MCS should be added to SYNC_RMQ.
- */
- - (void)testNewMCSMessage {
- int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
- NSDictionary *oldMessage = @{
- kFIRMessagingMessageIDKey : @"fake-rmq-1",
- kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveMCSSyncMessage:oldMessage]);
- NSDictionary *newMessage = @{
- kFIRMessagingMessageIDKey : @"fake-rmq-2",
- kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
- }
- /**
- * Test receiving a duplicate message via APNS.
- */
- - (void)testDuplicateAPNSMessage {
- NSString *messageID = @"fake-rmq-1";
- int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
- NSDictionary *newMessage = @{
- kFIRMessagingMessageIDKey : messageID,
- kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
- // The message is a duplicate
- XCTAssertTrue([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
- FIRMessagingPersistentSyncMessage *persistentMessage =
- [self.rmqManager querySyncMessageWithRmqID:messageID];
- XCTAssertTrue(persistentMessage.apnsReceived);
- XCTAssertFalse(persistentMessage.mcsReceived);
- }
- /**
- * Test receiving a duplicate message via MCS.
- */
- - (void)testDuplicateMCSMessage {
- NSString *messageID = @"fake-rmq-1";
- int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
- NSDictionary *newMessage = @{
- kFIRMessagingMessageIDKey : messageID,
- kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveMCSSyncMessage:newMessage]);
- // The message is a duplicate
- XCTAssertTrue([self.syncMessageManager didReceiveMCSSyncMessage:newMessage]);
- FIRMessagingPersistentSyncMessage *persistentMessage =
- [self.rmqManager querySyncMessageWithRmqID:messageID];
- XCTAssertFalse(persistentMessage.apnsReceived);
- XCTAssertTrue(persistentMessage.mcsReceived);
- }
- /**
- * Test receiving a sync message both via APNS and MCS.
- */
- - (void)testMessageReceivedBothViaAPNSAndMCS {
- NSString *messageID = @"fake-rmq-1";
- int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
- NSDictionary *newMessage = @{
- kFIRMessagingMessageIDKey : messageID,
- kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
- // Duplicate of the above received APNS message
- XCTAssertTrue([self.syncMessageManager didReceiveMCSSyncMessage:newMessage]);
- // Since we've received both APNS and MCS messages we should have deleted them from SYNC_RMQ
- FIRMessagingPersistentSyncMessage *persistentMessage =
- [self.rmqManager querySyncMessageWithRmqID:messageID];
- XCTAssertNil(persistentMessage);
- }
- - (void)testDeletingExpiredMessages {
- NSString *unexpiredMessageID = @"fake-not-expired-rmqID";
- int64_t futureExpirationTime = 86400; // 1 day in future
- NSDictionary *unexpiredMessage = @{
- kFIRMessagingMessageIDKey : unexpiredMessageID,
- kFIRMessagingMessageSyncMessageTTLKey : @(futureExpirationTime),
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:unexpiredMessage]);
- NSString *expiredMessageID = @"fake-expired-rmqID";
- int64_t past = -86400; // 1 day in past
- NSDictionary *expiredMessage = @{
- kFIRMessagingMessageIDKey : expiredMessageID,
- kFIRMessagingMessageSyncMessageTTLKey : @(past),
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:expiredMessage]);
- NSString *noTTLMessageID = @"no-ttl-rmqID"; // no TTL specified should be 4 weeks
- NSDictionary *noTTLMessage = @{
- kFIRMessagingMessageIDKey : noTTLMessageID,
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:noTTLMessage]);
- [self.syncMessageManager removeExpiredSyncMessages];
- XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:unexpiredMessageID]);
- XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:expiredMessageID]);
- XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:noTTLMessageID]);
- }
- - (void)testDeleteFinishedMessages {
- NSString *unexpiredMessageID = @"fake-not-expired-rmqID";
- int64_t futureExpirationTime = 86400; // 1 day in future
- NSDictionary *unexpiredMessage = @{
- kFIRMessagingMessageIDKey : unexpiredMessageID,
- kFIRMessagingMessageSyncMessageTTLKey : @(futureExpirationTime),
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:unexpiredMessage]);
- NSString *noTTLMessageID = @"no-ttl-rmqID"; // no TTL specified should be 4 weeks
- NSDictionary *noTTLMessage = @{
- kFIRMessagingMessageIDKey : noTTLMessageID,
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:noTTLMessage]);
- // Mark the no-TTL message as received via MCS too
- [self.rmqManager updateSyncMessageViaMCSWithRmqID:noTTLMessageID];
- [self.syncMessageManager removeExpiredSyncMessages];
- XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:unexpiredMessageID]);
- XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:noTTLMessageID]);
- }
- - (void)testDeleteFinishedAndExpiredMessages {
- NSString *unexpiredMessageID = @"fake-not-expired-rmqID";
- int64_t futureExpirationTime = 86400; // 1 day in future
- NSDictionary *unexpiredMessage = @{
- kFIRMessagingMessageIDKey : unexpiredMessageID,
- kFIRMessagingMessageSyncMessageTTLKey : @(futureExpirationTime),
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:unexpiredMessage]);
- NSString *expiredMessageID = @"fake-expired-rmqID";
- int64_t past = -86400; // 1 day in past
- NSDictionary *expiredMessage = @{
- kFIRMessagingMessageIDKey : expiredMessageID,
- kFIRMessagingMessageSyncMessageTTLKey : @(past),
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:expiredMessage]);
- NSString *noTTLMessageID = @"no-ttl-rmqID"; // no TTL specified should be 4 weeks
- NSDictionary *noTTLMessage = @{
- kFIRMessagingMessageIDKey : noTTLMessageID,
- @"hello" : @"world",
- };
- XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:noTTLMessage]);
- // Mark the no-TTL message as received via MCS too
- [self.rmqManager updateSyncMessageViaMCSWithRmqID:noTTLMessageID];
- // Remove expired or finished sync messages.
- [self.syncMessageManager removeExpiredSyncMessages];
- XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:unexpiredMessageID]);
- XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:expiredMessageID]);
- XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:noTTLMessageID]);
- }
- @end
|