diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f6ca4b08dc..47db1c614c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## Unreleased + +### Fixes + +- Core data span status with error (#2439) + ## 7.31.2 ### Fixes diff --git a/Sources/Sentry/SentryCoreDataTracker.m b/Sources/Sentry/SentryCoreDataTracker.m index ef592ff7842..98567e4a56d 100644 --- a/Sources/Sentry/SentryCoreDataTracker.m +++ b/Sources/Sentry/SentryCoreDataTracker.m @@ -50,7 +50,7 @@ - (NSArray *)managedObjectContext:(NSManagedObjectContext *)context [fetchSpan setDataValue:[NSNumber numberWithInteger:result.count] forKey:@"read_count"]; [fetchSpan - finishWithStatus:error != nil ? kSentrySpanStatusInternalError : kSentrySpanStatusOk]; + finishWithStatus:result == nil ? kSentrySpanStatusInternalError : kSentrySpanStatusOk]; SENTRY_LOG_DEBUG(@"SentryCoreDataTracker automatically finished span with status: %@", error == nil ? @"ok" : @"error"); @@ -91,8 +91,7 @@ - (BOOL)managedObjectContext:(NSManagedObjectContext *)context BOOL result = original(error); if (fetchSpan) { - [fetchSpan - finishWithStatus:*error != nil ? kSentrySpanStatusInternalError : kSentrySpanStatusOk]; + [fetchSpan finishWithStatus:result ? kSentrySpanStatusOk : kSentrySpanStatusInternalError]; SENTRY_LOG_DEBUG(@"SentryCoreDataTracker automatically finished span with status: %@", *error == nil ? @"ok" : @"error"); diff --git a/Tests/SentryTests/ClearTestState.swift b/Tests/SentryTests/ClearTestState.swift index 02db84e1294..60b77d8f4a9 100644 --- a/Tests/SentryTests/ClearTestState.swift +++ b/Tests/SentryTests/ClearTestState.swift @@ -2,27 +2,34 @@ import Foundation import Sentry func clearTestState() { - SentrySDK.close() - SentrySDK.setCurrentHub(nil) - SentrySDK.crashedLastRunCalled = false - SentrySDK.startInvocations = 0 - - PrivateSentrySDKOnly.onAppStartMeasurementAvailable = nil - PrivateSentrySDKOnly.appStartMeasurementHybridSDKMode = false - SentrySDK.setAppStartMeasurement(nil) - CurrentDate.setCurrentDateProvider(nil) - SentryNetworkTracker.sharedInstance.disable() - - #if os(iOS) || os(tvOS) || targetEnvironment(macCatalyst) - let framesTracker = SentryFramesTracker.sharedInstance() - framesTracker.stop() - framesTracker.resetFrames() - - setenv("ActivePrewarm", "0", 1) - SentryAppStartTracker.load() - #endif - - SentryDependencyContainer.reset() - Dynamic(SentryGlobalEventProcessor.shared()).removeAllProcessors() - SentrySwizzleWrapper.sharedInstance.removeAllCallbacks() + TestCleanup.clearTestState() +} + +@objcMembers +class TestCleanup: NSObject { + static func clearTestState() { + SentrySDK.close() + SentrySDK.setCurrentHub(nil) + SentrySDK.crashedLastRunCalled = false + SentrySDK.startInvocations = 0 + + PrivateSentrySDKOnly.onAppStartMeasurementAvailable = nil + PrivateSentrySDKOnly.appStartMeasurementHybridSDKMode = false + SentrySDK.setAppStartMeasurement(nil) + CurrentDate.setCurrentDateProvider(nil) + SentryNetworkTracker.sharedInstance.disable() + + #if os(iOS) || os(tvOS) || targetEnvironment(macCatalyst) + let framesTracker = SentryFramesTracker.sharedInstance() + framesTracker.stop() + framesTracker.resetFrames() + + setenv("ActivePrewarm", "0", 1) + SentryAppStartTracker.load() + #endif + + SentryDependencyContainer.reset() + Dynamic(SentryGlobalEventProcessor.shared()).removeAllProcessors() + SentrySwizzleWrapper.sharedInstance.removeAllCallbacks() + } } diff --git a/Tests/SentryTests/Integrations/Performance/CoreData/SentryCoreDataTrackerTest.swift b/Tests/SentryTests/Integrations/Performance/CoreData/SentryCoreDataTrackerTest.swift index 66303f720c2..3a3e0ff8519 100644 --- a/Tests/SentryTests/Integrations/Performance/CoreData/SentryCoreDataTrackerTest.swift +++ b/Tests/SentryTests/Integrations/Performance/CoreData/SentryCoreDataTrackerTest.swift @@ -188,6 +188,34 @@ class SentryCoreDataTrackerTests: XCTestCase { XCTAssertEqual(updated["SecondTestEntity"] as? Int, 2) } + func test_Request_with_Error() { + let fetch = NSFetchRequest(entityName: "TestEntity") + + let transaction = startTransaction() + let sut = fixture.getSut() + + let context = fixture.context + + let _ = try? sut.fetchManagedObjectContext(context, request: fetch) { _, _ in + return nil + } + + XCTAssertEqual(transaction.children.count, 1) + XCTAssertEqual(transaction.children[0].context.status, .internalError) + } + + func test_save_with_Error() { + let transaction = startTransaction() + let sut = fixture.getSut() + fixture.context.inserted = [fixture.testEntity()] + try? sut.saveManagedObjectContext(fixture.context) { _ in + return false + } + + XCTAssertEqual(transaction.children.count, 1) + XCTAssertEqual(transaction.children[0].context.status, .internalError) + } + func test_Save_NoChanges() { let sut = fixture.getSut()