From a3ef3b5de9980847895f921081e3eb41461fa1b3 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Thu, 18 Jun 2026 14:16:24 +0900 Subject: [PATCH 1/2] [messageport] Add regression integration tests Add 5 integration test cases covering previously untested public API: - LocalPort.registered reflects the register/unregister lifecycle. - LocalPort.register throws when the port is already registered. - LocalPort.unregister is a no-op when the port is not registered and is safe to call repeatedly. - Round-trip an empty string message. - Round-trip a nested collection (list and map) message. This is a Tizen-exclusive plugin with no upstream package. Test-only change, recorded under the existing NEXT changelog entry without a version bump. Validated on a Raspberry Pi 4 device and the TV emulator: 19 passed, 0 failed. --- packages/messageport/CHANGELOG.md | 1 + .../integration_test/messageport_test.dart | 60 +++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/packages/messageport/CHANGELOG.md b/packages/messageport/CHANGELOG.md index 1fdc90a81..62a239d0b 100644 --- a/packages/messageport/CHANGELOG.md +++ b/packages/messageport/CHANGELOG.md @@ -3,6 +3,7 @@ * Fix new lint warnings. * Update minimum Flutter and Dart version to 3.13 and 3.1. * Update code format. +* Add 5 integration test cases. ## 0.3.2 diff --git a/packages/messageport/example/integration_test/messageport_test.dart b/packages/messageport/example/integration_test/messageport_test.dart index ab6b28858..a7307edaa 100644 --- a/packages/messageport/example/integration_test/messageport_test.dart +++ b/packages/messageport/example/integration_test/messageport_test.dart @@ -110,6 +110,53 @@ void main() { await localPort.unregister(); }, timeout: const Timeout(Duration(seconds: 5))); + group('LocalPort lifecycle', () { + testWidgets('registered reflects the register/unregister lifecycle', ( + WidgetTester tester, + ) async { + final LocalPort localPort = await LocalPort.create(kTestPort); + expect(localPort.portName, equals(kTestPort)); + expect(localPort.registered, isFalse); + + localPort.register((dynamic message, [RemotePort? remotePort]) {}); + expect(localPort.registered, isTrue); + + await localPort.unregister(); + expect(localPort.registered, isFalse); + }, timeout: const Timeout(Duration(seconds: 5))); + + testWidgets('register throws when the port is already registered', ( + WidgetTester tester, + ) async { + final LocalPort localPort = await LocalPort.create(kTestPort); + localPort.register((dynamic message, [RemotePort? remotePort]) {}); + + expect( + () => + localPort.register((dynamic message, [RemotePort? remotePort]) {}), + throwsException, + ); + + await localPort.unregister(); + }, timeout: const Timeout(Duration(seconds: 5))); + + testWidgets('unregister is safe when not registered and when repeated', ( + WidgetTester tester, + ) async { + final LocalPort localPort = await LocalPort.create(kTestPort); + + // Unregistering before any registration must not throw. + await localPort.unregister(); + expect(localPort.registered, isFalse); + + // Unregister is safe to call repeatedly after a registration. + localPort.register((dynamic message, [RemotePort? remotePort]) {}); + await localPort.unregister(); + await localPort.unregister(); + expect(localPort.registered, isFalse); + }, timeout: const Timeout(Duration(seconds: 5))); + }); + group('Types test', () { late LocalPort localPort; late RemotePort remotePort; @@ -172,5 +219,18 @@ void main() { final Map value = {'a': 5, 'b': 12}; await checkForMessage>(value); }, timeout: const Timeout(Duration(seconds: 5))); + + testWidgets('empty string', (WidgetTester tester) async { + const String value = ''; + await checkForMessage(value); + }, timeout: const Timeout(Duration(seconds: 5))); + + testWidgets('nested collection', (WidgetTester tester) async { + final Map value = { + 'numbers': [1, 2, 3], + 'nested': {'key': 'value'}, + }; + await checkForMessage>(value); + }, timeout: const Timeout(Duration(seconds: 5))); }); } From 6570d00bbcfc108f6924c8f7a1591bde124f70bd Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Thu, 18 Jun 2026 15:10:57 +0900 Subject: [PATCH 2/2] [messageport] Use addTearDown to unregister local ports in lifecycle tests Register the LocalPort cleanup with addTearDown in the lifecycle tests so the port is always unregistered even if an assertion fails mid-test, preventing leaked registrations from accumulating across tests. Validated on a Raspberry Pi 4 device: 19 passed, 0 failed. --- .../example/integration_test/messageport_test.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/messageport/example/integration_test/messageport_test.dart b/packages/messageport/example/integration_test/messageport_test.dart index a7307edaa..621d7a2e6 100644 --- a/packages/messageport/example/integration_test/messageport_test.dart +++ b/packages/messageport/example/integration_test/messageport_test.dart @@ -115,6 +115,8 @@ void main() { WidgetTester tester, ) async { final LocalPort localPort = await LocalPort.create(kTestPort); + // Ensure the port is unregistered even if an assertion below fails. + addTearDown(localPort.unregister); expect(localPort.portName, equals(kTestPort)); expect(localPort.registered, isFalse); @@ -129,6 +131,7 @@ void main() { WidgetTester tester, ) async { final LocalPort localPort = await LocalPort.create(kTestPort); + addTearDown(localPort.unregister); localPort.register((dynamic message, [RemotePort? remotePort]) {}); expect( @@ -136,14 +139,13 @@ void main() { localPort.register((dynamic message, [RemotePort? remotePort]) {}), throwsException, ); - - await localPort.unregister(); }, timeout: const Timeout(Duration(seconds: 5))); testWidgets('unregister is safe when not registered and when repeated', ( WidgetTester tester, ) async { final LocalPort localPort = await LocalPort.create(kTestPort); + addTearDown(localPort.unregister); // Unregistering before any registration must not throw. await localPort.unregister();