FIRMessagingSyncMessageManagerTest.m 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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 "FirebaseMessaging/Tests/UnitTests/XCTestCase+FIRMessagingRmqManagerTests.h"
  18. #import "FirebaseMessaging/Sources/FIRMessagingConstants.h"
  19. #import "FirebaseMessaging/Sources/FIRMessagingPersistentSyncMessage.h"
  20. #import "FirebaseMessaging/Sources/FIRMessagingRmqManager.h"
  21. #import "FirebaseMessaging/Sources/FIRMessagingSyncMessageManager.h"
  22. #import "FirebaseMessaging/Sources/FIRMessagingUtilities.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 =
  37. [[FIRMessagingSyncMessageManager alloc] initWithRmqManager:self.rmqManager];
  38. }
  39. - (void)tearDown {
  40. [_rmqManager removeDatabase];
  41. [self waitForDrainDatabaseQueueForRmqManager:_rmqManager];
  42. [super tearDown];
  43. }
  44. /**
  45. * Test receiving a new sync message via APNS should be added to SYNC_RMQ.
  46. */
  47. - (void)testNewAPNSMessage {
  48. NSDictionary *oldMessage = @{
  49. kFIRMessagingMessageIDKey : @"fake-rmq-1",
  50. @"hello" : @"world",
  51. };
  52. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:oldMessage]);
  53. NSDictionary *newMessage = @{
  54. kFIRMessagingMessageIDKey : @"fake-rmq-2",
  55. @"hello" : @"world",
  56. };
  57. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  58. }
  59. #if !(SWIFT_PACKAGE && TARGET_OS_TV) // Not enough space.
  60. /**
  61. * Test receiving a duplicate message via APNS.
  62. */
  63. - (void)testDuplicateAPNSMessage {
  64. NSString *messageID = @"fake-rmq-1";
  65. NSDictionary *newMessage = @{
  66. kFIRMessagingMessageIDKey : messageID,
  67. @"hello" : @"world",
  68. };
  69. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  70. // The message is a duplicate
  71. XCTAssertTrue([self.syncMessageManager didReceiveAPNSSyncMessage:newMessage]);
  72. FIRMessagingPersistentSyncMessage *persistentMessage =
  73. [self.rmqManager querySyncMessageWithRmqID:messageID];
  74. XCTAssertTrue(persistentMessage.apnsReceived);
  75. XCTAssertFalse(persistentMessage.mcsReceived);
  76. }
  77. - (void)testDeletingExpiredMessages {
  78. NSString *unexpiredMessageID = @"fake-not-expired-rmqID";
  79. int64_t futureExpirationTime = 86400; // 1 day in future
  80. NSDictionary *unexpiredMessage = @{
  81. kFIRMessagingMessageIDKey : unexpiredMessageID,
  82. kFIRMessagingMessageSyncMessageTTLKey : @(futureExpirationTime),
  83. @"hello" : @"world",
  84. };
  85. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:unexpiredMessage]);
  86. NSString *expiredMessageID = @"fake-expired-rmqID";
  87. int64_t past = -86400; // 1 day in past
  88. NSDictionary *expiredMessage = @{
  89. kFIRMessagingMessageIDKey : expiredMessageID,
  90. kFIRMessagingMessageSyncMessageTTLKey : @(past),
  91. @"hello" : @"world",
  92. };
  93. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:expiredMessage]);
  94. NSString *noTTLMessageID = @"no-ttl-rmqID"; // no TTL specified should be 4 weeks
  95. NSDictionary *noTTLMessage = @{
  96. kFIRMessagingMessageIDKey : noTTLMessageID,
  97. @"hello" : @"world",
  98. };
  99. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:noTTLMessage]);
  100. [self.syncMessageManager removeExpiredSyncMessages];
  101. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:unexpiredMessageID]);
  102. XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:expiredMessageID]);
  103. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:noTTLMessageID]);
  104. }
  105. - (void)testDeleteFinishedMessages {
  106. NSString *unexpiredMessageID = @"fake-not-expired-rmqID";
  107. int64_t futureExpirationTime = 86400; // 1 day in future
  108. NSDictionary *unexpiredMessage = @{
  109. kFIRMessagingMessageIDKey : unexpiredMessageID,
  110. kFIRMessagingMessageSyncMessageTTLKey : @(futureExpirationTime),
  111. @"hello" : @"world",
  112. };
  113. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:unexpiredMessage]);
  114. NSString *noTTLMessageID = @"no-ttl-rmqID"; // no TTL specified should be 4 weeks
  115. NSDictionary *noTTLMessage = @{
  116. kFIRMessagingMessageIDKey : noTTLMessageID,
  117. @"hello" : @"world",
  118. };
  119. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:noTTLMessage]);
  120. [self.syncMessageManager removeExpiredSyncMessages];
  121. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:unexpiredMessageID]);
  122. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:noTTLMessageID]);
  123. }
  124. - (void)testDeleteFinishedAndExpiredMessages {
  125. NSString *unexpiredMessageID = @"fake-not-expired-rmqID";
  126. int64_t futureExpirationTime = 86400; // 1 day in future
  127. NSDictionary *unexpiredMessage = @{
  128. kFIRMessagingMessageIDKey : unexpiredMessageID,
  129. kFIRMessagingMessageSyncMessageTTLKey : @(futureExpirationTime),
  130. @"hello" : @"world",
  131. };
  132. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:unexpiredMessage]);
  133. NSString *expiredMessageID = @"fake-expired-rmqID";
  134. int64_t past = -86400; // 1 day in past
  135. NSDictionary *expiredMessage = @{
  136. kFIRMessagingMessageIDKey : expiredMessageID,
  137. kFIRMessagingMessageSyncMessageTTLKey : @(past),
  138. @"hello" : @"world",
  139. };
  140. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:expiredMessage]);
  141. NSString *noTTLMessageID = @"no-ttl-rmqID"; // no TTL specified should be 4 weeks
  142. NSDictionary *noTTLMessage = @{
  143. kFIRMessagingMessageIDKey : noTTLMessageID,
  144. @"hello" : @"world",
  145. };
  146. XCTAssertFalse([self.syncMessageManager didReceiveAPNSSyncMessage:noTTLMessage]);
  147. // Remove expired or finished sync messages.
  148. [self.syncMessageManager removeExpiredSyncMessages];
  149. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:unexpiredMessageID]);
  150. XCTAssertNil([self.rmqManager querySyncMessageWithRmqID:expiredMessageID]);
  151. XCTAssertNotNil([self.rmqManager querySyncMessageWithRmqID:noTTLMessageID]);
  152. }
  153. #endif // #if !(SWIFT_PACKAGE && TARGET_OS_TV)
  154. @end