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

package testplans

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	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

// Testing restrictions to apply to a source tree.
type TestRestriction struct {
	// Whether to disable hardware test suites.
	DisableHwTests bool `protobuf:"varint,1,opt,name=disable_hw_tests,json=disableHwTests,proto3" json:"disable_hw_tests,omitempty"`
	// Whether to disable virtual machine test suites.
	DisableVmTests bool `protobuf:"varint,3,opt,name=disable_vm_tests,json=disableVmTests,proto3" json:"disable_vm_tests,omitempty"`
	// Whether to disable non-Tast-based test suites.
	DisableNonTastTests bool `protobuf:"varint,5,opt,name=disable_non_tast_tests,json=disableNonTastTests,proto3" json:"disable_non_tast_tests,omitempty"`
	// A subset of CQ builders for which testing should be performed.
	// If this is nonempty, hw/vm tests will *only* be done for the provided
	// list of build targets.
	// SOON TO BE DEPRECATED: this concept will be replaced with CqTestWhen
	// rules, as below.
	CqOnlyTestBuilders []*TestRestriction_OnlyTestBuilder `protobuf:"bytes,6,rep,name=cq_only_test_builders,json=cqOnlyTestBuilders,proto3" json:"cq_only_test_builders,omitempty"`
	// Types that are valid to be assigned to CqTestWhen:
	//	*TestRestriction_CqOnlyTestGroup
	//	*TestRestriction_CqAlsoTestGroup
	CqTestWhen           isTestRestriction_CqTestWhen `protobuf_oneof:"CqTestWhen"`
	XXX_NoUnkeyedLiteral struct{}                     `json:"-"`
	XXX_unrecognized     []byte                       `json:"-"`
	XXX_sizecache        int32                        `json:"-"`
}

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

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

var xxx_messageInfo_TestRestriction proto.InternalMessageInfo

func (m *TestRestriction) GetDisableHwTests() bool {
	if m != nil {
		return m.DisableHwTests
	}
	return false
}

func (m *TestRestriction) GetDisableVmTests() bool {
	if m != nil {
		return m.DisableVmTests
	}
	return false
}

func (m *TestRestriction) GetDisableNonTastTests() bool {
	if m != nil {
		return m.DisableNonTastTests
	}
	return false
}

func (m *TestRestriction) GetCqOnlyTestBuilders() []*TestRestriction_OnlyTestBuilder {
	if m != nil {
		return m.CqOnlyTestBuilders
	}
	return nil
}

type isTestRestriction_CqTestWhen interface {
	isTestRestriction_CqTestWhen()
}

type TestRestriction_CqOnlyTestGroup struct {
	CqOnlyTestGroup string `protobuf:"bytes,7,opt,name=cq_only_test_group,json=cqOnlyTestGroup,proto3,oneof"`
}

type TestRestriction_CqAlsoTestGroup struct {
	CqAlsoTestGroup string `protobuf:"bytes,8,opt,name=cq_also_test_group,json=cqAlsoTestGroup,proto3,oneof"`
}

func (*TestRestriction_CqOnlyTestGroup) isTestRestriction_CqTestWhen() {}

func (*TestRestriction_CqAlsoTestGroup) isTestRestriction_CqTestWhen() {}

func (m *TestRestriction) GetCqTestWhen() isTestRestriction_CqTestWhen {
	if m != nil {
		return m.CqTestWhen
	}
	return nil
}

func (m *TestRestriction) GetCqOnlyTestGroup() string {
	if x, ok := m.GetCqTestWhen().(*TestRestriction_CqOnlyTestGroup); ok {
		return x.CqOnlyTestGroup
	}
	return ""
}

func (m *TestRestriction) GetCqAlsoTestGroup() string {
	if x, ok := m.GetCqTestWhen().(*TestRestriction_CqAlsoTestGroup); ok {
		return x.CqAlsoTestGroup
	}
	return ""
}

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

