// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/build_api_test.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 TestEnum int32

const (
	TestEnum_TEST_ENUM_UNSPECIFIED TestEnum = 0
	TestEnum_TEST_ENUM_FOO         TestEnum = 1
	TestEnum_TEST_ENUM_BAR         TestEnum = 2
	TestEnum_TEST_ENUM_BAZ         TestEnum = 3
)

var TestEnum_name = map[int32]string{
	0: "TEST_ENUM_UNSPECIFIED",
	1: "TEST_ENUM_FOO",
	2: "TEST_ENUM_BAR",
	3: "TEST_ENUM_BAZ",
}

var TestEnum_value = map[string]int32{
	"TEST_ENUM_UNSPECIFIED": 0,
	"TEST_ENUM_FOO":         1,
	"TEST_ENUM_BAR":         2,
	"TEST_ENUM_BAZ":         3,
}

func (x TestEnum) String() string {
	return proto.EnumName(TestEnum_name, int32(x))
}

func (TestEnum) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_78ca3263cf74c05a, []int{0}
}

type NestedPath struct {
	Path                 *chromiumos.Path `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_NestedPath proto.InternalMessageInfo

func (m *NestedPath) GetPath() *chromiumos.Path {
	if m != nil {
		return m.Path
	}
	return nil
}

type MultiFieldMessage struct {
	Id                   int32    `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"`
	Name                 string   `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	Flag                 bool     `protobuf:"varint,3,opt,name=flag,proto3" json:"flag,omitempty"`
	TestEnum             TestEnum `protobuf:"varint,4,opt,name=test_enum,json=testEnum,proto3,enum=chromite.api.TestEnum" json:"test_enum,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MultiFieldMessage proto.InternalMessageInfo

func (m *MultiFieldMessage) GetId() int32 {
	if m != nil {
		return m.Id
	}
	return 0
}

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

func (m *MultiFieldMessage) GetFlag() bool {
	if m != nil {
		return m.Flag
	}
	return false
}

func (m *MultiFieldMessage) GetTestEnum() TestEnum {
	if m != nil {
		return m.TestEnum
	}
	return TestEnum_TEST_ENUM_UNSPECIFIED
}

// Simple input message.
type TestRequestMessage struct {
	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// Chroot message for parsing and automatic chroot re-execution testing.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Path and ResultPath messages for insertion/extraction testing.
	Path        *chromiumos.Path       `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"`
	AnotherPath *chromiumos.Path       `protobuf:"bytes,4,opt,name=another_path,json=anotherPath,proto3" json:"another_path,omitempty"`
	NestedPath  *NestedPath            `protobuf:"bytes,5,opt,name=nested_path,json=nestedPath,proto3" json:"nested_path,omitempty"`
	ResultPath  *chromiumos.ResultPath `protobuf:"bytes,6,opt,name=result_path,json=resultPath,proto3" json:"result_path,omitempty"`
	// BuildTarget messages for parsing tests.
	BuildTarget  *chromiumos.BuildTarget   `protobuf:"bytes,7,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	BuildTargets []*chromiumos.BuildTarget `protobuf:"bytes,8,rep,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	// For SyncedDir syncing tests.
	SyncedDir  *chromiumos.SyncedDir   `protobuf:"bytes,9,opt,name=synced_dir,json=syncedDir,proto3" json:"synced_dir,omitempty"`
	SyncedDirs []*chromiumos.SyncedDir `protobuf:"bytes,10,rep,name=synced_dirs,json=syncedDirs,proto3" json:"synced_dirs,omitempty"`
	// Repeated message with multiple fields.
	Messages             []*MultiFieldMessage `protobuf:"bytes,11,rep,name=messages,proto3" json:"messages,omitempty"`
	TestEnum             TestEnum             `protobuf:"varint,12,opt,name=test_enum,json=testEnum,proto3,enum=chromite.api.TestEnum" json:"test_enum,omitempty"`
	TestEnums            []TestEnum           `protobuf:"varint,13,rep,packed,name=test_enums,json=testEnums,proto3,enum=chromite.api.TestEnum" json:"test_enums,omitempty"`
	Number               int32                `protobuf:"varint,14,opt,name=number,proto3" json:"number,omitempty"`
	Numbers              []int32              `protobuf:"varint,15,rep,packed,name=numbers,proto3" json:"numbers,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_TestRequestMessage proto.InternalMessageInfo

func (m *TestRequestMessage) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

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

func (m *TestRequestMessage) GetPath() *chromiumos.Path {
	if m != nil {
		return m.Path
	}
	return nil
}

func (m *TestRequestMessage) GetAnotherPath() *chromiumos.Path {
	if m != nil {
		return m.AnotherPath
	}
	return nil
}

func (m *TestRequestMessage) GetNestedPath() *NestedPath {
	if m != nil {
		return m.NestedPath
	}
	return nil
}

func (m *TestRequestMessage) GetResultPath() *chromiumos.ResultPath {
	if m != nil {
		return m.ResultPath
	}
	return nil
}

func (m *TestRequestMessage) GetBuildTarget() *chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func (m *TestRequestMessage) GetBuildTargets() []*chromiumos.BuildTarget {
	if m != nil {
		return m.BuildTargets
	}
	return nil
}

func (m *TestRequestMessage) GetSyncedDir() *chromiumos.SyncedDir {
	if m != nil {
		return m.SyncedDir
	}
	return nil
}

func (m *TestRequestMessage) GetSyncedDirs() []*chromiumos.SyncedDir {
	if m != nil {
		return m.SyncedDirs
	}
	return nil
}

func (m *TestRequestMessage) GetMessages() []*MultiFieldMessage {
	if m != nil {
		return m.Messages
	}
	return nil
}

func (m *TestRequestMessage) GetTestEnum() TestEnum {
	if m != nil {
		return m.TestEnum
	}
	return TestEnum_TEST_ENUM_UNSPECIFIED
}

func (m *TestRequestMessage) GetTestEnums() []TestEnum {
	if m != nil {
		return m.TestEnums
	}
	return nil
}

func (m *TestRequestMessage) GetNumber() int32 {
	if m != nil {
		return m.Number
	}
	return 0
}

func (m *TestRequestMessage) GetNumbers() []int32 {
	if m != nil {
		return m.Numbers
	}
	return nil
}

// Simple output message.
type TestResultMessage struct {
	Result string `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"`
	// Path messages for ResultPath testing.
	Artifact             *chromiumos.Path          `protobuf:"bytes,2,opt,name=artifact,proto3" json:"artifact,omitempty"`
	NestedArtifact       *NestedPath               `protobuf:"bytes,3,opt,name=nested_artifact,json=nestedArtifact,proto3" json:"nested_artifact,omitempty"`
	Artifacts            []*chromiumos.Path        `protobuf:"bytes,4,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	Events               []*chromiumos.MetricEvent `protobuf:"bytes,5,rep,name=events,proto3" json:"events,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_TestResultMessage proto.InternalMessageInfo

func (m *TestResultMessage) GetResult() string {
	if m != nil {
		return m.Result
	}
	return ""
}

func (m *TestResultMessage) GetArtifact() *chromiumos.Path {
	if m != nil {
		return m.Artifact
	}
	return nil
}

func (m *TestResultMessage) GetNestedArtifact() *NestedPath {
	if m != nil {
		return m.NestedArtifact
	}
	return nil
}

func (m *TestResultMessage) GetArtifacts() []*chromiumos.Path {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

func (m *TestResultMessage) GetEvents() []*chromiumos.MetricEvent {
	if m != nil {
		return m.Events
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromite.api.TestEnum", TestEnum_name, TestEnum_value)
	proto.RegisterType((*NestedPath)(nil), "chromite.api.NestedPath")
	proto.RegisterType((*MultiFieldMessage)(nil), "chromite.api.MultiFieldMessage")
	proto.RegisterType((*TestRequestMessage)(nil), "chromite.api.TestRequestMessage")
	proto.RegisterType((*TestResultMessage)(nil), "chromite.api.TestResultMessage")
}

func init() { proto.RegisterFile("chromite/api/build_api_test.proto", fileDescriptor_78ca3263cf74c05a) }

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

// TestApiServiceClient is the client API for TestApiService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type TestApiServiceClient interface {
	// Method that has input and output messages.
	InputOutputMethod(ctx context.Context, in *TestRequestMessage, opts ...grpc.CallOption) (*TestResultMessage, error)
	// Method name override.
	RenamedMethod(ctx context.Context, in *TestRequestMessage, opts ...grpc.CallOption) (*TestResultMessage, error)
}

type testApiServiceClient struct {
	cc *grpc.ClientConn
}

func NewTestApiServiceClient(cc *grpc.ClientConn) TestApiServiceClient {
	return &testApiServiceClient{cc}
}

func (c *testApiServiceClient) InputOutputMethod(ctx context.Context, in *TestRequestMessage, opts ...grpc.CallOption) (*TestResultMessage, error) {
	out := new(TestResultMessage)
	err := c.cc.Invoke(ctx, "/chromite.api.TestApiService/InputOutputMethod", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *testApiServiceClient) RenamedMethod(ctx context.Context, in *TestRequestMessage, opts ...grpc.CallOption) (*TestResultMessage, error) {
	out := new(TestResultMessage)
	err := c.cc.Invoke(ctx, "/chromite.api.TestApiService/RenamedMethod", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// TestApiServiceServer is the server API for TestApiService service.
type TestApiServiceServer interface {
	// Method that has input and output messages.
	InputOutputMethod(context.Context, *TestRequestMessage) (*TestResultMessage, error)
	// Method name override.
	RenamedMethod(context.Context, *TestRequestMessage) (*TestResultMessage, error)
}

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

func (*UnimplementedTestApiServiceServer) InputOutputMethod(ctx context.Context, req *TestRequestMessage) (*TestResultMessage, error) {
	return nil, status.Errorf(codes.Unimplemented, "method InputOutputMethod not implemented")
}
func (*UnimplementedTestApiServiceServer) RenamedMethod(ctx context.Context, req *TestRequestMessage) (*TestResultMessage, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RenamedMethod not implemented")
}

func RegisterTestApiServiceServer(s *grpc.Server, srv TestApiServiceServer) {
	s.RegisterService(&_TestApiService_serviceDesc, srv)
}

func _TestApiService_InputOutputMethod_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TestRequestMessage)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TestApiServiceServer).InputOutputMethod(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.TestApiService/InputOutputMethod",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TestApiServiceServer).InputOutputMethod(ctx, req.(*TestRequestMessage))
	}
	return interceptor(ctx, in, info, handler)
}

func _TestApiService_RenamedMethod_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TestRequestMessage)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TestApiServiceServer).RenamedMethod(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.TestApiService/RenamedMethod",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TestApiServiceServer).RenamedMethod(ctx, req.(*TestRequestMessage))
	}
	return interceptor(ctx, in, info, handler)
}

