diff --git a/CHANGELOG.md b/CHANGELOG.md index 18b276958e..c38892c7c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,9 @@ - Older self-hosted sentry instances will drop transactions containing unfinished spans. - This change was introduced in [relay/#1690](https://github.com/getsentry/relay/pull/1690) and released with [22.12.0](https://github.com/getsentry/relay/releases/tag/22.12.0) - Do not leak extensions of external classes ([#1576](https://github.com/getsentry/sentry-dart/pull/1576)) - +- Make `hint` non-nullable in `BeforeSendCallback`, `BeforeBreadcrumbCall` and `EventProcessor` ([#1574](https://github.com/getsentry/sentry-dart/pull/1574)) + - This will affect your callbacks, making this a breaking change. + ## Unreleased ### Fixes diff --git a/dart/example/bin/example.dart b/dart/example/bin/example.dart index 5163f341f7..d7530f5874 100644 --- a/dart/example/bin/example.dart +++ b/dart/example/bin/example.dart @@ -104,7 +104,7 @@ Future decode() async { class TagEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {hint}) { + SentryEvent? apply(SentryEvent event, hint) { return event..tags?.addAll({'page-locale': 'en-us'}); } } diff --git a/dart/example_web/web/main.dart b/dart/example_web/web/main.dart index c396be5e83..3034effe9b 100644 --- a/dart/example_web/web/main.dart +++ b/dart/example_web/web/main.dart @@ -129,7 +129,7 @@ Future parseData() async { class TagEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { return event..tags?.addAll({'page-locale': 'en-us'}); } } diff --git a/dart/lib/src/event_processor.dart b/dart/lib/src/event_processor.dart index 94fcd77fd8..45005d7b0e 100644 --- a/dart/lib/src/event_processor.dart +++ b/dart/lib/src/event_processor.dart @@ -8,7 +8,7 @@ import 'protocol.dart'; /// null in case the event will be dropped and not sent. abstract class EventProcessor { FutureOr apply( - SentryEvent event, { - Hint? hint, - }); + SentryEvent event, + Hint hint, + ); } diff --git a/dart/lib/src/event_processor/deduplication_event_processor.dart b/dart/lib/src/event_processor/deduplication_event_processor.dart index 5c3bd4606e..8706082cf5 100644 --- a/dart/lib/src/event_processor/deduplication_event_processor.dart +++ b/dart/lib/src/event_processor/deduplication_event_processor.dart @@ -26,7 +26,7 @@ class DeduplicationEventProcessor implements EventProcessor { final SentryOptions _options; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { if (event is SentryTransaction) { return event; } diff --git a/dart/lib/src/event_processor/enricher/io_enricher_event_processor.dart b/dart/lib/src/event_processor/enricher/io_enricher_event_processor.dart index 03623d7f0b..93d2514bfa 100644 --- a/dart/lib/src/event_processor/enricher/io_enricher_event_processor.dart +++ b/dart/lib/src/event_processor/enricher/io_enricher_event_processor.dart @@ -18,7 +18,7 @@ class IoEnricherEventProcessor implements EnricherEventProcessor { final SentryOptions _options; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { // If there's a native integration available, it probably has better // information available than Flutter. diff --git a/dart/lib/src/event_processor/enricher/web_enricher_event_processor.dart b/dart/lib/src/event_processor/enricher/web_enricher_event_processor.dart index fe2684d593..4c992b966d 100644 --- a/dart/lib/src/event_processor/enricher/web_enricher_event_processor.dart +++ b/dart/lib/src/event_processor/enricher/web_enricher_event_processor.dart @@ -21,7 +21,7 @@ class WebEnricherEventProcessor implements EnricherEventProcessor { final SentryOptions _options; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { // Web has no native integration, so no need to check for it final contexts = event.contexts.copyWith( diff --git a/dart/lib/src/event_processor/exception/io_exception_event_processor.dart b/dart/lib/src/event_processor/exception/io_exception_event_processor.dart index 0f7763f35e..bb4049c00e 100644 --- a/dart/lib/src/event_processor/exception/io_exception_event_processor.dart +++ b/dart/lib/src/event_processor/exception/io_exception_event_processor.dart @@ -14,7 +14,7 @@ class IoExceptionEventProcessor implements ExceptionEventProcessor { final SentryOptions _options; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { final throwable = event.throwable; if (throwable is HttpException) { return _applyHttpException(throwable, event); diff --git a/dart/lib/src/event_processor/exception/web_exception_event_processor.dart b/dart/lib/src/event_processor/exception/web_exception_event_processor.dart index ad57c9f5c2..6ce3be0fe0 100644 --- a/dart/lib/src/event_processor/exception/web_exception_event_processor.dart +++ b/dart/lib/src/event_processor/exception/web_exception_event_processor.dart @@ -8,5 +8,5 @@ ExceptionEventProcessor exceptionEventProcessor(SentryOptions _) => class WebExcptionEventProcessor implements ExceptionEventProcessor { @override - SentryEvent apply(SentryEvent event, {Hint? hint}) => event; + SentryEvent apply(SentryEvent event, Hint hint) => event; } diff --git a/dart/lib/src/hint.dart b/dart/lib/src/hint.dart index 87620d7ba1..f14f69d5dc 100644 --- a/dart/lib/src/hint.dart +++ b/dart/lib/src/hint.dart @@ -11,8 +11,8 @@ import 'sentry_attachment/sentry_attachment.dart'; /// Example: /// /// ```dart -/// options.beforeSend = (event, {hint}) { -/// final syntheticException = hint?.get(TypeCheckHint.syntheticException); +/// options.beforeSend = (event, hint) { +/// final syntheticException = hint.get(TypeCheckHint.syntheticException); /// if (syntheticException is FlutterErrorDetails) { /// // Do something with hint data /// } @@ -28,14 +28,14 @@ import 'sentry_attachment/sentry_attachment.dart'; /// ```dart /// import 'dart:convert'; /// -/// options.beforeSend = (event, {hint}) { +/// options.beforeSend = (event, hint) { /// final text = 'This event should not be sent happen in prod. Investigate.'; /// final textAttachment = SentryAttachment.fromIntList( /// utf8.encode(text), /// 'event_info.txt', /// contentType: 'text/plain', /// ); -/// hint?.attachments.add(textAttachment); +/// hint.attachments.add(textAttachment); /// return event; /// }; /// ``` diff --git a/dart/lib/src/scope.dart b/dart/lib/src/scope.dart index f9cb3796aa..bbe8bb54d5 100644 --- a/dart/lib/src/scope.dart +++ b/dart/lib/src/scope.dart @@ -143,7 +143,7 @@ class Scope { Scope(this._options); - Breadcrumb? _addBreadCrumbSync(Breadcrumb breadcrumb, {Hint? hint}) { + Breadcrumb? _addBreadCrumbSync(Breadcrumb breadcrumb, Hint hint) { // bail out if maxBreadcrumbs is zero if (_options.maxBreadcrumbs == 0) { return null; @@ -155,7 +155,7 @@ class Scope { try { processedBreadcrumb = _options.beforeBreadcrumb!( processedBreadcrumb, - hint: hint, + hint, ); if (processedBreadcrumb == null) { _options.logger( @@ -189,7 +189,7 @@ class Scope { /// Adds a breadcrumb to the breadcrumbs queue Future addBreadcrumb(Breadcrumb breadcrumb, {Hint? hint}) async { - final addedBreadcrumb = _addBreadCrumbSync(breadcrumb, hint: hint); + final addedBreadcrumb = _addBreadCrumbSync(breadcrumb, hint ?? Hint()); if (addedBreadcrumb != null) { await _callScopeObservers((scopeObserver) async => await scopeObserver.addBreadcrumb(addedBreadcrumb)); @@ -275,9 +275,9 @@ class Scope { } Future applyToEvent( - SentryEvent event, { - Hint? hint, - }) async { + SentryEvent event, + Hint hint, + ) async { event = event.copyWith( transaction: event.transaction ?? transaction, user: _mergeUsers(user, event.user), @@ -320,7 +320,7 @@ class Scope { SentryEvent? processedEvent = event; for (final processor in _eventProcessors) { try { - final e = processor.apply(processedEvent!, hint: hint); + final e = processor.apply(processedEvent!, hint); if (e is Future) { processedEvent = await e; } else { @@ -429,7 +429,7 @@ class Scope { } for (final breadcrumb in List.from(_breadcrumbs)) { - clone._addBreadCrumbSync(breadcrumb); + clone._addBreadCrumbSync(breadcrumb, Hint()); } for (final eventProcessor in List.from(_eventProcessors)) { diff --git a/dart/lib/src/sentry_client.dart b/dart/lib/src/sentry_client.dart index 09f98e4d02..5821ae6f63 100644 --- a/dart/lib/src/sentry_client.dart +++ b/dart/lib/src/sentry_client.dart @@ -76,7 +76,7 @@ class SentryClient { hint ??= Hint(); if (scope != null) { - preparedEvent = await scope.applyToEvent(preparedEvent, hint: hint); + preparedEvent = await scope.applyToEvent(preparedEvent, hint); } else { _options.logger( SentryLevel.debug, 'No scope to apply on event was provided'); @@ -89,8 +89,8 @@ class SentryClient { preparedEvent = await _runEventProcessors( preparedEvent, + hint, eventProcessors: _options.eventProcessors, - hint: hint, ); // dropped by event processors @@ -100,7 +100,7 @@ class SentryClient { preparedEvent = await _runBeforeSend( preparedEvent, - hint: hint, + hint, ); // dropped by beforeSend @@ -288,9 +288,11 @@ class SentryClient { SentryTransaction? preparedTransaction = _prepareEvent(transaction) as SentryTransaction; + final hint = Hint(); + if (scope != null) { - preparedTransaction = - await scope.applyToEvent(preparedTransaction) as SentryTransaction?; + preparedTransaction = await scope.applyToEvent(preparedTransaction, hint) + as SentryTransaction?; } else { _options.logger( SentryLevel.debug, 'No scope to apply on transaction was provided'); @@ -303,6 +305,7 @@ class SentryClient { preparedTransaction = await _runEventProcessors( preparedTransaction, + hint, eventProcessors: _options.eventProcessors, ) as SentryTransaction?; @@ -312,7 +315,7 @@ class SentryClient { } preparedTransaction = - await _runBeforeSend(preparedTransaction) as SentryTransaction?; + await _runBeforeSend(preparedTransaction, hint) as SentryTransaction?; // dropped by beforeSendTransaction if (preparedTransaction == null) { @@ -354,9 +357,9 @@ class SentryClient { void close() => _options.httpClient.close(); Future _runBeforeSend( - SentryEvent event, { - Hint? hint, - }) async { + SentryEvent event, + Hint hint, + ) async { SentryEvent? eventOrTransaction = event; final beforeSend = _options.beforeSend; @@ -373,7 +376,7 @@ class SentryClient { eventOrTransaction = e; } } else if (beforeSend != null) { - final e = beforeSend(event, hint: hint); + final e = beforeSend(event, hint); if (e is Future) { eventOrTransaction = await e; } else { @@ -404,14 +407,14 @@ class SentryClient { } Future _runEventProcessors( - SentryEvent event, { - Hint? hint, + SentryEvent event, + Hint hint, { required List eventProcessors, }) async { SentryEvent? processedEvent = event; for (final processor in eventProcessors) { try { - final e = processor.apply(processedEvent!, hint: hint); + final e = processor.apply(processedEvent!, hint); if (e is Future) { processedEvent = await e; } else { diff --git a/dart/lib/src/sentry_options.dart b/dart/lib/src/sentry_options.dart index 55450be9dd..37f7dc01e9 100644 --- a/dart/lib/src/sentry_options.dart +++ b/dart/lib/src/sentry_options.dart @@ -444,9 +444,9 @@ class SentryOptions { /// This function is called with an SDK specific event object and can return a modified event /// object or nothing to skip reporting the event typedef BeforeSendCallback = FutureOr Function( - SentryEvent event, { - Hint? hint, -}); + SentryEvent event, + Hint hint, +); /// This function is called with an SDK specific transaction object and can return a modified transaction /// object or nothing to skip reporting the transaction @@ -457,9 +457,9 @@ typedef BeforeSendTransactionCallback = FutureOr Function( /// This function is called with an SDK specific breadcrumb object before the breadcrumb is added /// to the scope. When nothing is returned from the function, the breadcrumb is dropped typedef BeforeBreadcrumbCallback = Breadcrumb? Function( - Breadcrumb? breadcrumb, { - Hint? hint, -}); + Breadcrumb? breadcrumb, + Hint hint, +); /// Used to provide timestamp for logging. typedef ClockProvider = DateTime Function(); diff --git a/dart/test/event_processor/deduplication_event_processor_test.dart b/dart/test/event_processor/deduplication_event_processor_test.dart index 47540cf035..4ced85c113 100644 --- a/dart/test/event_processor/deduplication_event_processor_test.dart +++ b/dart/test/event_processor/deduplication_event_processor_test.dart @@ -15,16 +15,16 @@ void main() { final sut = fixture.getSut(true); var ogEvent = _createEvent('foo'); - expect(sut.apply(ogEvent), isNotNull); - expect(sut.apply(ogEvent), isNull); + expect(sut.apply(ogEvent, Hint()), isNotNull); + expect(sut.apply(ogEvent, Hint()), isNull); }); test('does not deduplicate if disabled', () { final sut = fixture.getSut(false); var ogEvent = _createEvent('foo'); - expect(sut.apply(ogEvent), isNotNull); - expect(sut.apply(ogEvent), isNotNull); + expect(sut.apply(ogEvent, Hint()), isNotNull); + expect(sut.apply(ogEvent, Hint()), isNotNull); }); test('does not deduplicate if different events', () { @@ -32,16 +32,16 @@ void main() { var fooEvent = _createEvent('foo'); var barEvent = _createEvent('bar'); - expect(sut.apply(fooEvent), isNotNull); - expect(sut.apply(barEvent), isNotNull); + expect(sut.apply(fooEvent, Hint()), isNotNull); + expect(sut.apply(barEvent, Hint()), isNotNull); }); test('does not deduplicate transaction', () { final sut = fixture.getSut(true); final transaction = _createTransaction(fixture.hub); - expect(sut.apply(transaction), isNotNull); - expect(sut.apply(transaction), isNotNull); + expect(sut.apply(transaction, Hint()), isNotNull); + expect(sut.apply(transaction, Hint()), isNotNull); }); test('exceptions to keep for deduplication', () { @@ -51,10 +51,10 @@ void main() { var barEvent = _createEvent('bar'); var fooBarEvent = _createEvent('foo bar'); - expect(sut.apply(fooEvent), isNotNull); - expect(sut.apply(barEvent), isNotNull); - expect(sut.apply(fooBarEvent), isNotNull); - expect(sut.apply(fooEvent), isNotNull); + expect(sut.apply(fooEvent, Hint()), isNotNull); + expect(sut.apply(barEvent, Hint()), isNotNull); + expect(sut.apply(fooBarEvent, Hint()), isNotNull); + expect(sut.apply(fooEvent, Hint()), isNotNull); }); test('integration test', () async { diff --git a/dart/test/event_processor/enricher/io_enricher_test.dart b/dart/test/event_processor/enricher/io_enricher_test.dart index eb4a821de7..fcf37f958e 100644 --- a/dart/test/event_processor/enricher/io_enricher_test.dart +++ b/dart/test/event_processor/enricher/io_enricher_test.dart @@ -17,7 +17,7 @@ void main() { test('adds dart runtime', () { final enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.runtimes, isNotEmpty); final dartRuntime = event?.contexts.runtimes @@ -31,7 +31,7 @@ void main() { var event = SentryEvent(contexts: Contexts(runtimes: [runtime])); final enricher = fixture.getSut(); - event = enricher.apply(event)!; + event = enricher.apply(event, Hint())!; expect(event.contexts.runtimes.contains(runtime), true); // second runtime is Dart runtime @@ -42,7 +42,7 @@ void main() { 'does not add device, os and culture if native integration is available', () { final enricher = fixture.getSut(hasNativeIntegration: true); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device, isNull); expect(event?.contexts.operatingSystem, isNull); @@ -52,7 +52,7 @@ void main() { test('adds device, os and culture if no native integration is available', () { final enricher = fixture.getSut(hasNativeIntegration: false); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device, isNotNull); expect(event?.contexts.operatingSystem, isNotNull); @@ -61,14 +61,14 @@ void main() { test('device has name', () { final enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device?.name, isNotNull); }); test('culture has locale and timezone', () { final enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.culture?.locale, isNotNull); expect(event?.contexts.culture?.timezone, isNotNull); @@ -76,7 +76,7 @@ void main() { test('os has name and version', () { final enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.operatingSystem?.name, isNotNull); expect(event?.contexts.operatingSystem?.version, isNotNull); @@ -84,7 +84,7 @@ void main() { test('adds Dart context with PII', () { final enricher = fixture.getSut(includePii: true); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); final dartContext = event?.contexts['dart_context']; expect(dartContext, isNotNull); @@ -97,7 +97,7 @@ void main() { test('adds Dart context without PII', () { final enricher = fixture.getSut(includePii: false); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); final dartContext = event?.contexts['dart_context']; expect(dartContext, isNotNull); @@ -131,7 +131,7 @@ void main() { hasNativeIntegration: false, ); - final event = enricher.apply(fakeEvent); + final event = enricher.apply(fakeEvent, Hint()); // contexts.device expect( diff --git a/dart/test/event_processor/enricher/web_enricher_test.dart b/dart/test/event_processor/enricher/web_enricher_test.dart index 60076e506a..e5d5b2efec 100644 --- a/dart/test/event_processor/enricher/web_enricher_test.dart +++ b/dart/test/event_processor/enricher/web_enricher_test.dart @@ -20,21 +20,21 @@ void main() { test('add path as transaction if transaction is null', () { var enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.transaction, isNotNull); }); test("don't overwrite transaction", () { var enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent(transaction: 'foobar')); + final event = enricher.apply(SentryEvent(transaction: 'foobar'), Hint()); expect(event?.transaction, 'foobar'); }); test('add request with user-agent header', () { var enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.request?.headers['User-Agent'], isNotNull); expect(event?.request?.url, isNotNull); @@ -50,7 +50,7 @@ void main() { ), ); var enricher = fixture.getSut(); - event = enricher.apply(event)!; + event = enricher.apply(event, Hint())!; expect(event.request?.headers['User-Agent'], isNotNull); expect(event.request?.headers['foo'], 'bar'); @@ -68,7 +68,7 @@ void main() { ), ); var enricher = fixture.getSut(); - event = enricher.apply(event)!; + event = enricher.apply(event, Hint())!; expect(event.request?.headers['Authorization'], isNull); expect(event.request?.headers['authorization'], isNull); @@ -84,7 +84,7 @@ void main() { ), ); var enricher = fixture.getSut(); - event = enricher.apply(event)!; + event = enricher.apply(event, Hint())!; expect(event.request?.headers['User-Agent'], 'best browser agent'); expect(event.request?.url, 'foo.bar'); @@ -92,14 +92,14 @@ void main() { test('adds device and os', () { var enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device, isNotNull); }); test('adds Dart context', () { final enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); final dartContext = event?.contexts['dart_context']; expect(dartContext, isNotNull); @@ -108,14 +108,14 @@ void main() { test('device has screendensity', () { var enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device?.screenDensity, isNotNull); }); test('culture has timezone', () { var enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.culture?.timezone, isNotNull); }); @@ -142,7 +142,7 @@ void main() { final enricher = fixture.getSut(); - final event = enricher.apply(fakeEvent); + final event = enricher.apply(fakeEvent, Hint()); // contexts.device expect( diff --git a/dart/test/event_processor/exception/io_exception_event_processor_test.dart b/dart/test/event_processor/exception/io_exception_event_processor_test.dart index 14d2720df2..5d4d771a08 100644 --- a/dart/test/event_processor/exception/io_exception_event_processor_test.dart +++ b/dart/test/event_processor/exception/io_exception_event_processor_test.dart @@ -23,6 +23,7 @@ void main() { uri: Uri.parse('https://example.org/foo/bar?foo=bar'), ), ), + Hint(), ); expect(event?.request, isNotNull); @@ -36,6 +37,7 @@ void main() { SentryEvent( throwable: HttpException(''), ), + Hint(), ); expect(event?.request, isNull); @@ -55,6 +57,7 @@ void main() { ), ), ), + Hint(), ); expect(event?.request, isNotNull); @@ -81,6 +84,7 @@ void main() { OSError('Oh no :(', 42), ), ), + Hint(), ); // Due to the test setup, there's no SentryException for the FileSystemException. diff --git a/dart/test/http_client/failed_request_client_test.dart b/dart/test/http_client/failed_request_client_test.dart index 4e6cac15b1..2d017c177d 100644 --- a/dart/test/http_client/failed_request_client_test.dart +++ b/dart/test/http_client/failed_request_client_test.dart @@ -295,7 +295,7 @@ void main() { final sut = fixture.getSut(client: client); Hint? eventHint; - fixture.options.addEventProcessor(FunctionEventProcessor((event, {hint}) { + fixture.options.addEventProcessor(FunctionEventProcessor((event, hint) { eventHint = hint; return event; })); diff --git a/dart/test/mocks.dart b/dart/test/mocks.dart index 82430d96e8..08058d3b32 100644 --- a/dart/test/mocks.dart +++ b/dart/test/mocks.dart @@ -98,7 +98,7 @@ final fakeEvent = SentryEvent( /// Always returns null and thus drops all events class DropAllEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { return null; } } @@ -109,13 +109,13 @@ class FunctionEventProcessor implements EventProcessor { final EventProcessorFunction applyFunction; @override - SentryEvent? apply(SentryEvent event, {hint}) { - return applyFunction(event, hint: hint); + SentryEvent? apply(SentryEvent event, Hint hint) { + return applyFunction(event, hint); } } -typedef EventProcessorFunction = SentryEvent? Function(SentryEvent event, - {Hint? hint}); +typedef EventProcessorFunction = SentryEvent? Function( + SentryEvent event, Hint hint); var fakeEnvelope = SentryEnvelope.fromEvent( fakeEvent, diff --git a/dart/test/scope_test.dart b/dart/test/scope_test.dart index e8d2e08bf9..d93b1cf112 100644 --- a/dart/test/scope_test.dart +++ b/dart/test/scope_test.dart @@ -98,6 +98,26 @@ void main() { expect(sut.breadcrumbs.last, breadcrumb); }); + test('beforeBreadcrumb called with user provided hint', () { + Hint? actual; + BeforeBreadcrumbCallback bb = (_, hint) { + actual = hint; + return null; + }; + final sut = fixture.getSut( + beforeBreadcrumbCallback: bb, + ); + + final breadcrumb = Breadcrumb( + message: 'test log', + timestamp: DateTime.utc(2019), + ); + final hint = Hint.withMap({'user-name': 'joe dirt'}); + sut.addBreadcrumb(breadcrumb, hint: hint); + + expect(actual?.get('user-name'), 'joe dirt'); + }); + test('Executes and drops $Breadcrumb', () { final sut = fixture.getSut( beforeBreadcrumbCallback: fixture.beforeBreadcrumbCallback, @@ -404,7 +424,7 @@ void main() { await scope.setContexts('theme', 'material'); await scope.setUser(scopeUser); - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.user, scopeUser); expect(updatedEvent?.transaction, '/example/app'); @@ -425,7 +445,7 @@ void main() { final scope = Scope(SentryOptions(dsn: fakeDsn)) ..span = fixture.sentryTracer; - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.contexts['trace'] is SentryTraceContext, true); }); @@ -448,7 +468,7 @@ void main() { await scope.addBreadcrumb(breadcrumb); await scope.setUser(scopeUser); - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.user, isNotNull); expect(updatedEvent?.user?.id, eventUser.id); @@ -496,7 +516,7 @@ void main() { SentryOperatingSystem(name: 'context-os'), ); - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.contexts[SentryDevice.type].name, 'event-device'); expect(updatedEvent?.contexts[SentryApp.type].name, 'event-app'); @@ -526,7 +546,7 @@ void main() { await scope.setContexts('location', {'city': 'London'}); await scope.setContexts('items', [1, 2, 3]); - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.contexts[SentryDevice.type].name, 'context-device'); expect(updatedEvent?.contexts[SentryApp.type].name, 'context-app'); @@ -551,7 +571,7 @@ void main() { final scope = Scope(SentryOptions(dsn: fakeDsn)) ..level = SentryLevel.error; - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.level, SentryLevel.error); }); @@ -561,7 +581,7 @@ void main() { final scope = Scope(SentryOptions(dsn: fakeDsn)) ..span = fixture.sentryTracer; - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.transaction, 'name'); }); @@ -573,7 +593,7 @@ void main() { sut.addEventProcessor(fixture.processor); final event = SentryEvent(); - var newEvent = await sut.applyToEvent(event); + var newEvent = await sut.applyToEvent(event, Hint()); expect(newEvent, isNull); }); @@ -582,7 +602,7 @@ void main() { var tr = SentryTransaction(fixture.sentryTracer); final scope = Scope(SentryOptions(dsn: fakeDsn))..fingerprint = ['test']; - final updatedTr = await scope.applyToEvent(tr); + final updatedTr = await scope.applyToEvent(tr, Hint()); expect(updatedTr?.fingerprint, isNull); }); @@ -591,7 +611,7 @@ void main() { var tr = SentryTransaction(fixture.sentryTracer); final scope = Scope(SentryOptions(dsn: fakeDsn))..level = SentryLevel.error; - final updatedTr = await scope.applyToEvent(tr); + final updatedTr = await scope.applyToEvent(tr, Hint()); expect(updatedTr?.level, isNull); }); @@ -600,7 +620,7 @@ void main() { var tr = SentryTransaction(fixture.sentryTracer); final scope = Scope(SentryOptions(dsn: fakeDsn))..level = SentryLevel.error; - final updatedTr = await scope.applyToEvent(tr); + final updatedTr = await scope.applyToEvent(tr, Hint()); expect(updatedTr?.contexts.trace?.sampled, isTrue); }); @@ -617,9 +637,9 @@ void main() { final sut = fixture.getSut( scopeObserver: fixture.mockScopeObserver, beforeBreadcrumbCallback: ( - Breadcrumb? breadcrumb, { - Hint? hint, - }) { + Breadcrumb? breadcrumb, + Hint hint, + ) { return breadcrumb?.copyWith(message: "modified"); }, ); @@ -690,9 +710,9 @@ void main() { final sut = fixture.getSut( beforeBreadcrumbCallback: ( - Breadcrumb? breadcrumb, { - Hint? hint, - }) { + Breadcrumb? breadcrumb, + Hint hint, + ) { throw exception; }, debug: true); @@ -714,9 +734,9 @@ void main() { final sut = fixture.getSut( beforeBreadcrumbCallback: ( - Breadcrumb? breadcrumb, { - Hint? hint, - }) { + Breadcrumb? breadcrumb, + Hint hint, + ) { if (numberOfBeforeBreadcrumbCalls > 0) { throw exception; } @@ -777,11 +797,11 @@ class Fixture { EventProcessor get processor => DropAllEventProcessor(); - Breadcrumb? beforeBreadcrumbCallback(Breadcrumb? breadcrumb, {Hint? hint}) => + Breadcrumb? beforeBreadcrumbCallback(Breadcrumb? breadcrumb, Hint hint) => null; - Breadcrumb? beforeBreadcrumbMutateCallback(Breadcrumb? breadcrumb, - {Hint? hint}) => + Breadcrumb? beforeBreadcrumbMutateCallback( + Breadcrumb? breadcrumb, Hint hint) => breadcrumb?.copyWith(message: 'new message'); void mockLogger( @@ -802,7 +822,7 @@ class AddTagsEventProcessor implements EventProcessor { AddTagsEventProcessor(this.tags); @override - SentryEvent? apply(SentryEvent event, {hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { return event..tags?.addAll(tags); } } diff --git a/dart/test/sentry_client_test.dart b/dart/test/sentry_client_test.dart index 5d1c543c00..f62c310b5d 100644 --- a/dart/test/sentry_client_test.dart +++ b/dart/test/sentry_client_test.dart @@ -1039,7 +1039,7 @@ void main() { test('thrown error is handled', () async { final exception = Exception("before send exception"); - final beforeSendCallback = (SentryEvent event, {Hint? hint}) { + final beforeSendCallback = (SentryEvent event, Hint hint) { throw exception; }; @@ -1059,7 +1059,7 @@ void main() { setUp(() { fixture = Fixture(); fixture.options.addEventProcessor(FunctionEventProcessor( - (event, {hint}) => event + (event, hint) => event ..tags!.addAll({'theme': 'material'}) // ignore: deprecated_member_use_from_same_package ..extra!['host'] = '0.0.0.1' @@ -1101,8 +1101,8 @@ void main() { var executed = false; - final client = fixture.getSut( - eventProcessor: FunctionEventProcessor((event, {hint}) { + final client = + fixture.getSut(eventProcessor: FunctionEventProcessor((event, hint) { expect(myHint, hint); executed = true; return event; @@ -1116,8 +1116,8 @@ void main() { test('should create hint when none was provided', () async { var executed = false; - final client = fixture.getSut( - eventProcessor: FunctionEventProcessor((event, {hint}) { + final client = + fixture.getSut(eventProcessor: FunctionEventProcessor((event, hint) { expect(hint, isNotNull); executed = true; return event; @@ -1601,9 +1601,9 @@ Future> transactionFromEnvelope( } SentryEvent? beforeSendCallbackDropEvent( - SentryEvent event, { - Hint? hint, -}) => + SentryEvent event, + Hint hint, +) => null; SentryTransaction? beforeSendTransactionCallbackDropEvent( @@ -1612,9 +1612,9 @@ SentryTransaction? beforeSendTransactionCallbackDropEvent( null; Future asyncBeforeSendCallbackDropEvent( - SentryEvent event, { - Hint? hint, -}) async { + SentryEvent event, + Hint hint, +) async { await Future.delayed(Duration(milliseconds: 200)); return null; } @@ -1625,7 +1625,7 @@ Future asyncBeforeSendTransactionCallbackDropEvent( return null; } -SentryEvent? beforeSendCallback(SentryEvent event, {Hint? hint}) { +SentryEvent? beforeSendCallback(SentryEvent event, Hint hint) { return event ..tags!.addAll({'theme': 'material'}) // ignore: deprecated_member_use_from_same_package @@ -1701,8 +1701,7 @@ class Fixture { return client; } - Future droppingBeforeSend(SentryEvent event, - {Hint? hint}) async { + Future droppingBeforeSend(SentryEvent event, Hint hint) async { return null; } diff --git a/dio/lib/src/dio_event_processor.dart b/dio/lib/src/dio_event_processor.dart index 3a9603abd1..afeb692be4 100644 --- a/dio/lib/src/dio_event_processor.dart +++ b/dio/lib/src/dio_event_processor.dart @@ -15,7 +15,7 @@ class DioEventProcessor implements EventProcessor { final SentryOptions _options; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { if (event is SentryTransaction) { return event; } diff --git a/dio/test/dio_event_processor_test.dart b/dio/test/dio_event_processor_test.dart index af45d0c681..af4a94ab8d 100644 --- a/dio/test/dio_event_processor_test.dart +++ b/dio/test/dio_event_processor_test.dart @@ -24,7 +24,7 @@ void main() { throwable: Exception(), exceptions: [fixture.sentryError(throwable)], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(event, processedEvent); }); @@ -42,7 +42,7 @@ void main() { request: SentryRequest(), exceptions: [fixture.sentryError(dioError)], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(event.throwable, processedEvent.throwable); expect(event.request, processedEvent.request); @@ -67,10 +67,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(processedEvent.throwable, event.throwable); expect(processedEvent.request?.method, 'POST'); @@ -96,10 +96,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(processedEvent.throwable, event.throwable); expect(processedEvent.request?.method, 'GET'); @@ -125,10 +125,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(processedEvent.request?.headers, {}); }); @@ -177,10 +177,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; final capturedRequest = processedEvent.request; expect(capturedRequest, isNotNull); @@ -207,7 +207,7 @@ void main() { data: 'foobar', headers: Headers.fromMap(>{ 'foo': ['bar'], - 'set-cookie': ['foo=bar'] + 'set-cookie': ['foo=bar'], }), requestOptions: request, isRedirect: true, @@ -219,10 +219,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(processedEvent.throwable, event.throwable); expect(processedEvent.contexts.response, isNotNull); @@ -248,7 +248,7 @@ void main() { response: Response( data: 'foobar', headers: Headers.fromMap(>{ - 'foo': ['bar'] + 'foo': ['bar'], }), requestOptions: request, isRedirect: true, @@ -260,10 +260,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(processedEvent.throwable, event.throwable); expect(processedEvent.contexts.response, isNotNull); @@ -320,10 +320,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; final capturedResponse = processedEvent.contexts.response; expect(capturedResponse, isNotNull); @@ -338,7 +338,7 @@ void main() { final dataByType = { ResponseType.plain: ['plain'], ResponseType.bytes: [ - [1337] + [1337], ], ResponseType.json: [ 9001, @@ -347,7 +347,7 @@ void main() { true, ['list'], {'map-key': 'map-value'}, - ] + ], }; for (final entry in dataByType.entries) { @@ -375,10 +375,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; final capturedResponse = processedEvent.contexts.response; expect(capturedResponse, isNotNull); @@ -413,7 +413,7 @@ void main() { exceptions: exceptions, ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(processedEvent.exceptions?.length, 2); diff --git a/dio/test/failed_request_interceptor_test.dart b/dio/test/failed_request_interceptor_test.dart index 80eede8803..e7fb5a63e1 100644 --- a/dio/test/failed_request_interceptor_test.dart +++ b/dio/test/failed_request_interceptor_test.dart @@ -113,7 +113,7 @@ class Fixture { FailedRequestInterceptor getSut({ List failedRequestStatusCodes = const [ - SentryStatusCode.defaultRange() + SentryStatusCode.defaultRange(), ], List failedRequestTargets = const ['.*'], }) { diff --git a/dio/test/mocks.dart b/dio/test/mocks.dart index 83454cbfb3..30e53c5772 100644 --- a/dio/test/mocks.dart +++ b/dio/test/mocks.dart @@ -42,7 +42,7 @@ final fakeEvent = SentryEvent( type: 'navigation', data: {'screen': 'MainActivity', 'state': 'created'}, level: SentryLevel.info, - ) + ), ], contexts: Contexts( operatingSystem: const SentryOperatingSystem( @@ -98,7 +98,7 @@ final fakeEvent = SentryEvent( /// Doesn't do anything with the events class NoOpEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { return event; } } @@ -106,7 +106,7 @@ class NoOpEventProcessor implements EventProcessor { /// Always returns null and thus drops all events class DropAllEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { return null; } } @@ -117,15 +117,15 @@ class FunctionEventProcessor implements EventProcessor { final EventProcessorFunction applyFunction; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { - return applyFunction(event, hint: hint); + SentryEvent? apply(SentryEvent event, Hint hint) { + return applyFunction(event, hint); } } typedef EventProcessorFunction = SentryEvent? Function( - SentryEvent event, { - Hint? hint, -}); + SentryEvent event, + Hint hint, +); var fakeEnvelope = SentryEnvelope.fromEvent( fakeEvent, diff --git a/flutter/example/integration_test/integration_test.dart b/flutter/example/integration_test/integration_test.dart index ae42ae3945..9dc182111a 100644 --- a/flutter/example/integration_test/integration_test.dart +++ b/flutter/example/integration_test/integration_test.dart @@ -199,7 +199,7 @@ void main() { class Fixture { SentryEvent? sentEvent; - FutureOr beforeSend(SentryEvent event, {Hint? hint}) async { + FutureOr beforeSend(SentryEvent event, Hint hint) async { sentEvent = event; return event; } diff --git a/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart b/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart index 377af31d25..ce77150c40 100644 --- a/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart +++ b/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart @@ -19,7 +19,7 @@ class AndroidPlatformExceptionEventProcessor implements EventProcessor { static final _platformExceptionType = (PlatformException).toString(); @override - Future apply(SentryEvent event, {Hint? hint}) async { + Future apply(SentryEvent event, Hint hint) async { if (event is SentryTransaction) { return event; } diff --git a/flutter/lib/src/event_processor/flutter_enricher_event_processor.dart b/flutter/lib/src/event_processor/flutter_enricher_event_processor.dart index f72eb2470b..0df522c379 100644 --- a/flutter/lib/src/event_processor/flutter_enricher_event_processor.dart +++ b/flutter/lib/src/event_processor/flutter_enricher_event_processor.dart @@ -31,9 +31,9 @@ class FlutterEnricherEventProcessor implements EventProcessor { @override Future apply( - SentryEvent event, { - Hint? hint, - }) async { + SentryEvent event, + Hint hint, + ) async { // If there's a native integration available, it probably has better // information available than Flutter. final device = diff --git a/flutter/lib/src/event_processor/flutter_exception_event_processor.dart b/flutter/lib/src/event_processor/flutter_exception_event_processor.dart index e0f4b6af14..05f9fd6595 100644 --- a/flutter/lib/src/event_processor/flutter_exception_event_processor.dart +++ b/flutter/lib/src/event_processor/flutter_exception_event_processor.dart @@ -3,7 +3,7 @@ import 'package:sentry/sentry.dart'; class FlutterExceptionEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { if (event is SentryTransaction) { return event; } diff --git a/flutter/lib/src/event_processor/native_app_start_event_processor.dart b/flutter/lib/src/event_processor/native_app_start_event_processor.dart index 2187204299..0127f36d5a 100644 --- a/flutter/lib/src/event_processor/native_app_start_event_processor.dart +++ b/flutter/lib/src/event_processor/native_app_start_event_processor.dart @@ -18,7 +18,7 @@ class NativeAppStartEventProcessor implements EventProcessor { final SentryNative _native; @override - Future apply(SentryEvent event, {Hint? hint}) async { + Future apply(SentryEvent event, Hint hint) async { final appStartEnd = _native.appStartEnd; if (appStartEnd != null && diff --git a/flutter/lib/src/event_processor/platform_exception_event_processor.dart b/flutter/lib/src/event_processor/platform_exception_event_processor.dart index d403509ae9..2bf33e60f9 100644 --- a/flutter/lib/src/event_processor/platform_exception_event_processor.dart +++ b/flutter/lib/src/event_processor/platform_exception_event_processor.dart @@ -4,7 +4,7 @@ import 'package:sentry/sentry.dart'; /// Add code & message from [PlatformException] to [SentryException] class PlatformExceptionEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { if (event is SentryTransaction) { return event; } diff --git a/flutter/lib/src/event_processor/screenshot_event_processor.dart b/flutter/lib/src/event_processor/screenshot_event_processor.dart index b60f4faefa..8a68fed1c1 100644 --- a/flutter/lib/src/event_processor/screenshot_event_processor.dart +++ b/flutter/lib/src/event_processor/screenshot_event_processor.dart @@ -19,7 +19,7 @@ class ScreenshotEventProcessor implements EventProcessor { sentryScreenshotWidgetGlobalKey.currentContext != null; @override - Future apply(SentryEvent event, {Hint? hint}) async { + Future apply(SentryEvent event, Hint hint) async { if (event is SentryTransaction) { return event; } @@ -40,7 +40,7 @@ class ScreenshotEventProcessor implements EventProcessor { final bytes = await _createScreenshot(); if (bytes != null) { - hint?.screenshot = SentryAttachment.fromScreenshotData(bytes); + hint.screenshot = SentryAttachment.fromScreenshotData(bytes); } return event; } diff --git a/flutter/lib/src/integrations/load_contexts_integration.dart b/flutter/lib/src/integrations/load_contexts_integration.dart index 710d7d0924..f0aa565da3 100644 --- a/flutter/lib/src/integrations/load_contexts_integration.dart +++ b/flutter/lib/src/integrations/load_contexts_integration.dart @@ -40,7 +40,7 @@ class _LoadContextsIntegrationEventProcessor implements EventProcessor { final SentryFlutterOptions _options; @override - Future apply(SentryEvent event, {Hint? hint}) async { + Future apply(SentryEvent event, Hint hint) async { try { final loadContexts = await _channel.invokeMethod('loadContexts'); diff --git a/flutter/lib/src/integrations/load_image_list_integration.dart b/flutter/lib/src/integrations/load_image_list_integration.dart index c2a0c98848..a06d60d839 100644 --- a/flutter/lib/src/integrations/load_image_list_integration.dart +++ b/flutter/lib/src/integrations/load_image_list_integration.dart @@ -43,7 +43,7 @@ class _LoadImageListIntegrationEventProcessor implements EventProcessor { final SentryFlutterOptions _options; @override - Future apply(SentryEvent event, {Hint? hint}) async { + Future apply(SentryEvent event, Hint hint) async { if (event.needsSymbolication()) { try { // we call on every event because the loaded image list is cached diff --git a/flutter/lib/src/view_hierarchy/view_hierarchy_event_processor.dart b/flutter/lib/src/view_hierarchy/view_hierarchy_event_processor.dart index 99d43ad982..c3fefe52f5 100644 --- a/flutter/lib/src/view_hierarchy/view_hierarchy_event_processor.dart +++ b/flutter/lib/src/view_hierarchy/view_hierarchy_event_processor.dart @@ -1,7 +1,7 @@ import '../../sentry_flutter.dart'; import 'sentry_tree_walker.dart'; -/// A [EventProcessor] that renders an ASCII represention of the entire view +/// A [EventProcessor] that renders an ASCII representation of the entire view /// hierarchy of the application when an error happens and includes it as an /// attachment to the [Hint]. class SentryViewHierarchyEventProcessor implements EventProcessor { @@ -10,7 +10,7 @@ class SentryViewHierarchyEventProcessor implements EventProcessor { final SentryFlutterOptions _options; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { if (event is SentryTransaction) { return event; } @@ -31,7 +31,7 @@ class SentryViewHierarchyEventProcessor implements EventProcessor { final viewHierarchy = SentryAttachment.fromViewHierarchy(sentryViewHierarchy); - hint?.viewHierarchy = viewHierarchy; + hint.viewHierarchy = viewHierarchy; return event; } } diff --git a/flutter/test/android_platform_exception_event_processor_test.dart b/flutter/test/android_platform_exception_event_processor_test.dart index bfd8e2b4ce..0ac142922a 100644 --- a/flutter/test/android_platform_exception_event_processor_test.dart +++ b/flutter/test/android_platform_exception_event_processor_test.dart @@ -26,8 +26,8 @@ void main() { group(AndroidPlatformExceptionEventProcessor, () { test('exception is correctly parsed', () async { - final platformExceptionEvent = - await fixture.processor.apply(fixture.eventWithPlatformStackTrace); + final platformExceptionEvent = await fixture.processor + .apply(fixture.eventWithPlatformStackTrace, Hint()); final exceptions = platformExceptionEvent!.exceptions!; expect(exceptions.length, 2); @@ -45,8 +45,8 @@ void main() { test( 'Dart thread is current and not crashed if Android exception is present', () async { - final platformExceptionEvent = - await fixture.processor.apply(fixture.eventWithPlatformStackTrace); + final platformExceptionEvent = await fixture.processor + .apply(fixture.eventWithPlatformStackTrace, Hint()); final exceptions = platformExceptionEvent!.exceptions!; expect(exceptions.length, 2); @@ -56,8 +56,8 @@ void main() { }); test('platformexception has Android thread attached', () async { - final platformExceptionEvent = - await fixture.processor.apply(fixture.eventWithPlatformStackTrace); + final platformExceptionEvent = await fixture.processor + .apply(fixture.eventWithPlatformStackTrace, Hint()); final exceptions = platformExceptionEvent!.exceptions!; expect(exceptions.length, 2); @@ -76,8 +76,8 @@ void main() { fixture.options.attachThreads = false; final threadCount = fixture.eventWithPlatformStackTrace.threads?.length; - final platformExceptionEvent = - await fixture.processor.apply(fixture.eventWithPlatformStackTrace); + final platformExceptionEvent = await fixture.processor + .apply(fixture.eventWithPlatformStackTrace, Hint()); final exceptions = platformExceptionEvent!.exceptions!; expect(exceptions.length, 2); @@ -94,14 +94,15 @@ void main() { throwable: null, ); - final platformExceptionEvent = await fixture.processor.apply(event); + final platformExceptionEvent = + await fixture.processor.apply(event, Hint()); expect(event, platformExceptionEvent); }); test('does nothing if PlatformException has no stackTrace', () async { - final platformExceptionEvent = - await fixture.processor.apply(fixture.eventWithoutPlatformStackTrace); + final platformExceptionEvent = await fixture.processor + .apply(fixture.eventWithoutPlatformStackTrace, Hint()); expect(fixture.eventWithoutPlatformStackTrace, platformExceptionEvent); }); diff --git a/flutter/test/event_processor/flutter_enricher_event_processor_test.dart b/flutter/test/event_processor/flutter_enricher_event_processor_test.dart index bfccb8c773..72ff0fc1cb 100644 --- a/flutter/test/event_processor/flutter_enricher_event_processor_test.dart +++ b/flutter/test/event_processor/flutter_enricher_event_processor_test.dart @@ -32,7 +32,7 @@ void main() { binding: () => tester.binding, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); debugBrightnessOverride = null; debugDefaultTargetPlatformOverride = null; @@ -48,7 +48,7 @@ void main() { binding: () => tester.binding, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); final accessibility = event?.contexts['accessibility']; @@ -65,7 +65,7 @@ void main() { binding: () => tester.binding, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); final culture = event?.contexts.culture; @@ -79,7 +79,7 @@ void main() { ); tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.resumed); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); final app = event?.contexts.app; @@ -92,7 +92,7 @@ void main() { ); tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.inactive); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); final app = event?.contexts.app; @@ -110,7 +110,7 @@ void main() { final event = SentryEvent(); event.contexts.app = SentryApp(name: appName); - final mutatedEvent = await enricher.apply(event); + final mutatedEvent = await enricher.apply(event, Hint()); final app = mutatedEvent?.contexts.app; @@ -125,7 +125,7 @@ void main() { hasNativeIntegration: true, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device, isNull); }); @@ -137,7 +137,7 @@ void main() { hasNativeIntegration: false, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device, isNotNull); }); @@ -147,7 +147,7 @@ void main() { binding: () => tester.binding, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); final flutterRuntime = event?.contexts.runtimes .firstWhere((element) => element.name == 'Flutter'); @@ -171,7 +171,7 @@ void main() { checker: pair.key, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); final flutterRuntime = event?.contexts.runtimes .firstWhere((element) => element.name == 'Flutter'); @@ -199,7 +199,7 @@ void main() { ), ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); expect(event?.modules, { 'foo_package': 'unknown', @@ -227,7 +227,7 @@ void main() { ), ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); expect(event?.modules, null); }); @@ -251,7 +251,7 @@ void main() { ), ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); expect(event?.modules, {'foo_package': 'unknown'}); }); @@ -276,7 +276,7 @@ void main() { hasNativeIntegration: false, ); - final event = await enricher.apply(fakeEvent); + final event = await enricher.apply(fakeEvent, Hint()); // contexts.device expect( diff --git a/flutter/test/event_processor/flutter_exception_event_processor_test.dart b/flutter/test/event_processor/flutter_exception_event_processor_test.dart index aaca15e2af..8dc4f5c528 100644 --- a/flutter/test/event_processor/flutter_exception_event_processor_test.dart +++ b/flutter/test/event_processor/flutter_exception_event_processor_test.dart @@ -20,6 +20,7 @@ void main() { uri: Uri.parse('https://example.org/foo/bar?foo=bar'), ), ), + Hint(), ); expect(event?.request, isNotNull); diff --git a/flutter/test/event_processor/platform_exception_event_processor_test.dart b/flutter/test/event_processor/platform_exception_event_processor_test.dart index d4bf2d9c99..ecc3d7130b 100644 --- a/flutter/test/event_processor/platform_exception_event_processor_test.dart +++ b/flutter/test/event_processor/platform_exception_event_processor_test.dart @@ -26,7 +26,7 @@ void main() { var event = SentryEvent(exceptions: [sentryException]); final sut = fixture.getSut(); - event = (sut.apply(event))!; + event = (sut.apply(event, Hint()))!; expect(event.exceptions?.first.mechanism?.data["code"], "fixture-code"); expect(event.exceptions?.first.mechanism?.data["message"], @@ -46,7 +46,7 @@ void main() { var event = SentryEvent(exceptions: [sentryException]); final sut = fixture.getSut(); - event = (sut.apply(event))!; + event = (sut.apply(event, Hint()))!; expect(event.exceptions?.first.mechanism?.type, "platformException"); }); diff --git a/flutter/test/event_processor/screenshot_event_processor_test.dart b/flutter/test/event_processor/screenshot_event_processor_test.dart index da063e776c..6101217a04 100644 --- a/flutter/test/event_processor/screenshot_event_processor_test.dart +++ b/flutter/test/event_processor/screenshot_event_processor_test.dart @@ -32,7 +32,7 @@ void main() { final throwable = Exception(); final event = SentryEvent(throwable: throwable); final hint = Hint(); - await sut.apply(event, hint: hint); + await sut.apply(event, hint); expect(hint.screenshot != null, added); if (expectedMaxWidthOrHeight != null) { diff --git a/flutter/test/integrations/load_contexts_integration_test.dart b/flutter/test/integrations/load_contexts_integration_test.dart index a97b35db77..bf93f6da46 100644 --- a/flutter/test/integrations/load_contexts_integration_test.dart +++ b/flutter/test/integrations/load_contexts_integration_test.dart @@ -58,7 +58,8 @@ void main() { final integration = LoadContextsIntegration(fixture.methodChannel); integration.call(fixture.hub, fixture.options); - event = (await fixture.options.eventProcessors.first.apply(event))!; + event = + (await fixture.options.eventProcessors.first.apply(event, Hint()))!; expect(event.breadcrumbs!.length, 1); expect(event.breadcrumbs!.first.message, 'native'); @@ -83,7 +84,8 @@ void main() { final integration = LoadContextsIntegration(fixture.methodChannel); integration.call(fixture.hub, fixture.options); - event = (await fixture.options.eventProcessors.first.apply(event))!; + event = + (await fixture.options.eventProcessors.first.apply(event, Hint()))!; expect(event.breadcrumbs!.length, 1); expect(event.breadcrumbs!.first.message, 'event'); diff --git a/flutter/test/integrations/load_contexts_integrations_test.dart b/flutter/test/integrations/load_contexts_integrations_test.dart index c6bb98f0b7..6de2d32e8d 100644 --- a/flutter/test/integrations/load_contexts_integrations_test.dart +++ b/flutter/test/integrations/load_contexts_integrations_test.dart @@ -81,7 +81,7 @@ void main() { e.contexts.operatingSystem = SentryOperatingSystem(theme: 'theme1'); e.contexts.app = SentryApp(inForeground: true); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(fixture.called, true); expect(event?.contexts.device?.name, 'Device1'); @@ -121,7 +121,7 @@ void main() { final e = SentryEvent(contexts: eventContexts, user: SentryUser(id: 'myId')); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(fixture.called, true); expect(event?.contexts.device?.name, 'eDevice'); @@ -145,7 +145,8 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect( event?.sdk?.packages.any((element) => element.name == 'native-package'), @@ -169,7 +170,8 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect( event?.sdk?.integrations @@ -189,7 +191,8 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect( event?.sdk?.packages @@ -210,7 +213,8 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect( event?.sdk?.packages @@ -239,7 +243,7 @@ void main() { integration(fixture.hub, fixture.options); final e = SentryEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event, isNotNull); }); @@ -252,7 +256,8 @@ void main() { final eventSdk = getSdkVersion(name: 'sentry.dart.flutter'); final e = getEvent(sdk: eventSdk); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.tags?['event.origin'], 'flutter'); expect(event?.tags?['event.environment'], 'dart'); @@ -270,7 +275,8 @@ void main() { sdk: eventSdk, tags: {'a': 'b'}, ); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.tags?['event.origin'], 'flutter'); expect(event?.tags?['event.environment'], 'dart'); @@ -285,7 +291,8 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(tags: {}); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.tags?.containsKey('event.origin'), false); expect(event?.tags?.containsKey('event.environment'), false); @@ -298,7 +305,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(tags: {'key': 'flutter', 'key-a': 'flutter'}); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.tags?['key'], 'flutter'); expect(event?.tags?['key-a'], 'flutter'); @@ -311,7 +318,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(extra: {'key': 'flutter', 'key-a': 'flutter'}); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); // ignore: deprecated_member_use expect(event?.extra?['key'], 'flutter'); @@ -326,7 +333,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.user?.id, '196E065A-AAF7-409A-9A6C-A81F40274CB9'); expect(event?.user?.username, 'fixture-username'); @@ -340,7 +347,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(user: SentryUser(id: 'abc')); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.user?.id, 'abc'); }); @@ -350,7 +357,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.dist, 'fixture-dist'); }); @@ -360,7 +367,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(dist: 'abc'); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.dist, 'abc'); }); @@ -370,7 +377,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.environment, 'fixture-environment'); }); @@ -380,7 +387,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(environment: 'abc'); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.environment, 'abc'); }); @@ -391,7 +398,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(fingerprint: ['fingerprint-a', 'fingerprint-b']); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.fingerprint, ['fingerprint-a', 'fingerprint-b']); }); @@ -401,7 +408,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.level, SentryLevel.error); }); @@ -411,7 +418,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(level: SentryLevel.fatal); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.level, SentryLevel.fatal); }); diff --git a/flutter/test/integrations/load_image_list_test.dart b/flutter/test/integrations/load_image_list_test.dart index bb78561dae..1b82a3332e 100644 --- a/flutter/test/integrations/load_image_list_test.dart +++ b/flutter/test/integrations/load_image_list_test.dart @@ -135,7 +135,7 @@ void main() { final ep = fixture.options.eventProcessors.first; SentryEvent? event = _getEvent(); - event = await ep.apply(event); + event = await ep.apply(event, Hint()); expect(1, event!.debugMeta!.images.length); }); @@ -146,7 +146,7 @@ void main() { sut.call(fixture.hub, fixture.options); final ep = fixture.options.eventProcessors.first; SentryEvent? event = _getEvent(); - event = await ep.apply(event); + event = await ep.apply(event, Hint()); final image = event!.debugMeta!.images.first; diff --git a/flutter/test/integrations/native_app_start_integration_test.dart b/flutter/test/integrations/native_app_start_integration_test.dart index b2ef832705..467ac9bb55 100644 --- a/flutter/test/integrations/native_app_start_integration_test.dart +++ b/flutter/test/integrations/native_app_start_integration_test.dart @@ -32,7 +32,8 @@ void main() { final transaction = SentryTransaction(tracer); final processor = fixture.options.eventProcessors.first; - final enriched = await processor.apply(transaction) as SentryTransaction; + final enriched = + await processor.apply(transaction, Hint()) as SentryTransaction; final measurement = enriched.measurements['app_start_cold']!; expect(measurement.value, 10); @@ -52,8 +53,10 @@ void main() { final processor = fixture.options.eventProcessors.first; - var enriched = await processor.apply(transaction) as SentryTransaction; - var secondEnriched = await processor.apply(enriched) as SentryTransaction; + var enriched = + await processor.apply(transaction, Hint()) as SentryTransaction; + var secondEnriched = + await processor.apply(enriched, Hint()) as SentryTransaction; expect(secondEnriched.measurements.length, 1); }); @@ -72,8 +75,10 @@ void main() { final processor = fixture.options.eventProcessors.first; - var enriched = await processor.apply(transaction) as SentryTransaction; - var secondEnriched = await processor.apply(enriched) as SentryTransaction; + var enriched = + await processor.apply(transaction, Hint()) as SentryTransaction; + var secondEnriched = + await processor.apply(enriched, Hint()) as SentryTransaction; expect(secondEnriched.measurements.length, 2); expect(secondEnriched.measurements.containsKey(measurement.name), true); @@ -90,7 +95,8 @@ void main() { final transaction = SentryTransaction(tracer); final processor = fixture.options.eventProcessors.first; - final enriched = await processor.apply(transaction) as SentryTransaction; + final enriched = + await processor.apply(transaction, Hint()) as SentryTransaction; expect(enriched.measurements.isEmpty, true); }); diff --git a/flutter/test/load_image_list_test.dart b/flutter/test/load_image_list_test.dart index 0afff01b97..345d913887 100644 --- a/flutter/test/load_image_list_test.dart +++ b/flutter/test/load_image_list_test.dart @@ -127,7 +127,7 @@ void main() { final ep = fixture.options.eventProcessors.first; SentryEvent? event = _getEvent(); - event = await ep.apply(event); + event = await ep.apply(event, Hint()); expect(1, event!.debugMeta!.images.length); }); @@ -138,7 +138,7 @@ void main() { sut.call(fixture.hub, fixture.options); final ep = fixture.options.eventProcessors.first; SentryEvent? event = _getEvent(); - event = await ep.apply(event); + event = await ep.apply(event, Hint()); final image = event!.debugMeta!.images.first; diff --git a/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart b/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart index 537b2cd9c4..a409d1a293 100644 --- a/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart +++ b/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart @@ -26,7 +26,7 @@ void main() { exceptions: [SentryException(type: 'type', value: 'value')]); final hint = Hint(); - sut.apply(event, hint: hint); + sut.apply(event, hint); expect(hint.viewHierarchy, isNotNull); }); @@ -42,7 +42,7 @@ void main() { final event = SentryEvent(throwable: StateError('error')); final hint = Hint(); - sut.apply(event, hint: hint); + sut.apply(event, hint); expect(hint.viewHierarchy, isNotNull); }); @@ -58,7 +58,7 @@ void main() { final event = SentryEvent(); final hint = Hint(); - sut.apply(event, hint: hint); + sut.apply(event, hint); expect(hint.viewHierarchy, isNull); }); @@ -74,7 +74,7 @@ void main() { final event = SentryEvent(); final hint = Hint(); - sut.apply(event, hint: hint); + sut.apply(event, hint); expect(hint.viewHierarchy, isNull); }); diff --git a/sqflite/test/mocks/mocks.dart b/sqflite/test/mocks/mocks.dart index 0a3115df74..5ecd57ce50 100644 --- a/sqflite/test/mocks/mocks.dart +++ b/sqflite/test/mocks/mocks.dart @@ -33,7 +33,7 @@ ISentrySpan startTransactionShim( DatabaseExecutor, ], customMocks: [ - MockSpec(fallbackGenerators: {#startTransaction: startTransactionShim}) + MockSpec(fallbackGenerators: {#startTransaction: startTransactionShim}), ], ) void main() {}