blob: bdab23da04fe1479acd6010ac7df9719d62249a7 [file] [log] [blame]
// Copyright 2020 The Fuchsia 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 'package:fidl_fuchsia_io/fidl_async.dart';
import 'package:fidl_fuchsia_sys/fidl_async.dart';
import 'package:fidl_fuchsia_examples_inspect/fidl_async.dart' as fidl_codelab;
import 'package:fuchsia_services/services.dart';
import 'package:zircon/zircon.dart';
const kFizzBuzzUrl =
'fuchsia-pkg://fuchsia.com/inspect-dart-codelab-fizzbuzz#meta/inspect-dart-codelab-fizzbuzz.cmx';
int counter = 0;
class CodelabEnvironment {
ComponentControllerProxy _fizzBuzzController;
ComponentControllerProxy _reverserController;
EnvironmentProxy _childEnvironment;
EnvironmentControllerProxy _childEnvironmentController;
LauncherProxy _launcher;
Channel _fizzbuzzOutDirectoryServer;
bool _isCreated = false;
String _label;
String get label => _label;
Future<void> create() async {
if (_isCreated) {
throw Exception("Can't create more than once");
}
final environmentProxy = EnvironmentProxy();
final incoming = Incoming.fromSvcPath()..connectToService(environmentProxy);
_childEnvironment = EnvironmentProxy();
_childEnvironmentController = EnvironmentControllerProxy();
final fizzBuzzServiceDirectory = DirectoryProxy();
_fizzbuzzOutDirectoryServer =
fizzBuzzServiceDirectory.ctrl.request().passChannel();
final fizzbuzzOutDirectoryClient =
fizzBuzzServiceDirectory.ctrl.unbind().passChannel();
final additionalServices = ServiceList(
names: [fidl_codelab.FizzBuzz.$serviceName],
hostDirectory: fizzbuzzOutDirectoryClient,
);
final options = EnvironmentOptions(
inheritParentServices: true,
useParentRunners: true,
deleteStorageOnDeath: true,
killOnOom: true,
);
counter += 1;
_label = 'codelab-$counter';
await environmentProxy.createNestedEnvironment(
_childEnvironment.ctrl.request(),
_childEnvironmentController.ctrl.request(),
_label,
additionalServices,
options,
);
_launcher = LauncherProxy();
await _childEnvironment.getLauncher(_launcher.ctrl.request());
await incoming.close();
_isCreated = true;
}
Future<void> startFizzBuzz() async {
_fizzBuzzController = await _startComponent(
kFizzBuzzUrl,
_fizzbuzzOutDirectoryServer,
);
}
Future<fidl_codelab.ReverserProxy> startReverser(String reverserUrl) async {
final outDirectory = Incoming();
_reverserController = await _startComponent(
reverserUrl, outDirectory.request().passChannel());
final reverser = fidl_codelab.ReverserProxy();
outDirectory.connectToService(reverser);
return reverser;
}
Future<ComponentControllerProxy> _startComponent(
String componentUrl, Channel outDirectoryRequest) async {
final launchInfo = LaunchInfo(
url: componentUrl,
directoryRequest: outDirectoryRequest,
);
final controller = ComponentControllerProxy();
await _launcher.createComponent(launchInfo, controller.ctrl.request());
final completer = Completer();
final listener = controller.onDirectoryReady.listen(completer.complete);
await completer.future;
await listener.cancel();
return controller;
}
void dispose() {
if (_reverserController != null) {
_reverserController.ctrl.close();
}
if (_fizzBuzzController != null) {
_fizzBuzzController.ctrl.close();
}
if (_childEnvironmentController != null) {
_childEnvironmentController.ctrl.close();
}
if (_launcher != null) {
_launcher.ctrl.close();
}
if (_childEnvironment != null) {
_childEnvironment.ctrl.close();
}
_isCreated = false;
}
}