FIRMessagingTestUtilities.m 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. * Copyright 2019 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 "OCMock.h"
  17. #import "FirebaseMessaging/Tests/UnitTests/XCTestCase+FIRMessagingRmqManagerTests.h"
  18. #import "FirebaseMessaging/Tests/UnitTests/FIRMessagingTestUtilities.h"
  19. #import <GoogleUtilities/GULUserDefaults.h>
  20. #import "Firebase/InstanceID/Public/FirebaseInstanceID.h"
  21. #import "FirebaseInstallations/Source/Library/Private/FirebaseInstallationsInternal.h"
  22. #import "Interop/Analytics/Public/FIRAnalyticsInterop.h"
  23. #import "FirebaseMessaging/Sources/FIRMessagingPubSub.h"
  24. #import "FirebaseMessaging/Sources/FIRMessagingRmqManager.h"
  25. NS_ASSUME_NONNULL_BEGIN
  26. static NSString *const kFIRMessagingDefaultsTestDomain = @"com.messaging.tests";
  27. @interface FIRInstanceID (ExposedForTest)
  28. /// Private initializer to avoid singleton usage.
  29. - (FIRInstanceID *)initPrivately;
  30. /// Starts fetching and configuration of InstanceID. This is necessary after the `initPrivately`
  31. /// call.
  32. - (void)start;
  33. @end
  34. @interface FIRMessaging (ExposedForTest)
  35. @property(nonatomic, readwrite, strong) FIRMessagingPubSub *pubsub;
  36. @property(nonatomic, readwrite, strong) FIRMessagingRmqManager *rmq2Manager;
  37. /// Surface internal initializer to avoid singleton usage during tests.
  38. #pragma clang diagnostic push
  39. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  40. - (instancetype)initWithAnalytics:(nullable id<FIRAnalyticsInterop>)analytics
  41. withInstanceID:(FIRInstanceID *)instanceID
  42. withUserDefaults:(GULUserDefaults *)defaults;
  43. #pragma clang diagnostic pop
  44. /// Kicks off required calls for some messaging tests.
  45. - (void)start;
  46. - (void)setupRmqManager;
  47. @end
  48. @interface FIRMessagingRmqManager (ExposedForTest)
  49. - (void)removeDatabase;
  50. @end
  51. @implementation MockPendingTopicsListDelegate
  52. - (BOOL)pendingTopicsListCanRequestTopicUpdates:(FIRMessagingPendingTopicsList *)list {
  53. return self.isReady;
  54. }
  55. - (void)pendingTopicsList:(FIRMessagingPendingTopicsList *)list
  56. requestedUpdateForTopic:(NSString *)topic
  57. action:(FIRMessagingTopicAction)action
  58. completion:(FIRMessagingTopicOperationCompletion)completion {
  59. if (self.subscriptionHandler) {
  60. self.subscriptionHandler(topic, action, completion);
  61. }
  62. }
  63. - (void)pendingTopicsListDidUpdate:(FIRMessagingPendingTopicsList *)list {
  64. if (self.updateHandler) {
  65. self.updateHandler();
  66. }
  67. }
  68. @end
  69. @implementation FIRMessagingTestUtilities
  70. - (instancetype)initWithUserDefaults:(GULUserDefaults *)userDefaults
  71. withRMQManager:(BOOL)withRMQManager {
  72. self = [super init];
  73. if (self) {
  74. // `+[FIRInstallations installations]` supposed to be used on `-[FIRInstanceID start]` to get
  75. // `FIRInstallations` default instance. Need to stub it before.
  76. _mockInstallations = OCMClassMock([FIRInstallations class]);
  77. OCMStub([self.mockInstallations installations]).andReturn(self.mockInstallations);
  78. #pragma clang diagnostic push
  79. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  80. _instanceID = [[FIRInstanceID alloc] initPrivately];
  81. #pragma clang diagnostic pop
  82. [_instanceID start];
  83. // Create the messaging instance and call `start`.
  84. _messaging = [[FIRMessaging alloc] initWithAnalytics:nil
  85. withInstanceID:_instanceID
  86. withUserDefaults:userDefaults];
  87. if (withRMQManager) {
  88. [_messaging start];
  89. }
  90. _mockMessaging = OCMPartialMock(_messaging);
  91. if (!withRMQManager) {
  92. OCMStub([_mockMessaging setupRmqManager]).andDo(nil);
  93. [(FIRMessaging *)_mockMessaging start];
  94. }
  95. _mockInstanceID = OCMPartialMock(_instanceID);
  96. _mockPubsub = OCMPartialMock(_messaging.pubsub);
  97. }
  98. return self;
  99. }
  100. - (void)cleanupAfterTest:(XCTestCase *)testCase {
  101. [_messaging.rmq2Manager removeDatabase];
  102. [testCase waitForDrainDatabaseQueueForRmqManager:_messaging.rmq2Manager];
  103. [_messaging.messagingUserDefaults removePersistentDomainForName:kFIRMessagingDefaultsTestDomain];
  104. [_mockPubsub stopMocking];
  105. [_mockMessaging stopMocking];
  106. [_mockInstanceID stopMocking];
  107. }
  108. @end
  109. NS_ASSUME_NONNULL_END