diff --git a/packages/flutter_tools/lib/src/fuchsia/amber_ctl.dart b/packages/flutter_tools/lib/src/fuchsia/amber_ctl.dart index 8389eb7517..84183661ef 100644 --- a/packages/flutter_tools/lib/src/fuchsia/amber_ctl.dart +++ b/packages/flutter_tools/lib/src/fuchsia/amber_ctl.dart @@ -27,6 +27,12 @@ import 'fuchsia_pm.dart'; // -x: do not disable other active sources (if the provided source is // enabled) // +// add_repo_cfg - add a repository config to the set of known repositories, +// using a source config +// -n: name of the update source (optional, with URL) +// -f: file path or url to a source config file +// -h: SHA256 hash of source config file (optional, with URL) +// // rm_src - remove a source, if it exists // -n: name of the update source // @@ -73,4 +79,31 @@ class FuchsiaAmberCtl { await device.shell('amber_ctl get_up -n $packageName'); return result.exitCode == 0; } + + /// Converts the amber source config created when [server] was set up to a + /// pkg_resolver repo config, and teaches the pkg_resolver instance running + /// on [device] about the [FuchsiaPackageServer]. + Future addRepoCfg(FuchsiaDevice device, FuchsiaPackageServer server) async { + final String configUrl = '${server.url}/config.json'; + final RunResult result = + await device.shell('amber_ctl add_repo_cfg -n ${server.name} -f $configUrl'); + return result.exitCode == 0; + } + + /// Instructs the pkg_resolver instance running on [device] to prefetch the + /// package [packageName]. + Future pkgCtlResolve(FuchsiaDevice device, FuchsiaPackageServer server, + String packageName) async { + final String packageUrl = 'fuchsia-pkg://${server.name}/$packageName'; + final RunResult result = await device.shell('pkgctl resolve $packageUrl'); + return result.exitCode == 0; + } + + /// Instructs the pkg_resolver instance running on [device] to forget about + /// the Fuchsia package server that it was accessing via [serverUrl]. + Future pkgCtlRepoRemove(FuchsiaDevice device, FuchsiaPackageServer server) async { + final String repoUrl = 'fuchsia-pkg://${server.name}'; + final RunResult result = await device.shell('pkgctl repo remove --repo-url $repoUrl'); + return result.exitCode == 0; + } } diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart index 2cb003ee2c..df1840effa 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_device.dart @@ -265,7 +265,9 @@ class FuchsiaDevice extends Device { } // Start up a package server. - fuchsiaPackageServer = FuchsiaPackageServer(packageRepo.path, host, port); + const String packageServerName = 'flutter_tool'; + fuchsiaPackageServer = FuchsiaPackageServer( + packageRepo.path, packageServerName, host, port); if (!await fuchsiaPackageServer.start()) { printError('Failed to start the Fuchsia package server'); return LaunchResult.failed(); @@ -277,16 +279,17 @@ class FuchsiaDevice extends Device { return LaunchResult.failed(); } - // Teach amber about the package server. - if (!await fuchsiaDeviceTools.amberCtl.addSrc(this, fuchsiaPackageServer)) { + // Teach the package controller about the package server. + if (!await fuchsiaDeviceTools.amberCtl.addRepoCfg(this, fuchsiaPackageServer)) { printError('Failed to teach amber about the package server'); return LaunchResult.failed(); } serverRegistered = true; - // Tell amber to prefetch the app. - if (!await fuchsiaDeviceTools.amberCtl.getUp(this, appName)) { - printError('Failed to get amber to prefetch the package'); + // Tell the package controller to prefetch the app. + if (!await fuchsiaDeviceTools.amberCtl.pkgCtlResolve( + this, fuchsiaPackageServer, appName)) { + printError('Failed to get pkgctl to prefetch the package'); return LaunchResult.failed(); } @@ -298,15 +301,16 @@ class FuchsiaDevice extends Device { // Instruct tiles_ctl to start the app. final String fuchsiaUrl = - 'fuchsia-pkg://fuchsia.com/$appName#meta/$appName.cmx'; + 'fuchsia-pkg://$packageServerName/$appName#meta/$appName.cmx'; if (!await fuchsiaDeviceTools.tilesCtl.add(this, fuchsiaUrl, [])) { printError('Failed to add the app to tiles'); return LaunchResult.failed(); } } finally { - // Try to un-teach amber about the package server if needed. + // Try to un-teach the package controller about the package server if + // needed. if (serverRegistered) { - await fuchsiaDeviceTools.amberCtl.rmSrc(this, fuchsiaPackageServer); + await fuchsiaDeviceTools.amberCtl.pkgCtlRepoRemove(this, fuchsiaPackageServer); } // Shutdown the package server and delete the package repo; fuchsiaPackageServer?.stop(); diff --git a/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart b/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart index ab38a62f13..55907ffa06 100644 --- a/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart +++ b/packages/flutter_tools/lib/src/fuchsia/fuchsia_pm.dart @@ -166,6 +166,7 @@ class FuchsiaPM { /// Example usage: /// var server = FuchsiaPackageServer( /// '/path/to/repo', +/// 'server_name', /// await FuchsiaDevFinder.resolve(deviceName), /// await freshPort()); /// try { @@ -176,7 +177,7 @@ class FuchsiaPM { /// server.stop(); /// } class FuchsiaPackageServer { - FuchsiaPackageServer(this._repo, this._host, this._port); + FuchsiaPackageServer(this._repo, this.name, this._host, this._port); final String _repo; final String _host; @@ -187,6 +188,9 @@ class FuchsiaPackageServer { /// The url that can be used by the device to access this package server. String get url => 'http://$_host:$_port'; + // The name used to reference the server by fuchsia-pkg:// urls. + final String name; + /// Usees [FuchiaPM.newrepo] and [FuchsiaPM.serve] to spin up a new Fuchsia /// package server. /// diff --git a/packages/flutter_tools/test/fuchsia/fuchsia_device_test.dart b/packages/flutter_tools/test/fuchsia/fuchsia_device_test.dart index eb5c597c06..d7802f559e 100644 --- a/packages/flutter_tools/test/fuchsia/fuchsia_device_test.dart +++ b/packages/flutter_tools/test/fuchsia/fuchsia_device_test.dart @@ -695,6 +695,22 @@ class FakeFuchsiaAmberCtl implements FuchsiaAmberCtl { Future getUp(FuchsiaDevice device, String packageName) async { return true; } + + @override + Future addRepoCfg(FuchsiaDevice device, FuchsiaPackageServer server) async { + return true; + } + + @override + Future pkgCtlResolve(FuchsiaDevice device, FuchsiaPackageServer server, + String packageName) async { + return true; + } + + @override + Future pkgCtlRepoRemove(FuchsiaDevice device, FuchsiaPackageServer server) async { + return true; + } } class FailingAmberCtl implements FuchsiaAmberCtl { @@ -712,6 +728,22 @@ class FailingAmberCtl implements FuchsiaAmberCtl { Future getUp(FuchsiaDevice device, String packageName) async { return false; } + + @override + Future addRepoCfg(FuchsiaDevice device, FuchsiaPackageServer server) async { + return false; + } + + @override + Future pkgCtlResolve(FuchsiaDevice device, FuchsiaPackageServer server, + String packageName) async { + return false; + } + + @override + Future pkgCtlRepoRemove(FuchsiaDevice device, FuchsiaPackageServer server) async { + return false; + } } class FakeFuchsiaTilesCtl implements FuchsiaTilesCtl {