// 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.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: testplans/target_test_requirements_config.proto

package testplans

import (
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	lab "go.chromium.org/chromiumos/infra/proto/go/lab"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

type HwTestCfg_HwTestSuiteType int32

const (
	HwTestCfg_HW_TEST_SUITE_TYPE_UNSPECIFIED HwTestCfg_HwTestSuiteType = 0
	HwTestCfg_AUTOTEST                       HwTestCfg_HwTestSuiteType = 1
	HwTestCfg_TAST                           HwTestCfg_HwTestSuiteType = 2
)

// Enum value maps for HwTestCfg_HwTestSuiteType.
var (
	HwTestCfg_HwTestSuiteType_name = map[int32]string{
		0: "HW_TEST_SUITE_TYPE_UNSPECIFIED",
		1: "AUTOTEST",
		2: "TAST",
	}
	HwTestCfg_HwTestSuiteType_value = map[string]int32{
		"HW_TEST_SUITE_TYPE_UNSPECIFIED": 0,
		"AUTOTEST":                       1,
		"TAST":                           2,
	}
)

func (x HwTestCfg_HwTestSuiteType) Enum() *HwTestCfg_HwTestSuiteType {
	p := new(HwTestCfg_HwTestSuiteType)
	*p = x
	return p
}

func (x HwTestCfg_HwTestSuiteType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (HwTestCfg_HwTestSuiteType) Descriptor() protoreflect.EnumDescriptor {
	return file_testplans_target_test_requirements_config_proto_enumTypes[0].Descriptor()
}

func (HwTestCfg_HwTestSuiteType) Type() protoreflect.EnumType {
	return &file_testplans_target_test_requirements_config_proto_enumTypes[0]
}

func (x HwTestCfg_HwTestSuiteType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use HwTestCfg_HwTestSuiteType.Descriptor instead.
func (HwTestCfg_HwTestSuiteType) EnumDescriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{1, 0}
}

type TestSuiteCommon struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Human-readable consistent name for a build target, test type pair.
	DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Whether or not the test suite is considered critical.
	Critical *wrappers.BoolValue `protobuf:"bytes,2,opt,name=critical,proto3" json:"critical,omitempty"`
	// A list of groups to which this test suite belongs.
	// This is a key into other testingconfig modules.
	TestSuiteGroups []*TestSuiteCommon_TestSuiteGroup `protobuf:"bytes,3,rep,name=test_suite_groups,json=testSuiteGroups,proto3" json:"test_suite_groups,omitempty"`
	// Whether this suite should be disabled by default. It will only be enabled
	// if some other rule forces it to be put into the test plan.
	DisableByDefault bool `protobuf:"varint,4,opt,name=disable_by_default,json=disableByDefault,proto3" json:"disable_by_default,omitempty"`
}

func (x *TestSuiteCommon) Reset() {
	*x = TestSuiteCommon{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_target_test_requirements_config_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TestSuiteCommon) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TestSuiteCommon) ProtoMessage() {}

func (x *TestSuiteCommon) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_target_test_requirements_config_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestSuiteCommon.ProtoReflect.Descriptor instead.
func (*TestSuiteCommon) Descriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{0}
}

func (x *TestSuiteCommon) GetDisplayName() string {
	if x != nil {
		return x.DisplayName
	}
	return ""
}

func (x *TestSuiteCommon) GetCritical() *wrappers.BoolValue {
	if x != nil {
		return x.Critical
	}
	return nil
}

func (x *TestSuiteCommon) GetTestSuiteGroups() []*TestSuiteCommon_TestSuiteGroup {
	if x != nil {
		return x.TestSuiteGroups
	}
	return nil
}

func (x *TestSuiteCommon) GetDisableByDefault() bool {
	if x != nil {
		return x.DisableByDefault
	}
	return false
}

type HwTestCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	HwTest []*HwTestCfg_HwTest `protobuf:"bytes,1,rep,name=hw_test,json=hwTest,proto3" json:"hw_test,omitempty"`
}

func (x *HwTestCfg) Reset() {
	*x = HwTestCfg{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_target_test_requirements_config_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *HwTestCfg) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*HwTestCfg) ProtoMessage() {}

