FIRMessagingSyncMessageManagerTest.m 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  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 FIRMessagingRmqManager (ExposedForTest)
  24. - (void)removeDatabase;
  25. @end
  26. @interface FIRMessagingSyncMessageManagerTest : XCTestCase
  27. @property(nonatomic, readwrite, strong) FIRMessagingRmqManager *rmqManager;
  28. @property(nonatomic, readwrite, strong) FIRMessagingSyncMessageManager *syncMessageManager;
  29. @end
  30. @implementation FIRMessagingSyncMessageManagerTest
  31. - (void)setUp {
  32. [super setUp];
  33. // Make sure the db state is clean before we begin.
  34. _rmqManager = [[FIRMessagingRmqManager alloc] initWithDatabaseName:kRmqSqliteFilename];
  35. self.syncMessageManager = [[FIRMessagingSyncMessageManager alloc] initWithRmqManager:self.rmqManager];
  36. }
  37. - (void)tearDown {
  38. [_rmqManager removeDatabase];
  39. [super tearDown];
  40. }
  41. /**
  42. * Test receiving a new sync message via APNS should be added to SYNC_RMQ.
  43. */
  44. - (void)testNewAPNSMessage {
  45. int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
  46. NSDictionary *oldMessage = @{
  47. kFIRMessagingMessageIDKey : @"fake-rmq-1",
  48. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  49. @"hello" : @"world",
  50. };
  51. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:oldMessage]);
  52. NSDictionary *newMessage = @{
  53. kFIRMessagingMessageIDKey : @"fake-rmq-2",
  54. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  55. @"hello" : @"world",
  56. };
  57. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  58. }
  59. /**
  60. * Test receiving a new sync message via MCS should be added to SYNC_RMQ.
  61. */
  62. - (void)testNewMCSMessage {
  63. int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
  64. NSDictionary *oldMessage = @{
  65. kFIRMessagingMessageIDKey : @"fake-rmq-1",
  66. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  67. @"hello" : @"world",
  68. };
  69. XCTAssertFalse([self.syncMessageManager didReceiveMCSSyncMessage:oldMessage]);
  70. NSDictionary *newMessage = @{
  71. kFIRMessagingMessageIDKey : @"fake-rmq-2",
  72. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  73. @"hello" : @"world",
  74. };
  75. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  76. }
  77. /**
  78. * Test receiving a duplicate message via APNS.
  79. */
  80. - (void)testDuplicateAPNSMessage {
  81. NSString *messageID = @"fake-rmq-1";
  82. int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
  83. NSDictionary *newMessage = @{
  84. kFIRMessagingMessageIDKey : messageID,
  85. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  86. @"hello" : @"world",
  87. };
  88. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  89. // The message is a duplicate
  90. XCTAssertTrue([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  91. FIRMessagingPersistentSyncMessage *persistentMessage =
  92. [self.rmqManager querySyncMessageWithRmqID:messageID];
  93. XCTAssertTrue(persistentMessage.apnsReceived);
  94. XCTAssertFalse(persistentMessage.mcsReceived);
  95. }
  96. /**
  97. * Test receiving a duplicate message via MCS.
  98. */
  99. - (void)testDuplicateMCSMessage {
  100. NSString *messageID = @"fake-rmq-1";
  101. int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
  102. NSDictionary *newMessage = @{
  103. kFIRMessagingMessageIDKey : messageID,
  104. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  105. @"hello" : @"world",
  106. };
  107. XCTAssertFalse([self.syncMessageManager didReceiveMCSSyncMessage:newMessage]);
  108. // The message is a duplicate
  109. XCTAssertTrue([self.syncMessageManager didReceiveMCSSyncMessage:newMessage]);
  110. FIRMessagingPersistentSyncMessage *persistentMessage =
  111. [self.rmqManager querySyncMessageWithRmqID:messageID];
  112. XCTAssertFalse(persistentMessage.apnsReceived);
  113. XCTAssertTrue(persistentMessage.mcsReceived);
  114. }
  115. /**
  116. * Test receiving a sync message both via APNS and MCS.
  117. */
  118. - (void)testMessageReceivedBothViaAPNSAndMCS {
  119. NSString *messageID = @"fake-rmq-1";
  120. int64_t expirationTime = FIRMessagingCurrentTimestampInSeconds() + 86400; // 1 day in future
  121. NSDictionary *newMessage = @{
  122. kFIRMessagingMessageIDKey : messageID,
  123. kFIRMessagingMessageSyncViaMCSKey : @(expirationTime),
  124. @"hello" : @"world",
  125. };
  126. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  127. // Duplicate of the above received APNS message
  128. XCTAssertTrue([self.syncMessageManager didReceiveMCSSyncMessage:newMessage]);
  129. // Since we've received both APNS and MCS messages we should have deleted them from SYNC_RMQ
  130. FIRMessagingPersistentSyncMessage *persistentMessage =
  131. [self.rmqManager querySyncMessageWithRmqID:messageID];
  132. XCTAssertNil(persistentMessage);
  133. }
  134. - (void)testDeletingExpiredMessages {
  135. NSString *unexpiredMessageID = @"fake-not-expired-rmqID";
  136. int64_t futureExpirationTime = 86400; // 1 day in future
  137. NSDictionary *unexpiredMessage = @{
  138. kFIRMessagingMessageIDKey : unexpiredMessageID,
  139. kFIRMessagingMessageSyncMessageTTLKey : @(futureExpirationTime),
  140. @"hello" : @"world",
  141. };
  142. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:unexpiredMessage]);
  143. NSString *expiredMessageID = @"fake-expired-rmqID";
  144. int64_t past = -86400; // 1 day in past
  145. NSDictionary *expiredMessage = @{
  146. kFIRMessagingMessageIDKey : expiredMessageID,
  147. kFIRMessagingMessageSyncMessageTTLKey : @(past),
  148. @"hello" : @"world",
  149. };
  150. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:expiredMessage]);
  151. NSString *noTTLMessageID = @"no-ttl-rmqID"; // no TTL specified should be 4 weeks
  152. NSDictionary *noTTLMessage = @{
  153. kFIRMessagingMessageIDKey : noTTLMessageID,
  154. @"hello" : @"world",
  155. };
  156. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:noTTLMessage]);
  157. [self.syncMessageManager removeExpiredSyncMessages];
  158. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:unexpiredMessageID]);
  159. XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:expiredMessageID]);
  160. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:noTTLMessageID]);
  161. }
  162. - (void)testDeleteFinishedMessages {
  163. NSString *unexpiredMessageID = @"fake-not-expired-rmqID";
  164. int64_t futureExpirationTime = 86400; // 1 day in future
  165. NSDictionary *unexpiredMessage = @{
  166. kFIRMessagingMessageIDKey : unexpiredMessageID,
  167. kFIRMessagingMessageSyncMessageTTLKey : @(futureExpirationTime),
  168. @"hello" : @"world",
  169. };
  170. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:unexpiredMessage]);
  171. NSString *noTTLMessageID = @"no-ttl-rmqID"; // no TTL specified should be 4 weeks
  172. NSDictionary *noTTLMessage = @{
  173. kFIRMessagingMessageIDKey : noTTLMessageID,
  174. @"hello" : @"world",
  175. };
  176. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:noTTLMessage]);
  177. // Mark the no-TTL message as received via MCS too
  178. [self.rmqManager updateSyncMessageViaMCSWithRmqID:noTTLMessageID];
  179. [self.syncMessageManager removeExpiredSyncMessages];
  180. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:unexpiredMessageID]);
  181. XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:noTTLMessageID]);
  182. }
  183. - (void)testDeleteFinishedAndExpiredMessages {
  184. NSString *unexpiredMessageID = @"fake-not-expired-rmqID";
  185. int64_t futureExpirationTime = 86400; // 1 day in future
  186. NSDictionary *unexpiredMessage = @{
  187. kFIRMessagingMessageIDKey : unexpiredMessageID,
  188. kFIRMessagingMessageSyncMessageTTLKey : @(futureExpirationTime),
  189. @"hello" : @"world",
  190. };
  191. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:unexpiredMessage]);
  192. NSString *expiredMessageID = @"fake-expired-rmqID";
  193. int64_t past = -86400; // 1 day in past
  194. NSDictionary *expiredMessage = @{
  195. kFIRMessagingMessageIDKey : expiredMessageID,
  196. kFIRMessagingMessageSyncMessageTTLKey : @(past),
  197. @"hello" : @"world",
  198. };
  199. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:expiredMessage]);
  200. NSString *noTTLMessageID = @"no-ttl-rmqID"; // no TTL specified should be 4 weeks
  201. NSDictionary *noTTLMessage = @{
  202. kFIRMessagingMessageIDKey : noTTLMessageID,
  203. @"hello" : @"world",
  204. };
  205. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:noTTLMessage]);
  206. // Mark the no-TTL message as received via MCS too
  207. [self.rmqManager updateSyncMessageViaMCSWithRmqID:noTTLMessageID];
  208. // Remove expired or finished sync messages.
  209. [self.syncMessageManager removeExpiredSyncMessages];
  210. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:unexpiredMessageID]);
  211. XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:expiredMessageID]);
  212. XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:noTTLMessageID]);
  213. }
  214. @end