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

package testplans

import (
	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)
)

// A list of test groups.
type TestGroups struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Name []string `protobuf:"bytes,1,rep,name=name,proto3" json:"name,omitempty"`
}

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

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

func (*TestGroups) ProtoMessage() {}

func (x *TestGroups) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_source_tree_test_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 TestGroups.ProtoReflect.Descriptor instead.
func (*TestGroups) Descriptor() ([]byte, []int) {
	return file_testplans_source_tree_test_config_proto_rawDescGZIP(), []int{0}
}

func (x *TestGroups) GetName() []string {
	if x != nil {
		return x.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 {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

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

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

func (*SubtractiveRule) ProtoMessage() {}

func (x *SubtractiveRule) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_source_tree_test_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 SubtractiveRule.ProtoReflect.Descriptor instead.
func (*SubtractiveRule) Descriptor() ([]byte, []int) {
	return file_testplans_source_tree_test_config_proto_rawDescGZIP(), []int{1}
}

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

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

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

func (x *SubtractiveRule) GetOnlyKeepOneSuiteFromEachGroup() *TestGroups {
	if x != nil {
		return x.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 {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

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

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

func (*AdditiveRule) ProtoMessage() {}

func (x *AdditiveRule) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_source_tree_test_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 AdditiveRule.ProtoReflect.Descriptor instead.
func (*AdditiveRule) Descriptor() ([]byte, []int) {
	return file_testplans_source_tree_test_config_proto_rawDescGZIP(), []int{2}
}

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

func (x *AdditiveRule) GetAddOneSuiteFromEachGroup() *TestGroups {
	if x != nil {
		return x.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 {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

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

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

func (*SourceTestRules) ProtoMessage() {}

func (x *SourceTestRules) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_source_tree_test_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 SourceTestRules.ProtoReflect.Descriptor instead.
func (*SourceTestRules) Descriptor() ([]byte, []int) {
	return file_testplans_source_tree_test_config_proto_rawDescGZIP(), []int{3}
}

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

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

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

// Configures test restrictions for all relevant source trees.
// This is the root message.
type SourceTreeTestCfg struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

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

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

func (*SourceTreeTestCfg) ProtoMessage() {}

func (x *SourceTreeTestCfg) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_source_tree_test_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 SourceTreeTestCfg.ProtoReflect.Descriptor instead.
func (*SourceTreeTestCfg) Descriptor() ([]byte, []int) {
	return file_testplans_source_tree_test_config_proto_rawDescGZIP(), []int{4}
}

func (x *SourceTreeTestCfg) GetSourceTestRules() []*SourceTestRules {
	if x != nil {
		return x.SourceTestRules
	}
	return nil
}

var File_testplans_source_tree_test_config_proto protoreflect.FileDescriptor

var file_testplans_source_tree_test_config_proto_rawDesc = []byte{
	0x0a, 0x27, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x73, 0x6f, 0x75, 0x72,
	0x63, 0x65, 0x5f, 0x74, 0x72, 0x65, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 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, 0x16, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f,
	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x20, 0x0a, 0x0a,
	0x54, 0x65, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
	0x6d, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa2,
	0x02, 0x0a, 0x0f, 0x53, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75,
	0x6c, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x68, 0x77,
	0x5f, 0x74, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69,
	0x73, 0x61, 0x62, 0x6c, 0x65, 0x48, 0x77, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10,
	0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x6d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x73,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x56,
	0x6d, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x1e, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x6b,
	0x65, 0x65, 0x70, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x5f, 0x69,
	0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15,
	0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x47,
	0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x19, 0x6f, 0x6e, 0x6c, 0x79, 0x4b, 0x65, 0x65, 0x70, 0x41,
	0x6c, 0x6c, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x49, 0x6e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73,
	0x12, 0x61, 0x0a, 0x23, 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x6b, 0x65, 0x65, 0x70, 0x5f, 0x6f, 0x6e,
	0x65, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x61, 0x63,
	0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x47, 0x72,
	0x6f, 0x75, 0x70, 0x73, 0x52, 0x1d, 0x6f, 0x6e, 0x6c, 0x79, 0x4b, 0x65, 0x65, 0x70, 0x4f, 0x6e,
	0x65, 0x53, 0x75, 0x69, 0x74, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x45, 0x61, 0x63, 0x68, 0x47, 0x72,
	0x6f, 0x75, 0x70, 0x22, 0xb5, 0x01, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x76, 0x65,
	0x52, 0x75, 0x6c, 0x65, 0x12, 0x4d, 0x0a, 0x18, 0x61, 0x64, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x5f,
	0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61,
	0x6e, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x14, 0x61,
	0x64, 0x64, 0x41, 0x6c, 0x6c, 0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x49, 0x6e, 0x47, 0x72, 0x6f,
	0x75, 0x70, 0x73, 0x12, 0x56, 0x0a, 0x1d, 0x61, 0x64, 0x64, 0x5f, 0x6f, 0x6e, 0x65, 0x5f, 0x73,
	0x75, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x65, 0x61, 0x63, 0x68, 0x5f, 0x67,
	0x72, 0x6f, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73,
	0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70,
	0x73, 0x52, 0x18, 0x61, 0x64, 0x64, 0x4f, 0x6e, 0x65, 0x53, 0x75, 0x69, 0x74, 0x65, 0x46, 0x72,
	0x6f, 0x6d, 0x45, 0x61, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xd1, 0x01, 0x0a, 0x0f,
	0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x65, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12,
	0x39, 0x0a, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e,
	0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x52, 0x0b, 0x66,
	0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x45, 0x0a, 0x10, 0x73, 0x75,
	0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73,
	0x2e, 0x53, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6c, 0x65,
	0x52, 0x0f, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6c,
	0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x72, 0x75,
	0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70,
	0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6c,
	0x65, 0x52, 0x0c, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x22,
	0x61, 0x0a, 0x11, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x72, 0x65, 0x65, 0x54, 0x65, 0x73,
	0x74, 0x43, 0x66, 0x67, 0x12, 0x46, 0x0a, 0x11, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x1a, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x53, 0x6f, 0x75, 0x72,
	0x63, 0x65, 0x54, 0x65, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0f, 0x73, 0x6f, 0x75,
	0x72, 0x63, 0x65, 0x54, 0x65, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x01,
	0x10, 0x02, 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_source_tree_test_config_proto_rawDescOnce sync.Once
	file_testplans_source_tree_test_config_proto_rawDescData = file_testplans_source_tree_test_config_proto_rawDesc
)

func file_testplans_source_tree_test_config_proto_rawDescGZIP() []byte {
	file_testplans_source_tree_test_config_proto_rawDescOnce.Do(func() {
		file_testplans_source_tree_test_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_testplans_source_tree_test_config_proto_rawDescData)
	})
	return file_testplans_source_tree_test_config_proto_rawDescData
}

var file_testplans_source_tree_test_config_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
var file_testplans_source_tree_test_config_proto_goTypes = []interface{}{
	(*TestGroups)(nil),        // 0: testplans.TestGroups
	(*SubtractiveRule)(nil),   // 1: testplans.SubtractiveRule
	(*AdditiveRule)(nil),      // 2: testplans.AdditiveRule
	(*SourceTestRules)(nil),   // 3: testplans.SourceTestRules
	(*SourceTreeTestCfg)(nil), // 4: testplans.SourceTreeTestCfg
	(*FilePattern)(nil),       // 5: testplans.FilePattern
}
var file_testplans_source_tree_test_config_proto_depIdxs = []int32{
	0, // 0: testplans.SubtractiveRule.only_keep_all_suites_in_groups:type_name -> testplans.TestGroups
	0, // 1: testplans.SubtractiveRule.only_keep_one_suite_from_each_group:type_name -> testplans.TestGroups
	0, // 2: testplans.AdditiveRule.add_all_suites_in_groups:type_name -> testplans.TestGroups
	0, // 3: testplans.AdditiveRule.add_one_suite_from_each_group:type_name -> testplans.TestGroups
	5, // 4: testplans.SourceTestRules.file_pattern:type_name -> testplans.FilePattern
	1, // 5: testplans.SourceTestRules.subtractive_rule:type_name -> testplans.SubtractiveRule
	2, // 6: testplans.SourceTestRules.additive_rule:type_name -> testplans.AdditiveRule
	3, // 7: testplans.SourceTreeTestCfg.source_test_rules:type_name -> testplans.SourceTestRules
	8, // [8:8] is the sub-list for method output_type
	8, // [8:8] is the sub-list for method input_type
	8, // [8:8] is the sub-list for extension type_name
	8, // [8:8] is the sub-list for extension extendee
	0, // [0:8] is the sub-list for field type_name
}

func init() { file_testplans_source_tree_test_config_proto_init() }
func file_testplans_source_tree_test_config_proto_init() {
	if File_testplans_source_tree_test_config_proto != nil {
		return
	}
	file_testplans_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_testplans_source_tree_test_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestGroups); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_source_tree_test_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SubtractiveRule); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_source_tree_test_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AdditiveRule); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_source_tree_test_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SourceTestRules); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_source_tree_test_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SourceTreeTestCfg); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_testplans_source_tree_test_config_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   5,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_testplans_source_tree_test_config_proto_goTypes,
		DependencyIndexes: file_testplans_source_tree_test_config_proto_depIdxs,
		MessageInfos:      file_testplans_source_tree_test_config_proto_msgTypes,
	}.Build()
	File_testplans_source_tree_test_config_proto = out.File
	file_testplans_source_tree_test_config_proto_rawDesc = nil
	file_testplans_source_tree_test_config_proto_goTypes = nil
	file_testplans_source_tree_test_config_proto_depIdxs = nil
}