func (x *HwTestCfg) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_target_test_requirements_config_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HwTestCfg.ProtoReflect.Descriptor instead.
func (*HwTestCfg) Descriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{1}
}

func (x *HwTestCfg) GetHwTest() []*HwTestCfg_HwTest {
	if x != nil {
		return x.HwTest
	}
	return nil
}

type TastVmTestCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	TastVmTest []*TastVmTestCfg_TastVmTest `protobuf:"bytes,1,rep,name=tast_vm_test,json=tastVmTest,proto3" json:"tast_vm_test,omitempty"`
}

func (x *TastVmTestCfg) Reset() {
	*x = TastVmTestCfg{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_target_test_requirements_config_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TastVmTestCfg) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TastVmTestCfg) ProtoMessage() {}

func (x *TastVmTestCfg) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_target_test_requirements_config_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TastVmTestCfg.ProtoReflect.Descriptor instead.
func (*TastVmTestCfg) Descriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{2}
}

func (x *TastVmTestCfg) GetTastVmTest() []*TastVmTestCfg_TastVmTest {
	if x != nil {
		return x.TastVmTest
	}
	return nil
}

type VmTestCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	VmTest []*VmTestCfg_VmTest `protobuf:"bytes,1,rep,name=vm_test,json=vmTest,proto3" json:"vm_test,omitempty"`
}

func (x *VmTestCfg) Reset() {
	*x = VmTestCfg{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_target_test_requirements_config_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *VmTestCfg) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*VmTestCfg) ProtoMessage() {}

func (x *VmTestCfg) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_target_test_requirements_config_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use VmTestCfg.ProtoReflect.Descriptor instead.
func (*VmTestCfg) Descriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{3}
}

func (x *VmTestCfg) GetVmTest() []*VmTestCfg_VmTest {
	if x != nil {
		return x.VmTest
	}
	return nil
}

// Specifies a CrOS builder to target.
type TargetCriteria struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// DEPRECATED: we need to target builder_name instead. build_target
	// has to go away. See https://crbug.com/1016536
	//
	// Types that are assignable to TargetType:
	//	*TargetCriteria_BuildTarget
	TargetType isTargetCriteria_TargetType `protobuf_oneof:"target_type"`
	// A CrOS builder to target for testing, e.g. eve-postsubmit or
	// amd64-generic-kernel-v5_4-cq.
	BuilderName string `protobuf:"bytes,3,opt,name=builder_name,json=builderName,proto3" json:"builder_name,omitempty"`
}

func (x *TargetCriteria) Reset() {
	*x = TargetCriteria{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_target_test_requirements_config_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TargetCriteria) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TargetCriteria) ProtoMessage() {}

func (x *TargetCriteria) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_target_test_requirements_config_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TargetCriteria.ProtoReflect.Descriptor instead.
func (*TargetCriteria) Descriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{4}
}

func (m *TargetCriteria) GetTargetType() isTargetCriteria_TargetType {
	if m != nil {
		return m.TargetType
	}
	return nil
}

func (x *TargetCriteria) GetBuildTarget() string {
	if x, ok := x.GetTargetType().(*TargetCriteria_BuildTarget); ok {
		return x.BuildTarget
	}
	return ""
}

func (x *TargetCriteria) GetBuilderName() string {
	if x != nil {
		return x.BuilderName
	}
	return ""
}

type isTargetCriteria_TargetType interface {
	isTargetCriteria_TargetType()
}

type TargetCriteria_BuildTarget struct {
	// Any CrOS build target, such as "kevin". This should correspond to a
	// Portage overlay.
	BuildTarget string `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3,oneof"`
}

func (*TargetCriteria_BuildTarget) isTargetCriteria_TargetType() {}

// Details which testing is needed for a single CrOS build target.
type PerTargetTestRequirements struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Specifies the crieria for builds to target for testing.
	TargetCriteria *TargetCriteria `protobuf:"bytes,1,opt,name=target_criteria,json=targetCriteria,proto3" json:"target_criteria,omitempty"`
	// These configure what testing is needed for these BuildCriteria.
	HwTestCfg           *HwTestCfg     `protobuf:"bytes,3,opt,name=hw_test_cfg,json=hwTestCfg,proto3" json:"hw_test_cfg,omitempty"`
	VmTestCfg           *VmTestCfg     `protobuf:"bytes,5,opt,name=vm_test_cfg,json=vmTestCfg,proto3" json:"vm_test_cfg,omitempty"`
	DirectTastVmTestCfg *TastVmTestCfg `protobuf:"bytes,7,opt,name=direct_tast_vm_test_cfg,json=directTastVmTestCfg,proto3" json:"direct_tast_vm_test_cfg,omitempty"`
}

