Skip to content

Commit 1734d1b

Browse files
ref: Properly teardown frames tracker (#3545)
The teardown of the SentryFramesTracker didn't work properly in tests. The clearTestState method continuously initialized a new frames tracker cause it accessed the property dependency container. This is fixed now by calling SentryFramesTracker.stop directly in SentryDependencyContainer.reset which is also called in clearTestState. Furthermore, the SentryFramesTracker.stop now resets all frames and removes all observers.
1 parent 253f628 commit 1734d1b

6 files changed

Lines changed: 62 additions & 11 deletions

File tree

Sentry.xcodeproj/project.pbxproj

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
620379DD2AFE1432005AC0C1 /* SentryBuildAppStartSpans.m in Sources */ = {isa = PBXBuildFile; fileRef = 620379DC2AFE1432005AC0C1 /* SentryBuildAppStartSpans.m */; };
8080
622C08D829E546F4002571D4 /* SentryTraceOrigins.h in Headers */ = {isa = PBXBuildFile; fileRef = 622C08D729E546F4002571D4 /* SentryTraceOrigins.h */; };
8181
622C08DB29E554B9002571D4 /* SentrySpanContext+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 622C08D929E554B9002571D4 /* SentrySpanContext+Private.h */; };
82+
62375FB92B47F9F000CC55F1 /* SentryDependencyContainerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62375FB82B47F9F000CC55F1 /* SentryDependencyContainerTests.swift */; };
8283
623C45B02A651D8200D9E88B /* SentryCoreDataTracker+Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 623C45AF2A651D8200D9E88B /* SentryCoreDataTracker+Test.m */; };
8384
627E7589299F6FE40085504D /* SentryInternalDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = 627E7588299F6FE40085504D /* SentryInternalDefines.h */; };
8485
62862B1C2B1DDBC8009B16E3 /* SentryDelayedFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 62862B1B2B1DDBC8009B16E3 /* SentryDelayedFrame.h */; };
@@ -92,9 +93,9 @@
9293
62A456E52B0370E0003F19A1 /* SentryUIEventTrackerTransactionMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 62A456E42B0370E0003F19A1 /* SentryUIEventTrackerTransactionMode.m */; };
9394
62B86CFC29F052BB008F3947 /* SentryTestLogConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 62B86CFB29F052BB008F3947 /* SentryTestLogConfig.m */; };
9495
62C25C862B075F4900C68CBD /* TestOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62C25C852B075F4900C68CBD /* TestOptions.swift */; };
95-
62C3168B2B1F865A000D7031 /* SentryTimeSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62C3168A2B1F865A000D7031 /* SentryTimeSwiftTests.swift */; };
9696
62C316812B1F2E93000D7031 /* SentryDelayedFramesTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 62C316802B1F2E93000D7031 /* SentryDelayedFramesTracker.h */; };
9797
62C316832B1F2EA1000D7031 /* SentryDelayedFramesTracker.m in Sources */ = {isa = PBXBuildFile; fileRef = 62C316822B1F2EA1000D7031 /* SentryDelayedFramesTracker.m */; };
98+
62C3168B2B1F865A000D7031 /* SentryTimeSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62C3168A2B1F865A000D7031 /* SentryTimeSwiftTests.swift */; };
9899
62E081A929ED4260000F69FC /* SentryBreadcrumbDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 62E081A829ED4260000F69FC /* SentryBreadcrumbDelegate.h */; };
99100
62E081AB29ED4322000F69FC /* SentryBreadcrumbTestDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62E081AA29ED4322000F69FC /* SentryBreadcrumbTestDelegate.swift */; };
100101
62F226B729A37C120038080D /* SentryBooleanSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 62F226B629A37C120038080D /* SentryBooleanSerialization.m */; };
@@ -996,6 +997,7 @@
996997
620379DC2AFE1432005AC0C1 /* SentryBuildAppStartSpans.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SentryBuildAppStartSpans.m; sourceTree = "<group>"; };
997998
622C08D729E546F4002571D4 /* SentryTraceOrigins.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SentryTraceOrigins.h; path = include/SentryTraceOrigins.h; sourceTree = "<group>"; };
998999
622C08D929E554B9002571D4 /* SentrySpanContext+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "SentrySpanContext+Private.h"; path = "include/SentrySpanContext+Private.h"; sourceTree = "<group>"; };
1000+
62375FB82B47F9F000CC55F1 /* SentryDependencyContainerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryDependencyContainerTests.swift; sourceTree = "<group>"; };
9991001
623C45AE2A651C4500D9E88B /* SentryCoreDataTracker+Test.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SentryCoreDataTracker+Test.h"; sourceTree = "<group>"; };
10001002
623C45AF2A651D8200D9E88B /* SentryCoreDataTracker+Test.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "SentryCoreDataTracker+Test.m"; sourceTree = "<group>"; };
10011003
627E7588299F6FE40085504D /* SentryInternalDefines.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SentryInternalDefines.h; path = include/SentryInternalDefines.h; sourceTree = "<group>"; };
@@ -1009,9 +1011,9 @@
10091011
62A456E42B0370E0003F19A1 /* SentryUIEventTrackerTransactionMode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SentryUIEventTrackerTransactionMode.m; sourceTree = "<group>"; };
10101012
62B86CFB29F052BB008F3947 /* SentryTestLogConfig.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SentryTestLogConfig.m; sourceTree = "<group>"; };
10111013
62C25C852B075F4900C68CBD /* TestOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestOptions.swift; sourceTree = "<group>"; };
1012-
62C3168A2B1F865A000D7031 /* SentryTimeSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryTimeSwiftTests.swift; sourceTree = "<group>"; };
10131014
62C316802B1F2E93000D7031 /* SentryDelayedFramesTracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SentryDelayedFramesTracker.h; path = include/SentryDelayedFramesTracker.h; sourceTree = "<group>"; };
10141015
62C316822B1F2EA1000D7031 /* SentryDelayedFramesTracker.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SentryDelayedFramesTracker.m; sourceTree = "<group>"; };
1016+
62C3168A2B1F865A000D7031 /* SentryTimeSwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryTimeSwiftTests.swift; sourceTree = "<group>"; };
10151017
62E081A829ED4260000F69FC /* SentryBreadcrumbDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SentryBreadcrumbDelegate.h; path = include/SentryBreadcrumbDelegate.h; sourceTree = "<group>"; };
10161018
62E081AA29ED4322000F69FC /* SentryBreadcrumbTestDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryBreadcrumbTestDelegate.swift; sourceTree = "<group>"; };
10171019
62F226B629A37C120038080D /* SentryBooleanSerialization.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SentryBooleanSerialization.m; sourceTree = "<group>"; };
@@ -2866,6 +2868,7 @@
28662868
8431EE5A29ADB8EA00D8DC56 /* SentryTimeTests.m */,
28672869
62C3168A2B1F865A000D7031 /* SentryTimeSwiftTests.swift */,
28682870
33042A1629DC2C4300C60085 /* SentryExtraContextProviderTests.swift */,
2871+
62375FB82B47F9F000CC55F1 /* SentryDependencyContainerTests.swift */,
28692872
);
28702873
path = Helper;
28712874
sourceTree = "<group>";
@@ -4460,6 +4463,7 @@
44604463
7B18DE4A28DA0C8B004845C6 /* SentryNSNotificationCenterWrapperTests.swift in Sources */,
44614464
7BEFB044270B0F630025F808 /* SentryTracerObjCTests.m in Sources */,
44624465
7B0002322477F0520035FEF1 /* SentrySessionTests.m in Sources */,
4466+
62375FB92B47F9F000CC55F1 /* SentryDependencyContainerTests.swift in Sources */,
44634467
7BC6EC08255C36DE0059822A /* SentryStacktraceTests.swift in Sources */,
44644468
D88817DD26D72BA500BF2251 /* SentryTraceStateTests.swift in Sources */,
44654469
7B26BBFB24C0A66D00A79CCC /* SentrySdkInfoNilTests.m in Sources */,

