// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

syntax = "proto2";

package benchmark;

// A Suite requests that some benchmarks should be run.
message Suite {
  repeated Request requests = 1;
}

// A Request asks for samples for one benchmark.
message Request {
  // The id of the benchmark to run.
  optional BenchmarkID id = 1;

  // The parameters to pass to the benchmark.
  optional Params params = 2;

  // The number of samples to collect.
  optional int32 samples = 3;

  // The duration of each sample in milliseconds.
  optional int32 duration = 4;
}

enum BenchmarkID {
  READ_INT32_FIELDS_JSON = 1;
  READ_INT32_REPEATED_JSON = 2;
  READ_INT64_FIELDS_JSON = 3;
  READ_INT64_REPEATED_JSON = 4;
  READ_STRING_FIELDS_JSON = 5;
  READ_STRING_REPEATED_JSON = 6;

  GET_STRINGS = 20;
  SET_STRINGS = 21;
  HAS_STRINGS = 22;
}

// Parameters to a particular benchmark.
// (See the class for the ones it actually uses.)
message Params {
  // The number of (leaf) messages to use.
  optional int32 message_count = 1;

  // The number of int32 fields to set in each leaf.
  optional int32 int32_field_count = 2;

  // For repeated int32 fields, the number of values each should have.
  optional int32 int32_repeat_count = 3;

  // The number of int64 fields to set in each leaf.
  optional int32 int64_field_count = 4;

  // For repeated int64 fields, the number of values each should have.
  optional int32 int64_repeat_count = 5;

  // The number of string fields to set in each leaf.
  optional int32 string_field_count = 6;

  // For repeated string fields, the number of values each should have.
  optional int32 string_repeat_count = 7;

  // The size of the strings used in the benchmark.
  optional int32 string_size = 8;

  // An initial string value for filling the grid.
  optional string string_value = 9;
}

// A Report records what is happening while a suite is being run.
message Report {
  // status code.
  optional Status status = 1;
  // Top-level summary of what is happening.
  // (May provide an error if there are no responses).
  optional string message = 2;
  // Describes the experimental setup.
  optional Env env = 3;
  // The result of each request.
  repeated Response responses = 4;
}

enum Status {
  RUNNING = 1;
  DONE = 2;
  FAILED = 3;
}

// An Env describes the environment in which the benchmark ran.
message Env {
  // The script that was run, relative to "benchmarks" directory (VM only).
  optional string script = 1;

  // The path to the HTML page. (Browser tests only.)
  optional string page = 2;

  // The platform the benchmark was run on.
  optional Platform platform = 10;
  // The Dart package versions being exercised.
  optional Packages packages = 11;
}

// A Platform describes the hardware, OS, and perhaps browser.
message Platform {

  // values we can get from dart:io Platform
  optional string hostname = 1;
  optional OSType os_type = 2;
  optional string dart_version = 3;

  // values we can get from dart:html Navigator
  optional string user_agent = 10;

  // values we can get on any platform
  optional bool checked_mode = 20;
  optional bool dart_VM = 21;
}

enum OSType {
  LINUX = 1;
  MAC = 2;
  WINDOWS = 3;
  ANDROID = 4;
}

// Packages contains the Dart packages used.
message Packages {
  // The dart-protoc-plugin version (from pubspec.yaml)
  optional string version = 1;

  // Package versions from pubspec.lock
  repeated PackageVersion packages = 2;
}

// One entry in pubspec.lock, describing a Dart package.
message PackageVersion {
  optional string name = 1;
  optional string source = 2;
  optional string version = 3;
  optional string path = 4; // if set, this is a path dependency
}

// The result of running one Request.
message Response {
  optional Request request = 1;
  repeated Sample samples = 2;
}

// The output of running the benchmark in a loop.
message Sample {

  // The wall-clock duration of the entire loop in microseconds.
  optional int32 duration = 1;
  // The number of times the loop iterated.
  optional int32 loop_count = 2;
  // Various other counters.
  optional Counts counts = 3;
}

// Various counts measured for one sample in a benchmark run.
message Counts {
  // The number of times an int32 was read during one sample.
  optional int32 int32Reads = 1;

  // The number of times an int64 was read during one sample.
  optional int32 int64Reads = 2;

  // The number of strings read during a sample.
  optional int32 stringReads = 4;

  // The number of strings written during a sample.
  optional int32 stringWrites = 5;
}
