Skip to content

Commit

Permalink
Merge pull request #1486 from d-loose/arch-compatibility
Browse files Browse the repository at this point in the history
fix(packagekit): check arch compatibility in resolve
  • Loading branch information
d-loose authored Nov 10, 2023
2 parents be4b88e + 2569742 commit fb7779d
Show file tree
Hide file tree
Showing 3 changed files with 80 additions and 20 deletions.
19 changes: 17 additions & 2 deletions lib/src/packagekit/packagekit_service.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:io';

import 'package:dbus/dbus.dart';
import 'package:flutter/material.dart';
Expand Down Expand Up @@ -130,13 +131,27 @@ class PackageKitService {
action: (transaction) => transaction.removePackages([packageId]),
);

static Future<String> _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<PackageKitPackageInfo?> resolve(String name) async {
Future<PackageKitPackageInfo?> 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;
}
},
Expand Down
71 changes: 55 additions & 16 deletions test/packagekit_service_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -104,22 +104,61 @@ 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',
arch: 'amd64',
),
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', 'amd64');
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', 'amd64');
expect(info!.packageId.arch, equals('amd64'));
});
});

test('cancel', () async {
Expand Down
10 changes: 8 additions & 2 deletions test/test_utils.mocks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2446,11 +2446,17 @@ class MockPackageKitService extends _i1.Mock implements _i8.PackageKitService {
) as _i14.Future<int>);

@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?>);
Expand Down

0 comments on commit fb7779d

Please sign in to comment.