// Copyright 2018 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.

library fuchsia.netemul.environment;

using fuchsia.logger;
using fuchsia.netemul.network;
using fuchsia.sys;
using zx;

/// A single service to be launched in managed environment.
struct LaunchService {
    /// Service name.
    string:MAX name;
    /// Service launch url (fuchsia component url).
    string:MAX url;
    /// Service launch arguments
    vector<string:MAX>:MAX arguments;
};

/// A single virtual device to make available for child processes.
/// Virtual devices are mounted on /vdev.
resource struct VirtualDevice {
    /// Relative path to /vdev.
    string:MAX path;
    /// Virtual device server.
    fuchsia.netemul.network.DeviceProxy device;
};

/// Logger specific options for a created environment
table LoggerOptions {
    /// Enable printing logs.
    1: bool enabled;
    /// Enable kernel logs (no effect if `enabled` is false).
    2: bool klogs_enabled;
    /// LogFilter Options straight from fuchsia.logger.LogFilter.
    /// The LogFilterOptions will be passed directly to the `Listen`
    /// function of the fuchsia.logger.Log service without any
    /// modification. If none provided, assume null. See `Listen` of
    /// fuchsia.logger.Log for more information.
    3: fuchsia.logger.LogFilterOptions filter_options;
    /// Use the parent environment's syslog for output, only enriching
    /// tags with environment names. If false or not provided,
    /// environment logs are printed to stdout.
    4: bool syslog_output;
};

/// Options used to create environment.
resource table EnvironmentOptions {
    /// Environment name, for debugging purposes.
    /// If none provided, a random name will be generated.
    1: string:MAX name;
    /// Services to register on environment.
    /// If none provided, no additional services will be registered.
    /// However, a ManagedEnvironment may still register some default
    /// services.
    2: vector<LaunchService>:MAX services;
    /// Devices to make available.
    /// If none provided, no devices will be made available.
    3: vector<VirtualDevice>:MAX devices;
    /// Whether to inherit service launch options from parent environment.
    /// If none provided, assume false.
    4: bool inherit_parent_launch_services;
    /// Logger Options.
    /// If none provided, log printing is disabled by default.
    5: LoggerOptions logger_options;
};

/// Managed environment is made available on netemul runners.
/// Typically this interface will be used by the root runner
/// to setup the testing environment.
[Discoverable]
protocol ManagedEnvironment {
    /// Gets the managed launcher for the environment.
    GetLauncher(request<fuchsia.sys.Launcher> launcher);
    /// Creates a nested managed environment.
    CreateChildEnvironment(request<ManagedEnvironment> child_env, EnvironmentOptions options);
    /// Connects to a service named `name` provided by this environment.
    ConnectToService(string:MAX name, zx.handle:CHANNEL req);
    /// Exposes new virtual device `device` for all components within this environment
    AddDevice(VirtualDevice device);
    /// Removes virtual device mounted at `path` (relative to /vdev)
    RemoveDevice(string:MAX path);
};
