// Copyright 2016 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto2";

package android.vts;
option java_package = "com.android.vts.proto";
option java_outer_classname = "VtsReportMessage";
option java_multiple_files = false;


// To specify test case execution result.
enum TestCaseResult {
  UNKNOWN_RESULT = 0;
  TEST_CASE_RESULT_PASS = 1;
  TEST_CASE_RESULT_FAIL = 2;
  TEST_CASE_RESULT_SKIP = 3;
  TEST_CASE_RESULT_EXCEPTION = 4;
  TEST_CASE_RESULT_TIMEOUT = 5;
}


// To specify the VTS test type.
enum VtsTestType {
  UNKNOWN_VTS_TESTTYPE = 0;
  VTS_HOST_DRIVEN_STRUCTURAL = 1;
  VTS_HOST_DRIVEN_FUZZING = 2;
  VTS_TARGET_SIDE_GTEST = 3;
  VTS_TARGET_SIDE_FUZZING = 4;
}

enum VtsProfilingRegressionMode {
  UNKNOWN_REGRESSION_MODE = 0;
  // disable analysis
  VTS_REGRESSION_MODE_DISABLED = 1;
  // interpret increases in values as regression
  VTS_REGRESSION_MODE_INCREASING = 2;
  // interpret decreases in values as regression
  VTS_REGRESSION_MODE_DECREASING= 3;
}

enum VtsProfilingType {
  UNKNOWN_VTS_PROFILING_TYPE = 0;
  // for one sample which measures the time between two profiling points.
  VTS_PROFILING_TYPE_TIMESTAMP = 1;
  // for multiple single-type samples with labels.
  VTS_PROFILING_TYPE_LABELED_VECTOR = 2;
  // for multiple single-type samples without labels.
  VTS_PROFILING_TYPE_UNLABELED_VECTOR = 3;
}

// To specify a call flow event.
message AndroidDeviceInfoMessage {
  // product type (e.g., bullhead).
  optional bytes product_type = 1;

  // product type variant (e.g., still bullhead or another name).
  optional bytes product_variant = 2;

  // build type (e.g., userdebug).
  optional bytes build_flavor = 11;

  // Android Build ID.
  optional bytes build_id = 12;

  // branch name (e.g., master or nyc-dev).
  optional bytes branch = 21;

  // build alias implies the branch name.
  optional bytes build_alias = 22;

  // API level
  optional bytes api_level = 31;

  // ABI name that is current in use for the test
  optional bytes abi_name = 51;

  // ABI bitness that is current in use for the test. Example: '32', '64',
  optional bytes abi_bitness = 52;

  // Device USB serial number
  optional bytes serial = 101;
}


// To specify build info.
message AndroidBuildInfo {
  // build ID.
  optional bytes id = 1;

  // device name (e.g., bullhead).
  optional bytes name = 11;

  // build type (e.g., userdebug)
  optional bytes build_type = 12;

  // branch name (e.g., master or nyc-dev)
  optional bytes branch = 13;

  // indicates the latest commit information of each branch (e.g., xml format).
  optional bytes build_summary = 21;
}


// To specify the information about a host node.
message VtsHostInfo {
  // the host name (i.e., full domain name).
  optional bytes hostname = 1;
}


// To specify a test case execution report.
message TestCaseReportMessage {
  // the test case name.
  optional bytes name = 1;

  // the test result.
  optional TestCaseResult test_result = 11;

  // execution start and end time stamp.
  optional int64 start_timestamp = 21;
  optional int64 end_timestamp = 22;

  // coverage report per file
  repeated CoverageReportMessage coverage = 31;

  // profiling reports
  repeated ProfilingReportMessage profiling = 41;

  // systrace report message per file
  repeated SystraceReportMessage systrace = 42 [deprecated=true];

  // log for each test case. May contain multiple logs such as logcat, host log,
  // etc.
  repeated LogMessage log = 101;
}


// To specify a profiling report.
message ProfilingReportMessage {
  // the instrumentation point name.
  optional bytes name = 1;
  optional VtsProfilingType type = 2;
  optional VtsProfilingRegressionMode regression_mode = 3;

  // profiling start and end time stamp (for performance).
  optional int64 start_timestamp = 11;
  optional int64 end_timestamp = 12;

  repeated bytes label = 21;
  repeated int64 value = 22;

  // x-axis and y-axis title labels when displaying the data as a graph
  optional bytes x_axis_label = 31;
  optional bytes y_axis_label = 32;

  // a list of strings where each string has the form of 'key=value'.
  // used to tell certain properties of the data (e.g., passthrough vs.
  // binderized).
  repeated bytes options = 41;
}

// To specify a systrace report.
message SystraceReportMessage {
  // the target process name used by systrace
  optional bytes process_name = 1;

  // the produced html report
  repeated bytes html = 11;

  // URLs of the produced html reports
  repeated bytes url = 21;
}