func (x *PerTargetTestRequirements) Reset() {
	*x = PerTargetTestRequirements{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_target_test_requirements_config_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *PerTargetTestRequirements) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PerTargetTestRequirements) ProtoMessage() {}

func (x *PerTargetTestRequirements) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_target_test_requirements_config_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use PerTargetTestRequirements.ProtoReflect.Descriptor instead.
func (*PerTargetTestRequirements) Descriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{5}
}

func (x *PerTargetTestRequirements) GetTargetCriteria() *TargetCriteria {
	if x != nil {
		return x.TargetCriteria
	}
	return nil
}

func (x *PerTargetTestRequirements) GetHwTestCfg() *HwTestCfg {
	if x != nil {
		return x.HwTestCfg
	}
	return nil
}

func (x *PerTargetTestRequirements) GetVmTestCfg() *VmTestCfg {
	if x != nil {
		return x.VmTestCfg
	}
	return nil
}

func (x *PerTargetTestRequirements) GetDirectTastVmTestCfg() *TastVmTestCfg {
	if x != nil {
		return x.DirectTastVmTestCfg
	}
	return nil
}

// A listing of all testing that should be done for all CrOS builds.
type TargetTestRequirementsCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The testing that should be performed for a single set of target criteria.
	PerTargetTestRequirements []*PerTargetTestRequirements `protobuf:"bytes,1,rep,name=per_target_test_requirements,json=perTargetTestRequirements,proto3" json:"per_target_test_requirements,omitempty"`
}

func (x *TargetTestRequirementsCfg) Reset() {
	*x = TargetTestRequirementsCfg{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_target_test_requirements_config_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TargetTestRequirementsCfg) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TargetTestRequirementsCfg) ProtoMessage() {}

func (x *TargetTestRequirementsCfg) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_target_test_requirements_config_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TargetTestRequirementsCfg.ProtoReflect.Descriptor instead.
func (*TargetTestRequirementsCfg) Descriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{6}
}

func (x *TargetTestRequirementsCfg) GetPerTargetTestRequirements() []*PerTargetTestRequirements {
	if x != nil {
		return x.PerTargetTestRequirements
	}
	return nil
}

type TestSuiteCommon_TestSuiteGroup struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	TestSuiteGroup string `protobuf:"bytes,1,opt,name=test_suite_group,json=testSuiteGroup,proto3" json:"test_suite_group,omitempty"`
}

func (x *TestSuiteCommon_TestSuiteGroup) Reset() {
	*x = TestSuiteCommon_TestSuiteGroup{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_target_test_requirements_config_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TestSuiteCommon_TestSuiteGroup) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TestSuiteCommon_TestSuiteGroup) ProtoMessage() {}

func (x *TestSuiteCommon_TestSuiteGroup) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_target_test_requirements_config_proto_msgTypes[7]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestSuiteCommon_TestSuiteGroup.ProtoReflect.Descriptor instead.
func (*TestSuiteCommon_TestSuiteGroup) Descriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{0, 0}
}

func (x *TestSuiteCommon_TestSuiteGroup) GetTestSuiteGroup() string {
	if x != nil {
		return x.TestSuiteGroup
	}
	return ""
}

