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

// A list of test groups.
type TestGroups struct {
	Name                 []string `protobuf:"bytes,1,rep,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestGroups proto.InternalMessageInfo

func (m *TestGroups) GetName() []string {
	if m != nil {
		return m.Name
	}
	return nil
}

// A description of how to remove test suites from the default set of test
// suites in Chrome OS CQ, as a result of source configuration.
// See http://go/cq-source-config
type SubtractiveRule 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,2,opt,name=disable_vm_tests,json=disableVmTests,proto3" json:"disable_vm_tests,omitempty"`
	// Prunes away all default suites except those in the provided test groups.
	// e.g. setting this to "bluetooth" will have CQ run only those test suites
	// in the "bluetooth" test group.
	OnlyKeepAllSuitesInGroups *TestGroups `protobuf:"bytes,3,opt,name=only_keep_all_suites_in_groups,json=onlyKeepAllSuitesInGroups,proto3" json:"only_keep_all_suites_in_groups,omitempty"`
	// Prunes away all default suites except one in each provided test group.
	// e.g. can be used to ensure a test suite is launched on each of the
	// supported Chrome OS processor architectures.
	OnlyKeepOneSuiteFromEachGroup *TestGroups `protobuf:"bytes,4,opt,name=only_keep_one_suite_from_each_group,json=onlyKeepOneSuiteFromEachGroup,proto3" json:"only_keep_one_suite_from_each_group,omitempty"`
	XXX_NoUnkeyedLiteral          struct{}    `json:"-"`
	XXX_unrecognized              []byte      `json:"-"`
	XXX_sizecache                 int32       `json:"-"`
}

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

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

var xxx_messageInfo_SubtractiveRule proto.InternalMessageInfo

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

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

func (m *SubtractiveRule) GetOnlyKeepAllSuitesInGroups() *TestGroups {
	if m != nil {
		return m.OnlyKeepAllSuitesInGroups
	}
	return nil
}

func (m *SubtractiveRule) GetOnlyKeepOneSuiteFromEachGroup() *TestGroups {
	if m != nil {
		return m.OnlyKeepOneSuiteFromEachGroup
	}
	return nil
}

// A descriptive of how to add extra test suites to a CQ run based on source
// configuration. An AdditiveRule will trigger so long as any file matches the
// relevant source pattern. AdditiveRules combine as a union of additional test
// suites to run. disable_by_default=True test suites are particularly relevant
// to AdditiveRules, since AdditiveRules are the only thing that will include
// them.
type AdditiveRule struct {
	// Adds on all test suites in the provided groups, even if they have
	// disable_by_default=True.
	// e.g. could be used to trigger wificell testing (which is expensive) based
	// on the presence of files in wifi-related directories.
	AddAllSuitesInGroups *TestGroups `protobuf:"bytes,1,opt,name=add_all_suites_in_groups,json=addAllSuitesInGroups,proto3" json:"add_all_suites_in_groups,omitempty"`
	// Adds on one test suite from each of the provided groups, even if that suite
	// has disable_by_default=True.
	// e.g. could be used to trigger wificell testing (which is expensive) on one
	// board in each Chrome OS processor architecture.
	AddOneSuiteFromEachGroup *TestGroups `protobuf:"bytes,2,opt,name=add_one_suite_from_each_group,json=addOneSuiteFromEachGroup,proto3" json:"add_one_suite_from_each_group,omitempty"`
	XXX_NoUnkeyedLiteral     struct{}    `json:"-"`
	XXX_unrecognized         []byte      `json:"-"`
	XXX_sizecache            int32       `json:"-"`
}

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

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

var xxx_messageInfo_AdditiveRule proto.InternalMessageInfo

func (m *AdditiveRule) GetAddAllSuitesInGroups() *TestGroups {
	if m != nil {
		return m.AddAllSuitesInGroups
	}
	return nil
}

func (m *AdditiveRule) GetAddOneSuiteFromEachGroup() *TestGroups {
	if m != nil {
		return m.AddOneSuiteFromEachGroup
	}
	return nil
}

// A set of test subtractions and additions to perform for a source tree.
// See http://go/cq-source-config for documentation.
type SourceTestRules struct {
	// A file pattern, representing a segment of Chrome OS code.
	FilePattern *FilePattern `protobuf:"bytes,1,opt,name=file_pattern,json=filePattern,proto3" json:"file_pattern,omitempty"`
	// A subtractive rule to apply to this file pattern. See the relevant message
	// documentation.
	SubtractiveRule *SubtractiveRule `protobuf:"bytes,2,opt,name=subtractive_rule,json=subtractiveRule,proto3" json:"subtractive_rule,omitempty"`
	// An additive rule to apply to this file pattern. See the relevant message
	// documentation.
	AdditiveRule         *AdditiveRule `protobuf:"bytes,3,opt,name=additive_rule,json=additiveRule,proto3" json:"additive_rule,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

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

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

var xxx_messageInfo_SourceTestRules proto.InternalMessageInfo

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

func (m *SourceTestRules) GetSubtractiveRule() *SubtractiveRule {
	if m != nil {
		return m.SubtractiveRule
	}
	return nil
}

func (m *SourceTestRules) GetAdditiveRule() *AdditiveRule {
	if m != nil {
		return m.AdditiveRule
	}
	return nil
}

// Configures test restrictions for all relevant source trees.
// This is the root message.
type SourceTreeTestCfg struct {
	// Rules for how to test changes to specified source trees in the codebase.
	SourceTestRules      []*SourceTestRules `protobuf:"bytes,2,rep,name=source_test_rules,json=sourceTestRules,proto3" json:"source_test_rules,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{4}
}

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) GetSourceTestRules() []*SourceTestRules {
	if m != nil {
		return m.SourceTestRules
	}
	return nil
}

func init() {
	proto.RegisterType((*TestGroups)(nil), "testplans.TestGroups")
	proto.RegisterType((*SubtractiveRule)(nil), "testplans.SubtractiveRule")
	proto.RegisterType((*AdditiveRule)(nil), "testplans.AdditiveRule")
	proto.RegisterType((*SourceTestRules)(nil), "testplans.SourceTestRules")
	proto.RegisterType((*SourceTreeTestCfg)(nil), "testplans.SourceTreeTestCfg")
}

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

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