Skip to content

Commit

Permalink
Merge branch 'main' into feat/capture-feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
denrase committed Aug 19, 2024
2 parents 74b5529 + 256df44 commit c86b10e
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 10 deletions.
17 changes: 10 additions & 7 deletions .github/workflows/flutter.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ jobs:
defaults:
run:
shell: bash
working-directory: flutter
strategy:
fail-fast: false
matrix:
Expand Down Expand Up @@ -77,21 +78,23 @@ jobs:
- run: flutter upgrade

- name: Pub Get
run: |
cd flutter
flutter pub get
run: flutter pub get

- name: Test chrome
- name: Test web (JS)
if: matrix.target == 'web'
run: |
cd flutter
flutter test --platform chrome --test-randomize-ordering-seed=random --exclude-tags canvasKit
flutter test --platform chrome --test-randomize-ordering-seed=random --tags canvasKit --web-renderer canvaskit
- name: Test web (WASM)
if: matrix.target == 'web'
run: |
flutter test --platform chrome --wasm --test-randomize-ordering-seed=random --exclude-tags canvasKit
flutter test --platform chrome --wasm --test-randomize-ordering-seed=random --tags canvasKit --web-renderer canvaskit
- name: Test VM with coverage
if: matrix.target == 'linux' || matrix.target == 'macos' || matrix.target == 'windows'
run: |
cd flutter
flutter test --coverage --test-randomize-ordering-seed=random
dart run remove_from_coverage -f coverage/lcov.info -r 'binding.dart'
Expand All @@ -111,11 +114,11 @@ jobs:
exclude: 'lib/src/native/cocoa/binding.dart'

