// 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/execution/param.proto

package execution

import (
	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)
)

// Uniformly applied parameters for all test executions in a test platform
// request.
type Param struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// If set, crash reports generated during test execution are uploaded to a
	// builder-determined crash server (e.g. http://crash or
	// http://crash-staging)
	UploadCrashes bool `protobuf:"varint,1,opt,name=upload_crashes,json=uploadCrashes,proto3" json:"upload_crashes,omitempty"`
}

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

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

func (*Param) ProtoMessage() {}

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

func (x *Param) GetUploadCrashes() bool {
	if x != nil {
		return x.UploadCrashes
	}
	return false
}

var File_test_platform_execution_param_proto protoreflect.FileDescriptor

var file_test_platform_execution_param_proto_rawDesc = []byte{
	0x0a, 0x23, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2e,
	0x0a, 0x05, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x25, 0x0a, 0x0e, 0x75, 0x70, 0x6c, 0x6f, 0x61,
	0x64, 0x5f, 0x63, 0x72, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x0d, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x72, 0x61, 0x73, 0x68, 0x65, 0x73, 0x42, 0x43,
	0x5a, 0x41, 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, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74,
	0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_execution_param_proto_rawDescOnce sync.Once
	file_test_platform_execution_param_proto_rawDescData = file_test_platform_execution_param_proto_rawDesc
)

func file_test_platform_execution_param_proto_rawDescGZIP() []byte {
	file_test_platform_execution_param_proto_rawDescOnce.Do(func() {
		file_test_platform_execution_param_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_execution_param_proto_rawDescData)
	})
	return file_test_platform_execution_param_proto_rawDescData
}

var file_test_platform_execution_param_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_test_platform_execution_param_proto_goTypes = []interface{}{
	(*Param)(nil), // 0: test_platform.execution.Param
}
var file_test_platform_execution_param_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_test_platform_execution_param_proto_init() }
func file_test_platform_execution_param_proto_init() {
	if File_test_platform_execution_param_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_platform_execution_param_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Param); 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_execution_param_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_execution_param_proto_goTypes,
		DependencyIndexes: file_test_platform_execution_param_proto_depIdxs,
		MessageInfos:      file_test_platform_execution_param_proto_msgTypes,
	}.Build()
	File_test_platform_execution_param_proto = out.File
	file_test_platform_execution_param_proto_rawDesc = nil
	file_test_platform_execution_param_proto_goTypes = nil
	file_test_platform_execution_param_proto_depIdxs = nil
}