var _TestApiService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.TestApiService",
	HandlerType: (*TestApiServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "InputOutputMethod",
			Handler:    _TestApiService_InputOutputMethod_Handler,
		},
		{
			MethodName: "RenamedMethod",
			Handler:    _TestApiService_RenamedMethod_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/build_api_test.proto",
}

// InsideChrootApiServiceClient is the client API for InsideChrootApiService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type InsideChrootApiServiceClient interface {
	// No override of service level inside assertion.
	InsideServiceInsideMethod(ctx context.Context, in *TestRequestMessage, opts ...grpc.CallOption) (*TestResultMessage, error)
	// Override service level inside assertion with outside assertion.
	InsideServiceOutsideMethod(ctx context.Context, in *TestRequestMessage, opts ...grpc.CallOption) (*TestResultMessage, error)
}

type insideChrootApiServiceClient struct {
	cc *grpc.ClientConn
}

func NewInsideChrootApiServiceClient(cc *grpc.ClientConn) InsideChrootApiServiceClient {
	return &insideChrootApiServiceClient{cc}
}

func (c *insideChrootApiServiceClient) InsideServiceInsideMethod(ctx context.Context, in *TestRequestMessage, opts ...grpc.CallOption) (*TestResultMessage, error) {
	out := new(TestResultMessage)
	err := c.cc.Invoke(ctx, "/chromite.api.InsideChrootApiService/InsideServiceInsideMethod", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *insideChrootApiServiceClient) InsideServiceOutsideMethod(ctx context.Context, in *TestRequestMessage, opts ...grpc.CallOption) (*TestResultMessage, error) {
	out := new(TestResultMessage)
	err := c.cc.Invoke(ctx, "/chromite.api.InsideChrootApiService/InsideServiceOutsideMethod", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// InsideChrootApiServiceServer is the server API for InsideChrootApiService service.
type InsideChrootApiServiceServer interface {
	// No override of service level inside assertion.
	InsideServiceInsideMethod(context.Context, *TestRequestMessage) (*TestResultMessage, error)
	// Override service level inside assertion with outside assertion.
	InsideServiceOutsideMethod(context.Context, *TestRequestMessage) (*TestResultMessage, error)
}

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

func (*UnimplementedInsideChrootApiServiceServer) InsideServiceInsideMethod(ctx context.Context, req *TestRequestMessage) (*TestResultMessage, error) {
	return nil, status.Errorf(codes.Unimplemented, "method InsideServiceInsideMethod not implemented")
}
func (*UnimplementedInsideChrootApiServiceServer) InsideServiceOutsideMethod(ctx context.Context, req *TestRequestMessage) (*TestResultMessage, error) {
	return nil, status.Errorf(codes.Unimplemented, "method InsideServiceOutsideMethod not implemented")
}

func RegisterInsideChrootApiServiceServer(s *grpc.Server, srv InsideChrootApiServiceServer) {
	s.RegisterService(&_InsideChrootApiService_serviceDesc, srv)
}

func _InsideChrootApiService_InsideServiceInsideMethod_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TestRequestMessage)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(InsideChrootApiServiceServer).InsideServiceInsideMethod(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.InsideChrootApiService/InsideServiceInsideMethod",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(InsideChrootApiServiceServer).InsideServiceInsideMethod(ctx, req.(*TestRequestMessage))
	}
	return interceptor(ctx, in, info, handler)
}

func _InsideChrootApiService_InsideServiceOutsideMethod_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TestRequestMessage)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(InsideChrootApiServiceServer).InsideServiceOutsideMethod(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.InsideChrootApiService/InsideServiceOutsideMethod",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(InsideChrootApiServiceServer).InsideServiceOutsideMethod(ctx, req.(*TestRequestMessage))
	}
	return interceptor(ctx, in, info, handler)
}