// Configuration for a hardware test suite.
type HwTestCfg_HwTest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Common *TestSuiteCommon `protobuf:"bytes,12,opt,name=common,proto3" json:"common,omitempty"`
	// Name of the test suite to run.
	Suite string `protobuf:"bytes,1,opt,name=suite,proto3" json:"suite,omitempty"`
	// The key that identifies a distinct type of device in Skylab.
	// Skylab uses the term "board", hence use of this otherwise controversial
	// word.
	// e.g. could use device_target 'caroline' to test the build_target
	// 'caroline-arcnext'.
	SkylabBoard string `protobuf:"bytes,11,opt,name=skylab_board,json=skylabBoard,proto3" json:"skylab_board,omitempty"`
	// Key that further specifies the device to test on in Skylab.
	// e.g. for skylab_board 'octopus', may require skylab_model 'ampton'
	SkylabModel     string                    `protobuf:"bytes,15,opt,name=skylab_model,json=skylabModel,proto3" json:"skylab_model,omitempty"`
	HwTestSuiteType HwTestCfg_HwTestSuiteType `protobuf:"varint,13,opt,name=hw_test_suite_type,json=hwTestSuiteType,proto3,enum=testplans.HwTestCfg_HwTestSuiteType" json:"hw_test_suite_type,omitempty"`
	// The swarming pool in which to run the test suite, e.g. DUT_POOL_QUOTA.
	Pool string `protobuf:"bytes,14,opt,name=pool,proto3" json:"pool,omitempty"`
	// The licenses required for the DUT the test will run on.
	Licenses []lab.LicenseType `protobuf:"varint,16,rep,packed,name=licenses,proto3,enum=lab.LicenseType" json:"licenses,omitempty"`
}

func (x *HwTestCfg_HwTest) Reset() {
	*x = HwTestCfg_HwTest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_target_test_requirements_config_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *HwTestCfg_HwTest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*HwTestCfg_HwTest) ProtoMessage() {}

func (x *HwTestCfg_HwTest) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_target_test_requirements_config_proto_msgTypes[8]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HwTestCfg_HwTest.ProtoReflect.Descriptor instead.
func (*HwTestCfg_HwTest) Descriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{1, 0}
}

func (x *HwTestCfg_HwTest) GetCommon() *TestSuiteCommon {
	if x != nil {
		return x.Common
	}
	return nil
}

func (x *HwTestCfg_HwTest) GetSuite() string {
	if x != nil {
		return x.Suite
	}
	return ""
}

func (x *HwTestCfg_HwTest) GetSkylabBoard() string {
	if x != nil {
		return x.SkylabBoard
	}
	return ""
}

func (x *HwTestCfg_HwTest) GetSkylabModel() string {
	if x != nil {
		return x.SkylabModel
	}
	return ""
}

func (x *HwTestCfg_HwTest) GetHwTestSuiteType() HwTestCfg_HwTestSuiteType {
	if x != nil {
		return x.HwTestSuiteType
	}
	return HwTestCfg_HW_TEST_SUITE_TYPE_UNSPECIFIED
}

func (x *HwTestCfg_HwTest) GetPool() string {
	if x != nil {
		return x.Pool
	}
	return ""
}

func (x *HwTestCfg_HwTest) GetLicenses() []lab.LicenseType {
	if x != nil {
		return x.Licenses
	}
	return nil
}

type TastVmTestCfg_TastTestExpr struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A single tast test expression. See https://goo.gl/UPNEgT
	TestExpr string `protobuf:"bytes,1,opt,name=test_expr,json=testExpr,proto3" json:"test_expr,omitempty"`
}

func (x *TastVmTestCfg_TastTestExpr) Reset() {
	*x = TastVmTestCfg_TastTestExpr{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_target_test_requirements_config_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TastVmTestCfg_TastTestExpr) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TastVmTestCfg_TastTestExpr) ProtoMessage() {}

func (x *TastVmTestCfg_TastTestExpr) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_target_test_requirements_config_proto_msgTypes[9]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TastVmTestCfg_TastTestExpr.ProtoReflect.Descriptor instead.
func (*TastVmTestCfg_TastTestExpr) Descriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{2, 0}
}

func (x *TastVmTestCfg_TastTestExpr) GetTestExpr() string {
	if x != nil {
		return x.TestExpr
	}
	return ""
}

type TastVmTestCfg_TastVmTest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Common *TestSuiteCommon `protobuf:"bytes,4,opt,name=common,proto3" json:"common,omitempty"`
	// String containing short human-readable name describing test suite.
	SuiteName string `protobuf:"bytes,1,opt,name=suite_name,json=suiteName,proto3" json:"suite_name,omitempty"`
	// List of string expressions describing which tests to run; this
	// is passed directly to the 'tast run' command. See
	// https://goo.gl/UPNEgT for info about test expressions.
	TastTestExpr []*TastVmTestCfg_TastTestExpr `protobuf:"bytes,2,rep,name=tast_test_expr,json=tastTestExpr,proto3" json:"tast_test_expr,omitempty"`
}

