// Copyright 2020 The Fuchsia 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 recipes.fuchsia.fuchsia.fuchsia;

import "infra/fuchsia.proto";

message InputProperties {
  // The buildbucket ID of the child build. If set, will use this build instead
  // of launching a new one.
  string child_build_id = 1;

  // URL of the specs git repository.
  string spec_remote = 2;

  // Enable perfcompare mode: Compare performance between the "without CL" and
  // "with CL" revisions.  This involves building and testing both of those
  // revisions.
  bool perfcompare = 3;

  // Number of boots of Fuchsia to run performance tests on, in order to deal
  // with cross-boot variation of performance. Only applies when perfcompare
  // mode is enabled.
  //
  // This property is not intended to be set by a config.  It is just here so
  // that a test case can pass a smaller number in order to make the test
  // expectations simpler.
  int32 boots_per_revision = 4;

  // Whether to only run affected tests.
  bool affected_tests_only = 5;

  // Whether to build for the purpose of collecting coverage.
  bool collect_coverage = 6;

  // Message containing most properties that are common to most recipes under
  // recipes/fuchsia/.
  // TODO(fxbug.dev/77879): Consider merging required spec fields into the top
  // level of the properties message. There's nothing special about which fields
  // are nested in `spec` versus in the top-level properties; the spec field is
  // a vestige from when specs were checked into git rather than passed as
  // properties.
  infra.fuchsia.Fuchsia spec = 7;
}
