// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

syntax = "proto3";

package test_platform.skylab_test_runner;

option go_package = "go.chromium.org/chromiumos/infra/proto/go/test_platform/skylab_test_runner";

import "google/protobuf/timestamp.proto";
import "test_platform/request.proto";

// Request represents a request for running an individual test via the
// skylab_test_runner recipe.
message Request {
  // Prejob defines parameters that affect the steps before the actual test
  // (e.g. provision).
  message Prejob {
    repeated test_platform.Request.Params.SoftwareDependency software_dependencies = 1 [deprecated = true];

    // Mutable software prerequisites. Are installed before running the test if
    // necessary. E.g. {"cros-version" : "reef-release/R77-12345.0.0"}
    map<string, string> provisionable_labels = 2;

    // If set, use the Provision TLS API for the prejob.
    // See go/cros-prover go/cros-tls
    //
    // crbug.com/1137444: This is a transitional argument. Once go/cros-prover
    // migration is complete, all prejobs will use the TLS API and this argument
    // will be dropped.
    bool use_tls = 3;
  }

  Prejob prejob = 1;

  // Test describes which test harness and which test(s) to run.
  message Test {
    message Autotest {
      string name = 1;
      string test_args = 2;

      // Keyvals are key:value pairs added to the autoserv command.
      map <string, string> keyvals = 3;

      // If true, run the test as a client-side test: the test logic is
      // executed in its entirety on the DUT itself.
      // Otherwise, run the test as a server-side test: the test logic is
      // executed on the drone server and interacts with the DUT as an external
      // object.
      bool is_client_test = 4;

      // Name to be used to display this test's output artifacts, e.g. logs,
      // results etc. By default display_name is the same as name.
      //
      // display_name is especially useful when using test_args to distinguish
      // between multiple instances of the same test in a request.
      string display_name = 5;
    }

    oneof harness {
      Autotest autotest = 1;
    }

    // User-specified options for how results are served to clients
    message OffloadOptions {
      // If this test needs synchronous offloading of results to Google Storage
      bool synchronous_gs_enable = 1;
    }

    OffloadOptions offload = 2;
  }

  Test test = 2;

  // Soft deadline for test_runner execution.
  //
  // All prejob or test execution should abort beyond this deadline.
  // Clean up actions may execute beyond the deadline.
  google.protobuf.Timestamp deadline = 3;

  // The UID of the individual CTP request which kicked off this test run.
  // Note that distinct requests inside a multi-request CTP build will have
  // different UIDs.
  string parent_request_uid = 4;

  // The buildbucket ID of the CTP build that sent this test_runner request.
  int64 parent_build_id = 5;

  // Set of Tests to run. The string is a UUID provided by the client
  // and used to identify each test result in the response.
  map<string, Test> tests = 6;
}
