diff --git a/dart/lib/src/load_dart_debug_images_integration.dart b/dart/lib/src/load_dart_debug_images_integration.dart index 4b7a35c39f..c271c6232a 100644 --- a/dart/lib/src/load_dart_debug_images_integration.dart +++ b/dart/lib/src/load_dart_debug_images_integration.dart @@ -1,8 +1,16 @@ import 'dart:typed_data'; - import 'package:meta/meta.dart'; -import '../sentry.dart'; +import 'event_processor.dart'; +import 'hint.dart'; +import 'hub.dart'; +import 'integration.dart'; +import 'protocol/debug_image.dart'; +import 'protocol/debug_meta.dart'; +import 'protocol/sentry_event.dart'; +import 'protocol/sentry_level.dart'; +import 'protocol/sentry_stack_trace.dart'; +import 'sentry_options.dart'; class LoadDartDebugImagesIntegration extends Integration { @override @@ -87,7 +95,7 @@ class LoadImageIntegrationEventProcessor implements EventProcessor { if (platform.isAndroid || platform.isWindows) { type = 'elf'; - debugId = _convertBuildIdToDebugId(stackTrace.buildId!, platform.endian); + debugId = _convertBuildIdToDebugId(stackTrace.buildId!, Endian.host); if (platform.isAndroid) { codeFile = 'libapp.so'; } else if (platform.isWindows) { diff --git a/dart/lib/src/platform/_io_platform.dart b/dart/lib/src/platform/_io_platform.dart index ecc9c2035c..b7316e22ab 100644 --- a/dart/lib/src/platform/_io_platform.dart +++ b/dart/lib/src/platform/_io_platform.dart @@ -1,20 +1,3 @@ -import 'dart:io' as io show Platform; +import 'package:platform/platform.dart'; -import 'platform.dart'; - -const Platform instance = IOPlatform(); - -/// [Platform] implementation that delegates directly to `dart:io`. -class IOPlatform extends Platform { - /// Creates a new [IOPlatform]. - const IOPlatform(); - - @override - String get operatingSystem => io.Platform.operatingSystem; - - @override - String get operatingSystemVersion => io.Platform.operatingSystemVersion; - - @override - String get localHostname => io.Platform.localHostname; -} +const Platform instance = LocalPlatform(); diff --git a/dart/lib/src/platform/_web_platform.dart b/dart/lib/src/platform/_web_platform.dart index 97c05815be..7cbe6f3f79 100644 --- a/dart/lib/src/platform/_web_platform.dart +++ b/dart/lib/src/platform/_web_platform.dart @@ -1,7 +1,6 @@ +import 'package:platform/platform.dart'; import 'package:web/web.dart' as web; -import 'platform.dart'; - const Platform instance = WebPlatform(); /// [Platform] implementation that delegates to `dart:web`. @@ -48,4 +47,52 @@ class WebPlatform extends Platform { } return 'android'; } + + @override + // TODO: implement environment + Map get environment => throw UnimplementedError(); + + @override + // TODO: implement executable + String get executable => throw UnimplementedError(); + + @override + // TODO: implement executableArguments + List get executableArguments => throw UnimplementedError(); + + @override + // TODO: implement localeName + String get localeName => throw UnimplementedError(); + + @override + // TODO: implement numberOfProcessors + int get numberOfProcessors => throw UnimplementedError(); + + @override + // TODO: implement packageConfig + String? get packageConfig => throw UnimplementedError(); + + @override + // TODO: implement pathSeparator + String get pathSeparator => throw UnimplementedError(); + + @override + // TODO: implement resolvedExecutable + String get resolvedExecutable => throw UnimplementedError(); + + @override + // TODO: implement script + Uri get script => throw UnimplementedError(); + + @override + // TODO: implement stdinSupportsAnsi + bool get stdinSupportsAnsi => throw UnimplementedError(); + + @override + // TODO: implement stdoutSupportsAnsi + bool get stdoutSupportsAnsi => throw UnimplementedError(); + + @override + // TODO: implement version + String get version => throw UnimplementedError(); } diff --git a/dart/lib/src/platform/platform.dart b/dart/lib/src/platform/platform.dart index e3d5ae9f32..e0a997de53 100644 --- a/dart/lib/src/platform/platform.dart +++ b/dart/lib/src/platform/platform.dart @@ -1,41 +1,6 @@ -import 'dart:typed_data'; +import 'package:platform/platform.dart'; import '_io_platform.dart' if (dart.library.js_interop) '_web_platform.dart' as platform; const Platform instance = platform.instance; - -abstract class Platform { - const Platform(); - - /// A string (`linux`, `macos`, `windows`, `android`, `ios`, or `fuchsia`) - /// representing the operating system. - String get operatingSystem; - - /// A string representing the version of the operating system or platform. - String get operatingSystemVersion; - - /// Get the local hostname for the system. - String get localHostname; - - /// Endianness of this platform. - Endian get endian => Endian.host; - - /// True if the operating system is Linux. - bool get isLinux => (operatingSystem == 'linux'); - - /// True if the operating system is OS X. - bool get isMacOS => (operatingSystem == 'macos'); - - /// True if the operating system is Windows. - bool get isWindows => (operatingSystem == 'windows'); - - /// True if the operating system is Android. - bool get isAndroid => (operatingSystem == 'android'); - - /// True if the operating system is iOS. - bool get isIOS => (operatingSystem == 'ios'); - - /// True if the operating system is Fuchsia - bool get isFuchsia => (operatingSystem == 'fuchsia'); -} diff --git a/dart/lib/src/platform_checker.dart b/dart/lib/src/platform_checker.dart index 884775a95a..45a835d6ff 100644 --- a/dart/lib/src/platform_checker.dart +++ b/dart/lib/src/platform_checker.dart @@ -1,6 +1,6 @@ import 'dart:async'; - -import 'platform/platform.dart'; +import 'package:platform/platform.dart'; +import 'platform/platform.dart' as pf; /// Helper to check in which environment the library is running. /// The environment checks (release/debug/profile) are mutually exclusive. @@ -8,7 +8,7 @@ class PlatformChecker { static const _jsUtil = 'dart.library.js_util'; PlatformChecker({ - this.platform = instance, + this.platform = pf.instance, bool? isWeb, bool? isRootZone, }) : isWeb = isWeb ?? _isWebWithWasmSupport(), diff --git a/dart/lib/src/protocol/sdk_version.dart b/dart/lib/src/protocol/sdk_version.dart index b915fbdde8..a65e29927c 100644 --- a/dart/lib/src/protocol/sdk_version.dart +++ b/dart/lib/src/protocol/sdk_version.dart @@ -71,6 +71,7 @@ class SdkVersion { final json = AccessAwareMap(data); final packagesJson = json['packages'] as List?; final integrationsJson = json['integrations'] as List?; + return SdkVersion( name: json['name'], version: json['version'], diff --git a/dart/pubspec.yaml b/dart/pubspec.yaml index c87c4d0f88..50da18af3e 100644 --- a/dart/pubspec.yaml +++ b/dart/pubspec.yaml @@ -26,6 +26,7 @@ dependencies: uuid: '>=3.0.0 <5.0.0' collection: ^1.16.0 web: ^1.1.0 + platform: ^3.1.6 dev_dependencies: build_runner: ^2.3.0 diff --git a/dart/test/example_web_compile_test.dart b/dart/test/example_web_compile_test.dart index 20e2509b6f..12906e2968 100644 --- a/dart/test/example_web_compile_test.dart +++ b/dart/test/example_web_compile_test.dart @@ -48,6 +48,7 @@ void main() { } /// Runs [command] with command's stdout and stderr being forwrarded to +/// /// test runner's respective streams. It buffers stdout and returns it. /// /// Returns [_CommandResult] with exitCode and stdout as a single sting diff --git a/dart/test/mocks/mock_platform.dart b/dart/test/mocks/mock_platform.dart index 21dc234b09..26f6f5c8b5 100644 --- a/dart/test/mocks/mock_platform.dart +++ b/dart/test/mocks/mock_platform.dart @@ -1,40 +1,23 @@ -import 'dart:typed_data'; +import 'package:platform/platform.dart'; -import 'package:sentry/src/platform/platform.dart'; - -import 'no_such_method_provider.dart'; - -class MockPlatform extends Platform with NoSuchMethodProvider { - MockPlatform({String? os, Endian? endian}) - : operatingSystem = os ?? '', - endian = endian ?? Endian.host; - - factory MockPlatform.android() { - return MockPlatform(os: 'android'); +extension MockPlatform on FakePlatform { + static Platform android() { + return FakePlatform(operatingSystem: 'android'); } - factory MockPlatform.iOS() { - return MockPlatform(os: 'ios'); + static Platform iOS() { + return FakePlatform(operatingSystem: 'ios'); } - factory MockPlatform.macOS() { - return MockPlatform(os: 'macos'); + static Platform macOS() { + return FakePlatform(operatingSystem: 'macos'); } - factory MockPlatform.linux() { - return MockPlatform(os: 'linux'); + static Platform linux() { + return FakePlatform(operatingSystem: 'linux'); } - factory MockPlatform.windows() { - return MockPlatform(os: 'windows'); + static Platform windows() { + return FakePlatform(operatingSystem: 'windows'); } - - @override - final String operatingSystem; - - @override - final Endian endian; - - @override - String toString() => operatingSystem; } diff --git a/dart/test/mocks/mock_platform_checker.dart b/dart/test/mocks/mock_platform_checker.dart index efb58d6c7a..8cef300026 100644 --- a/dart/test/mocks/mock_platform_checker.dart +++ b/dart/test/mocks/mock_platform_checker.dart @@ -1,4 +1,4 @@ -import 'package:sentry/src/platform/platform.dart'; +import 'package:platform/platform.dart'; import 'package:sentry/src/platform_checker.dart'; import 'no_such_method_provider.dart'; diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index c311d7c2a6..e9395bb70a 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -48,6 +48,7 @@ dev_dependencies: ref: 6aa2c2642f507eab3df83373189170797a9fa5e7 jnigen: 0.14.0 + platform: any flutter: plugin: platforms: diff --git a/flutter/test/mocks.dart b/flutter/test/mocks.dart index 3dce2bbb60..b25f3a549b 100644 --- a/flutter/test/mocks.dart +++ b/flutter/test/mocks.dart @@ -6,13 +6,13 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:meta/meta.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; -import 'package:sentry/src/platform/platform.dart'; import 'package:sentry/src/sentry_tracer.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:sentry_flutter/src/frames_tracking/sentry_delayed_frames_tracker.dart'; import 'package:sentry_flutter/src/native/sentry_native_binding.dart'; import 'package:sentry_flutter/src/renderer/renderer.dart'; import 'package:sentry_flutter/src/web/sentry_js_binding.dart'; +import 'package:platform/platform.dart'; import 'mocks.mocks.dart'; import 'no_such_method_provider.dart'; @@ -59,43 +59,26 @@ ISentrySpan startTransactionShim( ]) void main() {} -class MockPlatform with NoSuchMethodProvider implements Platform { - const MockPlatform(this.operatingSystem, - {this.operatingSystemVersion = '', this.localHostname = ''}); - - const MockPlatform.android() : this('android'); - const MockPlatform.iOs() : this('ios'); - const MockPlatform.macOs() : this('macos'); - const MockPlatform.windows() : this('windows'); - const MockPlatform.linux() : this('linux'); - const MockPlatform.fuchsia() : this('fuchsia'); - - @override - final String operatingSystem; - - @override - final String operatingSystemVersion; - - @override - final String localHostname; - - @override - bool get isLinux => (operatingSystem == 'linux'); - - @override - bool get isMacOS => (operatingSystem == 'macos'); +extension MockPlatform on FakePlatform { + static Platform android() { + return FakePlatform(operatingSystem: 'android'); + } - @override - bool get isWindows => (operatingSystem == 'windows'); + static Platform iOS() { + return FakePlatform(operatingSystem: 'ios'); + } - @override - bool get isAndroid => (operatingSystem == 'android'); + static Platform macOS() { + return FakePlatform(operatingSystem: 'macos'); + } - @override - bool get isIOS => (operatingSystem == 'ios'); + static Platform linux() { + return FakePlatform(operatingSystem: 'linux'); + } - @override - bool get isFuchsia => (operatingSystem == 'fuchsia'); + static Platform windows() { + return FakePlatform(operatingSystem: 'windows'); + } } class MockPlatformChecker with NoSuchMethodProvider implements PlatformChecker { @@ -105,7 +88,7 @@ class MockPlatformChecker with NoSuchMethodProvider implements PlatformChecker { this.hasNativeIntegration = false, this.isRoot = true, Platform? mockPlatform, - }) : _mockPlatform = mockPlatform ?? MockPlatform(''); + }) : _mockPlatform = mockPlatform ?? FakePlatform(operatingSystem: ''); final MockPlatformCheckerBuildMode buildMode; final bool isWebValue; diff --git a/flutter/test/profiling_test.dart b/flutter/test/profiling_test.dart index fb0c4ce905..775123a8e5 100644 --- a/flutter/test/profiling_test.dart +++ b/flutter/test/profiling_test.dart @@ -20,7 +20,7 @@ void main() { group('$SentryNativeProfilerFactory', () { Hub hubWithSampleRate(double profilesSampleRate) { final o = defaultTestOptions(); - o.platformChecker = getPlatformChecker(platform: MockPlatform.iOs()); + o.platformChecker = getPlatformChecker(platform: MockPlatform.iOS()); o.profilesSampleRate = profilesSampleRate; final hub = MockHub(); diff --git a/flutter/test/replay/replay_native_test.dart b/flutter/test/replay/replay_native_test.dart index cb76cec0e6..715061528c 100644 --- a/flutter/test/replay/replay_native_test.dart +++ b/flutter/test/replay/replay_native_test.dart @@ -28,7 +28,7 @@ void main() { for (final mockPlatform in [ MockPlatform.android(), - MockPlatform.iOs(), + MockPlatform.iOS(), ]) { group('$SentryNativeBinding (${mockPlatform.operatingSystem})', () { late SentryNativeBinding sut; diff --git a/flutter/test/sentry_flutter_test.dart b/flutter/test/sentry_flutter_test.dart index 103e240b70..0c70e6aa39 100644 --- a/flutter/test/sentry_flutter_test.dart +++ b/flutter/test/sentry_flutter_test.dart @@ -4,8 +4,8 @@ import 'package:flutter/foundation.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; import 'package:package_info_plus/package_info_plus.dart'; +import 'package:platform/platform.dart'; import 'package:sentry/src/dart_exception_type_identifier.dart'; -import 'package:sentry/src/platform/platform.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:sentry_flutter/src/file_system_transport.dart'; import 'package:sentry_flutter/src/flutter_exception_type_identifier.dart'; @@ -131,7 +131,7 @@ void main() { late final Transport transport; final sentryFlutterOptions = - defaultTestOptions(getPlatformChecker(platform: MockPlatform.iOs())) + defaultTestOptions(getPlatformChecker(platform: MockPlatform.iOS())) ..methodChannel = native.channel; await SentryFlutter.init( @@ -185,7 +185,7 @@ void main() { List integrations = []; Transport transport = MockTransport(); final sentryFlutterOptions = - defaultTestOptions(getPlatformChecker(platform: MockPlatform.macOs())) + defaultTestOptions(getPlatformChecker(platform: MockPlatform.macOS())) ..methodChannel = native.channel; await SentryFlutter.init( @@ -396,7 +396,7 @@ void main() { List integrations = []; Transport transport = MockTransport(); final sentryFlutterOptions = - defaultTestOptions(getPlatformChecker(platform: MockPlatform.iOs())) + defaultTestOptions(getPlatformChecker(platform: MockPlatform.iOS())) ..methodChannel = native.channel; // Tests that iOS || macOS integrations aren't added on a browser which @@ -439,7 +439,7 @@ void main() { List integrations = []; Transport transport = MockTransport(); final sentryFlutterOptions = - defaultTestOptions(getPlatformChecker(platform: MockPlatform.macOs())) + defaultTestOptions(getPlatformChecker(platform: MockPlatform.macOS())) ..methodChannel = native.channel; // Tests that iOS || macOS integrations aren't added on a browser which @@ -531,7 +531,7 @@ void main() { List integrations = []; final sentryFlutterOptions = - defaultTestOptions(getPlatformChecker(platform: MockPlatform.iOs())) + defaultTestOptions(getPlatformChecker(platform: MockPlatform.iOS())) ..methodChannel = native.channel ..rendererWrapper = MockRendererWrapper(FlutterRenderer.skia) ..release = '' @@ -558,7 +558,7 @@ void main() { List integrations = []; final sentryFlutterOptions = - defaultTestOptions(getPlatformChecker(platform: MockPlatform.iOs())) + defaultTestOptions(getPlatformChecker(platform: MockPlatform.iOS())) ..rendererWrapper = MockRendererWrapper(FlutterRenderer.canvasKit) ..release = '' ..dist = ''; @@ -584,7 +584,7 @@ void main() { List integrations = []; final sentryFlutterOptions = - defaultTestOptions(getPlatformChecker(platform: MockPlatform.iOs())) + defaultTestOptions(getPlatformChecker(platform: MockPlatform.iOS())) ..rendererWrapper = MockRendererWrapper(FlutterRenderer.html) ..release = '' ..dist = ''; diff --git a/flutter/test/sentry_native_channel_test.dart b/flutter/test/sentry_native_channel_test.dart index b041e71105..d4c8217ac0 100644 --- a/flutter/test/sentry_native_channel_test.dart +++ b/flutter/test/sentry_native_channel_test.dart @@ -11,8 +11,8 @@ import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:sentry_flutter/src/native/factory.dart'; import 'package:sentry_flutter/src/native/method_channel_helper.dart'; import 'package:sentry_flutter/src/native/sentry_native_binding.dart'; -import 'package:sentry/src/platform/platform.dart' as platform; import 'package:sentry_flutter/src/replay/replay_config.dart'; +import 'package:platform/platform.dart'; import 'mocks.dart'; import 'mocks.mocks.dart'; import 'sentry_flutter_test.dart'; @@ -20,8 +20,8 @@ import 'sentry_flutter_test.dart'; void main() { for (var mockPlatform in [ MockPlatform.android(), - MockPlatform.iOs(), - MockPlatform.macOs() + MockPlatform.iOS(), + MockPlatform.macOS() ]) { group('$SentryNativeBinding', () { late SentryNativeBinding sut; @@ -207,7 +207,7 @@ void main() { if (mockPlatform.isAndroid) { matcher = throwsUnsupportedError; } else if (mockPlatform.isIOS || mockPlatform.isMacOS) { - if (platform.instance.isMacOS) { + if (LocalPlatform().isMacOS) { matcher = throwsA(predicate((e) => e is Exception && e.toString().contains('Failed to load Objective-C class'))); diff --git a/min_version_test/pubspec.yaml b/min_version_test/pubspec.yaml index 49a693a6cb..40bcc4a009 100644 --- a/min_version_test/pubspec.yaml +++ b/min_version_test/pubspec.yaml @@ -35,6 +35,7 @@ dependencies: dio: any # This gets constrained by `sentry_dio` logging: any # This gets constrained by `sentry_logging` + flutter: any dev_dependencies: flutter_test: sdk: flutter