|
|
@@ -61,4 +61,69 @@
|
|
|
}];
|
|
|
}
|
|
|
|
|
|
+/** Tests that synchronous observer registration works correctly and observers are immediately
|
|
|
+ * available. */
|
|
|
+- (void)testObservers_synchronousRegistrationAddsObserver {
|
|
|
+ NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
|
|
|
+ FPRTraceBackgroundActivityTracker *tracker = [[FPRTraceBackgroundActivityTracker alloc] init];
|
|
|
+ XCTAssertNotNil(tracker);
|
|
|
+
|
|
|
+ [notificationCenter postNotificationName:UIApplicationDidBecomeActiveNotification
|
|
|
+ object:[UIApplication sharedApplication]];
|
|
|
+ XCTAssertEqual(tracker.traceBackgroundState, FPRTraceStateForegroundOnly);
|
|
|
+
|
|
|
+ tracker = nil;
|
|
|
+ XCTAssertNil(tracker);
|
|
|
+ XCTAssertNoThrow([notificationCenter postNotificationName:UIApplicationDidBecomeActiveNotification
|
|
|
+ object:[UIApplication sharedApplication]]);
|
|
|
+ XCTAssertNoThrow([notificationCenter
|
|
|
+ postNotificationName:UIApplicationDidEnterBackgroundNotification
|
|
|
+ object:[UIApplication sharedApplication]]);
|
|
|
+}
|
|
|
+
|
|
|
+/** Tests rapid creation and deallocation to verify race condition. */
|
|
|
+- (void)testRapidCreationAndDeallocation_noRaceCondition {
|
|
|
+ for (int i = 0; i < 100; i++) {
|
|
|
+ @autoreleasepool {
|
|
|
+ FPRTraceBackgroundActivityTracker *tracker = [[FPRTraceBackgroundActivityTracker alloc] init];
|
|
|
+ XCTAssertNotNil(tracker);
|
|
|
+
|
|
|
+ [[NSNotificationCenter defaultCenter]
|
|
|
+ postNotificationName:UIApplicationDidBecomeActiveNotification
|
|
|
+ object:[UIApplication sharedApplication]];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ XCTAssertNoThrow([[NSNotificationCenter defaultCenter]
|
|
|
+ postNotificationName:UIApplicationDidBecomeActiveNotification
|
|
|
+ object:[UIApplication sharedApplication]]);
|
|
|
+ XCTAssertNoThrow([[NSNotificationCenter defaultCenter]
|
|
|
+ postNotificationName:UIApplicationDidEnterBackgroundNotification
|
|
|
+ object:[UIApplication sharedApplication]]);
|
|
|
+}
|
|
|
+
|
|
|
+/** Tests observer registration when created from background thread. */
|
|
|
+- (void)testObservers_registrationFromBackgroundThread {
|
|
|
+ XCTestExpectation *expectation = [self expectationWithDescription:@"Background thread creation"];
|
|
|
+
|
|
|
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
|
+ FPRTraceBackgroundActivityTracker *tracker = [[FPRTraceBackgroundActivityTracker alloc] init];
|
|
|
+ XCTAssertNotNil(tracker);
|
|
|
+
|
|
|
+ dispatch_async(dispatch_get_main_queue(), ^{
|
|
|
+ [[NSNotificationCenter defaultCenter]
|
|
|
+ postNotificationName:UIApplicationDidBecomeActiveNotification
|
|
|
+ object:[UIApplication sharedApplication]];
|
|
|
+
|
|
|
+ XCTAssertEqual(tracker.traceBackgroundState, FPRTraceStateForegroundOnly);
|
|
|
+ [expectation fulfill];
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ [self waitForExpectationsWithTimeout:5.0
|
|
|
+ handler:^(NSError *error) {
|
|
|
+ XCTAssertNil(error, @"Test timed out");
|
|
|
+ }];
|
|
|
+}
|
|
|
+
|
|
|
@end
|