From c813d53a782a98577dbe5342cc380d4db4e3082f Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Tue, 23 Jun 2026 17:58:51 +0900 Subject: [PATCH 1/4] [tizen_app_manager] Add regression integration tests Add regression integration test cases for tizen_app_manager public API: - AppManager.getInstalledApps: returns non-empty list - AppManager.getInstalledApps: includes the current app - AppManager.isRunning: returns true for running app - AppManager.isRunning: returns false for non-running app - AppManager.isRunning: throws ArgumentError for empty appId - AppManager.getAppInfo: returns all AppInfo fields - AppManager.getAppInfo: throws ArgumentError for empty appId - AppRunningContext: packageId matches current app - AppRunningContext: throws PlatformException for non-running appId Co-Authored-By: Claude Sonnet 4.6 --- packages/tizen_app_manager/CHANGELOG.md | 4 ++ .../tizen_app_manager_test.dart | 65 +++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/packages/tizen_app_manager/CHANGELOG.md b/packages/tizen_app_manager/CHANGELOG.md index 53fecbd00..8a63d1eac 100644 --- a/packages/tizen_app_manager/CHANGELOG.md +++ b/packages/tizen_app_manager/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Add 9 integration test cases. + ## 0.2.4 * Update code format. diff --git a/packages/tizen_app_manager/example/integration_test/tizen_app_manager_test.dart b/packages/tizen_app_manager/example/integration_test/tizen_app_manager_test.dart index abd8f7fc8..2725c642b 100644 --- a/packages/tizen_app_manager/example/integration_test/tizen_app_manager_test.dart +++ b/packages/tizen_app_manager/example/integration_test/tizen_app_manager_test.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:integration_test/integration_test.dart'; import 'package:tizen_app_manager/tizen_app_manager.dart'; @@ -35,4 +36,68 @@ void main() { expect(context.processId, isPositive); expect(context.isTerminated, isFalse); }); + + group('AppManager', () { + group('getInstalledApps', () { + testWidgets('returns non-empty list', (WidgetTester _) async { + final List apps = await AppManager.getInstalledApps(); + expect(apps, isNotEmpty); + }); + + testWidgets('includes the current app', (WidgetTester _) async { + final String appId = await AppManager.currentAppId; + final List apps = await AppManager.getInstalledApps(); + expect(apps.any((AppInfo app) => app.appId == appId), isTrue); + }); + }); + + group('isRunning', () { + testWidgets('returns true for running app', (WidgetTester _) async { + final String appId = await AppManager.currentAppId; + expect(await AppManager.isRunning(appId), isTrue); + }); + + testWidgets('returns false for non-running app', (WidgetTester _) async { + expect( + await AppManager.isRunning('org.tizen.nonexistent'), + isFalse, + ); + }); + + testWidgets('throws ArgumentError for empty appId', (WidgetTester _) async { + await expectLater(AppManager.isRunning(''), throwsArgumentError); + }); + }); + + group('getAppInfo', () { + testWidgets('returns all AppInfo fields', (WidgetTester _) async { + final String appId = await AppManager.currentAppId; + final AppInfo appInfo = await AppManager.getAppInfo(appId); + expect(appInfo.appId, appId); + expect(appInfo.executablePath, isNotEmpty); + expect(appInfo.sharedResourcePath, isNotEmpty); + }); + + testWidgets('throws ArgumentError for empty appId', (WidgetTester _) async { + await expectLater(AppManager.getAppInfo(''), throwsArgumentError); + }); + }); + }); + + group('AppRunningContext', () { + testWidgets('packageId matches current app', (WidgetTester _) async { + final String appId = await AppManager.currentAppId; + final AppRunningContext context = AppRunningContext(appId: appId); + expect(context.packageId, 'org.tizen.tizen_app_manager_example'); + }); + + testWidgets('throws PlatformException for non-running appId', ( + WidgetTester _, + ) async { + expect( + () => AppRunningContext(appId: 'org.tizen.nonexistent'), + throwsA(isA()), + ); + }); + }); } From dbec607ba2d148b0ffa656e599bb92ca9b7a30a7 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Tue, 23 Jun 2026 17:59:03 +0900 Subject: [PATCH 2/4] [tizen_app_manager] Fix memory leak in AppRunningContext.packageId The native string returned by app_context_get_package_id must be released with free() per the API contract, but was never freed. This caused heap corruption when multiple tests called packageId, leading to crashes in subsequent native calls. Co-Authored-By: Claude Sonnet 4.6 --- packages/tizen_app_manager/CHANGELOG.md | 2 ++ packages/tizen_app_manager/lib/src/app_context.dart | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/tizen_app_manager/CHANGELOG.md b/packages/tizen_app_manager/CHANGELOG.md index 8a63d1eac..044c6e0f5 100644 --- a/packages/tizen_app_manager/CHANGELOG.md +++ b/packages/tizen_app_manager/CHANGELOG.md @@ -1,5 +1,7 @@ ## NEXT +* Fix memory leak in `AppRunningContext.packageId` by freeing the native string + returned by `app_context_get_package_id`. * Add 9 integration test cases. ## 0.2.4 diff --git a/packages/tizen_app_manager/lib/src/app_context.dart b/packages/tizen_app_manager/lib/src/app_context.dart index 3bb414303..6271344fe 100644 --- a/packages/tizen_app_manager/lib/src/app_context.dart +++ b/packages/tizen_app_manager/lib/src/app_context.dart @@ -73,7 +73,10 @@ class AppContext { if (ret != 0) { _throwPlatformException(ret); } - return packageId.value.toDartString(); + final Pointer pkgId = packageId.value; + final String result = pkgId.toDartString(); + malloc.free(pkgId); + return result; }); } From 69ae400e6f23330a5d792f4086a4ea0b2b5e21b4 Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Tue, 30 Jun 2026 14:56:38 +0900 Subject: [PATCH 3/4] Fix dart format --- .../example/integration_test/tizen_app_manager_test.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/tizen_app_manager/example/integration_test/tizen_app_manager_test.dart b/packages/tizen_app_manager/example/integration_test/tizen_app_manager_test.dart index 2725c642b..4e33c3a65 100644 --- a/packages/tizen_app_manager/example/integration_test/tizen_app_manager_test.dart +++ b/packages/tizen_app_manager/example/integration_test/tizen_app_manager_test.dart @@ -64,7 +64,8 @@ void main() { ); }); - testWidgets('throws ArgumentError for empty appId', (WidgetTester _) async { + testWidgets('throws ArgumentError for empty appId', + (WidgetTester _) async { await expectLater(AppManager.isRunning(''), throwsArgumentError); }); }); @@ -78,7 +79,8 @@ void main() { expect(appInfo.sharedResourcePath, isNotEmpty); }); - testWidgets('throws ArgumentError for empty appId', (WidgetTester _) async { + testWidgets('throws ArgumentError for empty appId', + (WidgetTester _) async { await expectLater(AppManager.getAppInfo(''), throwsArgumentError); }); }); From 2dfff8d414f673b0938fdc07fc3e50676b45b20d Mon Sep 17 00:00:00 2001 From: Seungsoo Lee Date: Wed, 1 Jul 2026 11:45:26 +0900 Subject: [PATCH 4/4] [tizen_app_manager] Bump tizen_app_manager to 0.2.5 --- packages/tizen_app_manager/CHANGELOG.md | 2 +- packages/tizen_app_manager/README.md | 2 +- packages/tizen_app_manager/pubspec.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/tizen_app_manager/CHANGELOG.md b/packages/tizen_app_manager/CHANGELOG.md index 044c6e0f5..bec05960e 100644 --- a/packages/tizen_app_manager/CHANGELOG.md +++ b/packages/tizen_app_manager/CHANGELOG.md @@ -1,4 +1,4 @@ -## NEXT +## 0.2.5 * Fix memory leak in `AppRunningContext.packageId` by freeing the native string returned by `app_context_get_package_id`. diff --git a/packages/tizen_app_manager/README.md b/packages/tizen_app_manager/README.md index 3a099410e..2165d5194 100644 --- a/packages/tizen_app_manager/README.md +++ b/packages/tizen_app_manager/README.md @@ -10,7 +10,7 @@ To use this package, add `tizen_app_manager` as a dependency in your `pubspec.ya ```yaml dependencies: - tizen_app_manager: ^0.2.4 + tizen_app_manager: ^0.2.5 ``` ### Retrieving current app info diff --git a/packages/tizen_app_manager/pubspec.yaml b/packages/tizen_app_manager/pubspec.yaml index a16434cc3..28cf4210c 100644 --- a/packages/tizen_app_manager/pubspec.yaml +++ b/packages/tizen_app_manager/pubspec.yaml @@ -2,7 +2,7 @@ name: tizen_app_manager description: Tizen application manager APIs. Used to get app info and app running context on a Tizen device. homepage: https://github.com/flutter-tizen/plugins repository: https://github.com/flutter-tizen/plugins/tree/master/packages/tizen_app_manager -version: 0.2.4 +version: 0.2.5 environment: sdk: ">=3.1.0 <4.0.0"