// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file contains the schame to represent the condition which should match
// with the Config in device/config.proto.

syntax = "proto3";

package test_condition;

option go_package = "go.chromium.org/chromiumos/infra/proto/go/test_condition";

import "device/config.proto";

// Represents the condition of device.Config message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
message DeviceConfigCondition {
  // Condition of device.ConfigId. This condition needs to be satisfied by
  // device.Config.id.
  ConfigIdCondition id = 1;

  // If this is not FORM_FACTOR_UNSPECIFIED, form_factor and
  // device.Config.form_factor must have same value.
  device.Config.FormFactor form_factor = 2;

  // If not empty, the value of device.Config.form_factor must not be
  // contained in this field.
  repeated device.Config.FormFactor no_form_factors = 3;

  // If not empty, gpu_family and device.Config.gpu_family must have same
  // value.
  string gpu_family = 4;

  // If not empty, the value of device.Config.gpu_family must not be
  // contained in this field.
  repeated string no_gpu_families = 5;

  // If this is not GRAPHICS_UNSPECIFIED, graphics and device.Config.graphics
  // must have same value.
  device.Config.Graphics graphics = 6;

  // If not empty, the value of device.Config.graphics must not be contained
  // in this field.
  repeated device.Config.Graphics no_graphics = 7;

  // If not empty, all values in this field must be contained in the
  // device.Config.hardware_features list.
  repeated device.Config.HardwareFeature hardware_features = 8;

  // If not emtpy, any value in device.Config.hardware_features must not be
  // contained in this field.
  repeated device.Config.HardwareFeature no_hardware_features = 9;

  // If this is not POWER_SUPPLY_UNSPECIFIED, power and device.Config.power
  // must have same value.
  device.Config.PowerSupply power = 10;

  // If not empty, the value of device.Config.power must not be contained in
  // this field.
  repeated device.Config.PowerSupply no_powers = 11;

  // If this is not STORAGE_UNSPECIFIED, storage and device.Condition.storage
  // must have same value.
  device.Config.Storage storage = 12;

  // If not empty, the value of device.Config.storage must not be contained
  // in this field.
  repeated device.Config.Storage no_storages = 13;

  // If not empty, all values in this field must be contained in the
  // device.Config.video_accelerator_supports.
  repeated device.Config.VideoAcceleration video_acceleration_supports = 14;

  // If not empty, any value in device.Config.video_acceleration_supports
  // must not be contained in this field.
  repeated device.Config.VideoAcceleration no_video_acceleration_supports = 15;

  // If this is not SOC_UNSPECIFIED, soc and device.Config.soc must have same
  // value.
  device.Config.SOC soc = 16;

  // If not empty, the value of device.Config.soc must not be contained in
  // this field.
  repeated device.Config.SOC no_socs = 17;
}

// Represents the condition of device.ConfigId message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
// chromeos/infra/config has similar feature, i.e. disabling tests by DUT
// models. The big difference is; this configuration is provided from tests,
// and specifically it is branched. chromeos/infra/config is not branched.
// The majar use case of chromeos/infra/config is to disable whole tests on
// a specific types DUT due to, e.g., lab/infra issues.
// Example use case of this condition is; if there is a known issue in a
// third_party drive only on some specific board, but it is expected that the
// fix of the issue would take time. This condition can be used to disable
// the test for such a case.
// On the other hand, chromeos/infra/config is expected to be used for
// disabling tests on a specific board, regardless of versions, because of
// temporaly infra/lab issue, for example.
message ConfigIdCondition {
  // Condition of device.PlatformId. This condition needs to be satisfied by
  // device.ConfigId.platform_id.
  PlatformIdCondition platform_id = 1;

  // Condition of device.ModelId. This condition needs to be satisfied by
  // device.ConfigId.model_id.
  ModelIdCondition model_id = 2;

  // Condition of device.VariantId. This condition needs to be satisfied by
  // device.ConfigId.variant_id.
  VariantIdCondition variant_id = 3;

  // Condition of device.BrandId. This condition needs to be satisfied by
  // device.ConfigId.brand_id.
  BrandIdCondition brand_id = 4;
}

// Represents the condition of device.PlatformId message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
message PlatformIdCondition {
  // If not empty, value and device.ConfigId.value must have same value.
  string value = 1;

  // If not empty, the value of device.ConfigId.value must not be contained
  // in this field.
  repeated string no_values = 2;
}

// Represents the condition of device.ModelId message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
message ModelIdCondition {
  // If not empty, value and device.ConfigId.value must have same value.
  string value = 1;

  // If not empty, the value of device.ConfigId.value must not be contained
  // in this field.
  repeated string no_values = 2;
}

// Represents the condition of device.VariantId message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
message VariantIdCondition {
  // If not empty, value and device.ConfigId.value must have same value.
  string value = 1;

  // If not empty, the value of device.ConfigId.value must not be contained
  // in this field.
  repeated string no_values = 2;
}

// Represents the condition of device.BrandId message. If all conditions for
// each field are satisfied, this message is considered as satisfied.
message BrandIdCondition {
  // If not empty, value and device.ConfigId.value must have same value.
  string value = 1;

  // If not empty, the value of device.ConfigId.value must not be contained
  // in this field.
  repeated string no_values = 2;
}
