// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: test_platform/result_flow/test_runner.proto

package result_flow

import (
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// TestRunnerRequest defines the input of `result_flow test_runner`.
type TestRunnerRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// 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"`
}

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

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

func (*TestRunnerRequest) ProtoMessage() {}

func (x *TestRunnerRequest) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_result_flow_test_runner_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestRunnerRequest.ProtoReflect.Descriptor instead.
func (*TestRunnerRequest) Descriptor() ([]byte, []int) {
	return file_test_platform_result_flow_test_runner_proto_rawDescGZIP(), []int{0}
}

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

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

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

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

// TestRunnerResponse defines the output of `result_flow test_runner`.
type TestRunnerResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// `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"`
}

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

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

func (*TestRunnerResponse) ProtoMessage() {}

func (x *TestRunnerResponse) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_result_flow_test_runner_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestRunnerResponse.ProtoReflect.Descriptor instead.
func (*TestRunnerResponse) Descriptor() ([]byte, []int) {
	return file_test_platform_result_flow_test_runner_proto_rawDescGZIP(), []int{1}
}

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

var File_test_platform_result_flow_test_runner_proto protoreflect.FileDescriptor

var file_test_platform_result_flow_test_runner_proto_rawDesc = []byte{
	0x0a, 0x2b, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x2f, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x73,
	0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x1a, 0x26, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66,
	0x6c, 0x6f, 0x77, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
	0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x22, 0x8d, 0x02, 0x0a, 0x11, 0x54, 0x65, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0b, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x73,
	0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52,
	0x0a, 0x74, 0x65, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x08, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
	0x52, 0x07, 0x74, 0x65, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x3e, 0x0a, 0x09, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x73,
	0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52,
	0x08, 0x74, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x64, 0x65, 0x61,
	0x64, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e,
	0x65, 0x22, 0x4c, 0x0a, 0x12, 0x54, 0x65, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x52,
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c,
	0x6f, 0x77, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x42,
	0x45, 0x5a, 0x43, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f,
	0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e,
	0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c,
	0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_result_flow_test_runner_proto_rawDescOnce sync.Once
	file_test_platform_result_flow_test_runner_proto_rawDescData = file_test_platform_result_flow_test_runner_proto_rawDesc
)

func file_test_platform_result_flow_test_runner_proto_rawDescGZIP() []byte {
	file_test_platform_result_flow_test_runner_proto_rawDescOnce.Do(func() {
		file_test_platform_result_flow_test_runner_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_result_flow_test_runner_proto_rawDescData)
	})
	return file_test_platform_result_flow_test_runner_proto_rawDescData
}

var file_test_platform_result_flow_test_runner_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_test_platform_result_flow_test_runner_proto_goTypes = []interface{}{
	(*TestRunnerRequest)(nil),   // 0: test_platform.result_flow.TestRunnerRequest
	(*TestRunnerResponse)(nil),  // 1: test_platform.result_flow.TestRunnerResponse
	(*Source)(nil),              // 2: test_platform.result_flow.Source
	(*Target)(nil),              // 3: test_platform.result_flow.Target
	(*timestamp.Timestamp)(nil), // 4: google.protobuf.Timestamp
	(State)(0),                  // 5: test_platform.result_flow.State
}
var file_test_platform_result_flow_test_runner_proto_depIdxs = []int32{
	2, // 0: test_platform.result_flow.TestRunnerRequest.test_runner:type_name -> test_platform.result_flow.Source
	3, // 1: test_platform.result_flow.TestRunnerRequest.test_run:type_name -> test_platform.result_flow.Target
	3, // 2: test_platform.result_flow.TestRunnerRequest.test_case:type_name -> test_platform.result_flow.Target
	4, // 3: test_platform.result_flow.TestRunnerRequest.deadline:type_name -> google.protobuf.Timestamp
	5, // 4: test_platform.result_flow.TestRunnerResponse.state:type_name -> test_platform.result_flow.State
	5, // [5:5] is the sub-list for method output_type
	5, // [5:5] is the sub-list for method input_type
	5, // [5:5] is the sub-list for extension type_name
	5, // [5:5] is the sub-list for extension extendee
	0, // [0:5] is the sub-list for field type_name
}

func init() { file_test_platform_result_flow_test_runner_proto_init() }
func file_test_platform_result_flow_test_runner_proto_init() {
	if File_test_platform_result_flow_test_runner_proto != nil {
		return
	}
	file_test_platform_result_flow_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_test_platform_result_flow_test_runner_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestRunnerRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_result_flow_test_runner_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestRunnerResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_platform_result_flow_test_runner_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_result_flow_test_runner_proto_goTypes,
		DependencyIndexes: file_test_platform_result_flow_test_runner_proto_depIdxs,
		MessageInfos:      file_test_platform_result_flow_test_runner_proto_msgTypes,
	}.Build()
	File_test_platform_result_flow_test_runner_proto = out.File
	file_test_platform_result_flow_test_runner_proto_rawDesc = nil
	file_test_platform_result_flow_test_runner_proto_goTypes = nil
	file_test_platform_result_flow_test_runner_proto_depIdxs = nil
}
