// Code generated by protoc-gen-go. DO NOT EDIT.
// source: testplans/target_test_requirements_config.proto

package testplans

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type HwTestCfg_HwTestSuiteType int32

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

var HwTestCfg_HwTestSuiteType_name = map[int32]string{
	0: "HW_TEST_SUITE_TYPE_UNSPECIFIED",
	1: "AUTOTEST",
	2: "TAST",
}

var HwTestCfg_HwTestSuiteType_value = map[string]int32{
	"HW_TEST_SUITE_TYPE_UNSPECIFIED": 0,
	"AUTOTEST":                       1,
	"TAST":                           2,
}

func (x HwTestCfg_HwTestSuiteType) String() string {
	return proto.EnumName(HwTestCfg_HwTestSuiteType_name, int32(x))
}

func (HwTestCfg_HwTestSuiteType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{1, 0}
}

type TestSuiteCommon struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TestSuiteCommon) Reset()         { *m = TestSuiteCommon{} }
func (m *TestSuiteCommon) String() string { return proto.CompactTextString(m) }
func (*TestSuiteCommon) ProtoMessage()    {}
func (*TestSuiteCommon) Descriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{0}
}

func (m *TestSuiteCommon) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TestSuiteCommon.Unmarshal(m, b)
}
func (m *TestSuiteCommon) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TestSuiteCommon.Marshal(b, m, deterministic)
}
func (m *TestSuiteCommon) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TestSuiteCommon.Merge(m, src)
}
func (m *TestSuiteCommon) XXX_Size() int {
	return xxx_messageInfo_TestSuiteCommon.Size(m)
}
func (m *TestSuiteCommon) XXX_DiscardUnknown() {
	xxx_messageInfo_TestSuiteCommon.DiscardUnknown(m)
}

var xxx_messageInfo_TestSuiteCommon proto.InternalMessageInfo

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

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

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

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

type TestSuiteCommon_TestSuiteGroup struct {
	TestSuiteGroup       string   `protobuf:"bytes,1,opt,name=test_suite_group,json=testSuiteGroup,proto3" json:"test_suite_group,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TestSuiteCommon_TestSuiteGroup) Reset()         { *m = TestSuiteCommon_TestSuiteGroup{} }
func (m *TestSuiteCommon_TestSuiteGroup) String() string { return proto.CompactTextString(m) }
func (*TestSuiteCommon_TestSuiteGroup) ProtoMessage()    {}
func (*TestSuiteCommon_TestSuiteGroup) Descriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{0, 0}
}

func (m *TestSuiteCommon_TestSuiteGroup) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TestSuiteCommon_TestSuiteGroup.Unmarshal(m, b)
}
func (m *TestSuiteCommon_TestSuiteGroup) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TestSuiteCommon_TestSuiteGroup.Marshal(b, m, deterministic)
}
func (m *TestSuiteCommon_TestSuiteGroup) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TestSuiteCommon_TestSuiteGroup.Merge(m, src)
}
func (m *TestSuiteCommon_TestSuiteGroup) XXX_Size() int {
	return xxx_messageInfo_TestSuiteCommon_TestSuiteGroup.Size(m)
}
func (m *TestSuiteCommon_TestSuiteGroup) XXX_DiscardUnknown() {
	xxx_messageInfo_TestSuiteCommon_TestSuiteGroup.DiscardUnknown(m)
}

var xxx_messageInfo_TestSuiteCommon_TestSuiteGroup proto.InternalMessageInfo

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

type HwTestCfg struct {
	HwTest               []*HwTestCfg_HwTest `protobuf:"bytes,1,rep,name=hw_test,json=hwTest,proto3" json:"hw_test,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *HwTestCfg) Reset()         { *m = HwTestCfg{} }
func (m *HwTestCfg) String() string { return proto.CompactTextString(m) }
func (*HwTestCfg) ProtoMessage()    {}
func (*HwTestCfg) Descriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{1}
}

func (m *HwTestCfg) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_HwTestCfg.Unmarshal(m, b)
}
func (m *HwTestCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_HwTestCfg.Marshal(b, m, deterministic)
}
func (m *HwTestCfg) XXX_Merge(src proto.Message) {
	xxx_messageInfo_HwTestCfg.Merge(m, src)
}
func (m *HwTestCfg) XXX_Size() int {
	return xxx_messageInfo_HwTestCfg.Size(m)
}
func (m *HwTestCfg) XXX_DiscardUnknown() {
	xxx_messageInfo_HwTestCfg.DiscardUnknown(m)
}