func (x *TastVmTestCfg_TastVmTest) Reset() {
	*x = TastVmTestCfg_TastVmTest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_target_test_requirements_config_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TastVmTestCfg_TastVmTest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TastVmTestCfg_TastVmTest) ProtoMessage() {}

func (x *TastVmTestCfg_TastVmTest) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_target_test_requirements_config_proto_msgTypes[10]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TastVmTestCfg_TastVmTest.ProtoReflect.Descriptor instead.
func (*TastVmTestCfg_TastVmTest) Descriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{2, 1}
}

func (x *TastVmTestCfg_TastVmTest) GetCommon() *TestSuiteCommon {
	if x != nil {
		return x.Common
	}
	return nil
}

func (x *TastVmTestCfg_TastVmTest) GetSuiteName() string {
	if x != nil {
		return x.SuiteName
	}
	return ""
}

func (x *TastVmTestCfg_TastVmTest) GetTastTestExpr() []*TastVmTestCfg_TastTestExpr {
	if x != nil {
		return x.TastTestExpr
	}
	return nil
}

type VmTestCfg_VmTest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Common *TestSuiteCommon `protobuf:"bytes,8,opt,name=common,proto3" json:"common,omitempty"`
	// Test suite to be run in VMTest.
	TestSuite string `protobuf:"bytes,2,opt,name=test_suite,json=testSuite,proto3" json:"test_suite,omitempty"`
}

func (x *VmTestCfg_VmTest) Reset() {
	*x = VmTestCfg_VmTest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_testplans_target_test_requirements_config_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *VmTestCfg_VmTest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*VmTestCfg_VmTest) ProtoMessage() {}

func (x *VmTestCfg_VmTest) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_target_test_requirements_config_proto_msgTypes[11]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use VmTestCfg_VmTest.ProtoReflect.Descriptor instead.
func (*VmTestCfg_VmTest) Descriptor() ([]byte, []int) {
	return file_testplans_target_test_requirements_config_proto_rawDescGZIP(), []int{3, 0}
}

func (x *VmTestCfg_VmTest) GetCommon() *TestSuiteCommon {
	if x != nil {
		return x.Common
	}
	return nil
}

func (x *VmTestCfg_VmTest) GetTestSuite() string {
	if x != nil {
		return x.TestSuite
	}
	return ""
}

var File_testplans_target_test_requirements_config_proto protoreflect.FileDescriptor