var _InsideChrootApiService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.InsideChrootApiService",
	HandlerType: (*InsideChrootApiServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "InsideServiceInsideMethod",
			Handler:    _InsideChrootApiService_InsideServiceInsideMethod_Handler,
		},
		{
			MethodName: "InsideServiceOutsideMethod",
			Handler:    _InsideChrootApiService_InsideServiceOutsideMethod_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/build_api_test.proto",
}

// OutsideChrootApiServiceClient is the client API for OutsideChrootApiService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type OutsideChrootApiServiceClient interface {
	// No override of service level outside assertion.
	OutsideServiceOutsideMethod(ctx context.Context, in *TestRequestMessage, opts ...grpc.CallOption) (*TestResultMessage, error)
	// Override service level outside assertion with inside assertion.
	OutsideServiceInsideMethod(ctx context.Context, in *TestRequestMessage, opts ...grpc.CallOption) (*TestResultMessage, error)
}

type outsideChrootApiServiceClient struct {
	cc *grpc.ClientConn
}

func NewOutsideChrootApiServiceClient(cc *grpc.ClientConn) OutsideChrootApiServiceClient {
	return &outsideChrootApiServiceClient{cc}
}

func (c *outsideChrootApiServiceClient) OutsideServiceOutsideMethod(ctx context.Context, in *TestRequestMessage, opts ...grpc.CallOption) (*TestResultMessage, error) {
	out := new(TestResultMessage)
	err := c.cc.Invoke(ctx, "/chromite.api.OutsideChrootApiService/OutsideServiceOutsideMethod", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *outsideChrootApiServiceClient) OutsideServiceInsideMethod(ctx context.Context, in *TestRequestMessage, opts ...grpc.CallOption) (*TestResultMessage, error) {
	out := new(TestResultMessage)
	err := c.cc.Invoke(ctx, "/chromite.api.OutsideChrootApiService/OutsideServiceInsideMethod", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// OutsideChrootApiServiceServer is the server API for OutsideChrootApiService service.
type OutsideChrootApiServiceServer interface {
	// No override of service level outside assertion.
	OutsideServiceOutsideMethod(context.Context, *TestRequestMessage) (*TestResultMessage, error)
	// Override service level outside assertion with inside assertion.
	OutsideServiceInsideMethod(context.Context, *TestRequestMessage) (*TestResultMessage, error)
}

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

func (*UnimplementedOutsideChrootApiServiceServer) OutsideServiceOutsideMethod(ctx context.Context, req *TestRequestMessage) (*TestResultMessage, error) {
	return nil, status.Errorf(codes.Unimplemented, "method OutsideServiceOutsideMethod not implemented")
}
func (*UnimplementedOutsideChrootApiServiceServer) OutsideServiceInsideMethod(ctx context.Context, req *TestRequestMessage) (*TestResultMessage, error) {
	return nil, status.Errorf(codes.Unimplemented, "method OutsideServiceInsideMethod not implemented")
}

func RegisterOutsideChrootApiServiceServer(s *grpc.Server, srv OutsideChrootApiServiceServer) {
	s.RegisterService(&_OutsideChrootApiService_serviceDesc, srv)
}

func _OutsideChrootApiService_OutsideServiceOutsideMethod_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TestRequestMessage)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OutsideChrootApiServiceServer).OutsideServiceOutsideMethod(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.OutsideChrootApiService/OutsideServiceOutsideMethod",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OutsideChrootApiServiceServer).OutsideServiceOutsideMethod(ctx, req.(*TestRequestMessage))
	}
	return interceptor(ctx, in, info, handler)
}

func _OutsideChrootApiService_OutsideServiceInsideMethod_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TestRequestMessage)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OutsideChrootApiServiceServer).OutsideServiceInsideMethod(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.OutsideChrootApiService/OutsideServiceInsideMethod",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OutsideChrootApiServiceServer).OutsideServiceInsideMethod(ctx, req.(*TestRequestMessage))
	}
	return interceptor(ctx, in, info, handler)
}

var _OutsideChrootApiService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.OutsideChrootApiService",
	HandlerType: (*OutsideChrootApiServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "OutsideServiceOutsideMethod",
			Handler:    _OutsideChrootApiService_OutsideServiceOutsideMethod_Handler,
		},
		{
			MethodName: "OutsideServiceInsideMethod",
			Handler:    _OutsideChrootApiService_OutsideServiceInsideMethod_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/build_api_test.proto",
}