var xxx_messageInfo_HwTestCfg proto.InternalMessageInfo

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

// Configuration for a hardware test suite.
type HwTestCfg_HwTest struct {
	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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *HwTestCfg_HwTest) Reset()         { *m = HwTestCfg_HwTest{} }
func (m *HwTestCfg_HwTest) String() string { return proto.CompactTextString(m) }
func (*HwTestCfg_HwTest) ProtoMessage()    {}
func (*HwTestCfg_HwTest) Descriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{1, 0}
}

func (m *HwTestCfg_HwTest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_HwTestCfg_HwTest.Unmarshal(m, b)
}
func (m *HwTestCfg_HwTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_HwTestCfg_HwTest.Marshal(b, m, deterministic)
}
func (m *HwTestCfg_HwTest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_HwTestCfg_HwTest.Merge(m, src)
}
func (m *HwTestCfg_HwTest) XXX_Size() int {
	return xxx_messageInfo_HwTestCfg_HwTest.Size(m)
}
func (m *HwTestCfg_HwTest) XXX_DiscardUnknown() {
	xxx_messageInfo_HwTestCfg_HwTest.DiscardUnknown(m)
}

var xxx_messageInfo_HwTestCfg_HwTest proto.InternalMessageInfo

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

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

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

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

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

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

type TastVmTestCfg struct {
	TastVmTest           []*TastVmTestCfg_TastVmTest `protobuf:"bytes,1,rep,name=tast_vm_test,json=tastVmTest,proto3" json:"tast_vm_test,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

func (m *TastVmTestCfg) Reset()         { *m = TastVmTestCfg{} }
func (m *TastVmTestCfg) String() string { return proto.CompactTextString(m) }
func (*TastVmTestCfg) ProtoMessage()    {}
func (*TastVmTestCfg) Descriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{2}
}

func (m *TastVmTestCfg) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TastVmTestCfg.Unmarshal(m, b)
}
func (m *TastVmTestCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TastVmTestCfg.Marshal(b, m, deterministic)
}
func (m *TastVmTestCfg) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TastVmTestCfg.Merge(m, src)
}
func (m *TastVmTestCfg) XXX_Size() int {
	return xxx_messageInfo_TastVmTestCfg.Size(m)
}
func (m *TastVmTestCfg) XXX_DiscardUnknown() {
	xxx_messageInfo_TastVmTestCfg.DiscardUnknown(m)
}

var xxx_messageInfo_TastVmTestCfg proto.InternalMessageInfo

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

type TastVmTestCfg_TastTestExpr struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TastVmTestCfg_TastTestExpr) Reset()         { *m = TastVmTestCfg_TastTestExpr{} }
func (m *TastVmTestCfg_TastTestExpr) String() string { return proto.CompactTextString(m) }
func (*TastVmTestCfg_TastTestExpr) ProtoMessage()    {}
func (*TastVmTestCfg_TastTestExpr) Descriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{2, 0}
}

func (m *TastVmTestCfg_TastTestExpr) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TastVmTestCfg_TastTestExpr.Unmarshal(m, b)
}
func (m *TastVmTestCfg_TastTestExpr) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TastVmTestCfg_TastTestExpr.Marshal(b, m, deterministic)
}
func (m *TastVmTestCfg_TastTestExpr) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TastVmTestCfg_TastTestExpr.Merge(m, src)
}
func (m *TastVmTestCfg_TastTestExpr) XXX_Size() int {
	return xxx_messageInfo_TastVmTestCfg_TastTestExpr.Size(m)
}
func (m *TastVmTestCfg_TastTestExpr) XXX_DiscardUnknown() {
	xxx_messageInfo_TastVmTestCfg_TastTestExpr.DiscardUnknown(m)
}

var xxx_messageInfo_TastVmTestCfg_TastTestExpr proto.InternalMessageInfo

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

type TastVmTestCfg_TastVmTest struct {
	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"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

func (m *TastVmTestCfg_TastVmTest) Reset()         { *m = TastVmTestCfg_TastVmTest{} }
func (m *TastVmTestCfg_TastVmTest) String() string { return proto.CompactTextString(m) }
func (*TastVmTestCfg_TastVmTest) ProtoMessage()    {}
func (*TastVmTestCfg_TastVmTest) Descriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{2, 1}
}

func (m *TastVmTestCfg_TastVmTest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TastVmTestCfg_TastVmTest.Unmarshal(m, b)
}
func (m *TastVmTestCfg_TastVmTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TastVmTestCfg_TastVmTest.Marshal(b, m, deterministic)
}
func (m *TastVmTestCfg_TastVmTest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TastVmTestCfg_TastVmTest.Merge(m, src)
}
func (m *TastVmTestCfg_TastVmTest) XXX_Size() int {
	return xxx_messageInfo_TastVmTestCfg_TastVmTest.Size(m)
}
func (m *TastVmTestCfg_TastVmTest) XXX_DiscardUnknown() {
	xxx_messageInfo_TastVmTestCfg_TastVmTest.DiscardUnknown(m)
}

var xxx_messageInfo_TastVmTestCfg_TastVmTest proto.InternalMessageInfo

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

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

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

type VmTestCfg struct {
	VmTest               []*VmTestCfg_VmTest `protobuf:"bytes,1,rep,name=vm_test,json=vmTest,proto3" json:"vm_test,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

func (m *VmTestCfg) Reset()         { *m = VmTestCfg{} }
func (m *VmTestCfg) String() string { return proto.CompactTextString(m) }
func (*VmTestCfg) ProtoMessage()    {}
func (*VmTestCfg) Descriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{3}
}

