// Copyright 2021 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/skylab_test_runner/steps/test_execution.proto

package steps

import (
	skylab_test_runner "go.chromium.org/chromiumos/infra/proto/go/test_platform/skylab_test_runner"
	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)
)

// RunTestsRequest is the input for the Go-based replacement of test_runner.
type RunTestsRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Request *skylab_test_runner.Request `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"`
	Config  *skylab_test_runner.Config  `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
}

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

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

func (*RunTestsRequest) ProtoMessage() {}

func (x *RunTestsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_skylab_test_runner_steps_test_execution_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 RunTestsRequest.ProtoReflect.Descriptor instead.
func (*RunTestsRequest) Descriptor() ([]byte, []int) {
	return file_test_platform_skylab_test_runner_steps_test_execution_proto_rawDescGZIP(), []int{0}
}

func (x *RunTestsRequest) GetRequest() *skylab_test_runner.Request {
	if x != nil {
		return x.Request
	}
	return nil
}

func (x *RunTestsRequest) GetConfig() *skylab_test_runner.Config {
	if x != nil {
		return x.Config
	}
	return nil
}

// RunTestsResponse is the output from the Go-based replacement of test_runner.
type RunTestsResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A markdown string that should be used in Buildbucket as a summary of the
	// test_runner build.
	ErrorSummaryMarkdown string `protobuf:"bytes,1,opt,name=error_summary_markdown,json=errorSummaryMarkdown,proto3" json:"error_summary_markdown,omitempty"`
}

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

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

func (*RunTestsResponse) ProtoMessage() {}

func (x *RunTestsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_skylab_test_runner_steps_test_execution_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 RunTestsResponse.ProtoReflect.Descriptor instead.
func (*RunTestsResponse) Descriptor() ([]byte, []int) {
	return file_test_platform_skylab_test_runner_steps_test_execution_proto_rawDescGZIP(), []int{1}
}

func (x *RunTestsResponse) GetErrorSummaryMarkdown() string {
	if x != nil {
		return x.ErrorSummaryMarkdown
	}
	return ""
}

var File_test_platform_skylab_test_runner_steps_test_execution_proto protoreflect.FileDescriptor

var file_test_platform_skylab_test_runner_steps_test_execution_proto_rawDesc = []byte{
	0x0a, 0x3b, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e,
	0x65, 0x72, 0x2f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x78,
	0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x26, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79,
	0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e,
	0x73, 0x74, 0x65, 0x70, 0x73, 0x1a, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2f, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x22, 0x98, 0x01, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74,
	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62,
	0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a,
	0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b,
	0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72,
	0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22,
	0x48, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x16, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x73, 0x75, 0x6d,
	0x6d, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x14, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72,
	0x79, 0x4d, 0x61, 0x72, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x42, 0x52, 0x5a, 0x50, 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, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x65, 0x72, 0x2f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x62, 0x06, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_skylab_test_runner_steps_test_execution_proto_rawDescOnce sync.Once
	file_test_platform_skylab_test_runner_steps_test_execution_proto_rawDescData = file_test_platform_skylab_test_runner_steps_test_execution_proto_rawDesc
)

func file_test_platform_skylab_test_runner_steps_test_execution_proto_rawDescGZIP() []byte {
	file_test_platform_skylab_test_runner_steps_test_execution_proto_rawDescOnce.Do(func() {
		file_test_platform_skylab_test_runner_steps_test_execution_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_skylab_test_runner_steps_test_execution_proto_rawDescData)
	})
	return file_test_platform_skylab_test_runner_steps_test_execution_proto_rawDescData
}

var file_test_platform_skylab_test_runner_steps_test_execution_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_test_platform_skylab_test_runner_steps_test_execution_proto_goTypes = []interface{}{
	(*RunTestsRequest)(nil),            // 0: test_platform.skylab_test_runner.steps.RunTestsRequest
	(*RunTestsResponse)(nil),           // 1: test_platform.skylab_test_runner.steps.RunTestsResponse
	(*skylab_test_runner.Request)(nil), // 2: test_platform.skylab_test_runner.Request
	(*skylab_test_runner.Config)(nil),  // 3: test_platform.skylab_test_runner.Config
}
var file_test_platform_skylab_test_runner_steps_test_execution_proto_depIdxs = []int32{
	2, // 0: test_platform.skylab_test_runner.steps.RunTestsRequest.request:type_name -> test_platform.skylab_test_runner.Request
	3, // 1: test_platform.skylab_test_runner.steps.RunTestsRequest.config:type_name -> test_platform.skylab_test_runner.Config
	2, // [2:2] is the sub-list for method output_type
	2, // [2:2] is the sub-list for method input_type
	2, // [2:2] is the sub-list for extension type_name
	2, // [2:2] is the sub-list for extension extendee
	0, // [0:2] is the sub-list for field type_name
}

func init() { file_test_platform_skylab_test_runner_steps_test_execution_proto_init() }
func file_test_platform_skylab_test_runner_steps_test_execution_proto_init() {
	if File_test_platform_skylab_test_runner_steps_test_execution_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_platform_skylab_test_runner_steps_test_execution_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RunTestsRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_skylab_test_runner_steps_test_execution_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RunTestsResponse); 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_skylab_test_runner_steps_test_execution_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_skylab_test_runner_steps_test_execution_proto_goTypes,
		DependencyIndexes: file_test_platform_skylab_test_runner_steps_test_execution_proto_depIdxs,
		MessageInfos:      file_test_platform_skylab_test_runner_steps_test_execution_proto_msgTypes,
	}.Build()
	File_test_platform_skylab_test_runner_steps_test_execution_proto = out.File
	file_test_platform_skylab_test_runner_steps_test_execution_proto_rawDesc = nil
	file_test_platform_skylab_test_runner_steps_test_execution_proto_goTypes = nil
	file_test_platform_skylab_test_runner_steps_test_execution_proto_depIdxs = nil
}
