// 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( [flutterBin, '--show-test-device', 'daemon'], workingDirectory: tempDir.path); final StreamController stdout = StreamController.broadcast(); transformToLines(process.stdout) .listen((String line) => stdout.add(line)); final Stream> stream = stdout.stream.where((String line) { final Map 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 response = await stream.first; expect(response['event'], 'daemon.connected'); // start listening for devices process.stdin.writeln('[${jsonEncode({ '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({ '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. }