// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromite/api/test_metadata.proto

package api

import (
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	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)
)

type AutotestTest_ExecutionEnvironment int32

const (
	AutotestTest_EXECUTION_ENVIRONMENT_UNSPECIFIED AutotestTest_ExecutionEnvironment = 0
	// Autotest calls tests that run on the Device Under Test "client" tests.
	AutotestTest_EXECUTION_ENVIRONMENT_CLIENT AutotestTest_ExecutionEnvironment = 1
	// Autotest calls tests that run on the autotest drone "server" tests.
	AutotestTest_EXECUTION_ENVIRONMENT_SERVER AutotestTest_ExecutionEnvironment = 2
)

// Enum value maps for AutotestTest_ExecutionEnvironment.
var (
	AutotestTest_ExecutionEnvironment_name = map[int32]string{
		0: "EXECUTION_ENVIRONMENT_UNSPECIFIED",
		1: "EXECUTION_ENVIRONMENT_CLIENT",
		2: "EXECUTION_ENVIRONMENT_SERVER",
	}
	AutotestTest_ExecutionEnvironment_value = map[string]int32{
		"EXECUTION_ENVIRONMENT_UNSPECIFIED": 0,
		"EXECUTION_ENVIRONMENT_CLIENT":      1,
		"EXECUTION_ENVIRONMENT_SERVER":      2,
	}
)

func (x AutotestTest_ExecutionEnvironment) Enum() *AutotestTest_ExecutionEnvironment {
	p := new(AutotestTest_ExecutionEnvironment)
	*p = x
	return p
}

func (x AutotestTest_ExecutionEnvironment) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (AutotestTest_ExecutionEnvironment) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_test_metadata_proto_enumTypes[0].Descriptor()
}

func (AutotestTest_ExecutionEnvironment) Type() protoreflect.EnumType {
	return &file_chromite_api_test_metadata_proto_enumTypes[0]
}

func (x AutotestTest_ExecutionEnvironment) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use AutotestTest_ExecutionEnvironment.Descriptor instead.
func (AutotestTest_ExecutionEnvironment) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_test_metadata_proto_rawDescGZIP(), []int{4, 0}
}

type TestMetadataRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Test metadata is generated from a populated build target sysroot.
	// In particular the sysroot must contain compiled test packages.
	Sysroot *Sysroot `protobuf:"bytes,2,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
}

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

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

func (*TestMetadataRequest) ProtoMessage() {}

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

func (x *TestMetadataRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *TestMetadataRequest) GetSysroot() *Sysroot {
	if x != nil {
		return x.Sysroot
	}
	return nil
}

type TestMetadataResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Autotest *AutotestTestMetadata `protobuf:"bytes,1,opt,name=autotest,proto3" json:"autotest,omitempty"`
}

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

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

func (*TestMetadataResponse) ProtoMessage() {}

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

func (x *TestMetadataResponse) GetAutotest() *AutotestTestMetadata {
	if x != nil {
		return x.Autotest
	}
	return nil
}

type AutotestTestMetadata struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Suites []*AutotestSuite `protobuf:"bytes,1,rep,name=suites,proto3" json:"suites,omitempty"`
	Tests  []*AutotestTest  `protobuf:"bytes,2,rep,name=tests,proto3" json:"tests,omitempty"`
}

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

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

func (*AutotestTestMetadata) ProtoMessage() {}

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

func (x *AutotestTestMetadata) GetSuites() []*AutotestSuite {
	if x != nil {
		return x.Suites
	}
	return nil
}

func (x *AutotestTestMetadata) GetTests() []*AutotestTest {
	if x != nil {
		return x.Tests
	}
	return nil
}

type AutotestSuite struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Unique across all suites.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// These are appended to the dependencies of each child task.
	ChildDependencies   []*AutotestTaskDependency      `protobuf:"bytes,2,rep,name=child_dependencies,json=childDependencies,proto3" json:"child_dependencies,omitempty"`
	ChildTaskTimeoutSec int32                          `protobuf:"varint,3,opt,name=child_task_timeout_sec,json=childTaskTimeoutSec,proto3" json:"child_task_timeout_sec,omitempty"`
	Tests               []*AutotestSuite_TestReference `protobuf:"bytes,4,rep,name=tests,proto3" json:"tests,omitempty"`
}

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

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

func (*AutotestSuite) ProtoMessage() {}

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

func (x *AutotestSuite) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *AutotestSuite) GetChildDependencies() []*AutotestTaskDependency {
	if x != nil {
		return x.ChildDependencies
	}
	return nil
}

func (x *AutotestSuite) GetChildTaskTimeoutSec() int32 {
	if x != nil {
		return x.ChildTaskTimeoutSec
	}
	return 0
}

func (x *AutotestSuite) GetTests() []*AutotestSuite_TestReference {
	if x != nil {
		return x.Tests
	}
	return nil
}

type AutotestTest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Unique across all tests.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Autotest string labels to control which device the test runs on.
	Dependencies []*AutotestTaskDependency `protobuf:"bytes,2,rep,name=dependencies,proto3" json:"dependencies,omitempty"`
	AllowRetries bool                      `protobuf:"varint,3,opt,name=allow_retries,json=allowRetries,proto3" json:"allow_retries,omitempty"`
	// Only meaningful if allow_retries is true.
	// Total number of attempts for a failed test will be (1 + max_retries).
	MaxRetries        int32 `protobuf:"varint,4,opt,name=max_retries,json=maxRetries,proto3" json:"max_retries,omitempty"`
	NeedsMultipleDuts bool  `protobuf:"varint,5,opt,name=needs_multiple_duts,json=needsMultipleDuts,proto3" json:"needs_multiple_duts,omitempty"`
	// Only meaningful if needs_multiple_duts is true.
	// Values <= 2 are disallowed.
	DutCount             int32                             `protobuf:"varint,6,opt,name=dut_count,json=dutCount,proto3" json:"dut_count,omitempty"`
	ExecutionEnvironment AutotestTest_ExecutionEnvironment `protobuf:"varint,7,opt,name=execution_environment,json=executionEnvironment,proto3,enum=chromite.api.AutotestTest_ExecutionEnvironment" json:"execution_environment,omitempty"`
}

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

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

func (*AutotestTest) ProtoMessage() {}

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

func (x *AutotestTest) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *AutotestTest) GetDependencies() []*AutotestTaskDependency {
	if x != nil {
		return x.Dependencies
	}
	return nil
}

func (x *AutotestTest) GetAllowRetries() bool {
	if x != nil {
		return x.AllowRetries
	}
	return false
}

func (x *AutotestTest) GetMaxRetries() int32 {
	if x != nil {
		return x.MaxRetries
	}
	return 0
}

func (x *AutotestTest) GetNeedsMultipleDuts() bool {
	if x != nil {
		return x.NeedsMultipleDuts
	}
	return false
}

func (x *AutotestTest) GetDutCount() int32 {
	if x != nil {
		return x.DutCount
	}
	return 0
}

func (x *AutotestTest) GetExecutionEnvironment() AutotestTest_ExecutionEnvironment {
	if x != nil {
		return x.ExecutionEnvironment
	}
	return AutotestTest_EXECUTION_ENVIRONMENT_UNSPECIFIED
}

type AutotestTaskDependency struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Opaque string label that encodes characteristics of the device to use for
	// the task.
	Label string `protobuf:"bytes,1,opt,name=label,proto3" json:"label,omitempty"`
}

func (x *AutotestTaskDependency) Reset() {
	*x = AutotestTaskDependency{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_metadata_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*AutotestTaskDependency) ProtoMessage() {}

func (x *AutotestTaskDependency) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_metadata_proto_msgTypes[5]
	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 AutotestTaskDependency.ProtoReflect.Descriptor instead.
func (*AutotestTaskDependency) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_metadata_proto_rawDescGZIP(), []int{5}
}

func (x *AutotestTaskDependency) GetLabel() string {
	if x != nil {
		return x.Label
	}
	return ""
}

type AutotestSuite_TestReference struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
}

func (x *AutotestSuite_TestReference) Reset() {
	*x = AutotestSuite_TestReference{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_metadata_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*AutotestSuite_TestReference) ProtoMessage() {}

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

func (x *AutotestSuite_TestReference) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

var File_chromite_api_test_metadata_proto protoreflect.FileDescriptor

var file_chromite_api_test_metadata_proto_rawDesc = []byte{
	0x0a, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x12, 0x0c, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x1a, 0x1c, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x79, 0x73,
	0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x22, 0x72, 0x0a, 0x13, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64,
	0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68,
	0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06,
	0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f,
	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x07,
	0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x22, 0x56, 0x0a, 0x14, 0x54, 0x65, 0x73, 0x74, 0x4d,
	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
	0x3e, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x22, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74,
	0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x22,
	0x7d, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x54, 0x65, 0x73, 0x74, 0x4d,
	0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x33, 0x0a, 0x06, 0x73, 0x75, 0x69, 0x74, 0x65,
	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x53,
	0x75, 0x69, 0x74, 0x65, 0x52, 0x06, 0x73, 0x75, 0x69, 0x74, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x05,
	0x74, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74,
	0x65, 0x73, 0x74, 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x74, 0x65, 0x73, 0x74, 0x73, 0x22, 0x93,
	0x02, 0x0a, 0x0d, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65,
	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x53, 0x0a, 0x12, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x5f, 0x64, 0x65,
	0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x24, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x65,
	0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x11, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x44, 0x65, 0x70,
	0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x63, 0x68, 0x69,
	0x6c, 0x64, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f,
	0x73, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x63, 0x68, 0x69, 0x6c, 0x64,
	0x54, 0x61, 0x73, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x12, 0x3f,
	0x0a, 0x05, 0x74, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x75, 0x74,
	0x6f, 0x74, 0x65, 0x73, 0x74, 0x53, 0x75, 0x69, 0x74, 0x65, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52,
	0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x05, 0x74, 0x65, 0x73, 0x74, 0x73, 0x1a,
	0x23, 0x0a, 0x0d, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
	0x6e, 0x61, 0x6d, 0x65, 0x22, 0xe9, 0x03, 0x0a, 0x0c, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73,
	0x74, 0x54, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0c, 0x64, 0x65, 0x70,
	0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
	0x24, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41,
	0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x65, 0x6e,
	0x64, 0x65, 0x6e, 0x63, 0x79, 0x52, 0x0c, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63,
	0x69, 0x65, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x72, 0x65, 0x74,
	0x72, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f,
	0x77, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f,
	0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d,
	0x61, 0x78, 0x52, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x65, 0x65,
	0x64, 0x73, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x64, 0x75, 0x74, 0x73,
	0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x4d, 0x75, 0x6c,
	0x74, 0x69, 0x70, 0x6c, 0x65, 0x44, 0x75, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x75, 0x74,
	0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x75,
	0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x64, 0x0a, 0x15, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
	0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18,
	0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x54, 0x65, 0x73,
	0x74, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x76, 0x69, 0x72,
	0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f,
	0x6e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x81, 0x01, 0x0a,
	0x14, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f,
	0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x21, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49,
	0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55,
	0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x20, 0x0a, 0x1c,
	0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x56, 0x49, 0x52, 0x4f,
	0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4c, 0x49, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x20,
	0x0a, 0x1c, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x56, 0x49,
	0x52, 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x10, 0x02,
	0x22, 0x2e, 0x0a, 0x16, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b,
	0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61,
	0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c,
	0x32, 0x7a, 0x0a, 0x13, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
	0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4c, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x21,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65,
	0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x1a, 0x22, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x15, 0xc2, 0xed, 0x1a, 0x11, 0x0a, 0x0d, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x10, 0x01, 0x42, 0x38, 0x5a, 0x36,
	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, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromite_api_test_metadata_proto_rawDescOnce sync.Once
	file_chromite_api_test_metadata_proto_rawDescData = file_chromite_api_test_metadata_proto_rawDesc
)

func file_chromite_api_test_metadata_proto_rawDescGZIP() []byte {
	file_chromite_api_test_metadata_proto_rawDescOnce.Do(func() {
		file_chromite_api_test_metadata_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_test_metadata_proto_rawDescData)
	})
	return file_chromite_api_test_metadata_proto_rawDescData
}

var file_chromite_api_test_metadata_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_chromite_api_test_metadata_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
var file_chromite_api_test_metadata_proto_goTypes = []interface{}{
	(AutotestTest_ExecutionEnvironment)(0), // 0: chromite.api.AutotestTest.ExecutionEnvironment
	(*TestMetadataRequest)(nil),            // 1: chromite.api.TestMetadataRequest
	(*TestMetadataResponse)(nil),           // 2: chromite.api.TestMetadataResponse
	(*AutotestTestMetadata)(nil),           // 3: chromite.api.AutotestTestMetadata
	(*AutotestSuite)(nil),                  // 4: chromite.api.AutotestSuite
	(*AutotestTest)(nil),                   // 5: chromite.api.AutotestTest
	(*AutotestTaskDependency)(nil),         // 6: chromite.api.AutotestTaskDependency
	(*AutotestSuite_TestReference)(nil),    // 7: chromite.api.AutotestSuite.TestReference
	(*chromiumos.Chroot)(nil),              // 8: chromiumos.Chroot
	(*Sysroot)(nil),                        // 9: chromite.api.Sysroot
}
var file_chromite_api_test_metadata_proto_depIdxs = []int32{
	8,  // 0: chromite.api.TestMetadataRequest.chroot:type_name -> chromiumos.Chroot
	9,  // 1: chromite.api.TestMetadataRequest.sysroot:type_name -> chromite.api.Sysroot
	3,  // 2: chromite.api.TestMetadataResponse.autotest:type_name -> chromite.api.AutotestTestMetadata
	4,  // 3: chromite.api.AutotestTestMetadata.suites:type_name -> chromite.api.AutotestSuite
	5,  // 4: chromite.api.AutotestTestMetadata.tests:type_name -> chromite.api.AutotestTest
	6,  // 5: chromite.api.AutotestSuite.child_dependencies:type_name -> chromite.api.AutotestTaskDependency
	7,  // 6: chromite.api.AutotestSuite.tests:type_name -> chromite.api.AutotestSuite.TestReference
	6,  // 7: chromite.api.AutotestTest.dependencies:type_name -> chromite.api.AutotestTaskDependency
	0,  // 8: chromite.api.AutotestTest.execution_environment:type_name -> chromite.api.AutotestTest.ExecutionEnvironment
	1,  // 9: chromite.api.TestMetadataService.Get:input_type -> chromite.api.TestMetadataRequest
	2,  // 10: chromite.api.TestMetadataService.Get:output_type -> chromite.api.TestMetadataResponse
	10, // [10:11] is the sub-list for method output_type
	9,  // [9:10] is the sub-list for method input_type
	9,  // [9:9] is the sub-list for extension type_name
	9,  // [9:9] is the sub-list for extension extendee
	0,  // [0:9] is the sub-list for field type_name
}

func init() { file_chromite_api_test_metadata_proto_init() }
func file_chromite_api_test_metadata_proto_init() {
	if File_chromite_api_test_metadata_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	file_chromite_api_sysroot_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_test_metadata_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestMetadataRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_metadata_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestMetadataResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_metadata_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutotestTestMetadata); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_metadata_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutotestSuite); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_metadata_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutotestTest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_metadata_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutotestTaskDependency); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_metadata_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AutotestSuite_TestReference); 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_chromite_api_test_metadata_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   7,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_test_metadata_proto_goTypes,
		DependencyIndexes: file_chromite_api_test_metadata_proto_depIdxs,
		EnumInfos:         file_chromite_api_test_metadata_proto_enumTypes,
		MessageInfos:      file_chromite_api_test_metadata_proto_msgTypes,
	}.Build()
	File_chromite_api_test_metadata_proto = out.File
	file_chromite_api_test_metadata_proto_rawDesc = nil
	file_chromite_api_test_metadata_proto_goTypes = nil
	file_chromite_api_test_metadata_proto_depIdxs = nil
}
