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(crbug/1126855): Change to reserved after branches R87 and earlier are
  // no longer supported, and recipes have stopped setting the field.
  // Last used in R87.  Remove no earlier than 2021-06-01.
  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,
    };
  }
}
