FPRSessionManagerTest.m 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // Copyright 2020 Google LLC
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #import <XCTest/XCTest.h>
  15. #import "FirebasePerformance/Sources/AppActivity/FPRSessionManager+Private.h"
  16. #import "FirebasePerformance/Sources/AppActivity/FPRSessionManager.h"
  17. #import "FirebasePerformance/Sources/Configurations/FPRConfigurations+Private.h"
  18. #import <OCMock/OCMock.h>
  19. @interface FPRSessionManagerTest : XCTestCase
  20. @end
  21. @implementation FPRSessionManagerTest
  22. /** Validate the instance gets created and it is a singleton. */
  23. - (void)testInstanceCreation {
  24. FPRSessionManager *instance = [FPRSessionManager sharedInstance];
  25. XCTAssertNotNil(instance);
  26. XCTAssertEqual(instance, [FPRSessionManager sharedInstance]);
  27. }
  28. /** Validate that valid sessionId always exists. */
  29. - (void)testSessionIdExistance {
  30. FPRSessionManager *instance = [FPRSessionManager sharedInstance];
  31. [instance startTrackingAppStateChanges];
  32. NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
  33. [notificationCenter postNotificationName:UIApplicationWillEnterForegroundNotification
  34. object:[UIApplication sharedApplication]];
  35. XCTAssertNotNil(instance.sessionDetails.sessionId);
  36. NSString *lowercaseSessionId = [instance.sessionDetails.sessionId lowercaseString];
  37. XCTAssertEqualObjects(lowercaseSessionId, instance.sessionDetails.sessionId);
  38. }
  39. /** Validate that sessionId does not change when calling renew method immediately. */
  40. - (void)testSessionIdNotGettingRenewed {
  41. FPRSessionManager *instance = [FPRSessionManager sharedInstance];
  42. [instance startTrackingAppStateChanges];
  43. NSString *sessionId = instance.sessionDetails.sessionId;
  44. [instance renewSessionIdIfRunningTooLong];
  45. XCTAssertEqualObjects(sessionId, instance.sessionDetails.sessionId);
  46. }
  47. /** Validate that sessionId changes on application state changes. */
  48. - (void)testSessionIdUpdation {
  49. FPRSessionManager *instance = [FPRSessionManager sharedInstance];
  50. [instance startTrackingAppStateChanges];
  51. NSString *sessionId = instance.sessionDetails.sessionId;
  52. NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
  53. [notificationCenter postNotificationName:UIApplicationWillEnterForegroundNotification
  54. object:[UIApplication sharedApplication]];
  55. XCTAssertNotEqual(sessionId, instance.sessionDetails.sessionId);
  56. }
  57. /** Validate that sessionId changes sends notifications. */
  58. - (void)testSessionIdUpdationThrowsNotification {
  59. FPRSessionManager *instance = [FPRSessionManager sharedInstance];
  60. [instance startTrackingAppStateChanges];
  61. NSString *sessionId = instance.sessionDetails.sessionId;
  62. __block BOOL receivedNotification = NO;
  63. [instance.sessionNotificationCenter addObserverForName:kFPRSessionIdUpdatedNotification
  64. object:instance
  65. queue:[NSOperationQueue mainQueue]
  66. usingBlock:^(NSNotification *note) {
  67. receivedNotification = YES;
  68. }];
  69. NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
  70. [notificationCenter postNotificationName:UIApplicationWillEnterForegroundNotification
  71. object:[UIApplication sharedApplication]];
  72. XCTAssertTrue(receivedNotification);
  73. XCTAssertNotEqual(sessionId, instance.sessionDetails.sessionId);
  74. }
  75. /** Validate that sessionId changes sends notifications with the session details. */
  76. - (void)testSessionIdUpdationSendsNotificationWithSessionDetails {
  77. FPRSessionManager *instance = [FPRSessionManager sharedInstance];
  78. [instance startTrackingAppStateChanges];
  79. NSString *sessionId = instance.sessionDetails.sessionId;
  80. __block BOOL containsSessionDetails = NO;
  81. __block FPRSessionDetails *updatedSessionDetails = nil;
  82. [instance.sessionNotificationCenter
  83. addObserverForName:kFPRSessionIdUpdatedNotification
  84. object:instance
  85. queue:[NSOperationQueue mainQueue]
  86. usingBlock:^(NSNotification *note) {
  87. NSDictionary<NSString *, FPRSessionDetails *> *userInfo = note.userInfo;
  88. FPRSessionDetails *sessionDetails =
  89. [userInfo valueForKey:kFPRSessionIdNotificationKey];
  90. if (sessionDetails != nil) {
  91. containsSessionDetails = YES;
  92. updatedSessionDetails = sessionDetails;
  93. }
  94. }];
  95. NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
  96. [notificationCenter postNotificationName:UIApplicationWillEnterForegroundNotification
  97. object:[UIApplication sharedApplication]];
  98. XCTAssertTrue(containsSessionDetails);
  99. XCTAssertNotEqual(sessionId, instance.sessionDetails.sessionId);
  100. XCTAssertEqual(updatedSessionDetails.sessionId, instance.sessionDetails.sessionId);
  101. }
  102. @end