blob: 507c7dcf401180fefe94285d1b5c39c09af55b47 [file] [log] [blame]
// Copyright 2019 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/fidl.dart' as fidl;
import 'package:fidl_fuchsia_ledger/fidl.dart' as ledger;
import 'package:fidl_fuchsia_sys/fidl_async.dart'
show LaunchInfo, ComponentControllerProxy;
import 'package:lib.app.dart/app_async.dart' show Services, StartupContext;
import 'package:sledge/sledge.dart';
/// References a service that provides channels to a unique Ledger instance.
class LedgerTestInstanceProvider {
/// Default constructor.
LedgerTestInstanceProvider(this.services, this._controller);
/// The service providing channels to Ledger.
Services services;
// Prevents the controller from being GCed, which would result in the service
// being closed.
// ignore: unused_field
ComponentControllerProxy _controller;
}
/// Returns a new LedgerTestInstanceProvider that creates connections to a
/// in-memory Ledger.
Future<LedgerTestInstanceProvider> newLedgerTestInstanceProvider() async {
String server =
'fuchsia-pkg://fuchsia.com/ledger_test_instance_provider#meta/ledger_test_instance_provider.cmx';
final Services services = new Services();
final LaunchInfo launchInfo =
new LaunchInfo(url: server, directoryRequest: services.request());
final context = new StartupContext.fromStartupInfo();
final ComponentControllerProxy controller = new ComponentControllerProxy();
await context.launcher.createComponent(launchInfo, controller.ctrl.request());
return new LedgerTestInstanceProvider(services, controller);
}
/// Sledge subclass that makes sure the ComponentControllerProxy does not get GCed.
class _SledgeForTesting extends Sledge {
_SledgeForTesting(fidl.InterfaceHandle<ledger.Ledger> ledgerHandle,
SledgePageId pageId, this._controller)
: super.fromLedgerHandle(ledgerHandle, pageId);
// Prevents the connection to Ledger from being closed.
// ignore: unused_field
ComponentControllerProxy _controller;
}
/// Creates a new test Sledge instance backed by an in-memory Ledger provided
/// by [ledgerInstanceProvider].
/// If no [ledgerInstanceProvider] is provided, a new provider is created.
Future<Sledge> newSledgeForTesting(
{SledgePageId pageId,
LedgerTestInstanceProvider ledgerInstanceProvider}) async {
pageId ??= new SledgePageId('');
ledgerInstanceProvider ??= await newLedgerTestInstanceProvider();
fidl.InterfaceHandle<ledger.Ledger> ledgerHandle =
await ledgerInstanceProvider.services
.connectToServiceByName<ledger.Ledger>(ledger.Ledger.$serviceName);
final sledge = new _SledgeForTesting(
ledgerHandle, pageId, ledgerInstanceProvider._controller);
return sledge;
}