FIRMessagingSyncMessageManagerTest.m 9.6 KB

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