// 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"`
	// 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
}

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),
	}
}

// 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((*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{
	// 391 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0xc1, 0xaa, 0xda, 0x40,
	0x14, 0x86, 0x1b, 0x8d, 0x1a, 0x47, 0xa9, 0x69, 0x0a, 0xa2, 0xd2, 0x85, 0x48, 0xa1, 0xd9, 0x34,
	0x01, 0xa5, 0x8b, 0x2e, 0xab, 0xb4, 0x15, 0x17, 0x6d, 0x49, 0xa5, 0x85, 0x6e, 0x42, 0x4c, 0x27,
	0x71, 0x60, 0x32, 0x27, 0xce, 0x8c, 0x15, 0xfb, 0x18, 0xf7, 0x15, 0xee, 0x8b, 0x5e, 0x32, 0x89,
	0x49, 0xf4, 0xe2, 0xf2, 0x9c, 0xff, 0xfb, 0xe7, 0x9f, 0x73, 0x38, 0xe8, 0x9d, 0xc4, 0x42, 0xa6,
	0x34, 0x60, 0xc2, 0x15, 0x70, 0xe4, 0x21, 0xf6, 0x25, 0xc7, 0xd8, 0xcf, 0xba, 0x7e, 0x08, 0x2c,
	0x22, 0xb1, 0x93, 0x72, 0x90, 0x60, 0x75, 0x4b, 0x70, 0x32, 0xac, 0x3c, 0x21, 0x24, 0x09, 0xb0,
	0x1c, 0x99, 0x3d, 0x34, 0xd0, 0x60, 0x8b, 0x85, 0xf4, 0xb0, 0x90, 0x9c, 0x84, 0x92, 0x00, 0xb3,
	0x6c, 0x64, 0xfe, 0x25, 0x22, 0xd8, 0x51, 0xec, 0xef, 0x4f, 0xea, 0x59, 0x31, 0xd2, 0xa6, 0x9a,
	0x6d, 0x78, 0x2f, 0x8b, 0xfe, 0xfa, 0x94, 0x79, 0x44, 0x9d, 0xfc, 0x97, 0x14, 0x64, 0xf3, 0x8a,
	0xfc, 0x95, 0xe4, 0xe4, 0x02, 0x0d, 0x2f, 0x24, 0x03, 0xe6, 0xcb, 0x40, 0xc8, 0x82, 0x6f, 0x29,
	0xfe, 0x75, 0xa1, 0x7e, 0x03, 0xb6, 0x0d, 0x84, 0xcc, 0x4d, 0xef, 0x91, 0x15, 0x1e, 0x7c, 0x60,
	0xf4, 0x9c, 0x0f, 0x17, 0x73, 0x38, 0xa6, 0xa3, 0xce, 0x54, 0xb3, 0xbb, 0xeb, 0x17, 0xde, 0x20,
	0x3c, 0x7c, 0x67, 0xf4, 0x9c, 0xa1, 0x5f, 0x33, 0xa1, 0xc0, 0x03, 0x2a, 0xa0, 0x8e, 0x1b, 0x15,
	0xfe, 0x89, 0x0a, 0x28, 0xf1, 0x65, 0x1f, 0xa1, 0xd5, 0x21, 0x2b, 0x7f, 0xef, 0x31, 0xdb, 0xe8,
	0x86, 0x6e, 0xb6, 0x36, 0xba, 0xd1, 0x36, 0x3b, 0xb3, 0x47, 0x0d, 0x8d, 0x7f, 0xaa, 0xcd, 0x6e,
	0x39, 0xc6, 0xb7, 0xeb, 0xf9, 0x88, 0xfa, 0x11, 0xa1, 0xd8, 0x4f, 0x03, 0x29, 0x31, 0x67, 0x6a,
	0xe0, 0xde, 0x7c, 0xe8, 0x94, 0x1b, 0x76, 0xbe, 0x10, 0x8a, 0x7f, 0xe4, 0xaa, 0xd7, 0x8b, 0xaa,
	0xc2, 0xfa, 0x8c, 0x4c, 0xf5, 0x33, 0x5e, 0x3d, 0x37, 0x6a, 0x28, 0xfb, 0xa4, 0x66, 0xbf, 0x09,
	0xf4, 0x06, 0xf2, 0xba, 0xb1, 0xd1, 0x0d, 0xcd, 0x6c, 0xcc, 0xfe, 0xa3, 0x57, 0xd7, 0x9f, 0x5c,
	0x45, 0xb1, 0x85, 0xd1, 0x9b, 0x67, 0x37, 0x51, 0x4f, 0xd3, 0xa6, 0x4d, 0xbb, 0x37, 0x7f, 0x5b,
	0x4b, 0xbb, 0x3b, 0xa8, 0x37, 0x16, 0xf7, 0xa4, 0xe5, 0x87, 0x3f, 0x8b, 0x18, 0x9c, 0x70, 0xcf,
	0x21, 0x21, 0xc7, 0xc4, 0x01, 0x1e, 0xbb, 0x97, 0x02, 0x84, 0x4b, 0x58, 0xc4, 0x03, 0x57, 0x1d,
	0x98, 0x1b, 0x83, 0x5b, 0x66, 0xed, 0xda, 0xaa, 0xb7, 0x78, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x03,
	0x5b, 0x14, 0xd1, 0xc2, 0x02, 0x00, 0x00,
}
