// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/rtd/v1/progress.proto

package invocation

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	_struct "github.com/golang/protobuf/ptypes/struct"
	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

// Enum entries *may* be added to this enum in the future.
type Result_State int32

const (
	// No end state specified. Must not be used.
	Result_STATE_UNSPECIFIED Result_State = 0
	// Test request succeeded. All was well.
	Result_SUCCEEDED Result_State = 1
	// Test request failed. See `error` for more information.
	Result_FAILED Result_State = 2
	// Test did not run because the Remote Test Driver decided to skip it.
	//
	// Common reasons a test may be skipped:
	//
	// * A runtime check by the Remote Test Driver concluded that the test is
	//   not applicable to the targeted device(s). The Remote Test Driver should
	//   include detailed reasons in `errors`.
	Result_SKIPPED Result_State = 3
)

var Result_State_name = map[int32]string{
	0: "STATE_UNSPECIFIED",
	1: "SUCCEEDED",
	2: "FAILED",
	3: "SKIPPED",
}

var Result_State_value = map[string]int32{
	"STATE_UNSPECIFIED": 0,
	"SUCCEEDED":         1,
	"FAILED":            2,
	"SKIPPED":           3,
}

func (x Result_State) String() string {
	return proto.EnumName(Result_State_name, int32(x))
}

func (Result_State) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_53459f08935e9319, []int{1, 0}
}

// Enum entries *may* be added in the future.
type Result_Error_Source int32

const (
	// No Source specified. Should not be used.
	//
	// If source is unspecified, the Test Lab Environment should assume the
	// source to be the Remote Test Driver.
	Result_Error_SOURCE_UNSPECIFIED Result_Error_Source = 0
	// The test failed.
	Result_Error_TEST Result_Error_Source = 1
	// There was an error in Remote Test Driver invocation.
	Result_Error_REMOTE_TEST_DRIVER Result_Error_Source = 2
	// There was an error in a Test Lab Services API call.
	Result_Error_TEST_LAB_SERVICES Result_Error_Source = 3
)

var Result_Error_Source_name = map[int32]string{
	0: "SOURCE_UNSPECIFIED",
	1: "TEST",
	2: "REMOTE_TEST_DRIVER",
	3: "TEST_LAB_SERVICES",
}

var Result_Error_Source_value = map[string]int32{
	"SOURCE_UNSPECIFIED": 0,
	"TEST":               1,
	"REMOTE_TEST_DRIVER": 2,
	"TEST_LAB_SERVICES":  3,
}

func (x Result_Error_Source) String() string {
	return proto.EnumName(Result_Error_Source_name, int32(x))
}

func (Result_Error_Source) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_53459f08935e9319, []int{1, 0, 0}
}

// Enum entries *may* be added in the future.
type Result_Error_Severity int32

const (
	// No Severity set. Should not be used.
	Result_Error_SEVERITY_UNSPECIFIED Result_Error_Severity = 0
	// Remote Test Server should validate that a Result contains a CRITICAL
	// message iff state == FAILED.
	Result_Error_CRITICAL Result_Error_Severity = 1
	// Must not, by itself, lead to a FAILED Result.state.
	Result_Error_WARNING Result_Error_Severity = 2
)

var Result_Error_Severity_name = map[int32]string{
	0: "SEVERITY_UNSPECIFIED",
	1: "CRITICAL",
	2: "WARNING",
}

var Result_Error_Severity_value = map[string]int32{
	"SEVERITY_UNSPECIFIED": 0,
	"CRITICAL":             1,
	"WARNING":              2,
}

func (x Result_Error_Severity) String() string {
	return proto.EnumName(Result_Error_Severity_name, int32(x))
}

func (Result_Error_Severity) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_53459f08935e9319, []int{1, 0, 1}
}

