From b3e5b783f377684f13c0389c810e760b35d2a321 Mon Sep 17 00:00:00 2001 From: Dennis Loose Date: Wed, 8 Nov 2023 14:07:58 +0200 Subject: [PATCH 1/2] fix(packagekit): check arch compatibility in resolve --- lib/src/packagekit/packagekit_service.dart | 19 +++++- test/packagekit_service_test.dart | 67 ++++++++++++++++------ test/test_utils.mocks.dart | 10 +++- 3 files changed, 76 insertions(+), 20 deletions(-) diff --git a/lib/src/packagekit/packagekit_service.dart b/lib/src/packagekit/packagekit_service.dart index 713a100b5..ab2f83b68 100644 --- a/lib/src/packagekit/packagekit_service.dart +++ b/lib/src/packagekit/packagekit_service.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:io'; import 'package:dbus/dbus.dart'; import 'package:flutter/material.dart'; @@ -130,13 +131,27 @@ class PackageKitService { action: (transaction) => transaction.removePackages([packageId]), ); + static Future _getNativeArchitecture() async { + final snapArch = Platform.environment['SNAP_ARCH']; + if (snapArch != null) { + return snapArch; + } + + final result = await Process.run('/usr/bin/dpkg', ['--print-architecture']); + return result.stdout as String; + } + /// Resolves a single package name provided by `name`. - Future resolve(String name) async { + Future resolve( + String name, [ + @visibleForTesting String? architecture, + ]) async { + final arch = architecture ?? await _getNativeArchitecture(); PackageKitPackageInfo? info; await _createTransaction( action: (transaction) => transaction.resolve([name]), listener: (event) { - if (event is PackageKitPackageEvent) { + if (event is PackageKitPackageEvent && event.packageId.arch == arch) { info = event; } }, diff --git a/test/packagekit_service_test.dart b/test/packagekit_service_test.dart index 033ea9329..824731a70 100644 --- a/test/packagekit_service_test.dart +++ b/test/packagekit_service_test.dart @@ -104,22 +104,57 @@ void main() { expect(packageKit.getTransaction(id), isNull); }); - test('resolve', () async { - const mockInfo = PackageKitPackageEvent( - info: PackageKitInfo.available, - packageId: PackageKitPackageId(name: 'foo', version: '1.0'), - summary: 'summary', - ); - final mockTransaction = createMockPackageKitTransaction( - events: [mockInfo], - ); - final mockClient = createMockPackageKitClient(transaction: mockTransaction); - final packageKit = - PackageKitService(dbus: createMockDbusClient(), client: mockClient); - await packageKit.activateService(); - final info = await packageKit.resolve('foo'); - verify(mockTransaction.resolve(['foo'])).called(1); - expect(info, equals(mockInfo)); + group('resolve', () { + test('unique package', () async { + const mockInfo = PackageKitPackageEvent( + info: PackageKitInfo.available, + packageId: PackageKitPackageId(name: 'foo', version: '1.0'), + summary: 'summary', + ); + final mockTransaction = createMockPackageKitTransaction( + events: [mockInfo], + ); + final mockClient = + createMockPackageKitClient(transaction: mockTransaction); + final packageKit = + PackageKitService(dbus: createMockDbusClient(), client: mockClient); + await packageKit.activateService(); + final info = await packageKit.resolve('foo'); + verify(mockTransaction.resolve(['foo'])).called(1); + expect(info, equals(mockInfo)); + }); + + test('multiple architectures', () async { + final mockTransaction = createMockPackageKitTransaction( + events: const [ + PackageKitPackageEvent( + info: PackageKitInfo.available, + packageId: PackageKitPackageId( + name: 'foo', + version: '1.0', + arch: 'amd64', + ), + summary: 'summary', + ), + PackageKitPackageEvent( + info: PackageKitInfo.available, + packageId: PackageKitPackageId( + name: 'foo', + version: '1.0', + arch: 'i386', + ), + summary: 'summary', + ) + ], + ); + final mockClient = + createMockPackageKitClient(transaction: mockTransaction); + final packageKit = + PackageKitService(dbus: createMockDbusClient(), client: mockClient); + await packageKit.activateService(); + final info = await packageKit.resolve('foo'); + expect(info!.packageId.arch, equals('amd64')); + }); }); test('cancel', () async { diff --git a/test/test_utils.mocks.dart b/test/test_utils.mocks.dart index 03f1cb9bc..9a8ecba90 100644 --- a/test/test_utils.mocks.dart +++ b/test/test_utils.mocks.dart @@ -2446,11 +2446,17 @@ class MockPackageKitService extends _i1.Mock implements _i8.PackageKitService { ) as _i14.Future); @override - _i14.Future<_i10.PackageKitPackageEvent?> resolve(String? name) => + _i14.Future<_i10.PackageKitPackageEvent?> resolve( + String? name, [ + String? architecture, + ]) => (super.noSuchMethod( Invocation.method( #resolve, - [name], + [ + name, + architecture, + ], ), returnValue: _i14.Future<_i10.PackageKitPackageEvent?>.value(), ) as _i14.Future<_i10.PackageKitPackageEvent?>); From 2569742ef889b03bbc5bfc6b9f7188ba6f4d2c3e Mon Sep 17 00:00:00 2001 From: Dennis Loose Date: Wed, 8 Nov 2023 14:49:03 +0200 Subject: [PATCH 2/2] fix: update test --- test/packagekit_service_test.dart | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/packagekit_service_test.dart b/test/packagekit_service_test.dart index 824731a70..d35d61ed1 100644 --- a/test/packagekit_service_test.dart +++ b/test/packagekit_service_test.dart @@ -108,7 +108,11 @@ void main() { test('unique package', () async { const mockInfo = PackageKitPackageEvent( info: PackageKitInfo.available, - packageId: PackageKitPackageId(name: 'foo', version: '1.0'), + packageId: PackageKitPackageId( + name: 'foo', + version: '1.0', + arch: 'amd64', + ), summary: 'summary', ); final mockTransaction = createMockPackageKitTransaction( @@ -119,7 +123,7 @@ void main() { final packageKit = PackageKitService(dbus: createMockDbusClient(), client: mockClient); await packageKit.activateService(); - final info = await packageKit.resolve('foo'); + final info = await packageKit.resolve('foo', 'amd64'); verify(mockTransaction.resolve(['foo'])).called(1); expect(info, equals(mockInfo)); }); @@ -152,7 +156,7 @@ void main() { final packageKit = PackageKitService(dbus: createMockDbusClient(), client: mockClient); await packageKit.activateService(); - final info = await packageKit.resolve('foo'); + final info = await packageKit.resolve('foo', 'amd64'); expect(info!.packageId.arch, equals('amd64')); }); });