func (m *VmTestCfg) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_VmTestCfg.Unmarshal(m, b)
}
func (m *VmTestCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_VmTestCfg.Marshal(b, m, deterministic)
}
func (m *VmTestCfg) XXX_Merge(src proto.Message) {
	xxx_messageInfo_VmTestCfg.Merge(m, src)
}
func (m *VmTestCfg) XXX_Size() int {
	return xxx_messageInfo_VmTestCfg.Size(m)
}
func (m *VmTestCfg) XXX_DiscardUnknown() {
	xxx_messageInfo_VmTestCfg.DiscardUnknown(m)
}

var xxx_messageInfo_VmTestCfg proto.InternalMessageInfo

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

type VmTestCfg_VmTest struct {
	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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *VmTestCfg_VmTest) Reset()         { *m = VmTestCfg_VmTest{} }
func (m *VmTestCfg_VmTest) String() string { return proto.CompactTextString(m) }
func (*VmTestCfg_VmTest) ProtoMessage()    {}
func (*VmTestCfg_VmTest) Descriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{3, 0}
}

func (m *VmTestCfg_VmTest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_VmTestCfg_VmTest.Unmarshal(m, b)
}
func (m *VmTestCfg_VmTest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_VmTestCfg_VmTest.Marshal(b, m, deterministic)
}
func (m *VmTestCfg_VmTest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_VmTestCfg_VmTest.Merge(m, src)
}
func (m *VmTestCfg_VmTest) XXX_Size() int {
	return xxx_messageInfo_VmTestCfg_VmTest.Size(m)
}
func (m *VmTestCfg_VmTest) XXX_DiscardUnknown() {
	xxx_messageInfo_VmTestCfg_VmTest.DiscardUnknown(m)
}

var xxx_messageInfo_VmTestCfg_VmTest proto.InternalMessageInfo

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

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

// Specifies a CrOS builder to target.
type TargetCriteria struct {
	// DEPRECATED: we need to target builder_name instead. build_target
	// has to go away. See https://crbug.com/1016536
	//
	// Types that are valid to be assigned 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TargetCriteria) Reset()         { *m = TargetCriteria{} }
func (m *TargetCriteria) String() string { return proto.CompactTextString(m) }
func (*TargetCriteria) ProtoMessage()    {}
func (*TargetCriteria) Descriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{4}
}

func (m *TargetCriteria) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TargetCriteria.Unmarshal(m, b)
}
func (m *TargetCriteria) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TargetCriteria.Marshal(b, m, deterministic)
}
func (m *TargetCriteria) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TargetCriteria.Merge(m, src)
}
func (m *TargetCriteria) XXX_Size() int {
	return xxx_messageInfo_TargetCriteria.Size(m)
}
func (m *TargetCriteria) XXX_DiscardUnknown() {
	xxx_messageInfo_TargetCriteria.DiscardUnknown(m)
}

