@@ -8,10 +8,12 @@ import 'dart:typed_data';
88
99import 'package:flutter_tools/src/base/logger.dart' ;
1010import 'package:flutter_tools/src/daemon.dart' ;
11+ import 'package:flutter_tools/src/device.dart' ;
1112import 'package:flutter_tools/src/proxied_devices/devices.dart' ;
1213import 'package:test/fake.dart' ;
1314
1415import '../../src/common.dart' ;
16+ import '../../src/fake_devices.dart' ;
1517
1618void main () {
1719 late BufferLogger bufferLogger;
@@ -225,26 +227,45 @@ void main() {
225227 });
226228 });
227229
230+ final Map <String , Object > fakeDevice = < String , Object > {
231+ 'name' : 'device-name' ,
232+ 'id' : 'device-id' ,
233+ 'category' : 'mobile' ,
234+ 'platformType' : 'android' ,
235+ 'platform' : 'android-arm' ,
236+ 'emulator' : true ,
237+ 'ephemeral' : false ,
238+ 'sdk' : 'Test SDK (1.2.3)' ,
239+ 'capabilities' : < String , Object > {
240+ 'hotReload' : true ,
241+ 'hotRestart' : true ,
242+ 'screenshot' : false ,
243+ 'fastStart' : false ,
244+ 'flutterExit' : true ,
245+ 'hardwareRendering' : true ,
246+ 'startPaused' : true ,
247+ },
248+ };
249+ final Map <String , Object > fakeDevice2 = < String , Object > {
250+ 'name' : 'device-name2' ,
251+ 'id' : 'device-id2' ,
252+ 'category' : 'mobile' ,
253+ 'platformType' : 'android' ,
254+ 'platform' : 'android-arm' ,
255+ 'emulator' : true ,
256+ 'ephemeral' : false ,
257+ 'sdk' : 'Test SDK (1.2.3)' ,
258+ 'capabilities' : < String , Object > {
259+ 'hotReload' : true ,
260+ 'hotRestart' : true ,
261+ 'screenshot' : false ,
262+ 'fastStart' : false ,
263+ 'flutterExit' : true ,
264+ 'hardwareRendering' : true ,
265+ 'startPaused' : true ,
266+ },
267+ };
228268 group ('ProxiedDevice' , () {
229- final Map <String , Object > fakeDevice = < String , Object > {
230- 'name' : 'device-name' ,
231- 'id' : 'device-id' ,
232- 'category' : 'mobile' ,
233- 'platformType' : 'android' ,
234- 'platform' : 'android-arm' ,
235- 'emulator' : true ,
236- 'ephemeral' : false ,
237- 'sdk' : 'Test SDK (1.2.3)' ,
238- 'capabilities' : < String , Object > {
239- 'hotReload' : true ,
240- 'hotRestart' : true ,
241- 'screenshot' : false ,
242- 'fastStart' : false ,
243- 'flutterExit' : true ,
244- 'hardwareRendering' : true ,
245- 'startPaused' : true ,
246- },
247- };
248269 testWithoutContext ('calls stopApp without application package if not passed' , () async {
249270 bufferLogger = BufferLogger .test ();
250271 final ProxiedDevices proxiedDevices = ProxiedDevices (
@@ -259,6 +280,42 @@ void main() {
259280 expect (message.data['params' ], < String , Object ? > {'deviceId' : 'device-id' , 'userIdentifier' : 'user-id' });
260281 });
261282 });
283+
284+ group ('ProxiedDevices' , () {
285+ testWithoutContext ('devices respects the filter passed in' , () async {
286+ bufferLogger = BufferLogger .test ();
287+ final ProxiedDevices proxiedDevices = ProxiedDevices (
288+ clientDaemonConnection,
289+ logger: bufferLogger,
290+ );
291+
292+ final FakeDeviceDiscoveryFilter fakeFilter = FakeDeviceDiscoveryFilter ();
293+
294+ final FakeDevice supportedDevice = FakeDevice ('Device' , 'supported' );
295+ fakeFilter.filteredDevices = < Device > [
296+ supportedDevice,
297+ ];
298+
299+ final Future <List <Device >> resultFuture = proxiedDevices.devices (filter: fakeFilter);
300+
301+ final DaemonMessage message = await serverDaemonConnection.incomingCommands.first;
302+ expect (message.data['id' ], isNotNull);
303+ expect (message.data['method' ], 'device.discoverDevices' );
304+
305+ serverDaemonConnection.sendResponse (message.data['id' ]! , < Map <String , Object ?>> [
306+ fakeDevice,
307+ fakeDevice2,
308+ ]);
309+
310+ final List <Device > result = await resultFuture;
311+ expect (result.length, 1 );
312+ expect (result.first.id, supportedDevice.id);
313+
314+ expect (fakeFilter.devices! .length, 2 );
315+ expect (fakeFilter.devices! [0 ].id, fakeDevice['id' ]);
316+ expect (fakeFilter.devices! [1 ].id, fakeDevice2['id' ]);
317+ });
318+ });
262319}
263320
264321class FakeDaemonStreams implements DaemonStreams {
@@ -373,3 +430,14 @@ class FakeDaemonConnection extends Fake implements DaemonConnection {
373430 throw Exception ('"$method " request failed' );
374431 }
375432}
433+
434+ class FakeDeviceDiscoveryFilter extends Fake implements DeviceDiscoveryFilter {
435+ List <Device >? filteredDevices;
436+ List <Device >? devices;
437+
438+ @override
439+ Future <List <Device >> filterDevices (List <Device > devices) async {
440+ this .devices = devices;
441+ return filteredDevices! ;
442+ }
443+ }
0 commit comments