// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/result_flow/test_runner.proto

package result_flow

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

// TestRunnerRequest defines the input of `result_flow test_runner`.
type TestRunnerRequest struct {
	// The source config for fetching the test runner builds.
	TestRunner *Source `protobuf:"bytes,1,opt,name=test_runner,json=testRunner,proto3" json:"test_runner,omitempty"`
	// The target to upload test run results.
	TestRun *Target `protobuf:"bytes,2,opt,name=test_run,json=testRun,proto3" json:"test_run,omitempty"`
	// The target to upload test case results.
	TestCase *Target `protobuf:"bytes,3,opt,name=test_case,json=testCase,proto3" json:"test_case,omitempty"`
	// Hard deadline for execution.
	//
	// TestRunner command should abort beyond this deadline.
	Deadline             *timestamp.Timestamp `protobuf:"bytes,4,opt,name=deadline,proto3" json:"deadline,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_TestRunnerRequest proto.InternalMessageInfo

func (m *TestRunnerRequest) GetTestRunner() *Source {
	if m != nil {
		return m.TestRunner
	}
	return nil
}

func (m *TestRunnerRequest) GetTestRun() *Target {
	if m != nil {
		return m.TestRun
	}
	return nil
}

func (m *TestRunnerRequest) GetTestCase() *Target {
	if m != nil {
		return m.TestCase
	}
	return nil
}

func (m *TestRunnerRequest) GetDeadline() *timestamp.Timestamp {
	if m != nil {
		return m.Deadline
	}
	return nil
}

// TestRunnerResponse defines the output of `result_flow test_runner`.
type TestRunnerResponse struct {
	// `result_flow test_runner` exits with exit code 0 unless there is an
	// infrastructure failure. When the exit code is 0, `state` indicates the
	// best known state of the test_runner command execution (see comments on State enum).
	State                State    `protobuf:"varint,1,opt,name=state,proto3,enum=test_platform.result_flow.State" json:"state,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestRunnerResponse proto.InternalMessageInfo

func (m *TestRunnerResponse) GetState() State {
	if m != nil {
		return m.State
	}
	return State_STATE_UNSPECIFIED
}

func init() {
	proto.RegisterType((*TestRunnerRequest)(nil), "test_platform.result_flow.TestRunnerRequest")
	proto.RegisterType((*TestRunnerResponse)(nil), "test_platform.result_flow.TestRunnerResponse")
}

func init() {
	proto.RegisterFile("test_platform/result_flow/test_runner.proto", fileDescriptor_df9f4b468bf4599d)
}

var fileDescriptor_df9f4b468bf4599d = []byte{
	// 289 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0x41, 0x4b, 0x33, 0x31,
	0x10, 0x86, 0x69, 0xbf, 0x4f, 0xad, 0x29, 0x08, 0xe6, 0xb4, 0xf6, 0x62, 0xed, 0x41, 0x04, 0x21,
	0x81, 0x0a, 0x9e, 0xc4, 0x43, 0x8b, 0x37, 0x4f, 0x71, 0x4f, 0x5e, 0x4a, 0xba, 0x9d, 0x8d, 0x0b,
	0x9b, 0xcc, 0x9a, 0x4c, 0xf0, 0x57, 0xf8, 0x9f, 0xc5, 0xac, 0x5b, 0xd6, 0xc3, 0xaa, 0xc7, 0x61,
	0x9e, 0x79, 0x66, 0x78, 0x87, 0x5d, 0x13, 0x04, 0xda, 0x34, 0xb5, 0xa6, 0x12, 0xbd, 0x95, 0x1e,
	0x42, 0xac, 0x69, 0x53, 0xd6, 0xf8, 0x26, 0x53, 0xc7, 0x47, 0xe7, 0xc0, 0x8b, 0xc6, 0x23, 0x21,
	0x3f, 0xfb, 0x06, 0x8b, 0x1e, 0x3c, 0xbb, 0x1c, 0xf6, 0x14, 0x68, 0x2d, 0xba, 0x56, 0x31, 0x3b,
	0x37, 0x88, 0xa6, 0x06, 0x99, 0xaa, 0x6d, 0x2c, 0x25, 0x55, 0x16, 0x02, 0x69, 0xdb, 0xb4, 0xc0,
	0xe2, 0x7d, 0xcc, 0x4e, 0x73, 0x08, 0xa4, 0xd2, 0x62, 0x05, 0xaf, 0x11, 0x02, 0xf1, 0x15, 0x9b,
	0xf6, 0xce, 0xc9, 0x46, 0xf3, 0xd1, 0xd5, 0x74, 0x79, 0x21, 0x06, 0xef, 0x11, 0x4f, 0x18, 0x7d,
	0x01, 0x8a, 0xd1, 0x5e, 0xc5, 0xef, 0xd8, 0xa4, 0x73, 0x64, 0xe3, 0x5f, 0x05, 0xb9, 0xf6, 0x06,
	0x48, 0x1d, 0x7d, 0x09, 0xf8, 0x3d, 0x3b, 0x4e, 0x70, 0xa1, 0x03, 0x64, 0xff, 0xfe, 0x3a, 0x9e,
	0x36, 0xae, 0x75, 0x00, 0x7e, 0xcb, 0x26, 0x3b, 0xd0, 0xbb, 0xba, 0x72, 0x90, 0xfd, 0x4f, 0xe3,
	0x33, 0xd1, 0x66, 0x21, 0xba, 0x2c, 0x44, 0xde, 0x65, 0xa1, 0xf6, 0xec, 0xe2, 0x91, 0xf1, 0x7e,
	0x1c, 0xa1, 0x41, 0x97, 0x6c, 0x07, 0x81, 0x34, 0x41, 0x4a, 0xe2, 0x64, 0x39, 0xff, 0x29, 0x89,
	0x4f, 0x4e, 0xb5, 0xf8, 0xea, 0xe1, 0x79, 0x6d, 0x50, 0x14, 0x2f, 0x1e, 0x6d, 0x15, 0xad, 0x40,
	0x6f, 0x64, 0x57, 0x60, 0x90, 0x95, 0x2b, 0xbd, 0x6e, 0x5f, 0x23, 0x0d, 0xca, 0xc1, 0x97, 0x6e,
	0x0f, 0x13, 0x73, 0xf3, 0x11, 0x00, 0x00, 0xff, 0xff, 0x8d, 0xe5, 0x91, 0xae, 0x3e, 0x02, 0x00,
	0x00,
}
