| // Copyright 2018 The Chromium 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 'package:file/file.dart'; |
| import 'package:flutter_tools/src/base/file_system.dart'; |
| import 'package:flutter_tools/src/base/io.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() { |
| group('daemon_mode', () { |
| Directory tempDir; |
| final BasicProject _project = BasicProject(); |
| Process process; |
| |
| setUp(() async { |
| tempDir = createResolvedTempDirectorySync('daemon_mode_test.'); |
| await _project.setUpIn(tempDir); |
| }); |
| |
| tearDown(() async { |
| tryToDelete(tempDir); |
| process?.kill(); |
| }); |
| |
| test('device.getDevices', () async { |
| final String flutterBin = |
| fs.path.join(getFlutterRoot(), 'bin', 'flutter'); |
| |
| const ProcessManager processManager = LocalProcessManager(); |
| process = await processManager.start( |
| <String>[flutterBin, '--show-test-device', 'daemon'], |
| workingDirectory: tempDir.path); |
| |
| final StreamController<String> stdout = |
| StreamController<String>.broadcast(); |
| |
| transformToLines(process.stdout) |
| .listen((String line) => stdout.add(line)); |
| |
| final Stream<Map<String, dynamic>> stream = |
| stdout.stream.where((String line) { |
| final Map<String, dynamic> response = parseFlutterResponse(line); |
| // ignore 'Starting device daemon...' |
| if (response == null) { |
| return false; |
| } |
| // TODO(devoncarew): Remove this after #25440 lands. |
| if (response['event'] == 'daemon.showMessage') { |
| return false; |
| } |
| return true; |
| }).map(parseFlutterResponse); |
| |
| Map<String, dynamic> response = await stream.first; |
| expect(response['event'], 'daemon.connected'); |
| |
| // start listening for devices |
| process.stdin.writeln('[${jsonEncode(<String, dynamic>{ |
| 'id': 1, |
| 'method': 'device.enable', |
| })}]'); |
| response = await stream.first; |
| 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 |
| process.stdin.writeln('[${jsonEncode(<String, dynamic>{ |
| 'id': 2, |
| 'method': 'device.getDevices', |
| })}]'); |
| response = await stream.first; |
| expect(response['id'], 2); |
| expect(response['error'], isNull); |
| |
| final dynamic result = response['result']; |
| expect(result, isList); |
| expect(result, isNotEmpty); |
| }); |
| }, timeout: const Timeout.factor(10)); // This test uses the `flutter` tool, which could be blocked behind the startup lock for a long time. |
| } |