这是indexloc提供的服务,不要输入任何密码
Skip to content
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## Unreleased

### Fixes

- Missing `mechanism.handled` is not considered crash (#3353)

## 8.14.1

### Fixes
Expand Down
6 changes: 3 additions & 3 deletions Sources/Sentry/SentryHub.m
Original file line number Diff line number Diff line change
Expand Up @@ -642,22 +642,22 @@ - (BOOL)envelopeContainsEventWithErrorOrHigher:(NSArray<SentryEnvelopeItem *> *)

SentryLevel level = sentryLevelForString(eventJson[@"level"]);
if (level >= kSentryLevelError) {
*handled = [self eventContainsUnhandledError:eventJson];
*handled = [self eventContainsOnlyHandledErrors:eventJson];
return YES;
}
}
}
return NO;
}

- (BOOL)eventContainsUnhandledError:(NSDictionary *)eventDictionary
- (BOOL)eventContainsOnlyHandledErrors:(NSDictionary *)eventDictionary
{
NSArray *exceptions = eventDictionary[@"exception"][@"values"];
for (NSDictionary *exception in exceptions) {
NSDictionary *mechanism = exception[@"mechanism"];
NSNumber *handled = mechanism[@"handled"];

if ([handled boolValue] == NO) {
if (handled != nil && [handled boolValue] == NO) {
return NO;
}
}
Expand Down
46 changes: 46 additions & 0 deletions Tests/SentryTests/SentryHubTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import Sentry
import SentryTestUtils
import XCTest

// swiftlint:disable file_length
class SentryHubTests: XCTestCase {

private static let dsnAsString = TestConstants.dsnAsString(username: "SentryHubTests")
Expand Down Expand Up @@ -656,6 +657,14 @@ class SentryHubTests: XCTestCase {
assertSessionWithIncrementedErrorCountedAdded()
}

func testCaptureEnvelope_WithEventWithoutExceptionMechanism() {
sut.startSession()

captureFatalEventWithoutExceptionMechanism()

assertSessionWithIncrementedErrorCountedAdded()
}

func testCaptureEnvelope_WithEventWithFatal() {
sut.startSession()

Expand Down Expand Up @@ -864,12 +873,49 @@ class SentryHubTests: XCTestCase {
group.wait()
}

func testEventContainsOnlyHandledErrors() {
let sut = fixture.getSut()
XCTAssertFalse(sut.eventContainsOnlyHandledErrors(["exception":
["values":
[["mechanism": ["handled": false]]]
]
]))

XCTAssertTrue(sut.eventContainsOnlyHandledErrors(["exception":
["values":
[["mechanism": ["handled": true]],
["mechanism": ["handled": true]]]
]
]))

XCTAssertFalse(sut.eventContainsOnlyHandledErrors(["exception":
["values":
[["mechanism": ["handled": true]],
["mechanism": ["handled": false]]]
]
]))

XCTAssertTrue(sut.eventContainsOnlyHandledErrors(["exception":
["values":
[["mechanism": ["handled": true]],
["mechanism": ["other-key": false]]]
]
]))
}

private func captureEventEnvelope(level: SentryLevel) {
let event = TestData.event
event.level = level
sut.capture(SentryEnvelope(event: event))
}

private func captureFatalEventWithoutExceptionMechanism() {
let event = TestData.event
event.level = SentryLevel.fatal
event.exceptions?[0].mechanism = nil
sut.capture(SentryEnvelope(event: event))
}

private func givenCrashedSession() {
fixture.sentryCrash.internalCrashedLastLaunch = true
fixture.fileManager.storeCrashedSession(fixture.crashedSession)
Expand Down
1 change: 1 addition & 0 deletions Tests/SentryTests/State/SentryHub+Test.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ SentryHub ()
- (NSArray<id<SentryIntegrationProtocol>> *)installedIntegrations;
- (NSSet<NSString *> *)installedIntegrationNames;

- (BOOL)eventContainsOnlyHandledErrors:(NSDictionary *)eventDictionary;
@end

NS_ASSUME_NONNULL_END