SentryTestUtils/ClearTestState.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,6 @@ class TestCleanup: NSObject {
2626
setTestDefaultLogLevel()
2727

2828
#if os(iOS) || os(tvOS) || targetEnvironment(macCatalyst)
29-
let framesTracker = SentryDependencyContainer.sharedInstance().framesTracker
30-
framesTracker.stop()
31-
framesTracker.resetFrames()
3229

3330
setenv("ActivePrewarm", "0", 1)
3431
SentryAppStartTracker.load()

Sources/Sentry/SentryDependencyContainer.m

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,16 @@ + (instancetype)sharedInstance
6363

6464
+ (void)reset
6565
{
66-
#if !TARGET_OS_WATCH
6766
if (instance) {
67+
#if !TARGET_OS_WATCH
6868
[instance->_reachability removeAllObservers];
69-
}
7069
#endif // !TARGET_OS_WATCH
7170

71+
#if SENTRY_HAS_UIKIT
72+
[instance->_framesTracker stop];
73+
#endif // SENTRY_HAS_UIKIT
74+
}
75+
7276
instance = [[SentryDependencyContainer alloc] init];
7377
}
7478

Sources/Sentry/SentryFramesTracker.m

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ - (void)setDisplayLinkWrapper:(SentryDisplayLinkWrapper *)displayLinkWrapper
8383
_displayLinkWrapper = displayLinkWrapper;
8484
}
8585