var xxx_messageInfo_TargetCriteria proto.InternalMessageInfo

type isTargetCriteria_TargetType interface {
	isTargetCriteria_TargetType()
}

type TargetCriteria_BuildTarget struct {
	BuildTarget string `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3,oneof"`
}

func (*TargetCriteria_BuildTarget) isTargetCriteria_TargetType() {}

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

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

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

// XXX_OneofWrappers is for the internal use of the proto package.
func (*TargetCriteria) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*TargetCriteria_BuildTarget)(nil),
	}
}

// Details which testing is needed for a single CrOS build target.
type PerTargetTestRequirements struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *PerTargetTestRequirements) Reset()         { *m = PerTargetTestRequirements{} }
func (m *PerTargetTestRequirements) String() string { return proto.CompactTextString(m) }
func (*PerTargetTestRequirements) ProtoMessage()    {}
func (*PerTargetTestRequirements) Descriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{5}
}

func (m *PerTargetTestRequirements) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PerTargetTestRequirements.Unmarshal(m, b)
}
func (m *PerTargetTestRequirements) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PerTargetTestRequirements.Marshal(b, m, deterministic)
}
func (m *PerTargetTestRequirements) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PerTargetTestRequirements.Merge(m, src)
}
func (m *PerTargetTestRequirements) XXX_Size() int {
	return xxx_messageInfo_PerTargetTestRequirements.Size(m)
}
func (m *PerTargetTestRequirements) XXX_DiscardUnknown() {
	xxx_messageInfo_PerTargetTestRequirements.DiscardUnknown(m)
}

var xxx_messageInfo_PerTargetTestRequirements proto.InternalMessageInfo

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

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

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

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

// A listing of all testing that should be done for all CrOS builds.
type TargetTestRequirementsCfg struct {
	// 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"`
	XXX_NoUnkeyedLiteral      struct{}                     `json:"-"`
	XXX_unrecognized          []byte                       `json:"-"`
	XXX_sizecache             int32                        `json:"-"`
}

func (m *TargetTestRequirementsCfg) Reset()         { *m = TargetTestRequirementsCfg{} }
func (m *TargetTestRequirementsCfg) String() string { return proto.CompactTextString(m) }
func (*TargetTestRequirementsCfg) ProtoMessage()    {}
func (*TargetTestRequirementsCfg) Descriptor() ([]byte, []int) {
	return fileDescriptor_4af54ecd79c6f0f9, []int{6}
}

func (m *TargetTestRequirementsCfg) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TargetTestRequirementsCfg.Unmarshal(m, b)
}
func (m *TargetTestRequirementsCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TargetTestRequirementsCfg.Marshal(b, m, deterministic)
}
func (m *TargetTestRequirementsCfg) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TargetTestRequirementsCfg.Merge(m, src)
}
func (m *TargetTestRequirementsCfg) XXX_Size() int {
	return xxx_messageInfo_TargetTestRequirementsCfg.Size(m)
}
func (m *TargetTestRequirementsCfg) XXX_DiscardUnknown() {
	xxx_messageInfo_TargetTestRequirementsCfg.DiscardUnknown(m)
}

var xxx_messageInfo_TargetTestRequirementsCfg proto.InternalMessageInfo

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

func init() {
	proto.RegisterEnum("testplans.HwTestCfg_HwTestSuiteType", HwTestCfg_HwTestSuiteType_name, HwTestCfg_HwTestSuiteType_value)
	proto.RegisterType((*TestSuiteCommon)(nil), "testplans.TestSuiteCommon")
	proto.RegisterType((*TestSuiteCommon_TestSuiteGroup)(nil), "testplans.TestSuiteCommon.TestSuiteGroup")
	proto.RegisterType((*HwTestCfg)(nil), "testplans.HwTestCfg")
	proto.RegisterType((*HwTestCfg_HwTest)(nil), "testplans.HwTestCfg.HwTest")
	proto.RegisterType((*TastVmTestCfg)(nil), "testplans.TastVmTestCfg")
	proto.RegisterType((*TastVmTestCfg_TastTestExpr)(nil), "testplans.TastVmTestCfg.TastTestExpr")
	proto.RegisterType((*TastVmTestCfg_TastVmTest)(nil), "testplans.TastVmTestCfg.TastVmTest")
	proto.RegisterType((*VmTestCfg)(nil), "testplans.VmTestCfg")
	proto.RegisterType((*VmTestCfg_VmTest)(nil), "testplans.VmTestCfg.VmTest")
	proto.RegisterType((*TargetCriteria)(nil), "testplans.TargetCriteria")
	proto.RegisterType((*PerTargetTestRequirements)(nil), "testplans.PerTargetTestRequirements")
	proto.RegisterType((*TargetTestRequirementsCfg)(nil), "testplans.TargetTestRequirementsCfg")
}

