// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/test_metadata.proto

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	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

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
)

var AutotestTest_ExecutionEnvironment_name = map[int32]string{
	0: "EXECUTION_ENVIRONMENT_UNSPECIFIED",
	1: "EXECUTION_ENVIRONMENT_CLIENT",
	2: "EXECUTION_ENVIRONMENT_SERVER",
}

var AutotestTest_ExecutionEnvironment_value = map[string]int32{
	"EXECUTION_ENVIRONMENT_UNSPECIFIED": 0,
	"EXECUTION_ENVIRONMENT_CLIENT":      1,
	"EXECUTION_ENVIRONMENT_SERVER":      2,
}

func (x AutotestTest_ExecutionEnvironment) String() string {
	return proto.EnumName(AutotestTest_ExecutionEnvironment_name, int32(x))
}

func (AutotestTest_ExecutionEnvironment) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_805b925169bdc23a, []int{4, 0}
}

type TestMetadataRequest struct {
	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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestMetadataRequest proto.InternalMessageInfo

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

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

type TestMetadataResponse struct {
	Autotest             *AutotestTestMetadata `protobuf:"bytes,1,opt,name=autotest,proto3" json:"autotest,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_TestMetadataResponse proto.InternalMessageInfo

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

type AutotestTestMetadata struct {
	Suites               []*AutotestSuite `protobuf:"bytes,1,rep,name=suites,proto3" json:"suites,omitempty"`
	Tests                []*AutotestTest  `protobuf:"bytes,2,rep,name=tests,proto3" json:"tests,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_AutotestTestMetadata proto.InternalMessageInfo

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

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

type AutotestSuite struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

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

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

var xxx_messageInfo_AutotestSuite proto.InternalMessageInfo

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

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

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

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

type AutotestSuite_TestReference struct {
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AutotestSuite_TestReference proto.InternalMessageInfo

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

type AutotestTest struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}                          `json:"-"`
	XXX_unrecognized     []byte                            `json:"-"`
	XXX_sizecache        int32                             `json:"-"`
}

func (m *AutotestTest) Reset()         { *m = AutotestTest{} }
func (m *AutotestTest) String() string { return proto.CompactTextString(m) }
func (*AutotestTest) ProtoMessage()    {}
func (*AutotestTest) Descriptor() ([]byte, []int) {
	return fileDescriptor_805b925169bdc23a, []int{4}
}

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

var xxx_messageInfo_AutotestTest proto.InternalMessageInfo

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

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

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

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

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

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

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

type AutotestTaskDependency struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AutotestTaskDependency) Reset()         { *m = AutotestTaskDependency{} }
func (m *AutotestTaskDependency) String() string { return proto.CompactTextString(m) }
func (*AutotestTaskDependency) ProtoMessage()    {}
func (*AutotestTaskDependency) Descriptor() ([]byte, []int) {
	return fileDescriptor_805b925169bdc23a, []int{5}
}

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

var xxx_messageInfo_AutotestTaskDependency proto.InternalMessageInfo

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

func init() {
	proto.RegisterEnum("chromite.api.AutotestTest_ExecutionEnvironment", AutotestTest_ExecutionEnvironment_name, AutotestTest_ExecutionEnvironment_value)
	proto.RegisterType((*TestMetadataRequest)(nil), "chromite.api.TestMetadataRequest")
	proto.RegisterType((*TestMetadataResponse)(nil), "chromite.api.TestMetadataResponse")
	proto.RegisterType((*AutotestTestMetadata)(nil), "chromite.api.AutotestTestMetadata")
	proto.RegisterType((*AutotestSuite)(nil), "chromite.api.AutotestSuite")
	proto.RegisterType((*AutotestSuite_TestReference)(nil), "chromite.api.AutotestSuite.TestReference")
	proto.RegisterType((*AutotestTest)(nil), "chromite.api.AutotestTest")
	proto.RegisterType((*AutotestTaskDependency)(nil), "chromite.api.AutotestTaskDependency")
}

func init() { proto.RegisterFile("chromite/api/test_metadata.proto", fileDescriptor_805b925169bdc23a) }

