// Backing state for a test results table of a TestGrid dashboard tab.
// Grid is the top-level message; updated and stored by the updater and
// tabulator.
syntax = "proto3";
option go_package = "github.com/GoogleCloudPlatform/testgrid/pb/state";

import "google/protobuf/timestamp.proto";
import "pb/config/config.proto";

message Property { map<string, string> property = 1; }

// A metric and its values for each test cycle.
message Metric {
  string name = 1; // Name of metric, such as duration
  // Sparse encoding of values. Indices is a list of pairs of <index, count>
  // that details columns with metric values. So given:
  //   Indices: [0, 2, 6, 4]
  //   Values: [0.1,0.2,6.1,6.2,6.3,6.4]
  // Decoded 12-value equivalent is:
  // [0.1, 0.2, nil, nil, nil, nil, 6.1, 6.2, 6.3, 6.4, nil, nil, ...]
  repeated int32 indices =
      2; // n=index of first value, n+1=count of filled values
  repeated double values = 3; // only present for columns with a metric value
}

message UpdatePhaseData {
  // The name for a part of the update cycle.
  string phase_name = 1;

  // Time taken for a part of the update cycle, in seconds.
  double phase_seconds = 2;
}

// Info on time taken to update test results during the last update cycle.
message UpdateInfo {
  // Metrics for how long parts of the update cycle take.
  repeated UpdatePhaseData update_phase_data = 1;
}

// Info on a failing test row about the failure.
message AlertInfo {
  // Number of results that have failed.
  int32 fail_count = 1;

  // The build ID the test first failed at.
  string fail_build_id = 2;

  // The time the test first failed at.
  google.protobuf.Timestamp fail_time = 3;

  // The test ID for the first test failure.
  string fail_test_id = 4;

  // The build ID the test last passed at.
  string pass_build_id = 5;

  // The time the test last passed at.
  google.protobuf.Timestamp pass_time = 6;

  // A snippet explaining the failure.
  string failure_message = 7;

  // Link to search for build changes, internally a code-search link.
  string build_link = 8;

  // Text for option to search for build changes.
  string build_link_text = 9;

  // Text to display for link to search for build changes.
  string build_url_text = 10;

  // The build ID for the latest test failure. (Does not indicate the failure is
  // 'over', just the latest test failure we found.)
  string latest_fail_build_id = 11;

  // The test ID for the latest test failure.
  string latest_fail_test_id = 14;

  // Maps (property name):(property value) for arbitrary alert properties.
  map<string, string> properties = 12;

  // A list of IDs for issue hotlists related to this failure.
  repeated string hotlist_ids = 13;

  // Dynamic email list, route email alerts to these instead of the configured
  // defaults.
  repeated string email_addresses = 15;
}

// Info on default test metadata for a dashboard tab.
message TestMetadata {
  // Name of the test with associated test metadata.
  string test_name = 1;

  // Default bug component.
  int32 bug_component = 2;

  // Default owner.
  string owner = 3;

  // Default list of cc's.
  repeated string cc = 4;

  // When present, only file a bug for failed tests with same error type.
  // Otherwise, always file a bug.
  string error_type = 5;

  reserved 6;
}

// TestGrid column headers. Does not contain the individual cells.
message Column {
  // Unique instance of the job, typically BUILD_NUMBER from prow or a guid
  string build = 1;

  // Name associated with the column (such as the run/invocation ID).No two
  // columns should have the same build_id and name. The name field allows the
  // display of multiple columns with the same build_id.
  string name = 2;

  // Milliseconds since start of epoch (python time.time() * 1000)
  // TODO(#683): Use a timestamp, not this double
  double started = 3;

  // Additional custom headers like commit, image used, etc.
  repeated string extra = 4;

  // Custom hotlist ids.
  string hotlist_ids = 5;

  // An optional hint for the updater.
  string hint = 6;

  // Dynamic email list, route email alerts to these instead of the configured
  // defaults.
  repeated string email_addresses = 7;

  // Status totals for the column.
  // Only written in tab state, if a broken threshold is defined for columns.
  Stats stats = 8;
}

message Stats {
  int32 fail_count = 1;
  int32 pass_count = 2;
  int32 total_count = 3;
  // True if this column has any in-progress runs.
  bool pending = 4;
  // True if a broken threshold is defined, and this column's fail/total ratio
  // exceeds it.
  bool broken = 5;
}

// TestGrid rows
message Row {
  // Display name, which might process id to append/filter info.
  string name = 1;

  // raw id for the row, such as the bazel target or golang package.
  string id = 2;

  // Results for this row, run-length encoded to reduce size/improve
  // performance. Thus (encoded -> decoded equivalent):
  //   [0, 3, 5, 4] -> [0, 0, 0, 5, 5, 5, 5]
  //   [5, 1] -> [5]
  //   [1, 5] -> [1, 1, 1, 1, 1]
  // The decoded values are Result enums
  repeated int32 results = 3;

  // Test IDs for each test result in this test case.
  // Must be present on every column, regardless of status.
  repeated string cell_ids = 4;

  // Short description of the result, displayed on mouseover.
  // Present for any column with a non-empty status (not NO_RESULT).
  repeated string messages = 5;

  reserved 6;

  // Names of metrics associated with this test case. Stored separate from
  // metric info (which may be omitted).
  repeated string metric = 7;

  repeated Metric metrics = 8; // Numerical performance/timing data, etc.

  // Short string to place inside the cell (F for fail, etc)
  // Present for any column with a non-empty status (not NO_RESULT).
  repeated string icons = 9;

  // IDs for issues associated with this row.
  repeated string issues = 10;

  // An alert for the failure if there's a recent failure for this row.
  AlertInfo alert_info = 11;

  // Values of a user-defined property found in cells for this row.
  // TODO: Fold this into `properties` field.
  repeated string user_property = 12;

  // General key-value pairs associated with cells in this row.
  // Present for any column with a non-empty status (not NO_RESULT).
  repeated Property properties = 13;
}

// A single table of test results backing a dashboard tab.
message Grid {
  // A cycle of test results, not including the results. In the TestGrid client,
  // the cycles define the columns.
  repeated Column columns = 1;

  // A test case with test results. In the TestGrid client, the cases define the
  // rows (and the results define the individual cells).
  repeated Row rows = 2;

  reserved 3;

  // The latest configuration used to generate this test group.
  TestGroup config = 4;

  reserved 5;

  // Seconds since epoch for last time this cycle was updated.
  double last_time_updated = 6;

  reserved 7;

  // Stored info on previous timing for parts of the update cycle.
  repeated UpdateInfo update_info = 8;

  // Stored info on default test metadata.
  repeated TestMetadata test_metadata = 9;

  // Clusters of failures for a TestResultTable instance.
  repeated Cluster cluster = 10;

  // Most recent timestamp that clusters have processed.
  double most_recent_cluster_timestamp = 11;
}

// A cluster of failures grouped by test status and message for a test results
// table.
message Cluster {
  // Test status cluster grouped by.
  int32 test_status = 1;

  // Error message or testFailureClassification string cluster grouped by.
  string message = 2;

  // ClusterRows that belong to this cluster.
  repeated ClusterRow cluster_row = 3;
}

// Cells in a TestRow that belong to a specific Cluster.
message ClusterRow {
  // Name of TestRow.
  string display_name = 1;

  // Index within row that belongs to Cluster (refer to columns of the row).
  repeated int32 index = 2;
}
