| // Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file |
| // for details. 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:convert'; |
| import 'dart:io'; |
| |
| // TODO(bkonyi): Share this logic with _ServiceTesteeRunner.launch. |
| Future<(Process, Uri)> spawnDartProcess( |
| String script, { |
| bool serveObservatory = true, |
| bool pauseOnStart = true, |
| bool disableServiceAuthCodes = false, |
| bool subscribeToStdio = true, |
| }) async { |
| final executable = Platform.executable; |
| final tmpDir = await Directory.systemTemp.createTemp('dart_service'); |
| final serviceInfoUri = tmpDir.uri.resolve('service_info.json'); |
| final serviceInfoFile = await File.fromUri(serviceInfoUri).create(); |
| |
| final arguments = [ |
| '--no-dds', |
| '--observe=0', |
| if (!serveObservatory) '--no-serve-observatory', |
| if (pauseOnStart) '--pause-isolates-on-start', |
| if (disableServiceAuthCodes) '--disable-service-auth-codes', |
| '--write-service-info=$serviceInfoUri', |
| ...Platform.executableArguments, |
| Platform.script.resolve(script).toString(), |
| ]; |
| final process = await Process.start(executable, arguments); |
| if (subscribeToStdio) { |
| process.stdout |
| .transform(utf8.decoder) |
| .listen((line) => print('TESTEE OUT: $line')); |
| process.stderr |
| .transform(utf8.decoder) |
| .listen((line) => print('TESTEE ERR: $line')); |
| } |
| while ((await serviceInfoFile.length()) <= 5) { |
| await Future.delayed(const Duration(milliseconds: 50)); |
| } |
| final content = await serviceInfoFile.readAsString(); |
| final infoJson = json.decode(content); |
| return (process, Uri.parse(infoJson['uri'])); |
| } |