// To specify a coverage report.
message CoverageReportMessage {
  // the path to the source file from the project root.
  optional bytes file_path = 11;

  // the name of the project where the file can be found
  optional bytes project_name = 12;

  // the commit ID identifying the code revision
  optional bytes revision = 13;

  // i-th element gives the number of times i-th line is executed.
  repeated int64 line_coverage_vector = 23;

  // the number of source code lines that are instrumented for code coverage
  // measurement.
  optional int32 total_line_count = 101;

  // the number of source code lines that are executed.
  optional int32 covered_line_count = 102;

  // TODO(ryanjcampbell@) delete deprecated field
  // the directory path of a source file.
  optional bytes dir_path = 1 [deprecated=true];

  // TODO(ryanjcampbell@) delete deprecated field
  // the name of the source file.
  optional bytes file_name = 2 [deprecated=true];

  // TODO(ryanjcampbell@) delete deprecated field
  // produced html report.
  optional bytes html = 3 [deprecated=true];
}

// Information for a HAL interface.
message HalInterfaceMessage {
  // HAL package name. e.g. android.hardware.foo.
  optional bytes hal_package_name = 1;
  // HAL (major) version. e.g. 1.
  optional int32 hal_version_major = 2;
  // HAL (minor) version. e.g. 0.
  optional int32 hal_version_minor = 3;
  // HAL interface name. e.g. IFoo.
  optional bytes hal_interface_name = 4;
  // HAL release level (e.g. "current", "27", "28")
  optional bytes hal_release_level = 5;
}

// To specify a API coverage report. Currently only for HAL API coverage.
message ApiCoverageReportMessage {
  // Hal interface info.
  optional HalInterfaceMessage hal_interface = 1;

  // APIs provided by the HAL with given package, version and interface name.
  repeated bytes hal_api = 11;

  // APIs covered by the test.
  repeated bytes covered_hal_api = 12;
}

// To specify log report. This can be used either for per-test-module
// log message or per-test-case log message.
message LogMessage {
  // URL of a produced log file (e.g., stdout, stderr).
  optional bytes url = 1;

  // Name of a log file.
  optional bytes name = 2;

  // Content of log. Caution: do not put too much log in protobuf message,
  // as BigTable for example recommends < 10 MB for each record cell.
  optional bytes content = 3;
}

// To specify a resource object (reachable via a URL or contained in the
// message). This can be used to store a log file or an XML (or HTML) report
// file kept in a Google Cloud Storage (GCS) bucket or partner's network file
// system, or hosted by a HTTP server.
message UrlResourceMessage {
  // URL of a resource file.
  optional bytes url = 1;

  // Name of a resource file representing its type and does not have to be
  // the same as the exact file name.
  optional bytes name = 2;

  // Raw content of a resource file. Used if the file is small.
  optional bytes content = 3;
}

// To specify a test execution report.
message TestReportMessage {
  // The test suite name.
  optional bytes test_suite = 1 [deprecated=true];

  // The test name.
  optional bytes test = 2;

  // The test type
  optional VtsTestType test_type = 3;

  // Target device info
  repeated AndroidDeviceInfoMessage device_info = 4;

  // Build info
  optional AndroidBuildInfo build_info = 5;

  // Email addresses of subscribers to the test results
  repeated bytes subscriber_email = 6;

  // Info about the host computer
  optional VtsHostInfo host_info = 7;

  // Test case reports
  repeated TestCaseReportMessage test_case = 11;

  // Profiling reports
  repeated ProfilingReportMessage profiling = 21;

  // Systrace report per file
  repeated SystraceReportMessage systrace = 22  [deprecated=true];

  // Execution start and end time stamp.
  optional int64 start_timestamp = 101;
  optional int64 end_timestamp = 102;

  // Coverage report per file
  repeated CoverageReportMessage coverage = 103;

  // API coverage report for each HAL interface.
  repeated ApiCoverageReportMessage api_coverage = 104;

  // Log for a test module. May contain multiple logs such as logcat, host log,
  // etc.
  repeated LogMessage log = 1001;

  // URL links for the test run.
  repeated UrlResourceMessage link_resource = 1011;
}

// To specify a test execution report.
message TestPlanReportMessage {
  // Keys used to find all TestReportMessage messages of test modules in
  // this plan.
  repeated string test_module_name = 11;
  repeated int64 test_module_start_timestamp = 12;

  // The test plan name.
  optional string test_plan_name = 21;

  // Report resource flies.
  repeated UrlResourceMessage partner_report = 31;

  // Available HAL APIs for coverage measurement.
  // Only used for profiling test plan.
  repeated ApiCoverageReportMessage hal_api_report = 41;

  // Detailed information about the execution environment (e.g., branch,
  // build ID, and device) can be found in the associated TestReportMessage(s)
  // which share the same test_plan_execution_id.
}

// Proto wrapper for posting data to the VTS Dashboard
message DashboardPostMessage {
  // oauth2.0 access token
  optional string access_token = 1;

  repeated TestReportMessage test_report = 2;
  repeated TestPlanReportMessage test_plan_report = 3;
}