var file_testplans_target_test_requirements_config_proto_rawDesc = []byte{
	0x0a, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x74, 0x61, 0x72, 0x67,
	0x65, 0x74, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d,
	0x65, 0x6e, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x12, 0x09, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x1a, 0x1e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72,
	0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x11, 0x6c, 0x61,
	0x62, 0x2f, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
	0xad, 0x02, 0x0a, 0x0f, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6d,
	0x6d, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c,
	0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63,
	0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56,
	0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x55,
	0x0a, 0x11, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x67, 0x72, 0x6f,
	0x75, 0x70, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x43,
	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x47,
	0x72, 0x6f, 0x75, 0x70, 0x52, 0x0f, 0x74, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x47,
	0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
	0x5f, 0x62, 0x79, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28,
	0x08, 0x52, 0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x79, 0x44, 0x65, 0x66, 0x61,
	0x75, 0x6c, 0x74, 0x1a, 0x3a, 0x0a, 0x0e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65,
	0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x75,
	0x69, 0x74, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x0e, 0x74, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22,
	0xc6, 0x03, 0x0a, 0x09, 0x48, 0x77, 0x54, 0x65, 0x73, 0x74, 0x43, 0x66, 0x67, 0x12, 0x34, 0x0a,
	0x07, 0x68, 0x77, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b,
	0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x48, 0x77, 0x54, 0x65, 0x73,
	0x74, 0x43, 0x66, 0x67, 0x2e, 0x48, 0x77, 0x54, 0x65, 0x73, 0x74, 0x52, 0x06, 0x68, 0x77, 0x54,
	0x65, 0x73, 0x74, 0x1a, 0xb3, 0x02, 0x0a, 0x06, 0x48, 0x77, 0x54, 0x65, 0x73, 0x74, 0x12, 0x32,
	0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
	0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53,
	0x75, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d,
	0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x75, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x05, 0x73, 0x75, 0x69, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x6b, 0x79, 0x6c,
	0x61, 0x62, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
	0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73,
	0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0b, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x51,
	0x0a, 0x12, 0x68, 0x77, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f,
	0x74, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x74, 0x65, 0x73,
	0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x48, 0x77, 0x54, 0x65, 0x73, 0x74, 0x43, 0x66, 0x67,
	0x2e, 0x48, 0x77, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65,
	0x52, 0x0f, 0x68, 0x77, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70,
	0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x2c, 0x0a, 0x08, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65,
	0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x4c, 0x69,
	0x63, 0x65, 0x6e, 0x73, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x6c, 0x69, 0x63, 0x65, 0x6e,
	0x73, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x0b, 0x22, 0x4d, 0x0a, 0x0f, 0x48, 0x77, 0x54,
	0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x1e,
	0x48, 0x57, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x5f, 0x53, 0x55, 0x49, 0x54, 0x45, 0x5f, 0x54, 0x59,
	0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
	0x12, 0x0c, 0x0a, 0x08, 0x41, 0x55, 0x54, 0x4f, 0x54, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x08,
	0x0a, 0x04, 0x54, 0x41, 0x53, 0x54, 0x10, 0x02, 0x22, 0xb8, 0x02, 0x0a, 0x0d, 0x54, 0x61, 0x73,
	0x74, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x43, 0x66, 0x67, 0x12, 0x45, 0x0a, 0x0c, 0x74, 0x61,
	0x73, 0x74, 0x5f, 0x76, 0x6d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x23, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x73,
	0x74, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x43, 0x66, 0x67, 0x2e, 0x54, 0x61, 0x73, 0x74, 0x56,
	0x6d, 0x54, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x74, 0x61, 0x73, 0x74, 0x56, 0x6d, 0x54, 0x65, 0x73,
	0x74, 0x1a, 0x2b, 0x0a, 0x0c, 0x54, 0x61, 0x73, 0x74, 0x54, 0x65, 0x73, 0x74, 0x45, 0x78, 0x70,
	0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x78, 0x70, 0x72, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x73, 0x74, 0x45, 0x78, 0x70, 0x72, 0x1a, 0xb2,
	0x01, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x74, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a,
	0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x53, 0x75,
	0x69, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f,
	0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x75, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65,
	0x12, 0x4b, 0x0a, 0x0e, 0x74, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x78,
	0x70, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70,
	0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x74, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x43,
	0x66, 0x67, 0x2e, 0x54, 0x61, 0x73, 0x74, 0x54, 0x65, 0x73, 0x74, 0x45, 0x78, 0x70, 0x72, 0x52,
	0x0c, 0x74, 0x61, 0x73, 0x74, 0x54, 0x65, 0x73, 0x74, 0x45, 0x78, 0x70, 0x72, 0x4a, 0x04, 0x08,
	0x03, 0x10, 0x04, 0x22, 0xaa, 0x01, 0x0a, 0x09, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x43, 0x66,
	0x67, 0x12, 0x34, 0x0a, 0x07, 0x76, 0x6d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x56,
	0x6d, 0x54, 0x65, 0x73, 0x74, 0x43, 0x66, 0x67, 0x2e, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x52,
	0x06, 0x76, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x1a, 0x67, 0x0a, 0x06, 0x56, 0x6d, 0x54, 0x65, 0x73,
	0x74, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x65,
	0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63,
	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x75,
	0x69, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x65, 0x73, 0x74, 0x53,
	0x75, 0x69, 0x74, 0x65, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x08,
	0x22, 0x67, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72,
	0x69, 0x61, 0x12, 0x23, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67,
	0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64,
	0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x74, 0x61,
	0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0xad, 0x02, 0x0a, 0x19, 0x50, 0x65,
	0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69,
	0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x42, 0x0a, 0x0f, 0x74, 0x61, 0x72, 0x67, 0x65,
	0x74, 0x5f, 0x63, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x19, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x52, 0x0e, 0x74, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x12, 0x34, 0x0a, 0x0b, 0x68,
	0x77, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x66, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x14, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x48, 0x77, 0x54,
	0x65, 0x73, 0x74, 0x43, 0x66, 0x67, 0x52, 0x09, 0x68, 0x77, 0x54, 0x65, 0x73, 0x74, 0x43, 0x66,
	0x67, 0x12, 0x34, 0x0a, 0x0b, 0x76, 0x6d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x66, 0x67,
	0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61,
	0x6e, 0x73, 0x2e, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x43, 0x66, 0x67, 0x52, 0x09, 0x76, 0x6d,
	0x54, 0x65, 0x73, 0x74, 0x43, 0x66, 0x67, 0x12, 0x4e, 0x0a, 0x17, 0x64, 0x69, 0x72, 0x65, 0x63,
	0x74, 0x5f, 0x74, 0x61, 0x73, 0x74, 0x5f, 0x76, 0x6d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63,
	0x66, 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70,
	0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x74, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x43,
	0x66, 0x67, 0x52, 0x13, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x54, 0x61, 0x73, 0x74, 0x56, 0x6d,
	0x54, 0x65, 0x73, 0x74, 0x43, 0x66, 0x67, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08,
	0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x82, 0x01, 0x0a, 0x19, 0x54, 0x61,
	0x72, 0x67, 0x65, 0x74, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d,
	0x65, 0x6e, 0x74, 0x73, 0x43, 0x66, 0x67, 0x12, 0x65, 0x0a, 0x1c, 0x70, 0x65, 0x72, 0x5f, 0x74,
	0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69,
	0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x50, 0x65, 0x72, 0x54, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65,
	0x6e, 0x74, 0x73, 0x52, 0x19, 0x70, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x54, 0x65,
	0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x42, 0x35,
	0x5a, 0x33, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66,
	0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74,
	0x70, 0x6c, 0x61, 0x6e, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_testplans_target_test_requirements_config_proto_rawDescOnce sync.Once
	file_testplans_target_test_requirements_config_proto_rawDescData = file_testplans_target_test_requirements_config_proto_rawDesc
)

