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

library fuchsia.io.test;

using fuchsia.mem;
using fuchsia.io;
using zx;

// TODO(fxbug.dev/33880): Implement full testing framework. For now, we are
// hard-coding the desired directory layout manually in separate "Get"
// functions. In the next step, we would want to have a protocol to describe
// the intended directory layout setup, and integrate io2 connections.

/// Conformance test harnesses will implement this protocol to setup its
/// associated filesystem servers with the described directory layout,
/// allowing their implementation of `fuchsia.io` and `fuchsia.io2` protocols
/// to be verified by a common test suite.
///
/// Different test cases will not interact with one another during the
/// conformance test, and only one test case will be active at a time per
/// tested filesystem. So it is possible to host all cases as different
/// sub-directories under a common filesystem instance, to simplify the
/// lifecycle and implementation.
///
/// If a test case has mutable bits, each method call should be implemented
/// to obtain the directory in its original state. In other words, repeated
/// test case set up should "as-if" yield new directories.
///
/// See `src/storage/conformance/README.md` for an overview of io conformance
/// testing.
///
/// `Io1Config` lets the test harness modulate the set of expected outcomes and
/// behaviors validated by the test suite, by declaring specific properties
/// about the filesystem implementation. For example, setting [`ImmutableFile`]
/// to true informs the test suites that files hosted by this harness do not
/// support mutation.
table Io1Config {
    /// Files are read-only.
    1: bool immutable_file;

    /// Directories are read-only.
    2: bool immutable_dir;

    /// The exec right is not supported.
    3: bool no_exec;

    /// Vmofiles are not supported.
    4: bool no_vmofile;

    /// Remote directories are not supported.
    5: bool no_remote_dir;

    /// The admin right is not supported.
    6: bool no_admin;

    /// The GetBuffer method is not supported.
    7: bool no_get_buffer;

    /// The Rename method is not supported.
    8: bool no_rename;

    /// The Link and Unlink methods are not supported.
    9: bool no_link;

    /// The SetAttr method is not supported.
    10: bool no_set_attr;
};

resource table Directory {
    /// Name not required for root directory.
    1: string name;

    /// Nullable to sidestep recursion rules. Don't actually supply nulls.
    2: vector<DirectoryEntry?> entries;
};

table File {
    1: string name;
    2: bytes contents;
};

resource table VmoFile {
    1: string name;
    2: fuchsia.mem.Range buffer;
};

resource union DirectoryEntry {
    1: Directory directory;
    2: File file;
    3: VmoFile vmo_file;
};

[Discoverable]
protocol Io1Harness {
    /// Returns the list of properties of the filesystem.
    GetConfig() -> (Io1Config config);

    /// Serves a directory with the given contents.
    ///
    /// `root` describes the initial layout of the filesystem that will be
    /// used for the test case. The root directory that is served (returned via
    /// `directory_request`) will have the equivalent contents, served with the
    /// given `flags`.
    GetDirectory(Directory root,
                 uint32 flags,
                 request<fuchsia.io.Directory> directory_request);

    /// Serves a directory that holds a child `remote_directory` with name
    /// `dir_name`. The `directory_request` connection to the root directory
    /// has rights defined by `flags`.
    /// Note: This might not actually be needed for the defined io1 tests, but
    /// still might be useful for future testing if a fs forwards the correct
    /// request to the remote.
    ///
    /// + `remote_directory` the client end of the child remote directory.
    /// + `name` the name of the child remote directory in the root directory.
    /// + `flags` the flags the served directory connection has.
    /// + `directory_request` the server end of the root directory connection.
    ///
    /// TODO(fxbug.dev/33880): Add suppport for remote directories to
    /// GetDirectory and then delete this method.
    GetDirectoryWithRemoteDirectory(fuchsia.io.Directory remote_directory,
                                    string name,
                                    uint32 flags,
                                    request<fuchsia.io.Directory> directory_request);
};

/// Stub harness api for the io2.fidl protocol.
/// TODO(fxbug.dev/46082): Add separate io2 test harness api once we come up with a
/// good enough set of functions that we have enough flexibility to create
/// variable directory structures to with explicit permission settings for tests.
[Discoverable]
protocol Io2Harness {
    /// Prepares a test case with an empty directory. The directory metadata
    /// and directory entires should be read-only.
    ///
    /// + `directory_request` the server end of the root directory connection.
    ///
    /// This connection should have the following rights:
    ///
    ///     * [`fuchsia.io2/Rights.CONNECT`].
    ///     * [`fuchsia.io2/Rights.ENUMERATE`].
    ///     * [`fuchsia.io2/Rights.TRAVERSE`].
    ///     * [`fuchsia.io2/Rights.READ_BYTES`].
    ///     * [`fuchsia.io2/Rights.WRITE_BYTES`].
    ///     * [`fuchsia.io2/Rights.GET_ATTRIBUTES`].
    ///     * [`fuchsia.io2/Rights.UPDATE_ATTRIBUTES`].
    ///
    GetEmptyDirectory(zx.handle:CHANNEL directory_request);
};