// Configuration data needed by clients of ProgressSink.
type ProgressSinkClientConfig struct {
	// Local TCP port to be used by the Remote Test Driver to communicate with
	// InvocationProgressSink service.
	Port                 int32    `protobuf:"varint,1,opt,name=port,proto3" json:"port,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ProgressSinkClientConfig proto.InternalMessageInfo

func (m *ProgressSinkClientConfig) GetPort() int32 {
	if m != nil {
		return m.Port
	}
	return 0
}

// Result for a single invocation request.
type Result struct {
	// Final state of the test execution.
	//
	// Error details must be available in `errors` if state != SUCCEEDED.
	State Result_State `protobuf:"varint,1,opt,name=state,proto3,enum=test.rtd.v1.Result_State" json:"state,omitempty"`
	// errors must be set if state != SUCCEEDED.
	//
	// errors may be provided even if state == SUCCEEDED. Remote Test Drivers are
	// encouraged to provide multiple observed errors in Result to aid end-user
	// visibility of problems encountered.
	Errors               []*Result_Error `protobuf:"bytes,2,rep,name=errors,proto3" json:"errors,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_Result proto.InternalMessageInfo

func (m *Result) GetState() Result_State {
	if m != nil {
		return m.State
	}
	return Result_STATE_UNSPECIFIED
}

func (m *Result) GetErrors() []*Result_Error {
	if m != nil {
		return m.Errors
	}
	return nil
}

type Result_Error struct {
	// Provenance of the detected error.
	Source Result_Error_Source `protobuf:"varint,1,opt,name=source,proto3,enum=test.rtd.v1.Result_Error_Source" json:"source,omitempty"`
	// Severity of reported error.
	Severity Result_Error_Severity `protobuf:"varint,2,opt,name=severity,proto3,enum=test.rtd.v1.Result_Error_Severity" json:"severity,omitempty"`
	// Machine parseable details about the error.
	//
	// Test Lab Environments and Remote Test Servers must not interpret the
	// details.
	//
	// Remote Test Drivers should use uniform stable schema for `details` to
	// enable robust analytics.
	Details              *_struct.Struct `protobuf:"bytes,3,opt,name=details,proto3" json:"details,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_Result_Error proto.InternalMessageInfo

func (m *Result_Error) GetSource() Result_Error_Source {
	if m != nil {
		return m.Source
	}
	return Result_Error_SOURCE_UNSPECIFIED
}

func (m *Result_Error) GetSeverity() Result_Error_Severity {
	if m != nil {
		return m.Severity
	}
	return Result_Error_SEVERITY_UNSPECIFIED
}

func (m *Result_Error) GetDetails() *_struct.Struct {
	if m != nil {
		return m.Details
	}
	return nil
}

type ReportResultRequest struct {
	// The request to report results for, identified by the
	// Invocation.Request.name field.
	Request string `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
	// Result to report.
	Result               *Result  `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ReportResultRequest proto.InternalMessageInfo

func (m *ReportResultRequest) GetRequest() string {
	if m != nil {
		return m.Request
	}
	return ""
}

func (m *ReportResultRequest) GetResult() *Result {
	if m != nil {
		return m.Result
	}
	return nil
}

type ReportResultResponse struct {
	// If set, the invocation should immediately terminate, skipping remaining
	// requests.
	Terminate            bool     `protobuf:"varint,1,opt,name=terminate,proto3" json:"terminate,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ReportResultResponse proto.InternalMessageInfo

func (m *ReportResultResponse) GetTerminate() bool {
	if m != nil {
		return m.Terminate
	}
	return false
}

type ReportLogRequest struct {
	// Name of the log sink.
	//
	// name may be interpreted as a local file path or part of a URL. name must be
	// a valid resource name per https://aip.dev/122 and must be a valid POSIX
	// file path.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The request to report logs for, identified by the
	// Invocation.Request.name field.
	Request string `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"`
	// Uninterpreted chunk of log-data.
	Data                 []byte   `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ReportLogRequest proto.InternalMessageInfo

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

func (m *ReportLogRequest) GetRequest() string {
	if m != nil {
		return m.Request
	}
	return ""
}

func (m *ReportLogRequest) GetData() []byte {
	if m != nil {
		return m.Data
	}
	return nil
}

type ReportLogResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ReportLogResponse proto.InternalMessageInfo

type ArchiveArtifactRequest struct {
	// Name for the archived artifact.
	//
	// name may be interpreted as a local file path or part of a URL. name must be
	// a valid resource name per https://aip.dev/122 and must be a valid POSIX
	// file path.
	//
	// name must be unique across all artifacts archived from a single invocation
	// request.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The request to archive artifacts for, identified by the
	// Invocation.Request.name field.
	Request string `protobuf:"bytes,2,opt,name=request,proto3" json:"request,omitempty"`
	// Absolute path to a file or directory to archive.
	LocalPath            string   `protobuf:"bytes,3,opt,name=local_path,json=localPath,proto3" json:"local_path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ArchiveArtifactRequest) Reset()         { *m = ArchiveArtifactRequest{} }
func (m *ArchiveArtifactRequest) String() string { return proto.CompactTextString(m) }
func (*ArchiveArtifactRequest) ProtoMessage()    {}
func (*ArchiveArtifactRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_53459f08935e9319, []int{6}
}

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

var xxx_messageInfo_ArchiveArtifactRequest proto.InternalMessageInfo

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

func (m *ArchiveArtifactRequest) GetRequest() string {
	if m != nil {
		return m.Request
	}
	return ""
}

func (m *ArchiveArtifactRequest) GetLocalPath() string {
	if m != nil {
		return m.LocalPath
	}
	return ""
}

type ArchiveArtifactResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ArchiveArtifactResponse) Reset()         { *m = ArchiveArtifactResponse{} }
func (m *ArchiveArtifactResponse) String() string { return proto.CompactTextString(m) }
func (*ArchiveArtifactResponse) ProtoMessage()    {}
func (*ArchiveArtifactResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_53459f08935e9319, []int{7}
}

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

var xxx_messageInfo_ArchiveArtifactResponse proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("test.rtd.v1.Result_State", Result_State_name, Result_State_value)
	proto.RegisterEnum("test.rtd.v1.Result_Error_Source", Result_Error_Source_name, Result_Error_Source_value)
	proto.RegisterEnum("test.rtd.v1.Result_Error_Severity", Result_Error_Severity_name, Result_Error_Severity_value)
	proto.RegisterType((*ProgressSinkClientConfig)(nil), "test.rtd.v1.ProgressSinkClientConfig")
	proto.RegisterType((*Result)(nil), "test.rtd.v1.Result")
	proto.RegisterType((*Result_Error)(nil), "test.rtd.v1.Result.Error")
	proto.RegisterType((*ReportResultRequest)(nil), "test.rtd.v1.ReportResultRequest")
	proto.RegisterType((*ReportResultResponse)(nil), "test.rtd.v1.ReportResultResponse")
	proto.RegisterType((*ReportLogRequest)(nil), "test.rtd.v1.ReportLogRequest")
	proto.RegisterType((*ReportLogResponse)(nil), "test.rtd.v1.ReportLogResponse")
	proto.RegisterType((*ArchiveArtifactRequest)(nil), "test.rtd.v1.ArchiveArtifactRequest")
	proto.RegisterType((*ArchiveArtifactResponse)(nil), "test.rtd.v1.ArchiveArtifactResponse")
}

func init() { proto.RegisterFile("test/rtd/v1/progress.proto", fileDescriptor_53459f08935e9319) }

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

// ProgressSinkClient is the client API for ProgressSink service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ProgressSinkClient interface {
	// A Remote Test Driver invocation must call ReportResult exactly once per
	// request.
	ReportResult(ctx context.Context, in *ReportResultRequest, opts ...grpc.CallOption) (*ReportResultResponse, error)
	// A log stream from the Remote Test Driver invocation.
	//
	// Each call to this method must stream logs for a single invocation request
	// and log file. Data for the same file may be split over multiple ReportLog
	// calls. Data received from concurrent methods calls for the same log file
	// may be interleved arbitrarily.
	ReportLog(ctx context.Context, opts ...grpc.CallOption) (ProgressSink_ReportLogClient, error)
	// Archive test artifacts to non-ephemeral storage.
	//
	// Different Test Lab Environments may use very different non-ephemeral
	// storage technologies. Remote Test Servers must archive the artifacts to
	// final storage synchronously and return an error if the archival fails.
	//
	// Note: Remote Test Drivers should use ReportLog() to report logs.
	// ArchiveArtifact() should be used to report structured or binary data only.
	//
	// Remote Test Server may limit the size of artifacts that may be offloaded
	// per request and may fail further requests with RESOURCE_EXHAUSTED.
	ArchiveArtifact(ctx context.Context, in *ArchiveArtifactRequest, opts ...grpc.CallOption) (*ArchiveArtifactResponse, error)
}

