| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:async'; |
| import 'dart:convert'; |
| import 'dart:io' hide Directory; |
| |
| import 'package:file/file.dart'; |
| import 'package:process/process.dart'; |
| |
| import '../src/common.dart'; |
| import 'test_data/basic_project.dart'; |
| import 'test_driver.dart'; |
| import 'test_utils.dart'; |
| |
| void main() { |
| late Directory tempDir; |
| late Process daemonProcess; |
| |
| setUp(() async { |
| tempDir = createResolvedTempDirectorySync('daemon_mode_test.'); |
| }); |
| |
| tearDown(() async { |
| tryToDelete(tempDir); |
| daemonProcess.kill(); |
| }); |
| |
| testWithoutContext('device.getDevices', () async { |
| final BasicProject project = BasicProject(); |
| await project.setUpIn(tempDir); |
| |
| final String flutterBin = fileSystem.path.join(getFlutterRoot(), 'bin', 'flutter'); |
| |
| const ProcessManager processManager = LocalProcessManager(); |
| daemonProcess = await processManager.start( |
| <String>[flutterBin, ...getLocalEngineArguments(), '--show-test-device', 'daemon'], |
| workingDirectory: tempDir.path, |
| ); |
| |
| final StreamController<String> stdout = StreamController<String>.broadcast(); |
| transformToLines(daemonProcess.stdout).listen((String line) => stdout.add(line)); |
| final Stream<Map<String, Object?>?> stream = stdout |
| .stream |
| .map<Map<String, Object?>?>(parseFlutterResponse) |
| .where((Map<String, Object?>? value) => value != null); |
| |
| Map<String, Object?> response = (await stream.first)!; |
| expect(response['event'], 'daemon.connected'); |
| |
| // start listening for devices |
| daemonProcess.stdin.writeln('[${jsonEncode(<String, dynamic>{ |
| 'id': 1, |
| 'method': 'device.enable', |
| })}]'); |
| response = (await stream.firstWhere((Map<String, Object?>? json) => json!['id'] == 1))!; |
| expect(response['id'], 1); |
| expect(response['error'], isNull); |
| |
| // [{"event":"device.added","params":{"id":"flutter-tester","name": |
| // "Flutter test device","platform":"flutter-tester","emulator":false}}] |
| response = (await stream.first)!; |
| expect(response['event'], 'device.added'); |
| |
| // get the list of all devices |
| daemonProcess.stdin.writeln('[${jsonEncode(<String, dynamic>{ |
| 'id': 2, |
| 'method': 'device.getDevices', |
| })}]'); |
| // Skip other device.added events that may fire (desktop/web devices). |
| response = (await stream.firstWhere((Map<String, Object?>? response) => response!['event'] != 'device.added'))!; |
| expect(response['id'], 2); |
| expect(response['error'], isNull); |
| |
| final dynamic result = response['result']; |
| expect(result, isList); |
| expect(result, isNotEmpty); |
| }); |
| } |