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

package phosphorus

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

// Values should be consistent with https://aip.dev/216
type FetchCrashesResponse_State int32

const (
	// Should not be used.
	FetchCrashesResponse_STATE_UNSPECIFIED FetchCrashesResponse_State = 0
	// FetchCrashes succeeded.
	FetchCrashesResponse_SUCCEEDED FetchCrashesResponse_State = 1
	// FetchCrashes failed.
	FetchCrashesResponse_FAILED FetchCrashesResponse_State = 2
	// FetchCrashes hit the requested timeout.
	FetchCrashesResponse_TIMED_OUT FetchCrashesResponse_State = 3
	// FetchCrashes was aborted externally.
	FetchCrashesResponse_ABORTED FetchCrashesResponse_State = 4
)

var FetchCrashesResponse_State_name = map[int32]string{
	0: "STATE_UNSPECIFIED",
	1: "SUCCEEDED",
	2: "FAILED",
	3: "TIMED_OUT",
	4: "ABORTED",
}

var FetchCrashesResponse_State_value = map[string]int32{
	"STATE_UNSPECIFIED": 0,
	"SUCCEEDED":         1,
	"FAILED":            2,
	"TIMED_OUT":         3,
	"ABORTED":           4,
}

func (x FetchCrashesResponse_State) String() string {
	return proto.EnumName(FetchCrashesResponse_State_name, int32(x))
}

func (FetchCrashesResponse_State) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_8145b7cb95f95596, []int{2, 0}
}

