// Copyright 2019 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";

// "from PB.recipe_modules.infra.fuchsia import Fuchsia"
package recipe_modules.infra.fuchsia;

option go_package = "recipes";

// Fuchsia fully describes how to execute a Fuchsia CI/CQ task:
//
//  * How to fetch the Fuchsia sources.
//  * How to build Fuchsia.
//  * How to test Fuchsia.
//  * How to archive and log outputs to various places.
//
// See the fuchsia.py recipe for full documentation on task execution.
//
// TODO(IN-1102):
//
// * Improve the docs of the fields in this message, since this is the User
//   facing API for the recipe.
// * Use Enums instead of strings where appropriate once we have starlark and
//   support for human-readable constant values. Enums are just int literals in
//   textprotos.
message Fuchsia {
  // (required) How to obtain the Fuchsia build inputs. See Checkout docs.
  Checkout checkout = 1;

  // (required) How to build Fuchsia. See Build docs.
  Build build = 2;

  // How to test Fuchsia. See Test docs.
  Test test = 3;

  // The GCS bucket to upload results to.
  string gcs_bucket = 4;

  // Describes how to fetch the Fuchsia build inputs.
  message Checkout {
    // Jiri <package> atttribute values indicating additional packages to fetch
    // from the input manifest. By default, packages with attribute tags are
    // skipped unless one or more of the attribute values are specified here.
    repeated string attributes = 1;

    // Whether to checkout from a Jiri snapshot.
    bool use_snapshot = 2;

    // The name of the manifest to import from the integration repository.
    string manifest = 4;

    // Jiri remote manifest project,
    //
    // TODO(IN-1102): This should always be "integration" and is redundant
    // because we can select the proper integration repo using the build input.
    // Delete this in favor of a hard-coded constant since this value will only
    // ever change if we completely restructure our CI/CD model or rename the
    // integration repo, and thus this recipe.
    string project = 6;

    // The remote integration manifest repository.
    string remote = 7;
  }

  // Describes how to build Fuchsia.
  message Build {
    // The build type
    string build_type = 1;

    // Board to build
    string board = 2;

    // GCS bucket for uploading debug symbols.
    string debug_symbol_bucket = 3;

    // Tags of environments on which the testsharder will key
    repeated string environment_tags = 4;

    // Whether to exclude images during the build.
    bool exclude_images = 5;

    // Extra args to pass to GN.
    repeated string gn_args = 6;

    // Whether to generate and upload breakpad symbols as part of this build.
    bool include_breakpad_symbols = 7;

    // Whether to build and upload an archive of debug binaries.
    bool include_symbol_archive = 8;

    // Extra targets to pass to Ninja.
    repeated string ninja_targets = 9;

    // A list of Fuchsia packages to build.
    repeated string packages = 10;

    // The product to build.
    string product = 11;

    // Whether to run any tests.
    bool run_tests = 12;

    // The target architecture. One of x64 or arm64.
    string target = 13;

    // Packages to build and add to the universe set
    repeated string universe_packages = 14;

    // --variant arguments to GN in `select_variant`
    repeated string variants = 15;

    // Additional args to pass to zircon build using standard FOO=bar syntax.
    repeated string zircon_args = 16;
  }

  // Describes how to test Fuchsia.
  message Test {
    // The type of device to execute tests on, if the value is
    // ot QEMU it will be passed to Swarming as the device_type
    // dimension.
    string device_type = 1;

    // Whether to pave images the device for testing. (Ignored if
    // device_type == QEMU)
    bool pave = 2;

    // Swarming pool from which a test task will be drawn
    string pool = 3;

    // Shell-quoted string to add to the runtests commandline
    string runtests_args = 4;

    // Whether any plaintext needs to be supplied to the tests
    bool requires_secrets = 5;

    // How long to wait for Swarming to find a bot on which to test
    int32 swarming_expiration_timeout_secs = 6;

    // How long to wait (in seconds) before killing the test
    // swarming task if there\'s no output being produced
    int32 swarming_io_timeout_secs = 7;

    // Whether to run tests as shards.
    bool test_in_shards = 8;

    // How long to wait until timing out on tests.
    int32 timeout_secs = 9;
  }
}