var fileDescriptor_805b925169bdc23a = []byte{
	// 668 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x94, 0x51, 0x4f, 0xd3, 0x50,
	0x14, 0xc7, 0xed, 0xc6, 0x06, 0x1c, 0x36, 0x33, 0x2e, 0x03, 0x9b, 0x42, 0xe2, 0x28, 0x9a, 0x4c,
	0x1f, 0x5a, 0x33, 0x12, 0xe3, 0x93, 0x46, 0xb7, 0xaa, 0x4b, 0x60, 0x98, 0x6e, 0x10, 0xe3, 0x4b,
	0x73, 0x69, 0x0f, 0xd0, 0xb0, 0xf6, 0xce, 0xde, 0x5b, 0x04, 0x13, 0x1f, 0xfc, 0x0c, 0x7e, 0x23,
	0xbf, 0x8d, 0x0f, 0x7e, 0x07, 0xd3, 0xdb, 0x16, 0xd6, 0xa4, 0xe3, 0xc1, 0xb7, 0xf5, 0xfc, 0x7f,
	0xff, 0xff, 0xe9, 0x39, 0x5d, 0x0e, 0x74, 0xdc, 0x8b, 0x88, 0x05, 0xbe, 0x40, 0x93, 0xce, 0x7c,
	0x53, 0x20, 0x17, 0x4e, 0x80, 0x82, 0x7a, 0x54, 0x50, 0x63, 0x16, 0x31, 0xc1, 0x48, 0x23, 0x27,
	0x0c, 0x3a, 0xf3, 0xb5, 0x9d, 0x02, 0x7f, 0x1a, 0xfb, 0x53, 0xcf, 0xa1, 0x33, 0x3f, 0x65, 0x35,
	0xad, 0xa0, 0xf2, 0x1b, 0x1e, 0x31, 0x26, 0x32, 0xed, 0x51, 0xaa, 0xc5, 0x01, 0xe3, 0xa6, 0xcb,
	0x82, 0x80, 0x85, 0xa9, 0xa0, 0x47, 0xb0, 0x31, 0x41, 0x2e, 0x0e, 0xb3, 0xb6, 0x36, 0x7e, 0x8d,
	0x91, 0x0b, 0xf2, 0x1c, 0xea, 0x89, 0x83, 0x09, 0x55, 0xe9, 0x28, 0xdd, 0xb5, 0x1e, 0x31, 0xee,
	0x02, 0x8c, 0xbe, 0x54, 0xec, 0x8c, 0x20, 0x26, 0x2c, 0x67, 0xcd, 0xd4, 0x8a, 0x84, 0x37, 0x8d,
	0xf9, 0xb7, 0x36, 0xc6, 0xa9, 0x68, 0xe7, 0x94, 0x7e, 0x02, 0xed, 0x62, 0x4f, 0x3e, 0x63, 0x21,
	0x47, 0xf2, 0x1a, 0x56, 0x68, 0x2c, 0x58, 0xb2, 0x87, 0xac, 0xad, 0x5e, 0x4c, 0x7a, 0x9b, 0xa9,
	0x05, 0xf7, 0xad, 0x47, 0xff, 0x01, 0xed, 0x32, 0x82, 0xec, 0x43, 0x9d, 0xc7, 0xbe, 0x40, 0xae,
	0x2a, 0x9d, 0x6a, 0x77, 0xad, 0xb7, 0x5d, 0x9e, 0x3a, 0x4e, 0x18, 0x3b, 0x43, 0xc9, 0x0b, 0xa8,
	0x25, 0x45, 0xae, 0x56, 0xa4, 0x47, 0x5b, 0xfc, 0x26, 0x76, 0x0a, 0xea, 0xbf, 0x2a, 0xd0, 0x2c,
	0x64, 0x11, 0x02, 0x4b, 0x21, 0x0d, 0x50, 0x0e, 0xb3, 0x6a, 0xcb, 0xdf, 0x64, 0x0c, 0xc4, 0xbd,
	0x48, 0x3e, 0x9c, 0x87, 0x33, 0x0c, 0x3d, 0x0c, 0x5d, 0x1f, 0xf3, 0x26, 0x4f, 0x16, 0x34, 0xa1,
	0xfc, 0x72, 0x90, 0xd3, 0x37, 0xf6, 0xba, 0xf4, 0x0f, 0xe6, 0xec, 0x64, 0x1f, 0xb6, 0xd2, 0x50,
	0x41, 0xf9, 0xa5, 0x23, 0xfc, 0x00, 0x59, 0x2c, 0x1c, 0x8e, 0xae, 0x5a, 0xed, 0x28, 0xdd, 0x9a,
	0xbd, 0x21, 0xd5, 0x24, 0x67, 0x92, 0x6a, 0x63, 0x74, 0xc9, 0x9b, 0x7c, 0xc2, 0x25, 0xd9, 0xfc,
	0xd9, 0x3d, 0x5b, 0x31, 0xe4, 0x9c, 0x78, 0x86, 0x11, 0x86, 0x2e, 0x66, 0x03, 0x6b, 0x7b, 0xd0,
	0x2c, 0xd4, 0xcb, 0xe6, 0xd5, 0xff, 0x54, 0xa1, 0x31, 0xbf, 0xad, 0xd2, 0xa5, 0x7c, 0x84, 0xc6,
	0x7f, 0xaf, 0xa3, 0xe0, 0x24, 0x7b, 0xd0, 0xa4, 0xd3, 0x29, 0xfb, 0xe6, 0x44, 0x28, 0xa2, 0x24,
	0x2a, 0x59, 0xc0, 0x8a, 0xdd, 0x90, 0x45, 0x3b, 0xad, 0x91, 0xc7, 0xb0, 0x16, 0xd0, 0xeb, 0x5b,
	0x64, 0x49, 0xee, 0x08, 0x02, 0x7a, 0x9d, 0x03, 0x06, 0x6c, 0x84, 0x88, 0x1e, 0x77, 0x82, 0x78,
	0x2a, 0xfc, 0xd9, 0x14, 0x1d, 0x2f, 0x16, 0x5c, 0xad, 0xc9, 0xac, 0x75, 0x29, 0x1d, 0x66, 0xca,
	0x20, 0x16, 0x9c, 0x6c, 0xc3, 0xaa, 0x17, 0x0b, 0xc7, 0x65, 0x71, 0x28, 0xd4, 0xba, 0x8c, 0x5b,
	0xf1, 0x62, 0xd1, 0x4f, 0x9e, 0x89, 0x07, 0x9b, 0x78, 0x8d, 0x6e, 0x2c, 0x7c, 0x16, 0x3a, 0x18,
	0x5e, 0xf9, 0x11, 0x0b, 0x03, 0x0c, 0x85, 0xba, 0xdc, 0x51, 0xba, 0x0f, 0x7b, 0xe6, 0xe2, 0x7f,
	0x96, 0x61, 0xe5, 0x3e, 0xeb, 0xce, 0x66, 0xb7, 0xb1, 0xa4, 0xaa, 0xff, 0x54, 0xa0, 0x5d, 0x86,
	0x93, 0xa7, 0xb0, 0x6b, 0x7d, 0xb6, 0xfa, 0xc7, 0x93, 0xe1, 0xd1, 0xc8, 0xb1, 0x46, 0x27, 0x43,
	0xfb, 0x68, 0x74, 0x68, 0x8d, 0x26, 0xce, 0xf1, 0x68, 0xfc, 0xc9, 0xea, 0x0f, 0xdf, 0x0f, 0xad,
	0x41, 0xeb, 0x01, 0xe9, 0xc0, 0x4e, 0x39, 0xd6, 0x3f, 0x18, 0x5a, 0xa3, 0x49, 0x4b, 0x59, 0x4c,
	0x8c, 0x2d, 0xfb, 0xc4, 0xb2, 0x5b, 0x15, 0xdd, 0x80, 0xad, 0xf2, 0x8f, 0x44, 0xda, 0x50, 0x9b,
	0xd2, 0x53, 0x9c, 0x66, 0x5f, 0x3d, 0x7d, 0xe8, 0x7d, 0x2f, 0x1e, 0x9f, 0x31, 0x46, 0x57, 0xbe,
	0x8b, 0xe4, 0x00, 0xaa, 0x1f, 0x50, 0x90, 0xdd, 0xe2, 0x62, 0x4a, 0xce, 0x94, 0xa6, 0xdf, 0x87,
	0xa4, 0x57, 0x45, 0xdb, 0xfc, 0xfd, 0x57, 0x5b, 0x87, 0x66, 0xe1, 0xba, 0xb6, 0x94, 0x77, 0xaf,
	0xbe, 0xbc, 0x3c, 0x67, 0xb7, 0x57, 0xcd, 0x60, 0xd1, 0xb9, 0x39, 0x77, 0x23, 0xfd, 0xf0, 0x2c,
	0xa2, 0xa6, 0x3c, 0x91, 0xe6, 0x39, 0x33, 0xe7, 0x2f, 0xeb, 0x69, 0x5d, 0x96, 0xf7, 0xff, 0x05,
	0x00, 0x00, 0xff, 0xff, 0x33, 0xe3, 0x1e, 0x7b, 0xbe, 0x05, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// TestMetadataServiceClient is the client API for TestMetadataService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type TestMetadataServiceClient interface {
	Get(ctx context.Context, in *TestMetadataRequest, opts ...grpc.CallOption) (*TestMetadataResponse, error)
}

