FIRMessagingHandlingTest.m 9.8 KB

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