func init() {
	proto.RegisterFile("testplans/target_test_requirements_config.proto", fileDescriptor_4af54ecd79c6f0f9)
}

var fileDescriptor_4af54ecd79c6f0f9 = []byte{
	// 864 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x55, 0x51, 0x6f, 0xe3, 0x44,
	0x10, 0x3e, 0x27, 0x6e, 0x6a, 0x8f, 0xd3, 0xc4, 0x2c, 0x27, 0xe1, 0xe6, 0xe0, 0x14, 0x72, 0x20,
	0x05, 0x81, 0x12, 0x29, 0x57, 0x78, 0xe0, 0xed, 0xd2, 0x0b, 0xb4, 0x41, 0x57, 0x8a, 0xe3, 0x1e,
	0x82, 0x97, 0xd5, 0x26, 0xd9, 0x38, 0x16, 0x76, 0xd6, 0xac, 0x37, 0xed, 0xe5, 0x15, 0x89, 0xff,
	0xc0, 0x6f, 0x40, 0xe2, 0x85, 0x27, 0x7e, 0x1e, 0xf2, 0xee, 0x26, 0xb1, 0x7b, 0x97, 0x0a, 0x9e,
	0xbc, 0x33, 0x3b, 0xb3, 0xfb, 0xcd, 0xf7, 0xed, 0x8c, 0xa1, 0x2f, 0x68, 0x26, 0xd2, 0x98, 0xac,
	0xb2, 0xbe, 0x20, 0x3c, 0xa4, 0x02, 0xe7, 0x0e, 0xcc, 0xe9, 0xaf, 0xeb, 0x88, 0xd3, 0x84, 0xae,
	0x44, 0x86, 0x67, 0x6c, 0xb5, 0x88, 0xc2, 0x5e, 0xca, 0x99, 0x60, 0xc8, 0xde, 0x25, 0xb4, 0x9e,
	0x86, 0x8c, 0x85, 0x31, 0xed, 0xcb, 0x8d, 0xe9, 0x7a, 0xd1, 0xbf, 0xe3, 0x24, 0x4d, 0x29, 0xcf,
	0x54, 0x68, 0xe7, 0xaf, 0x0a, 0x34, 0x03, 0x9a, 0x89, 0xc9, 0x3a, 0x12, 0xf4, 0x9c, 0x25, 0x09,
	0x5b, 0xa1, 0x8f, 0xa1, 0x3e, 0x8f, 0xb2, 0x34, 0x26, 0x1b, 0xbc, 0x22, 0x09, 0xf5, 0x8c, 0xb6,
	0xd1, 0xb5, 0x7d, 0x47, 0xfb, 0xae, 0x48, 0x42, 0xd1, 0x57, 0x60, 0xcd, 0x78, 0x24, 0xa2, 0x19,
	0x89, 0xbd, 0x4a, 0xdb, 0xe8, 0x3a, 0x83, 0x56, 0x4f, 0xdd, 0xd4, 0xdb, 0xde, 0xd4, 0x1b, 0x32,
	0x16, 0xbf, 0x26, 0xf1, 0x9a, 0xfa, 0xbb, 0x58, 0x74, 0x03, 0xef, 0x49, 0xec, 0x59, 0x7e, 0x1d,
	0x0e, 0x39, 0x5b, 0xa7, 0x99, 0x57, 0x6d, 0x57, 0xbb, 0xce, 0xe0, 0xb3, 0xde, 0x0e, 0x75, 0xef,
	0x1e, 0xa2, 0xbd, 0xfd, 0x6d, 0x9e, 0xe1, 0x37, 0x45, 0xc9, 0xce, 0xd0, 0x17, 0x80, 0xe6, 0x51,
	0x46, 0xa6, 0x31, 0xc5, 0xd3, 0x0d, 0x9e, 0xd3, 0x05, 0x59, 0xc7, 0xc2, 0x33, 0xdb, 0x46, 0xd7,
	0xf2, 0x5d, 0xbd, 0x33, 0xdc, 0xbc, 0x54, 0xfe, 0xd6, 0xd7, 0xd0, 0x28, 0x1f, 0x88, 0xba, 0xe0,
	0xde, 0x87, 0xa5, 0xab, 0x6e, 0x94, 0xaf, 0xea, 0xfc, 0x51, 0x05, 0xfb, 0xe2, 0x2e, 0x4f, 0x3f,
	0x5f, 0x84, 0xe8, 0x0c, 0x8e, 0x97, 0x77, 0x52, 0x0d, 0xcf, 0x90, 0x45, 0x3c, 0x29, 0x14, 0xb1,
	0x0b, 0xd3, 0x2b, 0xbf, 0xb6, 0x94, 0xdf, 0xd6, 0xef, 0x15, 0xa8, 0x29, 0x17, 0x1a, 0x40, 0x6d,
	0x26, 0x4b, 0xf4, 0xea, 0x9a, 0xc5, 0x83, 0x24, 0xf8, 0x3a, 0x12, 0x3d, 0x86, 0x23, 0x89, 0x53,
	0x23, 0x54, 0x46, 0x2e, 0x5a, 0xf6, 0xcb, 0x26, 0x26, 0x53, 0x3c, 0x65, 0x84, 0xcf, 0x3d, 0x47,
	0x89, 0xa6, 0x7c, 0xc3, 0xdc, 0x55, 0x08, 0x49, 0xd8, 0x9c, 0xc6, 0x5e, 0xb3, 0x18, 0xf2, 0x2a,
	0x77, 0xa1, 0x1f, 0x00, 0xe9, 0x82, 0x34, 0x17, 0x62, 0x93, 0x52, 0xef, 0xa4, 0x6d, 0x74, 0x1b,
	0x83, 0x4f, 0x1e, 0xa8, 0x4d, 0xe2, 0x0c, 0x36, 0x29, 0xf5, 0x9b, 0xcb, 0xb2, 0x03, 0x21, 0x30,
	0x53, 0xc6, 0x62, 0xaf, 0x21, 0x6f, 0x93, 0xeb, 0xb1, 0x69, 0x55, 0x5c, 0xa7, 0xf3, 0x0a, 0x9a,
	0xf7, 0xb2, 0x51, 0x07, 0x9e, 0x5e, 0xfc, 0x88, 0x83, 0xd1, 0x24, 0xc0, 0x93, 0x9b, 0xcb, 0x60,
	0x84, 0x83, 0x9f, 0xae, 0x47, 0xf8, 0xe6, 0x6a, 0x72, 0x3d, 0x3a, 0xbf, 0xfc, 0xe6, 0x72, 0xf4,
	0xd2, 0x7d, 0x84, 0xea, 0x60, 0xbd, 0xb8, 0x09, 0xbe, 0xcf, 0x83, 0x5c, 0x03, 0x59, 0x60, 0x06,
	0x2f, 0x26, 0x81, 0x5b, 0xe9, 0xfc, 0x53, 0x81, 0x93, 0x80, 0x64, 0xe2, 0x75, 0xb2, 0x95, 0x67,
	0x04, 0x75, 0x41, 0x32, 0x81, 0x6f, 0x93, 0xa2, 0x46, 0xcf, 0x8a, 0x1c, 0x17, 0xe3, 0x0b, 0x96,
	0x0f, 0x62, 0xb7, 0x6e, 0x7d, 0x0e, 0xf5, 0x7c, 0x27, 0x5f, 0x8f, 0xde, 0xa4, 0x1c, 0x3d, 0x01,
	0xd9, 0x60, 0x98, 0xbe, 0x49, 0xb9, 0x16, 0xc1, 0x12, 0x7a, 0xb3, 0xf5, 0xb7, 0x01, 0xb0, 0x3f,
	0xa7, 0x20, 0xb0, 0xf9, 0x9f, 0x05, 0xfe, 0x08, 0x40, 0x91, 0x5f, 0xe8, 0x3e, 0x5b, 0x7a, 0x64,
	0xef, 0x7d, 0x07, 0x0d, 0x59, 0xd5, 0x1e, 0x43, 0x45, 0xd6, 0xf5, 0xe9, 0x83, 0x75, 0x6d, 0xd1,
	0xfb, 0x92, 0x92, 0xad, 0x35, 0x36, 0xad, 0xaa, 0x6b, 0x76, 0xfe, 0x34, 0xc0, 0xde, 0xd3, 0x76,
	0x06, 0xc7, 0x65, 0xc6, 0x8a, 0xaf, 0x7a, 0x7f, 0xaa, 0x66, 0xaa, 0x76, 0xab, 0x58, 0x0a, 0xa1,
	0xf6, 0x56, 0xcd, 0xd6, 0xff, 0xa9, 0x79, 0xff, 0xea, 0xe4, 0x48, 0xb1, 0x7d, 0x7b, 0xd7, 0x7b,
	0x63, 0xd3, 0x32, 0xdc, 0x8a, 0x04, 0x6b, 0x75, 0x42, 0x68, 0x04, 0x72, 0x0c, 0x9e, 0xf3, 0x48,
	0x50, 0x1e, 0x11, 0xf4, 0x0c, 0xea, 0xd3, 0x75, 0x14, 0xcf, 0xb1, 0x1a, 0x8f, 0x2a, 0xfd, 0xe2,
	0x91, 0xef, 0x48, 0xaf, 0x0a, 0xce, 0x5f, 0xbf, 0x34, 0x29, 0x57, 0xbc, 0x56, 0xd5, 0xeb, 0xd7,
	0xbe, 0x9c, 0xd9, 0xe1, 0x09, 0x38, 0xdb, 0x01, 0xbb, 0x49, 0x69, 0x3e, 0x1b, 0x4f, 0xaf, 0x29,
	0x57, 0xf9, 0xb2, 0xd6, 0xc2, 0xc4, 0x45, 0x43, 0x68, 0xea, 0xe0, 0x99, 0xc6, 0x21, 0xa5, 0x72,
	0x06, 0xa7, 0x25, 0x1d, 0x8a, 0x40, 0xfd, 0x86, 0x28, 0x03, 0x3f, 0x03, 0x67, 0xdb, 0x6e, 0xb3,
	0x45, 0x28, 0x21, 0x39, 0x83, 0xc7, 0xef, 0xea, 0x33, 0xdf, 0x5e, 0x16, 0xa6, 0x8e, 0xa3, 0xf5,
	0x91, 0x59, 0x47, 0x6f, 0x65, 0xed, 0x34, 0xf2, 0xed, 0xdb, 0x9d, 0xaa, 0x57, 0xf0, 0xc1, 0x3c,
	0xe2, 0x74, 0x26, 0x70, 0xb1, 0x27, 0xe4, 0x09, 0xc7, 0xf2, 0x04, 0xef, 0xd0, 0xfb, 0xf1, 0xdf,
	0x57, 0x89, 0x25, 0xa7, 0xec, 0xe1, 0xea, 0xd8, 0xb4, 0x4c, 0xf7, 0x68, 0x6c, 0x5a, 0x35, 0xf7,
	0xb8, 0xf3, 0x9b, 0x01, 0xa7, 0xef, 0x26, 0x2b, 0xbf, 0x9f, 0xc2, 0x87, 0x29, 0xe5, 0xf8, 0xd0,
	0x1f, 0x4c, 0x3f, 0xb5, 0xe2, 0x90, 0x39, 0xc8, 0xbd, 0x7f, 0x9a, 0x1e, 0xda, 0x1a, 0x7e, 0xf9,
	0xf3, 0xf3, 0x90, 0xf5, 0x66, 0x4b, 0xce, 0x92, 0x68, 0x9d, 0xf4, 0x18, 0x0f, 0xfb, 0x5b, 0x83,
	0x65, 0xfd, 0x68, 0xb5, 0xe0, 0x44, 0xfd, 0x0c, 0xfb, 0x21, 0xdb, 0xff, 0x58, 0xa7, 0x35, 0xe9,
	0x7b, 0xfe, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x2d, 0x88, 0xeb, 0xda, 0x6c, 0x07, 0x00, 0x00,
}
