From 20f33471972f0472e8a689884a7685ada3e6ffd2 Mon Sep 17 00:00:00 2001 From: Godofredo Contreras Date: Mon, 13 Apr 2020 17:58:51 -0700 Subject: [PATCH 1/3] Update package server to use the port file. This is to simplify the package server removing the logic to get the port from stdout. https://github.com/flutter/flutter/issues/43285 --- .../fuchsia_ctl/lib/src/package_server.dart | 42 +++++++++++++------ .../fuchsia_ctl/test/package_server_test.dart | 30 +++++++++---- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/packages/fuchsia_ctl/lib/src/package_server.dart b/packages/fuchsia_ctl/lib/src/package_server.dart index fd36fff2ade1..98e51146e663 100644 --- a/packages/fuchsia_ctl/lib/src/package_server.dart +++ b/packages/fuchsia_ctl/lib/src/package_server.dart @@ -6,8 +6,12 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; +import 'package:file/file.dart'; +import 'package:file/local.dart'; import 'package:fuchsia_ctl/fuchsia_ctl.dart'; import 'package:process/process.dart'; +import 'package:path/path.dart'; +import 'package:uuid/uuid.dart'; /// A wrapper around the Fuchsia SDK `pm` tool. class PackageServer { @@ -15,8 +19,10 @@ class PackageServer { PackageServer( this.pmPath, { this.processManager = const LocalProcessManager(), + this.fileSystem = const LocalFileSystem(), }) : assert(pmPath != null), - assert(processManager != null); + assert(processManager != null), + assert(fileSystem != null); /// The path on the file system to the `pm` executable. final String pmPath; @@ -24,8 +30,14 @@ class PackageServer { /// The process manager to use for launching `pm`. final ProcessManager processManager; + /// The file sytem for the package server. + final FileSystem fileSystem; + Process _pmServerProcess; + /// Path to the port file generated by `pm`. + String portPath; + /// The port the server is listening on, if the server is running. /// /// Throws a [StateError] if accessed when the server is not running. @@ -84,33 +96,38 @@ class PackageServer { String repo, { String address = '', int port = 0, + String portFilePath, }) async { assert(repo != null); assert(port != null); + + final String uuid = Uuid().v4(); + portPath = portFilePath ?? + join(fileSystem.systemTempDirectory.path, '${uuid}_port.txt'); final List pmCommand = [ pmPath, 'serve', - '-repo', repo, // - '-l', '$address:$port', + '-repo', + repo, + '-l', + '$address:$port', + 'f', + portPath, ]; stdout.writeln('Running ${pmCommand.join(' ')}'); _pmServerProcess = await processManager.start(pmCommand); - final Completer serverPortCompleter = Completer(); + await Future.delayed(const Duration(seconds: 5), () async { + final String portString = await fileSystem.file(portPath).readAsString(); + _serverPort = int.parse(portString); + }); _pmServerProcess.stdout .transform(utf8.decoder) .transform(const LineSplitter()) - .listen((String line) { - if (line.contains('serving $repo at http://')) { - _serverPort = int.parse(line.substring(line.lastIndexOf(':') + 1)); - serverPortCompleter.complete(); - } - stdout.writeln(line); - }); + .listen(stdout.writeln); _pmServerProcess.stderr .transform(utf8.decoder) .transform(const LineSplitter()) .listen(stderr.writeln); - await serverPortCompleter.future; } /// Closes a running server. @@ -120,6 +137,7 @@ class PackageServer { if (_pmServerProcess == null) { throw StateError('Must call serveRepo before calling close.'); } + await fileSystem.file(portPath).delete(); _pmServerProcess.kill(); final int exitCode = await _pmServerProcess.exitCode; _pmServerProcess = null; diff --git a/packages/fuchsia_ctl/test/package_server_test.dart b/packages/fuchsia_ctl/test/package_server_test.dart index a8e99b0d7bd1..e1f220830836 100644 --- a/packages/fuchsia_ctl/test/package_server_test.dart +++ b/packages/fuchsia_ctl/test/package_server_test.dart @@ -5,6 +5,8 @@ import 'dart:io' show ProcessResult; import 'dart:math' show Random; +import 'package:file/file.dart'; +import 'package:file/memory.dart'; import 'package:fuchsia_ctl/fuchsia_ctl.dart'; import 'package:fuchsia_ctl/src/package_server.dart'; import 'package:fuchsia_ctl/src/operation_result.dart'; @@ -67,8 +69,10 @@ void main() { pmBin, 'publish', '-a', - '-repo', repoPath, // - '-f', farFile, + '-repo', + repoPath, + '-f', + farFile, ]); expect(result.success, true); }); @@ -80,8 +84,6 @@ void main() { 0, [ '', - 'YYYY-MM-DD HH:mm:ss [pm serve] serving $repoPath at http://:$randomPort', - 'YYYY-MM-DD HH:mm:ss [pm serve] 200 /', ], [''], ); @@ -90,14 +92,28 @@ void main() { return serverProcess; }); + final MemoryFileSystem fs = MemoryFileSystem(); + final PackageServer server = PackageServer( pmBin, processManager: processManager, + fileSystem: fs, ); expect(server.serving, false); - - await server.serveRepo(repoPath, port: 0); + final File portFile = fs.file( + 'port.txt', + ) + ..create() + ..writeAsString( + randomPort.toString(), + ); + + await server.serveRepo( + repoPath, + port: 0, + portFilePath: portFile.path, + ); expect(server.serving, true); final List capturedStartArgs = @@ -110,7 +126,7 @@ void main() { pmBin, 'serve', '-repo', repoPath, // - '-l', ':0', + '-l', ':0', 'f', 'port.txt', ]); expect(server.serverPort, randomPort); From d5891d1a7bf4651dc45b2922cad3b89bc78ac27e Mon Sep 17 00:00:00 2001 From: Godofredo Contreras Date: Mon, 13 Apr 2020 19:38:45 -0700 Subject: [PATCH 2/3] Add missing dash to flag. --- packages/fuchsia_ctl/lib/src/package_server.dart | 2 +- packages/fuchsia_ctl/test/package_server_test.dart | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/fuchsia_ctl/lib/src/package_server.dart b/packages/fuchsia_ctl/lib/src/package_server.dart index 98e51146e663..660cfdf243b6 100644 --- a/packages/fuchsia_ctl/lib/src/package_server.dart +++ b/packages/fuchsia_ctl/lib/src/package_server.dart @@ -111,7 +111,7 @@ class PackageServer { repo, '-l', '$address:$port', - 'f', + '-f', portPath, ]; stdout.writeln('Running ${pmCommand.join(' ')}'); diff --git a/packages/fuchsia_ctl/test/package_server_test.dart b/packages/fuchsia_ctl/test/package_server_test.dart index e1f220830836..d9036e4186e7 100644 --- a/packages/fuchsia_ctl/test/package_server_test.dart +++ b/packages/fuchsia_ctl/test/package_server_test.dart @@ -125,8 +125,12 @@ void main() { expect(capturedStartArgs, [ pmBin, 'serve', - '-repo', repoPath, // - '-l', ':0', 'f', 'port.txt', + '-repo', + repoPath, + '-l', + ':0', + '-f', + 'port.txt', ]); expect(server.serverPort, randomPort); From 92026c7fa2d4f453a32e1e472e9f874694871f64 Mon Sep 17 00:00:00 2001 From: Godofredo Contreras Date: Tue, 14 Apr 2020 12:42:58 -0700 Subject: [PATCH 3/3] Import path with path alias. --- packages/fuchsia_ctl/lib/src/package_server.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/fuchsia_ctl/lib/src/package_server.dart b/packages/fuchsia_ctl/lib/src/package_server.dart index 660cfdf243b6..7a41fca5a3c5 100644 --- a/packages/fuchsia_ctl/lib/src/package_server.dart +++ b/packages/fuchsia_ctl/lib/src/package_server.dart @@ -10,7 +10,7 @@ import 'package:file/file.dart'; import 'package:file/local.dart'; import 'package:fuchsia_ctl/fuchsia_ctl.dart'; import 'package:process/process.dart'; -import 'package:path/path.dart'; +import 'package:path/path.dart' as path; import 'package:uuid/uuid.dart'; /// A wrapper around the Fuchsia SDK `pm` tool. @@ -103,7 +103,7 @@ class PackageServer { final String uuid = Uuid().v4(); portPath = portFilePath ?? - join(fileSystem.systemTempDirectory.path, '${uuid}_port.txt'); + path.join(fileSystem.systemTempDirectory.path, '${uuid}_port.txt'); final List pmCommand = [ pmPath, 'serve',