type TestRestriction_OnlyTestBuilder struct {
	BuilderName          string   `protobuf:"bytes,1,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 *TestRestriction_OnlyTestBuilder) Reset()         { *m = TestRestriction_OnlyTestBuilder{} }
func (m *TestRestriction_OnlyTestBuilder) String() string { return proto.CompactTextString(m) }
func (*TestRestriction_OnlyTestBuilder) ProtoMessage()    {}
func (*TestRestriction_OnlyTestBuilder) Descriptor() ([]byte, []int) {
	return fileDescriptor_9aed450ade7161bc, []int{0, 0}
}

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

var xxx_messageInfo_TestRestriction_OnlyTestBuilder proto.InternalMessageInfo

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

// A set of test restrictions for a source tree.
type SourceTreeTestRestriction struct {
	// A file pattern, representing a segment of Chrome OS code.
	FilePattern *FilePattern `protobuf:"bytes,3,opt,name=file_pattern,json=filePattern,proto3" json:"file_pattern,omitempty"`
	// The test restrictions to apply to the source tree.
	TestRestriction      *TestRestriction `protobuf:"bytes,2,opt,name=test_restriction,json=testRestriction,proto3" json:"test_restriction,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_SourceTreeTestRestriction proto.InternalMessageInfo

func (m *SourceTreeTestRestriction) GetFilePattern() *FilePattern {
	if m != nil {
		return m.FilePattern
	}
	return nil
}

func (m *SourceTreeTestRestriction) GetTestRestriction() *TestRestriction {
	if m != nil {
		return m.TestRestriction
	}
	return nil
}

// Configures test restrictions for all relevant source trees.
// This is the root message.
type SourceTreeTestCfg struct {
	// (Source tree, test restriction) pairs.
	SourceTreeTestRestriction []*SourceTreeTestRestriction `protobuf:"bytes,1,rep,name=source_tree_test_restriction,json=sourceTreeTestRestriction,proto3" json:"source_tree_test_restriction,omitempty"`
	XXX_NoUnkeyedLiteral      struct{}                     `json:"-"`
	XXX_unrecognized          []byte                       `json:"-"`
	XXX_sizecache             int32                        `json:"-"`
}

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

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

var xxx_messageInfo_SourceTreeTestCfg proto.InternalMessageInfo

func (m *SourceTreeTestCfg) GetSourceTreeTestRestriction() []*SourceTreeTestRestriction {
	if m != nil {
		return m.SourceTreeTestRestriction
	}
	return nil
}

func init() {
	proto.RegisterType((*TestRestriction)(nil), "testplans.TestRestriction")
	proto.RegisterType((*TestRestriction_OnlyTestBuilder)(nil), "testplans.TestRestriction.OnlyTestBuilder")
	proto.RegisterType((*SourceTreeTestRestriction)(nil), "testplans.SourceTreeTestRestriction")
	proto.RegisterType((*SourceTreeTestCfg)(nil), "testplans.SourceTreeTestCfg")
}

func init() {
	proto.RegisterFile("testplans/source_tree_test_config.proto", fileDescriptor_9aed450ade7161bc)
}

var fileDescriptor_9aed450ade7161bc = []byte{
	// 440 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0xd1, 0x8b, 0xd3, 0x40,
	0x10, 0xc6, 0xcd, 0xb5, 0x77, 0xb6, 0xdb, 0x62, 0x6b, 0xc4, 0xd2, 0x2b, 0x3e, 0xd4, 0x22, 0x58,
	0x04, 0x13, 0xb8, 0xea, 0x83, 0x8f, 0xf6, 0x50, 0x8f, 0x7b, 0x38, 0x25, 0x16, 0x05, 0x41, 0xc2,
	0x36, 0x37, 0x49, 0x17, 0x36, 0x3b, 0xed, 0xce, 0xd6, 0xe3, 0xfc, 0x6f, 0xc4, 0x7f, 0x54, 0xb2,
	0x49, 0x9b, 0x34, 0xd2, 0xc7, 0x7c, 0xf3, 0xfb, 0x66, 0xf2, 0xcd, 0x2c, 0x7b, 0x69, 0x80, 0xcc,
	0x5a, 0x72, 0x45, 0x3e, 0xe1, 0x56, 0x47, 0x10, 0x1a, 0x0d, 0x10, 0x66, 0x6a, 0x18, 0xa1, 0x8a,
	0x45, 0xe2, 0xad, 0x35, 0x1a, 0x74, 0xdb, 0x7b, 0x70, 0x34, 0x28, 0x3d, 0x11, 0xa6, 0x29, 0xaa,
	0x1c, 0x99, 0xfc, 0x69, 0xb0, 0xde, 0x02, 0xc8, 0x04, 0x40, 0x46, 0x8b, 0xc8, 0x08, 0x54, 0xee,
	0x94, 0xf5, 0x6f, 0x05, 0xf1, 0xa5, 0x84, 0x70, 0x75, 0x67, 0xdb, 0xd2, 0xd0, 0x19, 0x3b, 0xd3,
	0x56, 0xf0, 0xa8, 0xd0, 0xaf, 0xee, 0x32, 0x0f, 0x55, 0xc9, 0x5f, 0x69, 0x41, 0x36, 0x0e, 0xc8,
	0x6f, 0x69, 0x4e, 0xce, 0xd8, 0x60, 0x47, 0x2a, 0x54, 0xa1, 0xe1, 0x64, 0x0a, 0xfe, 0xd4, 0xf2,
	0x4f, 0x8a, 0xea, 0x0d, 0xaa, 0x05, 0x27, 0x93, 0x9b, 0x7e, 0xb2, 0xa7, 0xd1, 0x26, 0x44, 0x25,
	0xef, 0xf3, 0x70, 0xcb, 0xad, 0x90, 0xb7, 0xa0, 0x69, 0x78, 0x36, 0x6e, 0x4c, 0x3b, 0x17, 0xaf,
	0xbc, 0x7d, 0x28, 0xaf, 0x96, 0xc1, 0xfb, 0xac, 0xe4, 0x7d, 0xa6, 0xcd, 0x73, 0x4b, 0xe0, 0x46,
	0x9b, 0x9a, 0x44, 0xee, 0x6b, 0xe6, 0x1e, 0xb4, 0x4f, 0x34, 0x6e, 0xd7, 0xc3, 0x87, 0x63, 0x67,
	0xda, 0xbe, 0x7a, 0x10, 0xf4, 0x4a, 0xc7, 0xa7, 0xac, 0x50, 0xe0, 0x5c, 0x12, 0x56, 0xf1, 0x56,
	0x89, 0xbf, 0x97, 0x84, 0x7b, 0x7c, 0xf4, 0x86, 0xf5, 0x6a, 0x13, 0xdd, 0xe7, 0xac, 0x5b, 0x44,
	0x08, 0x15, 0x4f, 0xc1, 0x2e, 0xb5, 0x1d, 0x74, 0x0a, 0xed, 0x86, 0xa7, 0x30, 0xef, 0x32, 0x76,
	0xb9, 0xc9, 0x3c, 0xdf, 0x57, 0xa0, 0xae, 0x9b, 0xad, 0x66, 0xff, 0x74, 0xf2, 0xd7, 0x61, 0xe7,
	0x5f, 0xed, 0xa1, 0x17, 0x1a, 0xa0, 0x7e, 0xad, 0x77, 0xac, 0x1b, 0x0b, 0x09, 0xe1, 0x9a, 0x1b,
	0x03, 0x5a, 0xd9, 0xfd, 0x77, 0x2e, 0x06, 0x95, 0xdd, 0x7c, 0x14, 0x12, 0xbe, 0xe4, 0xd5, 0xa0,
	0x13, 0x97, 0x1f, 0xee, 0x07, 0xd6, 0xb7, 0x49, 0x74, 0xd9, 0x6e, 0x78, 0x62, 0xed, 0xa3, 0xe3,
	0xab, 0x0d, 0x7a, 0xe6, 0x50, 0xb8, 0x6e, 0xb6, 0x9c, 0xfe, 0xc9, 0xe4, 0x37, 0x7b, 0x7c, 0xf8,
	0x93, 0x97, 0x71, 0xe2, 0x02, 0x7b, 0xf6, 0xdf, 0x13, 0xad, 0x4e, 0x73, 0xec, 0x21, 0x5f, 0x54,
	0xa6, 0x1d, 0x0d, 0x1a, 0x9c, 0xd3, 0xb1, 0xd2, 0xfc, 0xed, 0x8f, 0x59, 0x82, 0x5e, 0xb4, 0xd2,
	0x98, 0x8a, 0x6d, 0xea, 0xa1, 0x4e, 0xfc, 0xdd, 0x07, 0x92, 0x2f, 0x54, 0xac, 0xb9, 0x6f, 0xdf,
	0xbb, 0x9f, 0xa0, 0xbf, 0x9f, 0xb5, 0x3c, 0xb3, 0xda, 0xec, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff,
	0xd8, 0x50, 0xd0, 0x58, 0x51, 0x03, 0x00, 0x00,
}
