syntax = "proto3";

package cobalt;



option java_multiple_files = true;
option java_package = "com.google.cobalt";

////////////////////////////////////////////////////////////////////////////////
// NOTE: This file is used by the Cobalt client and the Cobalt servers.
// The source-of-truth of this file is located in Google's internal code
// repository, and the file is automatically copied to Cobalt's open source
// repo where it is used by the Cobalt client code. Do not edit the copy of this
// file in the open-source repo as those edits will be overwritten when the file
// is next copied.
////////////////////////////////////////////////////////////////////////////////

// The state of a single experiment on a device.
message Experiment {
  // The id of the experiment as defined by the Experiment framework.
  int64 experiment_id = 1;
  // The id of the experiment arm as defined by the Experiment framework.
  int64 arm_id = 2;
}

// A SystemProfile describes the client system on which an Observation is
// collected.
message SystemProfile {
  reserved 3;

  enum OS {
    UNKNOWN_OS = 0;
    FUCHSIA = 1;
    LINUX = 2;
    ANDROID = 3;
  }

  enum ARCH {
    UNKNOWN_ARCH = 0;
    X86_64 = 1;
    ARM_64 = 2;
    X86_32 = 3;
    ARM_32 = 4;
  }

  enum BuildType {
    UNKNOWN_TYPE = 0;
    OTHER_TYPE = 1;
    USER = 2;
    USER_DEBUG = 3;
    ENG = 4;
  }

  OS os = 1;
  ARCH arch = 2;

  // This is a string representing the board name of the device. If a board name
  // cannot be determined, then this field will be 'unknown:<cpu signature>'.
  string board_name = 4;

  // This is a string representing the type of Fuchsia product from which
  // an observation is collected.
  //
  // During development, this is going to refer to layers of the Fuchsia cake
  // such as "garnet", "zircon", "topaz", etc... In the future, we will use
  // something related to what sort of device we are running on, such as
  // "Acme Lightbulb X" or "Machine Corp. Laptop III".
  string product_name = 5;

  // This is a string representing the version of the currently running system.
  // The use of this field is system-specific. For example on Fuchsia it is the
  // build version (aka OS version) with a value that looks like
  // "0.20200114.1.1".
  string system_version = 8;

  // This is a string representation of the current channel. It is an arbitrary
  // string that depends on the system. For example on Fuchsia some possible
  // values are "qa-daily" and "fishfood".
  //
  // The value '<unset>' means the system did not notify Cobalt of the current
  // channel.
  //
  // The value '<unknown>' means the system explicitly notified Cobalt it did
  // not know the channel.

  string channel = 9;

  // This is a string representation of the current realm. Realm is a software-
  // distribution identifier that is more general than |channel|. A realm
  // corresponds to one or more channels. The values are system-specific. For
  // example on Fuchsia the "Dogfood" realm might contain the "fishood_release",
  // "teamfood_release", and "dogfood_release" channels.
  //
  // The value '<unset>' means the system did not notify Cobalt of the current
  // channel.
  //
  // The value '<unknown>' means the system explicitly notified Cobalt it did
  // not know the channel.
  //
  string realm = 10;

  // An enumerated representation of the current build type.
  //
  // The value `UNKNOWN_TYPE` means the system failed to supply a build type.
  // The value `OTHER_TYPE` indicates the system supplied a value that did not
  // match any of the enumerated values.
  BuildType build_type = 11;

  // Contains all the experiments the device has a notion of and the experiment
  // state the device belongs to.
  repeated Experiment experiments = 7;

  // We used to have a field called |build_level|.
  reserved 6;
  reserved "build_level";
}
