syntax = "proto3";

package chromite.api;

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

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

// Messages used to test build_api message and service handling.

message NestedPath {
  chromiumos.Path path = 1;
}

// Simple input message.
message TestRequestMessage {
  string id = 1;
  // Chroot message for parsing and automatic chroot re-execution testing.
  chromiumos.Chroot chroot = 2;
  // Path and ResultPath messages for insertion/extraction testing.
  chromiumos.Path path = 3;
  chromiumos.Path another_path = 4;
  NestedPath nested_path = 5;
  chromiumos.ResultPath result_path = 6;
  // BuildTarget messages for parsing tests.
  chromiumos.BuildTarget build_target = 7;
  repeated chromiumos.BuildTarget build_targets = 8;
  // For SyncedDir syncing tests.
  chromiumos.SyncedDir synced_dir = 9;
  repeated chromiumos.SyncedDir synced_dirs = 10;
}

// Simple output message.
message TestResultMessage {
  string result = 1;
  // Path messages for ResultPath testing.
  chromiumos.Path artifact = 2;
  NestedPath nested_artifact = 3;
  repeated chromiumos.Path artifacts = 4;
  repeated chromiumos.MetricEvent events = 5;
}


// The test service.
service TestApiService {
  // Mocking the method returns means we don't have an implementation of this
  // module, but we do require it.
  option (service_options) = {
    module: "build_api_test",
  };

  // Method that has input and output messages.
  rpc InputOutputMethod(TestRequestMessage) returns (TestResultMessage);
  // Method name override.
  rpc RenamedMethod(TestRequestMessage) returns (TestResultMessage) {
    option (method_options) = {
      implementation_name: "CorrectName",
    };
  }
}

// Inside chroot service.
service InsideChrootApiService {
  // Mocking the method returns means we don't have an implementation of this
  // module, but we do require it.
  option (service_options) = {
    module: "build_api_test",
    service_chroot_assert: INSIDE,
  };

  // No override of service level inside assertion.
  rpc InsideServiceInsideMethod(TestRequestMessage) returns (TestResultMessage);

  // Override service level inside assertion with outside assertion.
  rpc InsideServiceOutsideMethod(TestRequestMessage)
    returns (TestResultMessage) {
    option (method_options) = {
      method_chroot_assert: OUTSIDE,
    };
  }
}

// Outside chroot service.
service OutsideChrootApiService {
  // Mocking the method returns means we don't have an implementation of this
  // module, but we do require it.
  option (service_options) = {
    module: "build_api_test",
    service_chroot_assert: OUTSIDE,
  };

  // No override of service level outside assertion.
  rpc OutsideServiceOutsideMethod(TestRequestMessage)
    returns (TestResultMessage);

  // Override service level outside assertion with inside assertion.
  rpc OutsideServiceInsideMethod(TestRequestMessage)
    returns (TestResultMessage) {
    option (method_options) = {
      method_chroot_assert: INSIDE,
    };
  }
}
