FIRMessagingHandlingTest.m 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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 <OCMock/OCMock.h>
  18. #import <GoogleUtilities/GULUserDefaults.h>
  19. #import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h"
  20. #import "FirebaseMessaging/Sources/Public/FirebaseMessaging/FIRMessaging.h"
  21. #import "Interop/Analytics/Public/FIRAnalyticsInterop.h"
  22. #import "FirebaseMessaging/Sources/FIRMessagingAnalytics.h"
  23. #import "FirebaseMessaging/Sources/FIRMessagingRmqManager.h"
  24. #import "FirebaseMessaging/Sources/FIRMessagingSyncMessageManager.h"
  25. #import "FirebaseMessaging/Sources/FIRMessaging_Private.h"
  26. #import "FirebaseMessaging/Tests/UnitTests/FIRMessagingTestUtilities.h"
  27. extern NSString *const kFIRMessagingFCMTokenFetchAPNSOption;
  28. @interface FIRMessaging ()
  29. @property(nonatomic, readwrite, strong) NSString *defaultFcmToken;
  30. - (BOOL)handleContextManagerMessage:(NSDictionary *)message;
  31. - (void)handleIncomingLinkIfNeededFromMessage:(NSDictionary *)message;
  32. @end
  33. /*
  34. * This class checks if we handle the received message properly
  35. * based on each type of messages. Checks include duplicate message handling,
  36. * analytics logging, etc.
  37. */
  38. @interface FIRMessagingHandlingTest : XCTestCase
  39. @property(nonatomic, strong) FIRMessagingAnalytics *messageAnalytics;
  40. @property(nonatomic, strong) id mockFirebaseApp;
  41. @property(nonatomic, strong) id mockMessagingAnalytics;
  42. @property(nonatomic, strong) FIRMessagingTestUtilities *testUtil;
  43. @end
  44. @implementation FIRMessagingHandlingTest
  45. - (void)setUp {
  46. [super setUp];
  47. // Create the messaging instance with all the necessary dependencies.
  48. NSUserDefaults *defaults =
  49. [[NSUserDefaults alloc] initWithSuiteName:kFIRMessagingDefaultsTestDomain];
  50. _testUtil = [[FIRMessagingTestUtilities alloc] initWithUserDefaults:defaults withRMQManager:YES];
  51. _mockFirebaseApp = OCMClassMock([FIRApp class]);
  52. OCMStub([_mockFirebaseApp defaultApp]).andReturn(_mockFirebaseApp);
  53. [[NSUserDefaults standardUserDefaults]
  54. removePersistentDomainForName:[NSBundle mainBundle].bundleIdentifier];
  55. _mockMessagingAnalytics = OCMClassMock([FIRMessagingAnalytics class]);
  56. }
  57. - (void)tearDown {
  58. [_testUtil cleanupAfterTest:self];
  59. [_mockMessagingAnalytics stopMocking];
  60. [_mockFirebaseApp stopMocking];
  61. [super tearDown];
  62. }
  63. - (void)testEmptyNotification {
  64. XCTAssertEqualObjects(@(FIRMessagingMessageStatusUnknown),
  65. @([_testUtil.mockMessaging appDidReceiveMessage:@{}].status));
  66. }
  67. - (void)testAPNSDisplayNotification {
  68. NSDictionary *notificationPayload = @{
  69. @"aps" : @{
  70. @"alert" : @{
  71. @"body" : @"body of notification",
  72. @"title" : @"title of notification",
  73. }
  74. },
  75. @"gcm.message_id" : @"1566515013484879",
  76. @"gcm.n.e" : @1,
  77. @"google.c.a.c_id" : @"7379928225816991517",
  78. @"google.c.a.e" : @1,
  79. @"google.c.a.ts" : @1566515009,
  80. @"google.c.a.udt" : @0
  81. };
  82. OCMExpect([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]);
  83. OCMExpect([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]);
  84. OCMExpect([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]);
  85. XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew),
  86. @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status));
  87. OCMVerifyAll(_testUtil.mockMessaging);
  88. OCMReject([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]);
  89. OCMReject([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]);
  90. OCMReject([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]);
  91. XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew),
  92. @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status));
  93. OCMVerifyAll(_testUtil.mockMessaging);
  94. }
  95. - (void)testAPNSContentAvailableNotification {
  96. NSDictionary *notificationPayload = @{
  97. @"aps" : @{@"content-available" : @1},
  98. @"gcm.message_id" : @"1566513591299872",
  99. @"image" : @"bunny.png",
  100. @"google.c.a.e" : @1
  101. };
  102. OCMExpect([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]);
  103. OCMExpect([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]);
  104. OCMExpect([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]);
  105. XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew),
  106. @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status));
  107. OCMVerifyAll(_testUtil.mockMessaging);
  108. OCMReject([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]);
  109. OCMReject([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]);
  110. OCMReject([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]);
  111. XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew),
  112. @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status));
  113. OCMVerifyAll(_testUtil.mockMessaging);
  114. }
  115. - (void)testAPNSContentAvailableContextualNotification {
  116. NSDictionary *notificationPayload = @{
  117. @"aps" : @{@"content-available" : @1},
  118. @"gcm.message_id" : @"1566515531287827",
  119. @"gcm.n.e" : @1,
  120. @"gcm.notification.body" : @"Local time zone message!",
  121. @"gcm.notification.title" : @"Hello",
  122. @"gcms" : @"gcm.gmsproc.cm",
  123. @"google.c.a.c_id" : @"5941428497527920876",
  124. @"google.c.a.e" : @1,
  125. @"google.c.a.ts" : @1566565920,
  126. @"google.c.a.udt" : @1,
  127. @"google.c.cm.cat" : @"com.google.firebase.messaging.testapp.dev",
  128. @"google.c.cm.lt_end" : @"2019-09-20 13:12:00",
  129. @"google.c.cm.lt_start" : @"2019-08-23 13:12:00",
  130. };
  131. OCMExpect([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]);
  132. OCMExpect([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]);
  133. OCMExpect([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]);
  134. XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew),
  135. @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status));
  136. OCMVerifyAll(_testUtil.mockMessaging);
  137. OCMReject([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]);
  138. OCMReject([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]);
  139. OCMReject([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]);
  140. XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew),
  141. @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status));
  142. OCMVerifyAll(_testUtil.mockMessaging);
  143. }
  144. - (void)testContextualLocalNotification {
  145. NSDictionary *notificationPayload = @{
  146. @"gcm.message_id" : @"1566515531281975",
  147. @"gcm.n.e" : @1,
  148. @"gcm.notification.body" : @"Local time zone message!",
  149. @"gcm.notification.title" : @"Hello",
  150. @"gcms" : @"gcm.gmsproc.cm",
  151. @"google.c.a.c_id" : @"5941428497527920876",
  152. @"google.c.a.e" : @1,
  153. @"google.c.a.ts" : @1566565920,
  154. @"google.c.a.udt" : @1,
  155. };
  156. OCMExpect([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]);
  157. OCMExpect([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]);
  158. OCMExpect([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]);
  159. XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew),
  160. @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status));
  161. OCMVerifyAll(_testUtil.mockMessaging);
  162. OCMReject([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]);
  163. OCMReject([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]);
  164. OCMReject([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]);
  165. XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew),
  166. @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status));
  167. OCMVerifyAll(_testUtil.mockMessaging);
  168. }
  169. - (void)testMCSNotification {
  170. NSDictionary *notificationPayload = @{@"from" : @"35006771263", @"image" : @"bunny.png"};
  171. OCMExpect([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]);
  172. OCMExpect([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]);
  173. OCMExpect([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]);
  174. XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew),
  175. @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status));
  176. OCMVerifyAll(_testUtil.mockMessaging);
  177. OCMExpect([_testUtil.mockMessaging handleContextManagerMessage:notificationPayload]);
  178. OCMExpect([_testUtil.mockMessaging handleIncomingLinkIfNeededFromMessage:notificationPayload]);
  179. OCMExpect([_mockMessagingAnalytics logMessage:notificationPayload toAnalytics:[OCMArg any]]);
  180. XCTAssertEqualObjects(@(FIRMessagingMessageStatusNew),
  181. @([_testUtil.messaging appDidReceiveMessage:notificationPayload].status));
  182. OCMVerifyAll(_testUtil.mockMessaging);
  183. }
  184. @end