type testMetadataServiceClient struct {
	cc *grpc.ClientConn
}

func NewTestMetadataServiceClient(cc *grpc.ClientConn) TestMetadataServiceClient {
	return &testMetadataServiceClient{cc}
}

func (c *testMetadataServiceClient) Get(ctx context.Context, in *TestMetadataRequest, opts ...grpc.CallOption) (*TestMetadataResponse, error) {
	out := new(TestMetadataResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.TestMetadataService/Get", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// TestMetadataServiceServer is the server API for TestMetadataService service.
type TestMetadataServiceServer interface {
	Get(context.Context, *TestMetadataRequest) (*TestMetadataResponse, error)
}

// UnimplementedTestMetadataServiceServer can be embedded to have forward compatible implementations.
type UnimplementedTestMetadataServiceServer struct {
}

func (*UnimplementedTestMetadataServiceServer) Get(ctx context.Context, req *TestMetadataRequest) (*TestMetadataResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
}

func RegisterTestMetadataServiceServer(s *grpc.Server, srv TestMetadataServiceServer) {
	s.RegisterService(&_TestMetadataService_serviceDesc, srv)
}

func _TestMetadataService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TestMetadataRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TestMetadataServiceServer).Get(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.TestMetadataService/Get",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TestMetadataServiceServer).Get(ctx, req.(*TestMetadataRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _TestMetadataService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.TestMetadataService",
	HandlerType: (*TestMetadataServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "Get",
			Handler:    _TestMetadataService_Get_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/test_metadata.proto",
}