type progressSinkClient struct {
	cc *grpc.ClientConn
}

func NewProgressSinkClient(cc *grpc.ClientConn) ProgressSinkClient {
	return &progressSinkClient{cc}
}

func (c *progressSinkClient) ReportResult(ctx context.Context, in *ReportResultRequest, opts ...grpc.CallOption) (*ReportResultResponse, error) {
	out := new(ReportResultResponse)
	err := c.cc.Invoke(ctx, "/test.rtd.v1.ProgressSink/ReportResult", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *progressSinkClient) ReportLog(ctx context.Context, opts ...grpc.CallOption) (ProgressSink_ReportLogClient, error) {
	stream, err := c.cc.NewStream(ctx, &_ProgressSink_serviceDesc.Streams[0], "/test.rtd.v1.ProgressSink/ReportLog", opts...)
	if err != nil {
		return nil, err
	}
	x := &progressSinkReportLogClient{stream}
	return x, nil
}

type ProgressSink_ReportLogClient interface {
	Send(*ReportLogRequest) error
	CloseAndRecv() (*ReportLogResponse, error)
	grpc.ClientStream
}

type progressSinkReportLogClient struct {
	grpc.ClientStream
}

func (x *progressSinkReportLogClient) Send(m *ReportLogRequest) error {
	return x.ClientStream.SendMsg(m)
}

func (x *progressSinkReportLogClient) CloseAndRecv() (*ReportLogResponse, error) {
	if err := x.ClientStream.CloseSend(); err != nil {
		return nil, err
	}
	m := new(ReportLogResponse)
	if err := x.ClientStream.RecvMsg(m); err != nil {
		return nil, err
	}
	return m, nil
}

func (c *progressSinkClient) ArchiveArtifact(ctx context.Context, in *ArchiveArtifactRequest, opts ...grpc.CallOption) (*ArchiveArtifactResponse, error) {
	out := new(ArchiveArtifactResponse)
	err := c.cc.Invoke(ctx, "/test.rtd.v1.ProgressSink/ArchiveArtifact", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ProgressSinkServer is the server API for ProgressSink service.
type ProgressSinkServer interface {
	// A Remote Test Driver invocation must call ReportResult exactly once per
	// request.
	ReportResult(context.Context, *ReportResultRequest) (*ReportResultResponse, error)
	// A log stream from the Remote Test Driver invocation.
	//
	// Each call to this method must stream logs for a single invocation request
	// and log file. Data for the same file may be split over multiple ReportLog
	// calls. Data received from concurrent methods calls for the same log file
	// may be interleved arbitrarily.
	ReportLog(ProgressSink_ReportLogServer) error
	// Archive test artifacts to non-ephemeral storage.
	//
	// Different Test Lab Environments may use very different non-ephemeral
	// storage technologies. Remote Test Servers must archive the artifacts to
	// final storage synchronously and return an error if the archival fails.
	//
	// Note: Remote Test Drivers should use ReportLog() to report logs.
	// ArchiveArtifact() should be used to report structured or binary data only.
	//
	// Remote Test Server may limit the size of artifacts that may be offloaded
	// per request and may fail further requests with RESOURCE_EXHAUSTED.
	ArchiveArtifact(context.Context, *ArchiveArtifactRequest) (*ArchiveArtifactResponse, error)
}

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

func (*UnimplementedProgressSinkServer) ReportResult(ctx context.Context, req *ReportResultRequest) (*ReportResultResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ReportResult not implemented")
}
func (*UnimplementedProgressSinkServer) ReportLog(srv ProgressSink_ReportLogServer) error {
	return status.Errorf(codes.Unimplemented, "method ReportLog not implemented")
}
func (*UnimplementedProgressSinkServer) ArchiveArtifact(ctx context.Context, req *ArchiveArtifactRequest) (*ArchiveArtifactResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ArchiveArtifact not implemented")
}

func RegisterProgressSinkServer(s *grpc.Server, srv ProgressSinkServer) {
	s.RegisterService(&_ProgressSink_serviceDesc, srv)
}

func _ProgressSink_ReportResult_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ReportResultRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ProgressSinkServer).ReportResult(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/test.rtd.v1.ProgressSink/ReportResult",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ProgressSinkServer).ReportResult(ctx, req.(*ReportResultRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ProgressSink_ReportLog_Handler(srv interface{}, stream grpc.ServerStream) error {
	return srv.(ProgressSinkServer).ReportLog(&progressSinkReportLogServer{stream})
}

type ProgressSink_ReportLogServer interface {
	SendAndClose(*ReportLogResponse) error
	Recv() (*ReportLogRequest, error)
	grpc.ServerStream
}

type progressSinkReportLogServer struct {
	grpc.ServerStream
}

func (x *progressSinkReportLogServer) SendAndClose(m *ReportLogResponse) error {
	return x.ServerStream.SendMsg(m)
}

func (x *progressSinkReportLogServer) Recv() (*ReportLogRequest, error) {
	m := new(ReportLogRequest)
	if err := x.ServerStream.RecvMsg(m); err != nil {
		return nil, err
	}
	return m, nil
}

func _ProgressSink_ArchiveArtifact_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ArchiveArtifactRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ProgressSinkServer).ArchiveArtifact(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/test.rtd.v1.ProgressSink/ArchiveArtifact",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ProgressSinkServer).ArchiveArtifact(ctx, req.(*ArchiveArtifactRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _ProgressSink_serviceDesc = grpc.ServiceDesc{
	ServiceName: "test.rtd.v1.ProgressSink",
	HandlerType: (*ProgressSinkServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "ReportResult",
			Handler:    _ProgressSink_ReportResult_Handler,
		},
		{
			MethodName: "ArchiveArtifact",
			Handler:    _ProgressSink_ArchiveArtifact_Handler,
		},
	},
	Streams: []grpc.StreamDesc{
		{
			StreamName:    "ReportLog",
			Handler:       _ProgressSink_ReportLog_Handler,
			ClientStreams: true,
		},
	},
	Metadata: "test/rtd/v1/progress.proto",
}
