syntax = "proto2";

package continuous_tests;

// When building proto outside of google3, it fails to build if any
// enum values in the same message have the same name, because
// natively enum values in a message are all siblings instead of being
// local-scoped within their parent enum. As a result, we cannot
// follow the google3 best practice to have the 0th enum value by DEFAULT
// in all cases. These protos get copied to google3 via copybara, and in
// google3 we get linter warnings when any enum values have the same name.
// (-- api-linter: enum_default_value=disabled --)

message BuildTargets {
  enum BranchType {
    ALL = 0;
    MASTER = 1;
    RELEASE = 2;
  }
  // Branch can be specified either by name or type.
  message Branch {
    oneof BranchSpec {
      BranchType type = 1;
      string name = 2;
    }
  }
  enum Variant {
    DEFAULT = 0;  // all variants
    ENG = 1;
    USER = 2;
    ARM = 3;
    X86 = 4;
    X64 = 5;
    ARM64 = 6;
    USERDEBUG = 7;
  }
  // Branch types under test (default = All branch types).
  optional BranchType branch_types = 1;
  // Strings of product capabilities for the types of products under test.
  // Product capabilities are defined in:
  // https://cs.corp.google.com/eureka_internal/builder/masters/configs/eureka/build_config.protoascii
  repeated string product_types = 2;
  // Specific product(s) under test. Prefer using product_types where possible.
  repeated string products = 3;
  // Variants under test.
  optional Variant variants = 4;
  // (Optional) The builder_name builds being targeted.
  // When unused (default), catatester will target all builder_names that
  // match every specified <product>-<variant> combination.
  // Set this to explicitly set builder_names for targeting non-conventional
  // builds: i.e. steak-yeti, biggie-mesh.
  // This is additive to any branch_types specified.
  repeated string builder_names = 5;
  // Branches under test (default = All branches).
  repeated Branch branches = 6;
}

message Schedule {
  // Cron-based scheduler string for how often to test new builds.
  optional string cron = 1;
  enum Policy {
    DEFAULT = 0;           // by default, LATEST_UNTESTED_BUILD
    LATEST_UNTESTED = 1;   // will backfill older untested builds
    LATEST = 2;            // will test latest even if already tested before
    LATEST_MINUS_ONE = 3;  // will test latest minus one untested OTA
  }
  // Scheduler policy for which build to test.
  optional Policy policy = 2;
}

message BotRequirement {
  optional string bot_dimension = 1;
  optional string value = 2;
}

message CastOsModule {
  optional string cipd_package = 1;
  optional string cipd_version = 2;
}

message TestTarget {
  enum Recipe {
    HOME_RUNNER = 0;
    DEVICE_UNIT_TEST_RUNNER = 1;
    OTA_INSTALLABLE_RUNNER = 2;
    LIBASSISTANT_RUNNER = 3;
    FUCHSIA_GUNIT_RUNNER = 4;  // Deprecated
    FUCHSIA_RUNNER = 5;
    VIRTUAL_DEVICE_RUNNER = 6;
  }
  enum Priority {
    DEFAULT = 0;  // Controller currently interprets default == medium
    CRITICAL = 1;
    MEDIUM = 2;
    HIGH = 3;
    LOW = 4;
  }
  // Path to the test config file. (relative to test_configs_root).
  optional string config = 1;
  // By default, catatester will run all test cases in the test config.
  // Set this if you wish to run only a specific subset of named test cases that
  // are defined in the test config file.
  repeated string test_cases = 2;
  // Name of the binary to execute for this test config.
  optional string binary_name = 3;
  // Test priority.
  optional Priority priority = 4;
  // Whether this test target is enabled (default = true).
  optional bool enabled = 5 [default = true];
  // The luci-py recipe to use for running the swarming task.
  optional Recipe recipe = 6;
  // The test timeout (mins).  Does not include ota install time.
  optional int32 test_timeout_mins = 7 [default = 60];
  // Names of test groups that this test belongs to.
  // Test group tags must be defined in test_group_tags.
  repeated string test_groups = 8;
  // Optional list of testbed requirements that the test requires.
  repeated BotRequirement testbed_requirements = 9;
  // the key of the cipd_refs map to be used for this test.
  optional string cipd_refs_key = 10 [default = 'internal'];
  // Bot pool to use for allocation. Default value set by controller.
  optional string bot_pool = 11;
  // CastOs Modules to install before running the test.
  repeated CastOsModule castos_modules = 12;
  // Whether to skip setting default bot dimensions when scheduling the test.
  // If True, all dimensions (other than pool) must be set in
  // testbed_requirements.
  optional bool skip_default_dimensions = 13;
}

enum BuildPlatform {
  DEFAULT = 0;
  CATABUILDER = 1;
  ANDROID_BUILD = 2;
}

message ContinuousTest {
  optional TestTarget test_target = 1;
  repeated BuildTargets build_targets = 2;
}

message ScheduledTest {
  optional TestTarget test_target = 1;
  repeated BuildTargets build_targets = 2;
  // Set if you want a cron-based scheduler for running tests.
  // When not set (by default), catatester will test every matching new build
  // continuously.
  optional Schedule schedule = 3;
  repeated string branches = 4;
  optional string repo = 5 [default = "internal"];
  // (Optional) The platform where the build comes from.
  // By default, every build is from Catabuilder.
  optional BuildPlatform build_platform = 6 [default = CATABUILDER];
}

message ContinuousTestsConfig {
  // Relative path from continuous-tests repo to the test configs root dir.
  optional string test_configs_root = 1;

  // Continuous test targets.
  repeated ContinuousTest continuous_test = 2;

  // Scheduled test targets.
  repeated ScheduledTest scheduled_test = 3;

  // Priority-Ordering of branch types.
  repeated BuildTargets.BranchType branch_type_priorities = 4;
  // Branch names that we no longer want to test.
  repeated string disabled_branches = 5;

  // Build restrictions for certain products.
  // Useful for new products where we don't have enough inventory to test every
  // build_target permutation desired by the tests.
  message BuildRestrictions {
    repeated BuildTargets.BranchType allowed_branch_types = 1;
    repeated BuildTargets.Variant allowed_variants = 2;
  }
  map<string, BuildRestrictions> build_restrictions = 6;

  // Defines common test group tags.
  repeated string test_group_tags = 7;

  // Device modules passed to the test runner to instantiate the correct
  // device class during the execution of tests.
  message DeviceModule {
    optional string device_module = 1;
    optional string device_class = 2;
  }
  map<string, DeviceModule> device_modules = 8;

  // Per repo CIPD references
  message CipdRef {
    optional string package_name = 1;
    optional string version = 2;
    optional string path = 3;
  }
  message CipdRefs {
    repeated CipdRef refs = 1;
  }
  map<string, CipdRefs> cipd_refs = 9;
}