- name: Build ${{ matrix.target }}
working-directory: flutter/example
run: |
flutter config --enable-windows-desktop
flutter config --enable-macos-desktop
flutter config --enable-linux-desktop
cd flutter/example
TARGET=${{ matrix.target }}
flutter pub get
case $TARGET in
Expand Down
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ SentryNavigatorObserver(ignoreRoutes: ["/ignoreThisRoute"]),
```
- Support `captureFeedback` ([#2230](https://github.com/getsentry/sentry-dart/pull/2230))

### Improvements

- Debouncing of SentryWidgetsBindingObserver.didChangeMetrics with delay of 100ms. ([#2232](https://github.com/getsentry/sentry-dart/pull/2232))

### Dependencies

- Bump Android SDK from v7.13.0 to v7.14.0 ([#2228](https://github.com/getsentry/sentry-dart/pull/2228))
Expand Down
20 changes: 20 additions & 0 deletions flutter/lib/src/utils/debouncer.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:meta/meta.dart';

@internal
class Debouncer {
final int milliseconds;
Timer? _timer;

Debouncer({required this.milliseconds});

void run(VoidCallback action) {
_timer?.cancel();
_timer = Timer(Duration(milliseconds: milliseconds), action);
}

void dispose() {
_timer?.cancel();
}
}
12 changes: 9 additions & 3 deletions flutter/lib/src/widgets_binding_observer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'dart:ui';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import '../sentry_flutter.dart';
import 'utils/debouncer.dart';

/// This is a `WidgetsBindingObserver` which can observe some events of a
/// Flutter application.
Expand Down Expand Up @@ -50,6 +51,8 @@ class SentryWidgetsBindingObserver with WidgetsBindingObserver {
// ignore: deprecated_member_use
final StreamController<SingletonFlutterWindow?> _screenSizeStreamController;

final _didChangeMetricsDebouncer = Debouncer(milliseconds: 100);

/// This method records lifecycle events.
/// It tries to mimic the behavior of ActivityBreadcrumbsIntegration of Sentry
/// Android for lifecycle events.
Expand Down Expand Up @@ -88,9 +91,12 @@ class SentryWidgetsBindingObserver with WidgetsBindingObserver {
if (!_options.enableWindowMetricBreadcrumbs) {
return;
}
// ignore: deprecated_member_use
final window = _options.bindingUtils.instance?.window;
_screenSizeStreamController.add(window);

_didChangeMetricsDebouncer.run(() {
// ignore: deprecated_member_use
final window = _options.bindingUtils.instance?.window;
_screenSizeStreamController.add(window);
});
}

void _onScreenSizeChanged(Map<String, dynamic> data) {
Expand Down
8 changes: 8 additions & 0 deletions flutter/test/integrations/flutter_error_integration_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,10 @@ void main() {
expect(event.contexts['flutter_error_details']['context'],
'thrown while handling a gesture');
expect(event.contexts['flutter_error_details']['information'], 'foo bar');
}, onPlatform: {
// TODO stacktrace parsing for wasm is not implemented yet
// https://github.com/getsentry/sentry-dart/issues/1480
'wasm': Skip('WASM stack trace parsing not implemented yet'),
});

test('captures error with long FlutterErrorDetails.information', () async {
Expand Down Expand Up @@ -115,6 +119,10 @@ void main() {
'thrown while handling a gesture');
expect(event.contexts['flutter_error_details']['information'],
'foo bar\nHello World!');
}, onPlatform: {
// TODO stacktrace parsing for wasm is not implemented yet
// https://github.com/getsentry/sentry-dart/issues/1480
'wasm': Skip('WASM stack trace parsing not implemented yet'),
});

test('captures error with no FlutterErrorDetails', () async {
Expand Down
77 changes: 77 additions & 0 deletions flutter/test/widgets_binding_observer_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,9 @@ void main() {
// ignore: deprecated_member_use
window.physicalSizeTestValue = Size(newWidth, newHeight);

// waiting for debouncing with 100ms added https://github.com/getsentry/sentry-dart/issues/400
await tester.pump(Duration(milliseconds: 150));

final breadcrumb =
verify(hub.addBreadcrumb(captureAny)).captured.single as Breadcrumb;

Expand Down Expand Up @@ -230,6 +233,9 @@ void main() {
// ignore: deprecated_member_use
window.devicePixelRatioTestValue = newPixelRatio;

// waiting for debouncing with 100ms added https://github.com/getsentry/sentry-dart/issues/400
await tester.pump(Duration(milliseconds: 150));

final breadcrumb =
verify(hub.addBreadcrumb(captureAny)).captured.single as Breadcrumb;

Expand Down Expand Up @@ -265,6 +271,9 @@ void main() {
// ignore: deprecated_member_use
window.viewInsetsTestValue = WindowPadding.zero;

// waiting for debouncing with 100ms added https://github.com/getsentry/sentry-dart/issues/400
await tester.pump(Duration(milliseconds: 150));

verifyNever(hub.addBreadcrumb(captureAny));

instance.removeObserver(observer);
Expand All @@ -286,6 +295,9 @@ void main() {

window.onMetricsChanged!();

// waiting for debouncing with 100ms added https://github.com/getsentry/sentry-dart/issues/400
await tester.pump(Duration(milliseconds: 150));

verifyNever(hub.addBreadcrumb(captureAny));

instance.removeObserver(observer);
Expand Down Expand Up @@ -400,5 +412,70 @@ void main() {

instance.removeObserver(observer);
});

testWidgets('debouncing didChangeMetrics with 100ms delay',
(WidgetTester tester) async {
final hub = MockHub();

final observer = SentryWidgetsBindingObserver(
hub: hub,
options: flutterTrackingEnabledOptions,
);
final instance = tester.binding;
instance.addObserver(observer);

// ignore: deprecated_member_use
final window = instance.window;

// ignore: deprecated_member_use
window.physicalSizeTestValue = window.physicalSize;

const newPixelRatio = 1.7;
// ignore: deprecated_member_use
window.devicePixelRatioTestValue = newPixelRatio;

verifyNever(hub.addBreadcrumb(captureAny));

// waiting for debouncing with 100ms added https://github.com/getsentry/sentry-dart/issues/400
await tester.pump(Duration(milliseconds: 150));

verify(hub.addBreadcrumb(captureAny));

instance.removeObserver(observer);
});

testWidgets('debouncing: didChangeMetrics is called only once in 100ms',
(WidgetTester tester) async {
final hub = MockHub();

final observer = SentryWidgetsBindingObserver(
hub: hub,
options: flutterTrackingEnabledOptions,
);
final instance = tester.binding;
instance.addObserver(observer);

// ignore: deprecated_member_use
final window = instance.window;

// ignore: deprecated_member_use
window.physicalSizeTestValue = window.physicalSize;

// ignore: deprecated_member_use
window.devicePixelRatioTestValue = 2.1;
// ignore: deprecated_member_use
window.devicePixelRatioTestValue = 2.2;
// ignore: deprecated_member_use
window.devicePixelRatioTestValue = 2.3;

verifyNever(hub.addBreadcrumb(captureAny));

// waiting for debouncing with 100ms added https://github.com/getsentry/sentry-dart/issues/400
await tester.pump(Duration(milliseconds: 150));

verify(hub.addBreadcrumb(captureAny)).called(1);

instance.removeObserver(observer);
});
});
}

0 comments on commit c86b10e

Please sign in to comment.