| // 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'; |
| |
| import 'package:flutter_devicelab/framework/running_processes.dart'; |
| import 'package:process/process.dart'; |
| |
| import 'common.dart'; |
| |
| void main() { |
| test('Parse PowerShell result', () { |
| const String powershellOutput = r''' |
| |
| ProcessId CreationDate CommandLine |
| --------- ------------ ----------- |
| 6552 3/7/2019 5:00:27 PM "C:\tools\dart-sdk\bin\dart.exe" .\bin\agent.dart ci |
| 6553 3/7/2019 10:00:27 PM "C:\tools\dart-sdk1\bin\dart.exe" .\bin\agent.dart ci |
| 6554 3/7/2019 11:00:27 AM "C:\tools\dart-sdk2\bin\dart.exe" .\bin\agent.dart ci |
| |
| |
| '''; |
| final List<RunningProcessInfo> results = |
| processPowershellOutput(powershellOutput).toList(); |
| expect(results.length, 3); |
| expect( |
| results, |
| equals(<RunningProcessInfo>[ |
| RunningProcessInfo( |
| 6552, |
| r'"C:\tools\dart-sdk\bin\dart.exe" .\bin\agent.dart ci', |
| DateTime(2019, 7, 3, 17, 0, 27), |
| ), |
| RunningProcessInfo( |
| 6553, |
| r'"C:\tools\dart-sdk1\bin\dart.exe" .\bin\agent.dart ci', |
| DateTime(2019, 7, 3, 22, 0, 27), |
| ), |
| RunningProcessInfo( |
| 6554, |
| r'"C:\tools\dart-sdk2\bin\dart.exe" .\bin\agent.dart ci', |
| DateTime(2019, 7, 3, 11, 0, 27), |
| ), |
| ])); |
| }); |
| |
| test('Parse Posix output', () { |
| const String psOutput = r''' |
| STARTED PID COMMAND |
| Sat Mar 9 20:12:47 2019 1 /sbin/launchd |
| Sat Mar 9 20:13:00 2019 49 /usr/sbin/syslogd |
| '''; |
| |
| final List<RunningProcessInfo> results = |
| processPsOutput(psOutput, null).toList(); |
| expect(results.length, 2); |
| expect( |
| results, |
| equals(<RunningProcessInfo>[ |
| RunningProcessInfo( |
| 1, |
| '/sbin/launchd', |
| DateTime(2019, 3, 9, 20, 12, 47), |
| ), |
| RunningProcessInfo( |
| 49, |
| '/usr/sbin/syslogd', |
| DateTime(2019, 3, 9, 20, 13), |
| ), |
| ])); |
| }); |
| |
| test('RunningProcessInfo.terminate', () { |
| final RunningProcessInfo process = RunningProcessInfo(123, 'test', DateTime(456)); |
| final FakeProcessManager fakeProcessManager = FakeProcessManager(); |
| process.terminate(processManager: fakeProcessManager); |
| if (Platform.isWindows) { |
| expect(fakeProcessManager.log, <String>['run([taskkill.exe, /pid, 123, /f], null, null, null, null, null, null)']); |
| } else { |
| expect(fakeProcessManager.log, <String>['killPid(123, SIGKILL)']); |
| } |
| }); |
| } |
| |
| class FakeProcessManager implements ProcessManager { |
| final List<String> log = <String>[]; |
| |
| @override |
| bool canRun(Object? a, { String? workingDirectory }) { |
| log.add('canRun($a, $workingDirectory)'); |
| return true; |
| } |
| |
| @override |
| bool killPid(int a, [ProcessSignal? b]) { |
| log.add('killPid($a, $b)'); |
| return true; |
| } |
| |
| @override |
| Future<ProcessResult> run(List<Object> a, { |
| Map<String, String>? environment, |
| bool? includeParentEnvironment, |
| bool? runInShell, |
| Encoding? stderrEncoding, |
| Encoding? stdoutEncoding, |
| String? workingDirectory, |
| }) async { |
| log.add('run($a, $environment, $includeParentEnvironment, $runInShell, $stderrEncoding, $stdoutEncoding, $workingDirectory)'); |
| return ProcessResult(1, 0, 'stdout', 'stderr'); |
| } |
| |
| @override |
| ProcessResult runSync(List<Object> a, { |
| Map<String, String>? environment, |
| bool? includeParentEnvironment, |
| bool? runInShell, |
| Encoding? stderrEncoding, |
| Encoding? stdoutEncoding, |
| String? workingDirectory, |
| }) { |
| log.add('runSync($a, $environment, $includeParentEnvironment, $runInShell, $stderrEncoding, $stdoutEncoding, $workingDirectory)'); |
| return ProcessResult(1, 0, 'stdout', 'stderr'); |
| } |
| |
| @override |
| Future<Process> start( |
| List<Object> a, { |
| Map<String, String>? environment, |
| bool? includeParentEnvironment, |
| ProcessStartMode? mode, |
| bool? runInShell, |
| String? workingDirectory, |
| }) { |
| log.add('start($a, $environment, $includeParentEnvironment, $mode, $runInShell, $workingDirectory)'); |
| return Completer<Process>().future; |
| } |
| } |