// FetchCrashesRequest defines the input of `phosphorus fetchcrashes`.
type FetchCrashesRequest struct {
	Config      *Config `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
	DutHostname string  `protobuf:"bytes,2,opt,name=dut_hostname,json=dutHostname,proto3" json:"dut_hostname,omitempty"`
	// Hard deadline for execution.
	//
	// FetchCrashes execution should abort beyond this deadline.
	Deadline *timestamp.Timestamp `protobuf:"bytes,3,opt,name=deadline,proto3" json:"deadline,omitempty"`
	// If set, upload crashes.
	// Currently, the command is a no-op if this is false, though eventually it
	// may save crashes to output directories.
	UploadCrashes bool `protobuf:"varint,4,opt,name=upload_crashes,json=uploadCrashes,proto3" json:"upload_crashes,omitempty"`
	// If set, upload crashes to http://crash-staging instead of http://crash.
	// Useful for testing.
	UseStaging           bool     `protobuf:"varint,5,opt,name=use_staging,json=useStaging,proto3" json:"use_staging,omitempty"` // Deprecated: Do not use.
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_FetchCrashesRequest proto.InternalMessageInfo

func (m *FetchCrashesRequest) GetConfig() *Config {
	if m != nil {
		return m.Config
	}
	return nil
}

func (m *FetchCrashesRequest) GetDutHostname() string {
	if m != nil {
		return m.DutHostname
	}
	return ""
}

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

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

// Deprecated: Do not use.
func (m *FetchCrashesRequest) GetUseStaging() bool {
	if m != nil {
		return m.UseStaging
	}
	return false
}

// CrashSummary defines details of crashes that will be easily accessible to
// callers always.
type CrashSummary struct {
	// Name of the crashing executable.
	ExecName string `protobuf:"bytes,1,opt,name=exec_name,json=execName,proto3" json:"exec_name,omitempty"`
	// If uploads were on, URL at which this crash can be found.
	UploadUrl string `protobuf:"bytes,2,opt,name=upload_url,json=uploadUrl,proto3" json:"upload_url,omitempty"`
	// Name of the integration test that was running when this crash happened, if
	// any.
	InProgressIntegrationTest string `protobuf:"bytes,3,opt,name=in_progress_integration_test,json=inProgressIntegrationTest,proto3" json:"in_progress_integration_test,omitempty"`
	// Crash signature (may not be populated for all crash types).
	Sig string `protobuf:"bytes,4,opt,name=sig,proto3" json:"sig,omitempty"`
	// Base part of crash filename in out dir. All files associated with the crash
	// will start with this string.
	// (e.g. chrome.20201202.130102.12345.4567)
	FilenameBase         string   `protobuf:"bytes,5,opt,name=filename_base,json=filenameBase,proto3" json:"filename_base,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CrashSummary proto.InternalMessageInfo

func (m *CrashSummary) GetExecName() string {
	if m != nil {
		return m.ExecName
	}
	return ""
}

func (m *CrashSummary) GetUploadUrl() string {
	if m != nil {
		return m.UploadUrl
	}
	return ""
}

func (m *CrashSummary) GetInProgressIntegrationTest() string {
	if m != nil {
		return m.InProgressIntegrationTest
	}
	return ""
}

func (m *CrashSummary) GetSig() string {
	if m != nil {
		return m.Sig
	}
	return ""
}

func (m *CrashSummary) GetFilenameBase() string {
	if m != nil {
		return m.FilenameBase
	}
	return ""
}

// FetchCrashesResponse defines the output of `phosphorus fetch-crashes`.
type FetchCrashesResponse struct {
	// `phosphorus fetch-crashes` 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 prejob execution (see comments on State enum).
	State FetchCrashesResponse_State `protobuf:"varint,1,opt,name=state,proto3,enum=test_platform.phosphorus.FetchCrashesResponse_State" json:"state,omitempty"`
	// Details on the uploaded crashes.
	Crashes []*CrashSummary `protobuf:"bytes,2,rep,name=crashes,proto3" json:"crashes,omitempty"`
	// Names of crashes that are present only in RTD output
	CrashesRtdOnly []string `protobuf:"bytes,4,rep,name=crashes_rtd_only,json=crashesRtdOnly,proto3" json:"crashes_rtd_only,omitempty"`
	// Names of crashes that are present only in FetchCrashes output
	CrashesTlsOnly       []string `protobuf:"bytes,5,rep,name=crashes_tls_only,json=crashesTlsOnly,proto3" json:"crashes_tls_only,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_FetchCrashesResponse proto.InternalMessageInfo

func (m *FetchCrashesResponse) GetState() FetchCrashesResponse_State {
	if m != nil {
		return m.State
	}
	return FetchCrashesResponse_STATE_UNSPECIFIED
}

func (m *FetchCrashesResponse) GetCrashes() []*CrashSummary {
	if m != nil {
		return m.Crashes
	}
	return nil
}

func (m *FetchCrashesResponse) GetCrashesRtdOnly() []string {
	if m != nil {
		return m.CrashesRtdOnly
	}
	return nil
}

func (m *FetchCrashesResponse) GetCrashesTlsOnly() []string {
	if m != nil {
		return m.CrashesTlsOnly
	}
	return nil
}

func init() {
	proto.RegisterEnum("test_platform.phosphorus.FetchCrashesResponse_State", FetchCrashesResponse_State_name, FetchCrashesResponse_State_value)
	proto.RegisterType((*FetchCrashesRequest)(nil), "test_platform.phosphorus.FetchCrashesRequest")
	proto.RegisterType((*CrashSummary)(nil), "test_platform.phosphorus.CrashSummary")
	proto.RegisterType((*FetchCrashesResponse)(nil), "test_platform.phosphorus.FetchCrashesResponse")
}

func init() {
	proto.RegisterFile("test_platform/phosphorus/fetchcrashes.proto", fileDescriptor_8145b7cb95f95596)
}

var fileDescriptor_8145b7cb95f95596 = []byte{
	// 582 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x93, 0x5f, 0x6f, 0xd3, 0x3c,
	0x14, 0xc6, 0xdf, 0xb4, 0xeb, 0xb6, 0x9c, 0x6e, 0x53, 0x5e, 0x03, 0x52, 0x18, 0x20, 0x4a, 0xa7,
	0xa1, 0x4a, 0x48, 0x89, 0x34, 0x10, 0xe2, 0x0e, 0xd6, 0x26, 0x13, 0x45, 0xb0, 0x4d, 0x6e, 0x7a,
	0xc3, 0x8d, 0xe5, 0x35, 0x6e, 0x62, 0x29, 0xb1, 0x83, 0xed, 0x48, 0xec, 0xeb, 0xf1, 0x05, 0xf8,
	0x36, 0x5c, 0xa3, 0xfc, 0x63, 0xab, 0x44, 0xb9, 0x73, 0x9e, 0xfc, 0x8e, 0xcf, 0xf3, 0x1c, 0xdb,
	0xf0, 0xca, 0x30, 0x6d, 0x48, 0x91, 0x51, 0xb3, 0x96, 0x2a, 0xf7, 0x8b, 0x54, 0xea, 0x22, 0x95,
	0xaa, 0xd4, 0xfe, 0x9a, 0x99, 0x55, 0xba, 0x52, 0x54, 0xa7, 0x4c, 0x7b, 0x85, 0x92, 0x46, 0x22,
	0x77, 0x03, 0xf6, 0xee, 0xe0, 0xe3, 0xe7, 0x89, 0x94, 0x49, 0xc6, 0xfc, 0x9a, 0xbb, 0x29, 0xd7,
	0xbe, 0xe1, 0x39, 0xd3, 0x86, 0xe6, 0x45, 0x53, 0x7a, 0x7c, 0xba, 0xb5, 0xcf, 0x4a, 0xe6, 0xb9,
	0x14, 0x0d, 0x36, 0xfe, 0x65, 0xc1, 0x83, 0x8b, 0xaa, 0xf1, 0xac, 0x69, 0x8c, 0xd9, 0xb7, 0x92,
	0x69, 0x83, 0xde, 0xc1, 0xee, 0x4a, 0x8a, 0x35, 0x4f, 0x5c, 0x6b, 0x64, 0x4d, 0x86, 0x67, 0x23,
	0x6f, 0x9b, 0x15, 0x6f, 0x56, 0x73, 0xb8, 0xe5, 0xd1, 0x0b, 0x38, 0x88, 0x4b, 0x43, 0x52, 0xa9,
	0x8d, 0xa0, 0x39, 0x73, 0x7b, 0x23, 0x6b, 0x62, 0xe3, 0x61, 0x5c, 0x9a, 0x8f, 0xad, 0x84, 0xde,
	0xc2, 0x7e, 0xcc, 0x68, 0x9c, 0x71, 0xc1, 0xdc, 0x7e, 0xbd, 0xfd, 0xb1, 0xd7, 0xe4, 0xf1, 0xba,
	0x3c, 0x5e, 0xd4, 0xe5, 0xc1, 0x7f, 0x58, 0x74, 0x0a, 0x47, 0x65, 0x91, 0x49, 0x1a, 0x93, 0x76,
	0x4c, 0xee, 0xce, 0xc8, 0x9a, 0xec, 0xe3, 0xc3, 0x46, 0x6d, 0x23, 0xa0, 0x13, 0x18, 0x96, 0x9a,
	0x11, 0x6d, 0x68, 0xc2, 0x45, 0xe2, 0x0e, 0x2a, 0x66, 0xda, 0x73, 0x2d, 0x0c, 0xa5, 0x66, 0x8b,
	0x46, 0x1d, 0xff, 0xb0, 0xe0, 0xa0, 0x2e, 0x58, 0x94, 0x79, 0x4e, 0xd5, 0x2d, 0x7a, 0x02, 0x36,
	0xfb, 0xce, 0x56, 0xa4, 0x36, 0x6d, 0xd5, 0xa6, 0xf7, 0x2b, 0xe1, 0xb2, 0x72, 0xfc, 0x0c, 0xa0,
	0xed, 0x5c, 0xaa, 0xac, 0x8d, 0x64, 0x37, 0xca, 0x52, 0x65, 0xe8, 0x3d, 0x3c, 0xe5, 0x82, 0x14,
	0x4a, 0x26, 0x8a, 0x69, 0x4d, 0xb8, 0x30, 0x2c, 0x51, 0xd4, 0x70, 0x29, 0x48, 0x35, 0xb6, 0x3a,
	0xa4, 0x8d, 0x1f, 0x73, 0x71, 0xdd, 0x22, 0xf3, 0x3b, 0x22, 0xaa, 0xc6, 0xed, 0x40, 0x5f, 0xf3,
	0xa4, 0x8e, 0x63, 0xe3, 0x6a, 0x89, 0x4e, 0xe0, 0x70, 0xcd, 0x33, 0x56, 0xb9, 0x21, 0x37, 0x54,
	0xb3, 0x3a, 0x86, 0x8d, 0x0f, 0x3a, 0x71, 0x4a, 0x35, 0x1b, 0xff, 0xec, 0xc1, 0xc3, 0xcd, 0xd3,
	0xd3, 0x85, 0x14, 0x9a, 0xa1, 0x4f, 0x30, 0xd0, 0x86, 0x9a, 0x26, 0xc8, 0xd1, 0xd9, 0x9b, 0xed,
	0xa7, 0xf7, 0xb7, 0x72, 0x6f, 0x51, 0xd5, 0xe2, 0x66, 0x0b, 0xf4, 0x01, 0xf6, 0xba, 0x71, 0xf7,
	0x46, 0xfd, 0xc9, 0xf0, 0xec, 0xe5, 0x3f, 0xee, 0xc2, 0xbd, 0x89, 0xe2, 0xae, 0x0c, 0x4d, 0xc0,
	0x69, 0x97, 0x44, 0x99, 0x98, 0x48, 0x91, 0xdd, 0xba, 0x3b, 0xa3, 0xfe, 0xc4, 0xc6, 0x47, 0xad,
	0x8e, 0x4d, 0x7c, 0x25, 0xb2, 0xdb, 0xfb, 0xa4, 0xc9, 0x74, 0x43, 0x0e, 0x36, 0xc8, 0x28, 0xd3,
	0x15, 0x39, 0x5e, 0xc2, 0xa0, 0x76, 0x89, 0x1e, 0xc1, 0xff, 0x8b, 0xe8, 0x3c, 0x0a, 0xc9, 0xf2,
	0x72, 0x71, 0x1d, 0xce, 0xe6, 0x17, 0xf3, 0x30, 0x70, 0xfe, 0x43, 0x87, 0x60, 0x2f, 0x96, 0xb3,
	0x59, 0x18, 0x06, 0x61, 0xe0, 0x58, 0x08, 0x60, 0xf7, 0xe2, 0x7c, 0xfe, 0x39, 0x0c, 0x9c, 0x5e,
	0xf5, 0x2b, 0x9a, 0x7f, 0x09, 0x03, 0x72, 0xb5, 0x8c, 0x9c, 0x3e, 0x1a, 0xc2, 0xde, 0xf9, 0xf4,
	0x0a, 0x47, 0x61, 0xe0, 0xec, 0x4c, 0x83, 0xaf, 0xd3, 0x44, 0x7a, 0xab, 0x54, 0xc9, 0x9c, 0x97,
	0xb9, 0x27, 0x55, 0xe2, 0x77, 0x1f, 0x52, 0xfb, 0x5c, 0xac, 0x15, 0x6d, 0xde, 0x9c, 0x9f, 0x48,
	0x7f, 0xdb, 0x13, 0xbb, 0xd9, 0xad, 0x91, 0xd7, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xbf, 0x2f,
	0xda, 0xb7, 0xed, 0x03, 0x00, 0x00,
}
