blob: e35cb293fa2621fa338105fb12517ae2eca284bb [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:convert';
// ignore_for_file: implementation_imports
import 'package:fidl_fuchsia_modular_session/fidl_async.dart';
import 'package:fidl_fuchsia_modular_testing/fidl_async.dart';
import 'package:fuchsia_logger/logger.dart';
import 'package:fuchsia_modular_testing/src/test_harness_fixtures.dart';
import 'package:fuchsia_modular_testing/src/test_harness_spec_builder.dart';
import 'package:test/test.dart';
import 'package:zircon/zircon.dart';
void main() {
setupLogger();
group('spec builder', () {
late TestHarnessSpecBuilder builder;
setUp(() {
builder = TestHarnessSpecBuilder();
});
group('adding basemgrConfig', () {
test('not adding uses default basemgrConfig', () {
final spec = builder.build();
expect(spec.basemgrConfig, BasemgrConfig());
});
test('setting null', () {
expect(() => builder.setBasemgrConfig(null), throwsArgumentError);
});
test('able to set basemgrSpec', () {
final basemgrConfig = BasemgrConfig(sessionShellMap: [
SessionShellMapEntry(name: 'test', config: SessionShellConfig())
]);
builder.setBasemgrConfig(basemgrConfig);
expect(builder.build().basemgrConfig, basemgrConfig);
});
});
group('adding sessionmgrConfig', () {
test('not adding uses default sessionmgrConfig', () {
final spec = builder.build();
expect(spec.sessionmgrConfig, SessionmgrConfig());
});
test('setting null', () {
expect(() => builder.setSessionmgrConfig(null), throwsArgumentError);
});
test('able to set sessionmgrConfig', () {
final url = generateComponentUrl();
const service = 'fuchsia.sys.Launcher';
final sessionmgrConfig = SessionmgrConfig(agentServiceIndex: [
AgentServiceIndexEntry(agentUrl: url, serviceName: service)
]);
builder.setSessionmgrConfig(sessionmgrConfig);
expect(builder.build().sessionmgrConfig, sessionmgrConfig);
});
});
group('adding components', () {
test('addComponentToIntercept fails on null component url', () {
expect(
() => builder.addComponentToIntercept(null), throwsArgumentError);
});
test('addComponentToIntercept fails on empty component url', () {
expect(() => builder.addComponentToIntercept(''), throwsArgumentError);
});
test('addComponentToIntercept adds to the spec', () {
final url = generateComponentUrl();
builder.addComponentToIntercept(url);
final spec = builder.build();
expect(spec.componentsToIntercept,
contains(predicate((dynamic ispec) => ispec.componentUrl == url)));
});
test('able to add many components', () {
builder
..addComponentToIntercept(generateComponentUrl())
..addComponentToIntercept(generateComponentUrl());
expect(builder.build().componentsToIntercept!.length, 2);
});
test('componentUrl can only be added once', () {
final url = generateComponentUrl();
builder.addComponentToIntercept(url);
expect(() => builder.addComponentToIntercept(url), throwsException);
});
test('can add services to the components cmx file', () {
const service = 'fuchsia.sys.Launcher';
builder.addComponentToIntercept(generateComponentUrl(),
services: [service]);
final spec = builder.build();
final interceptSpec = spec.componentsToIntercept!.first;
final contents = interceptSpec.extraCmxContents!;
final vmo = SizedVmo(contents.vmo.handle, contents.size);
final bytes = vmo.read(contents.size).bytesAsUint8List();
final expectedSandbox = {
'sandbox': {
'services': [service]
}
};
expect(expectedSandbox, json.decode(utf8.decode(bytes)));
});
test('can add additional components_to_intercept after build', () {
expect(() => builder.build().componentsToIntercept!.add(InterceptSpec()),
returnsNormally);
});
});
group('adding environment services to inherit', () {
test('can add additional env_services_to_inherit after build', () {
expect(() => builder.build().envServicesToInherit!.add('foo'),
returnsNormally);
});
test('automatically inherits logger service', () {
expect(builder.build().envServicesToInherit,
contains('fuchsia.logger.LogSink'));
});
test('throws argument error for null service', () {
expect(() => builder.addEnvironmentServiceToInherit(null),
throwsArgumentError);
});
test('throws argument error for empty service', () {
expect(() => builder.addEnvironmentServiceToInherit(''),
throwsArgumentError);
});
test('throws exception for duplicate service', () {
builder.addEnvironmentServiceToInherit('service');
expect(() => builder.addEnvironmentServiceToInherit('service'),
throwsException);
});
test('addEnvServiceToInherit adds the service to the inherited services',
() {
builder.addEnvironmentServiceToInherit('fuchsia.my.Service');
expect(builder.build().envServicesToInherit,
contains('fuchsia.my.Service'));
});
});
group('adding environment services from components', () {
test('can add additional servicesFromComponents after build', () {
expect(
() => builder.build().envServices!.servicesFromComponents!.add(
ComponentService(name: 'foo', url: generateComponentUrl())),
returnsNormally);
});
test('throws argument error for null input values', () {
expect(
() => builder.addServiceFromComponent(null, generateComponentUrl()),
throwsArgumentError);
expect(() => builder.addServiceFromComponent('name', null),
throwsArgumentError);
});
test('throws argument error for empty name and component url', () {
expect(
() => builder.addServiceFromComponent('', generateComponentUrl()),
throwsArgumentError);
expect(() => builder.addServiceFromComponent('name', ''),
throwsArgumentError);
});
test('throws exception for duplicate service', () {
const name = 'myService';
final url = generateComponentUrl();
builder.addServiceFromComponent(name, url);
expect(
() => builder.addServiceFromComponent(name, url), throwsException);
});
test(
'addServiceFromComponent adds the service to environment, served by the component',
() {
final url = generateComponentUrl();
builder.addServiceFromComponent('fuchsia.my.Service', url);
expect(builder.build().envServices!.servicesFromComponents,
contains(ComponentService(name: 'fuchsia.my.Service', url: url)));
});
});
});
}