func file_testplans_target_test_requirements_config_proto_rawDescGZIP() []byte {
	file_testplans_target_test_requirements_config_proto_rawDescOnce.Do(func() {
		file_testplans_target_test_requirements_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_testplans_target_test_requirements_config_proto_rawDescData)
	})
	return file_testplans_target_test_requirements_config_proto_rawDescData
}

var file_testplans_target_test_requirements_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_testplans_target_test_requirements_config_proto_msgTypes = make([]protoimpl.MessageInfo, 12)
var file_testplans_target_test_requirements_config_proto_goTypes = []interface{}{
	(HwTestCfg_HwTestSuiteType)(0),         // 0: testplans.HwTestCfg.HwTestSuiteType
	(*TestSuiteCommon)(nil),                // 1: testplans.TestSuiteCommon
	(*HwTestCfg)(nil),                      // 2: testplans.HwTestCfg
	(*TastVmTestCfg)(nil),                  // 3: testplans.TastVmTestCfg
	(*VmTestCfg)(nil),                      // 4: testplans.VmTestCfg
	(*TargetCriteria)(nil),                 // 5: testplans.TargetCriteria
	(*PerTargetTestRequirements)(nil),      // 6: testplans.PerTargetTestRequirements
	(*TargetTestRequirementsCfg)(nil),      // 7: testplans.TargetTestRequirementsCfg
	(*TestSuiteCommon_TestSuiteGroup)(nil), // 8: testplans.TestSuiteCommon.TestSuiteGroup
	(*HwTestCfg_HwTest)(nil),               // 9: testplans.HwTestCfg.HwTest
	(*TastVmTestCfg_TastTestExpr)(nil),     // 10: testplans.TastVmTestCfg.TastTestExpr
	(*TastVmTestCfg_TastVmTest)(nil),       // 11: testplans.TastVmTestCfg.TastVmTest
	(*VmTestCfg_VmTest)(nil),               // 12: testplans.VmTestCfg.VmTest
	(*wrappers.BoolValue)(nil),             // 13: google.protobuf.BoolValue
	(lab.LicenseType)(0),                   // 14: lab.LicenseType
}
var file_testplans_target_test_requirements_config_proto_depIdxs = []int32{
	13, // 0: testplans.TestSuiteCommon.critical:type_name -> google.protobuf.BoolValue
	8,  // 1: testplans.TestSuiteCommon.test_suite_groups:type_name -> testplans.TestSuiteCommon.TestSuiteGroup
	9,  // 2: testplans.HwTestCfg.hw_test:type_name -> testplans.HwTestCfg.HwTest
	11, // 3: testplans.TastVmTestCfg.tast_vm_test:type_name -> testplans.TastVmTestCfg.TastVmTest
	12, // 4: testplans.VmTestCfg.vm_test:type_name -> testplans.VmTestCfg.VmTest
	5,  // 5: testplans.PerTargetTestRequirements.target_criteria:type_name -> testplans.TargetCriteria
	2,  // 6: testplans.PerTargetTestRequirements.hw_test_cfg:type_name -> testplans.HwTestCfg
	4,  // 7: testplans.PerTargetTestRequirements.vm_test_cfg:type_name -> testplans.VmTestCfg
	3,  // 8: testplans.PerTargetTestRequirements.direct_tast_vm_test_cfg:type_name -> testplans.TastVmTestCfg
	6,  // 9: testplans.TargetTestRequirementsCfg.per_target_test_requirements:type_name -> testplans.PerTargetTestRequirements
	1,  // 10: testplans.HwTestCfg.HwTest.common:type_name -> testplans.TestSuiteCommon
	0,  // 11: testplans.HwTestCfg.HwTest.hw_test_suite_type:type_name -> testplans.HwTestCfg.HwTestSuiteType
	14, // 12: testplans.HwTestCfg.HwTest.licenses:type_name -> lab.LicenseType
	1,  // 13: testplans.TastVmTestCfg.TastVmTest.common:type_name -> testplans.TestSuiteCommon
	10, // 14: testplans.TastVmTestCfg.TastVmTest.tast_test_expr:type_name -> testplans.TastVmTestCfg.TastTestExpr
	1,  // 15: testplans.VmTestCfg.VmTest.common:type_name -> testplans.TestSuiteCommon
	16, // [16:16] is the sub-list for method output_type
	16, // [16:16] is the sub-list for method input_type
	16, // [16:16] is the sub-list for extension type_name
	16, // [16:16] is the sub-list for extension extendee
	0,  // [0:16] is the sub-list for field type_name
}

