syntax = "proto3";
package chromite.api;

option go_package = "go.chromium.org/chromiumos/infra/proto/go/chromite/api";

import "chromite/api/build_api.proto";
import "chromite/api/sysroot.proto";
import "chromiumos/common.proto";
import "chromiumos/metrics.proto";

// Proto for executing test-related functionality.

message BuildTargetUnitTestRequest {
  message Flags {
    // Assume the sysroot is empty.
    bool empty_sysroot = 1;
    // Whether a toolchain change has occurred.
    bool toolchain_changed = 2;
    // Whether to produce code coverage data.
    bool code_coverage = 3;
    // Whether to allow no testable packages to be found.
    bool testable_packages_optional = 4;
   }

  // The build target being tested.
  chromiumos.BuildTarget build_target = 1;
  // The path where the result tarball should be saved.
  string result_path = 2;
  // The chroot containing the sysroot.
  chromiumos.Chroot chroot = 3;
  // The flags.
  Flags flags = 4;
  // Skipped packages.
  // Deprecated in favor of package_blocklist.
  // Left in place for compatibility for now.
  // TODO: Change to reserved after 2021-06-01 and recipes have been updated.
  repeated chromiumos.PackageInfo package_blacklist = 5;
  // Packages to be tested.
  // Defaults to all testable packages when none are given.
  repeated chromiumos.PackageInfo packages = 6;
  // Skipped packages.
  repeated chromiumos.PackageInfo package_blocklist = 7;
}

message BuildTargetUnitTestResponse {
  // The unittest tarball that was created.
  string tarball_path = 1;
  // The list of packages that failed.
  repeated chromiumos.PackageInfo failed_packages = 2;
  // The metric events that occurred during the running of BuildTargetUnitTest.
  repeated chromiumos.MetricEvent events = 3;
}

// Chromite UnitTest request.
message ChromiteUnitTestRequest {
  // The chroot to use to execute the endpoint.
  chromiumos.Chroot chroot = 1;
}

message ChromiteUnitTestResponse {
}

message ChromitePytestRequest {
  // The chroot to use to execute the endpoint.
  chromiumos.Chroot chroot = 1;
}

message ChromitePytestResponse {
}

message CrosSigningTestRequest {
  // Required if not in default location.
  // The chroot where the tests should be executed.
  chromiumos.Chroot chroot = 1;
}

message CrosSigningTestResponse {
}

// Run the debug_info_test script.
message DebugInfoTestRequest {
  // The sysroot to tests.
  chromite.api.Sysroot sysroot = 1;
  // The chroot to use to execute the endpoint.
  chromiumos.Chroot chroot = 2;
}

message DebugInfoTestResponse {
}

message VmTestRequest {
  // The build target under test. Required.
  chromiumos.BuildTarget build_target = 1;

  // The chroot in which to run commands. Required.
  chromiumos.Chroot chroot = 2;

  // Required. The VM image path.
  chromiumos.Path vm_path = 3;

  // Options for SSHing into the VM.
  message SshOptions {
    // Path to the private key to the VM.
    chromiumos.Path private_key_path = 1;

    // SSH port to communicate with VM.
    int32 port = 2;
  }

  // Options for SSHing into the VM.
  SshOptions ssh_options = 4;

  // The program that manages and runs the tests in the VM.
  enum TestHarness {
    // No test harness specified.
    UNSPECIFIED = 0;

    // Run tests with Tast.
    TAST = 1;

    // Run tests with Autotest.
    AUTOTEST = 2;
  }

  TestHarness test_harness = 5;

  // A specific VM test to run.
  message VmTest {
    // The name pattern for the VM test.
    // For Autotest, this pattern matches against the test suite name.
    // For Tast, this pattern matches against the Tast test name.
    string pattern = 1;
  }

  // All VM tests that should be run. At least one must be specified.
  repeated VmTest vm_tests = 6;
}

message VmTestResponse {
}

message MoblabVmTestRequest {
  // Chroot in which to run the VM tests.
  chromiumos.Chroot chroot = 1;

  // Data used in the test.
  message Payload {
    // Directory containing the payload.
    chromiumos.Path path = 1;
  }

  // Effectively the full output produced by the image builder.
  Payload image_payload = 2;

  // Payloads to be loaded into the Moblab VM's cache.
  repeated Payload cache_payloads = 3;
}

message MoblabVmTestResponse {
}

message SimpleChromeWorkflowTestRequest {
  // The sysroot for which SimpleChrome flow will be run.
  // The path and build_target are required.
  // Chrome will be built for the specified board using the sysroot.
  Sysroot sysroot = 1;

  // Chrome source directory under which chromium will be built and tested
  // using cros chrome-sdk.
  string chrome_root = 2;

  // Options for using goma when building Chrome.
  chromiumos.GomaConfig goma_config = 3;
}

message SimpleChromeWorkflowTestResponse {
}

// The test service.
service TestService {
  option (service_options) = {
    module: "test",
    service_chroot_assert: INSIDE,
  };

  // Run a build target's ebuild unit tests.
  rpc BuildTargetUnitTest(BuildTargetUnitTestRequest)
    returns (BuildTargetUnitTestResponse) {
    option (method_options) = {
      method_chroot_assert: OUTSIDE,
    };
  }

  // Run the chromite unit tests.
  rpc ChromiteUnitTest(ChromiteUnitTestRequest) returns (ChromiteUnitTestResponse);

  // Run Pytest in chromite.
  rpc ChromitePytest(ChromitePytestRequest) returns (ChromitePytestResponse);

  // Run the cros-signing unit tests.
  rpc CrosSigningTest(CrosSigningTestRequest) returns (CrosSigningTestResponse);

  // Run the debug info tests on a sysroot.
  rpc DebugInfoTest(DebugInfoTestRequest) returns (DebugInfoTestResponse);

  // Run VM tests and report failures.
  rpc VmTest(VmTestRequest) returns (VmTestResponse);

  // Run Moblab VM tests and report failures.
  rpc MoblabVmTest(MoblabVmTestRequest) returns (MoblabVmTestResponse) {
    option (method_options) = {
      method_chroot_assert: OUTSIDE,
    };
  }

  // Run the Simple Chrome workflow unit tests.
  rpc SimpleChromeWorkflowTest(SimpleChromeWorkflowTestRequest)
    returns (SimpleChromeWorkflowTestResponse) {
    option (method_options) = {
      method_chroot_assert: OUTSIDE,
    };
  }
}
