FIRMessagingSyncMessageManagerTest.m 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. /*
  2. * Copyright 2017 Google
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #import <XCTest/XCTest.h>
  17. #import "Firebase/Messaging/FIRMessagingPersistentSyncMessage.h"
  18. #import "Firebase/Messaging/FIRMessagingRmqManager.h"
  19. #import "Firebase/Messaging/FIRMessagingSyncMessageManager.h"
  20. #import "Firebase/Messaging/FIRMessagingUtilities.h"
  21. #import "Firebase/Messaging/FIRMessagingConstants.h"
  22. static NSString *const kRmqSqliteFilename = @"rmq-sync-manager-test";
  23. @interface FIRMessagingSyncMessageManagerTest : XCTestCase
  24. @property(nonatomic, readwrite, strong) FIRMessagingRmqManager *rmqManager;
  25. @property(nonatomic, readwrite, strong) FIRMessagingSyncMessageManager *syncMessageManager;
  26. @end
  27. @implementation FIRMessagingSyncMessageManagerTest
  28. - (void)setUp {
  29. [super setUp];
  30. // Make sure the db state is clean before we begin.
  31. [FIRMessagingRmqManager removeDatabaseWithName:kRmqSqliteFilename];
  32. self.rmqManager = [[FIRMessagingRmqManager alloc] initWithDatabaseName:kRmqSqliteFilename];
  33. self.syncMessageManager = [[FIRMessagingSyncMessageManager alloc] initWithRmqManager:self.rmqManager];
  34. }
  35. - (void)tearDown {
  36. [[self.rmqManager class] removeDatabaseWithName:kRmqSqliteFilename];
  37. [super tearDown];
  38. }
  39. /**
  40. * Test receiving a new sync message via APNS should be added to SYNC_RMQ.
  41. */
  42. - (void)testNewAPNSMessage {
  43. int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
  44. NSDictionary *oldMessage = @{
  45. kFIRMessagingMessageIDKey : @"fake-rmq-1",
  46. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  47. @"hello" : @"world",
  48. };
  49. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:oldMessage]);
  50. NSDictionary *newMessage = @{
  51. kFIRMessagingMessageIDKey : @"fake-rmq-2",
  52. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  53. @"hello" : @"world",
  54. };
  55. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  56. }
  57. /**
  58. * Test receiving a new sync message via MCS should be added to SYNC_RMQ.
  59. */
  60. - (void)testNewMCSMessage {
  61. int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
  62. NSDictionary *oldMessage = @{
  63. kFIRMessagingMessageIDKey : @"fake-rmq-1",
  64. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  65. @"hello" : @"world",
  66. };
  67. XCTAssertFalse([self.syncMessageManager didReceiveMCSSyncMessage:oldMessage]);
  68. NSDictionary *newMessage = @{
  69. kFIRMessagingMessageIDKey : @"fake-rmq-2",
  70. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  71. @"hello" : @"world",
  72. };
  73. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  74. }
  75. /**
  76. * Test receiving a duplicate message via APNS.
  77. */
  78. - (void)testDuplicateAPNSMessage {
  79. NSString *messageID = @"fake-rmq-1";
  80. int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
  81. NSDictionary *newMessage = @{
  82. kFIRMessagingMessageIDKey : messageID,
  83. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  84. @"hello" : @"world",
  85. };
  86. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  87. // The message is a duplicate
  88. XCTAssertTrue([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  89. FIRMessagingPersistentSyncMessage *persistentMessage =
  90. [self.rmqManager querySyncMessageWithRmqID:messageID];
  91. XCTAssertTrue(persistentMessage.apnsReceived);
  92. XCTAssertFalse(persistentMessage.mcsReceived);
  93. }
  94. /**
  95. * Test receiving a duplicate message via MCS.
  96. */
  97. - (void)testDuplicateMCSMessage {
  98. NSString *messageID = @"fake-rmq-1";
  99. int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
  100. NSDictionary *newMessage = @{
  101. kFIRMessagingMessageIDKey : messageID,
  102. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  103. @"hello" : @"world",
  104. };
  105. XCTAssertFalse([self.syncMessageManager didReceiveMCSSyncMessage:newMessage]);
  106. // The message is a duplicate
  107. XCTAssertTrue([self.syncMessageManager didReceiveMCSSyncMessage:newMessage]);
  108. FIRMessagingPersistentSyncMessage *persistentMessage =
  109. [self.rmqManager querySyncMessageWithRmqID:messageID];
  110. XCTAssertFalse(persistentMessage.apnsReceived);
  111. XCTAssertTrue(persistentMessage.mcsReceived);
  112. }
  113. /**
  114. * Test receiving a sync message both via APNS and MCS.
  115. */
  116. - (void)testMessageReceivedBothViaAPNSAndMCS {
  117. NSString *messageID = @"fake-rmq-1";
  118. int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
  119. NSDictionary *newMessage = @{
  120. kFIRMessagingMessageIDKey : messageID,
  121. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  122. @"hello" : @"world",
  123. };
  124. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  125. // Duplicate of the above received APNS message
  126. XCTAssertTrue([self.syncMessageManager didReceiveMCSSyncMessage:newMessage]);
  127. // Since we've received both APNS and MCS messages we should have deleted them from SYNC_RMQ
  128. FIRMessagingPersistentSyncMessage *persistentMessage =
  129. [self.rmqManager querySyncMessageWithRmqID:messageID];
  130. XCTAssertNil(persistentMessage);
  131. }
  132. - (void)testDeletingExpiredMessages {
  133. NSString *unexpiredMessageID = @"fake-not-expired-rmqID";
  134. int64_t futureExpirationTime = 86400; // 1 day in future
  135. NSDictionary *unexpiredMessage = @{
  136. kFIRMessagingMessageIDKey : unexpiredMessageID,
  137. kFIRMessagingMessageSyncMessageTTLKey : @(futureExpirationTime),
  138. @"hello" : @"world",
  139. };
  140. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:unexpiredMessage]);
  141. NSString *expiredMessageID = @"fake-expired-rmqID";
  142. int64_t past = -86400; // 1 day in past
  143. NSDictionary *expiredMessage = @{
  144. kFIRMessagingMessageIDKey : expiredMessageID,
  145. kFIRMessagingMessageSyncMessageTTLKey : @(past),
  146. @"hello" : @"world",
  147. };
  148. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:expiredMessage]);
  149. NSString *noTTLMessageID = @"no-ttl-rmqID"; // no TTL specified should be 4 weeks
  150. NSDictionary *noTTLMessage = @{
  151. kFIRMessagingMessageIDKey : noTTLMessageID,
  152. @"hello" : @"world",
  153. };
  154. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:noTTLMessage]);
  155. [self.syncMessageManager removeExpiredSyncMessages];
  156. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:unexpiredMessageID]);
  157. XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:expiredMessageID]);
  158. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:noTTLMessageID]);
  159. }
  160. - (void)testDeleteFinishedMessages {
  161. NSString *unexpiredMessageID = @"fake-not-expired-rmqID";
  162. int64_t futureExpirationTime = 86400; // 1 day in future
  163. NSDictionary *unexpiredMessage = @{
  164. kFIRMessagingMessageIDKey : unexpiredMessageID,
  165. kFIRMessagingMessageSyncMessageTTLKey : @(futureExpirationTime),
  166. @"hello" : @"world",
  167. };
  168. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:unexpiredMessage]);
  169. NSString *noTTLMessageID = @"no-ttl-rmqID"; // no TTL specified should be 4 weeks
  170. NSDictionary *noTTLMessage = @{
  171. kFIRMessagingMessageIDKey : noTTLMessageID,
  172. @"hello" : @"world",
  173. };
  174. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:noTTLMessage]);
  175. // Mark the no-TTL message as received via MCS too
  176. XCTAssertTrue([self.rmqManager updateSyncMessageViaMCSWithRmqID:noTTLMessageID error:nil]);
  177. [self.syncMessageManager removeExpiredSyncMessages];
  178. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:unexpiredMessageID]);
  179. XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:noTTLMessageID]);
  180. }
  181. - (void)testDeleteFinishedAndExpiredMessages {
  182. NSString *unexpiredMessageID = @"fake-not-expired-rmqID";
  183. int64_t futureExpirationTime = 86400; // 1 day in future
  184. NSDictionary *unexpiredMessage = @{
  185. kFIRMessagingMessageIDKey : unexpiredMessageID,
  186. kFIRMessagingMessageSyncMessageTTLKey : @(futureExpirationTime),
  187. @"hello" : @"world",
  188. };
  189. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:unexpiredMessage]);
  190. NSString *expiredMessageID = @"fake-expired-rmqID";
  191. int64_t past = -86400; // 1 day in past
  192. NSDictionary *expiredMessage = @{
  193. kFIRMessagingMessageIDKey : expiredMessageID,
  194. kFIRMessagingMessageSyncMessageTTLKey : @(past),
  195. @"hello" : @"world",
  196. };
  197. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:expiredMessage]);
  198. NSString *noTTLMessageID = @"no-ttl-rmqID"; // no TTL specified should be 4 weeks
  199. NSDictionary *noTTLMessage = @{
  200. kFIRMessagingMessageIDKey : noTTLMessageID,
  201. @"hello" : @"world",
  202. };
  203. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:noTTLMessage]);
  204. // Mark the no-TTL message as received via MCS too
  205. XCTAssertTrue([self.rmqManager updateSyncMessageViaMCSWithRmqID:noTTLMessageID error:nil]);
  206. // Remove expired or finished sync messages.
  207. [self.syncMessageManager removeExpiredSyncMessages];
  208. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:unexpiredMessageID]);
  209. XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:expiredMessageID]);
  210. XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:noTTLMessageID]);
  211. }
  212. @end