86-
/** Internal for testing */
8786
- (void)resetFrames
8887
{
8988
_totalFrames = 0;
@@ -277,6 +276,9 @@ - (void)stop
277276
_isRunning = NO;
278277
[self.displayLinkWrapper invalidate];
279278
[self.delayedFramesTracker resetDelayedFramesTimeStamps];
279+
@synchronized(self.listeners) {
280+
[self.listeners removeAllObjects];
281+
}
280282
}
281283

282284
- (void)dealloc
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import Nimble
2+
import XCTest
3+
4+
#if os(iOS) || os(tvOS) || targetEnvironment(macCatalyst)
5+
final class SentryDependencyContainerTests: XCTestCase {
6+
7+
func testReset_CallsFramesTrackerStop() throws {
8+
let framesTracker = SentryDependencyContainer.sharedInstance().framesTracker
9+
framesTracker.start()
10+
SentryDependencyContainer.reset()
11+
12+
expect(framesTracker.isRunning) == false
13+
}
14+
}
15+
#endif

Tests/SentryTests/Integrations/Performance/FramesTracking/SentryFramesTrackerTests.swift

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,19 @@ class SentryFramesTrackerTests: XCTestCase {
6969
expect(self.fixture.sut.isRunning) == false
7070
}
7171

72+
func testKeepFrames_WhenStopped() throws {
73+
let sut = fixture.sut
74+
sut.start()
75+
76+
let displayLink = fixture.displayLinkWrapper
77+
displayLink.call()
78+
displayLink.normalFrame()
79+
80+
sut.stop()
81+
82+
try assert(slow: 0, frozen: 0, total: 1)
83+
}
84+
7285
func testStartAfterStopped_SubscribesTwiceToDisplayLink() {
7386
let sut = fixture.sut
7487
sut.start()
@@ -550,6 +563,22 @@ class SentryFramesTrackerTests: XCTestCase {
550563

551564
expect(listener.newFrameInvocations.count) == 0
552565
}
566+
567+
func testListenerNotCalledAfterCallingStop() {
568+
let sut = fixture.sut
569+
let listener1 = FrameTrackerListener()
570+
let listener2 = FrameTrackerListener()
571+
sut.start()
572+
sut.add(listener1)
573+
sut.stop()
574+
sut.start()
575+
sut.add(listener2)
576+
577+
fixture.displayLinkWrapper.normalFrame()
578+
579+
expect(listener1.newFrameInvocations.count) == 0
580+
expect(listener2.newFrameInvocations.count) == 1
581+
}
553582

554583
func testReleasedListener() {
555584
let sut = fixture.sut
@@ -617,13 +646,13 @@ private extension SentryFramesTrackerTests {
617646
func assert(slow: UInt? = nil, frozen: UInt? = nil, total: UInt? = nil, frameRates: UInt? = nil) throws {
618647
let currentFrames = fixture.sut.currentFrames
619648
if let total = total {
620-
XCTAssertEqual(total, currentFrames.total)
649+
expect(currentFrames.total) == total
621650
}
622651
if let slow = slow {
623-
XCTAssertEqual(slow, currentFrames.slow)
652+
expect(currentFrames.slow) == slow
624653
}
625654
if let frozen = frozen {
626-
XCTAssertEqual(frozen, currentFrames.frozen)
655+
expect(currentFrames.frozen) == frozen
627656
}
628657

629658
#if os(iOS) || os(macOS) || targetEnvironment(macCatalyst)

0 commit comments

Comments
 (0)