func init() { file_testplans_target_test_requirements_config_proto_init() }
func file_testplans_target_test_requirements_config_proto_init() {
	if File_testplans_target_test_requirements_config_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_testplans_target_test_requirements_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestSuiteCommon); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_target_test_requirements_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*HwTestCfg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_target_test_requirements_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TastVmTestCfg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_target_test_requirements_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*VmTestCfg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_target_test_requirements_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TargetCriteria); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_target_test_requirements_config_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PerTargetTestRequirements); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_target_test_requirements_config_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TargetTestRequirementsCfg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_target_test_requirements_config_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestSuiteCommon_TestSuiteGroup); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_target_test_requirements_config_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*HwTestCfg_HwTest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_target_test_requirements_config_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TastVmTestCfg_TastTestExpr); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_target_test_requirements_config_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TastVmTestCfg_TastVmTest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_target_test_requirements_config_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*VmTestCfg_VmTest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_testplans_target_test_requirements_config_proto_msgTypes[4].OneofWrappers = []interface{}{
		(*TargetCriteria_BuildTarget)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_testplans_target_test_requirements_config_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   12,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_testplans_target_test_requirements_config_proto_goTypes,
		DependencyIndexes: file_testplans_target_test_requirements_config_proto_depIdxs,
		EnumInfos:         file_testplans_target_test_requirements_config_proto_enumTypes,
		MessageInfos:      file_testplans_target_test_requirements_config_proto_msgTypes,
	}.Build()
	File_testplans_target_test_requirements_config_proto = out.File
	file_testplans_target_test_requirements_config_proto_rawDesc = nil
	file_testplans_target_test_requirements_config_proto_goTypes = nil
	file_testplans_target_test_requirements_config_proto_depIdxs = nil
}
