// Copyright 2019 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/taskstate.proto

package test_platform

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

type TaskState_LifeCycleMask int32

const (
	TaskState_LIFE_CYCLE_MASK_UNSPECIFIED TaskState_LifeCycleMask = 0
	// Mask for LifeCycle values in which a task started running.
	TaskState_LIFE_CYCLE_MASK_STARTED TaskState_LifeCycleMask = 16
	// Mask for LifeCycle values in which a task completed running.
	TaskState_LIFE_CYCLE_MASK_COMPLETED TaskState_LifeCycleMask = 32
	// Mask for LifeCycle values in which a task is in its final state.
	TaskState_LIFE_CYCLE_MASK_FINAL TaskState_LifeCycleMask = 64
)

// Enum value maps for TaskState_LifeCycleMask.
var (
	TaskState_LifeCycleMask_name = map[int32]string{
		0:  "LIFE_CYCLE_MASK_UNSPECIFIED",
		16: "LIFE_CYCLE_MASK_STARTED",
		32: "LIFE_CYCLE_MASK_COMPLETED",
		64: "LIFE_CYCLE_MASK_FINAL",
	}
	TaskState_LifeCycleMask_value = map[string]int32{
		"LIFE_CYCLE_MASK_UNSPECIFIED": 0,
		"LIFE_CYCLE_MASK_STARTED":     16,
		"LIFE_CYCLE_MASK_COMPLETED":   32,
		"LIFE_CYCLE_MASK_FINAL":       64,
	}
)

func (x TaskState_LifeCycleMask) Enum() *TaskState_LifeCycleMask {
	p := new(TaskState_LifeCycleMask)
	*p = x
	return p
}

func (x TaskState_LifeCycleMask) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (TaskState_LifeCycleMask) Descriptor() protoreflect.EnumDescriptor {
	return file_test_platform_taskstate_proto_enumTypes[0].Descriptor()
}

func (TaskState_LifeCycleMask) Type() protoreflect.EnumType {
	return &file_test_platform_taskstate_proto_enumTypes[0]
}

func (x TaskState_LifeCycleMask) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use TaskState_LifeCycleMask.Descriptor instead.
func (TaskState_LifeCycleMask) EnumDescriptor() ([]byte, []int) {
	return file_test_platform_taskstate_proto_rawDescGZIP(), []int{0, 0}
}

type TaskState_LifeCycle int32

const (
	TaskState_LIFE_CYCLE_UNSPECIFIED TaskState_LifeCycle = 0
	// Waiting to start.
	TaskState_LIFE_CYCLE_PENDING TaskState_LifeCycle = 1
	// Running.
	TaskState_LIFE_CYCLE_RUNNING TaskState_LifeCycle = 16
	// Ran to completion without being cancelled externally, regardless
	// of whether it succeeded or failed.
	TaskState_LIFE_CYCLE_COMPLETED TaskState_LifeCycle = 112
	// Never got a chance to run, cancelled externally.
	TaskState_LIFE_CYCLE_CANCELLED TaskState_LifeCycle = 65
	// Never got a chance to run, rejected due to no capacity.
	TaskState_LIFE_CYCLE_REJECTED TaskState_LifeCycle = 66
	// Started running but was cancelled externally while running.
	TaskState_LIFE_CYCLE_ABORTED TaskState_LifeCycle = 80
)

// Enum value maps for TaskState_LifeCycle.
var (
	TaskState_LifeCycle_name = map[int32]string{
		0:   "LIFE_CYCLE_UNSPECIFIED",
		1:   "LIFE_CYCLE_PENDING",
		16:  "LIFE_CYCLE_RUNNING",
		112: "LIFE_CYCLE_COMPLETED",
		65:  "LIFE_CYCLE_CANCELLED",
		66:  "LIFE_CYCLE_REJECTED",
		80:  "LIFE_CYCLE_ABORTED",
	}
	TaskState_LifeCycle_value = map[string]int32{
		"LIFE_CYCLE_UNSPECIFIED": 0,
		"LIFE_CYCLE_PENDING":     1,
		"LIFE_CYCLE_RUNNING":     16,
		"LIFE_CYCLE_COMPLETED":   112,
		"LIFE_CYCLE_CANCELLED":   65,
		"LIFE_CYCLE_REJECTED":    66,
		"LIFE_CYCLE_ABORTED":     80,
	}
)

func (x TaskState_LifeCycle) Enum() *TaskState_LifeCycle {
	p := new(TaskState_LifeCycle)
	*p = x
	return p
}

func (x TaskState_LifeCycle) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (TaskState_LifeCycle) Descriptor() protoreflect.EnumDescriptor {
	return file_test_platform_taskstate_proto_enumTypes[1].Descriptor()
}

func (TaskState_LifeCycle) Type() protoreflect.EnumType {
	return &file_test_platform_taskstate_proto_enumTypes[1]
}

func (x TaskState_LifeCycle) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use TaskState_LifeCycle.Descriptor instead.
func (TaskState_LifeCycle) EnumDescriptor() ([]byte, []int) {
	return file_test_platform_taskstate_proto_rawDescGZIP(), []int{0, 1}
}

type TaskState_Verdict int32

const (
	// The task produced no usable verdict (possibly because it never
	// ran, or never finished, or the results were unparseable).
	//
	// Under most circumstances, this should be treated as a failure or
	// an infrastructure failure.
	TaskState_VERDICT_UNSPECIFIED TaskState_Verdict = 0
	// The task produced a definitive verdict: it passed.
	TaskState_VERDICT_PASSED TaskState_Verdict = 1
	// The task produced a definitive verdict: it failed.
	TaskState_VERDICT_FAILED TaskState_Verdict = 2
	// The task definitively produced no verdict (for instance, because
	// the test is irrelevant in the given environment).
	//
	// Under most circumstances, this should be treated as a passing
	// (but uninteresting).
	TaskState_VERDICT_NO_VERDICT TaskState_Verdict = 3
	// The task failed, but passed after one or more retries.
	TaskState_VERDICT_PASSED_ON_RETRY TaskState_Verdict = 4
)

// Enum value maps for TaskState_Verdict.
var (
	TaskState_Verdict_name = map[int32]string{
		0: "VERDICT_UNSPECIFIED",
		1: "VERDICT_PASSED",
		2: "VERDICT_FAILED",
		3: "VERDICT_NO_VERDICT",
		4: "VERDICT_PASSED_ON_RETRY",
	}
	TaskState_Verdict_value = map[string]int32{
		"VERDICT_UNSPECIFIED":     0,
		"VERDICT_PASSED":          1,
		"VERDICT_FAILED":          2,
		"VERDICT_NO_VERDICT":      3,
		"VERDICT_PASSED_ON_RETRY": 4,
	}
)

func (x TaskState_Verdict) Enum() *TaskState_Verdict {
	p := new(TaskState_Verdict)
	*p = x
	return p
}

func (x TaskState_Verdict) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (TaskState_Verdict) Descriptor() protoreflect.EnumDescriptor {
	return file_test_platform_taskstate_proto_enumTypes[2].Descriptor()
}

func (TaskState_Verdict) Type() protoreflect.EnumType {
	return &file_test_platform_taskstate_proto_enumTypes[2]
}

func (x TaskState_Verdict) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use TaskState_Verdict.Descriptor instead.
func (TaskState_Verdict) EnumDescriptor() ([]byte, []int) {
	return file_test_platform_taskstate_proto_rawDescGZIP(), []int{0, 2}
}

type TaskState struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	LifeCycle TaskState_LifeCycle `protobuf:"varint,1,opt,name=life_cycle,json=lifeCycle,proto3,enum=test_platform.TaskState_LifeCycle" json:"life_cycle,omitempty"`
	// Verdict describes whether the task passed, failed, or had some other
	// indefinite verdict.
	Verdict TaskState_Verdict `protobuf:"varint,2,opt,name=verdict,proto3,enum=test_platform.TaskState_Verdict" json:"verdict,omitempty"`
}

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

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

func (*TaskState) ProtoMessage() {}

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

func (x *TaskState) GetLifeCycle() TaskState_LifeCycle {
	if x != nil {
		return x.LifeCycle
	}
	return TaskState_LIFE_CYCLE_UNSPECIFIED
}

func (x *TaskState) GetVerdict() TaskState_Verdict {
	if x != nil {
		return x.Verdict
	}
	return TaskState_VERDICT_UNSPECIFIED
}

var File_test_platform_taskstate_proto protoreflect.FileDescriptor

var file_test_platform_taskstate_proto_rawDesc = []byte{
	0x0a, 0x1d, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x74, 0x61, 0x73, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
	0x0d, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0xd4,
	0x04, 0x0a, 0x09, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x41, 0x0a, 0x0a,
	0x6c, 0x69, 0x66, 0x65, 0x5f, 0x63, 0x79, 0x63, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
	0x32, 0x22, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x69, 0x66, 0x65, 0x43,
	0x79, 0x63, 0x6c, 0x65, 0x52, 0x09, 0x6c, 0x69, 0x66, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x12,
	0x3a, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e,
	0x32, 0x20, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x64, 0x69,
	0x63, 0x74, 0x52, 0x07, 0x76, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x22, 0x87, 0x01, 0x0a, 0x0d,
	0x4c, 0x69, 0x66, 0x65, 0x43, 0x79, 0x63, 0x6c, 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x1f, 0x0a,
	0x1b, 0x4c, 0x49, 0x46, 0x45, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x53, 0x4b,
	0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b,
	0x0a, 0x17, 0x4c, 0x49, 0x46, 0x45, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x53,
	0x4b, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x10, 0x12, 0x1d, 0x0a, 0x19, 0x4c,
	0x49, 0x46, 0x45, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x43,
	0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x20, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x49,
	0x46, 0x45, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x46, 0x49,
	0x4e, 0x41, 0x4c, 0x10, 0x40, 0x22, 0xbc, 0x01, 0x0a, 0x09, 0x4c, 0x69, 0x66, 0x65, 0x43, 0x79,
	0x63, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x4c, 0x49, 0x46, 0x45, 0x5f, 0x43, 0x59, 0x43, 0x4c,
	0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
	0x16, 0x0a, 0x12, 0x4c, 0x49, 0x46, 0x45, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x50, 0x45,
	0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x49, 0x46, 0x45, 0x5f,
	0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x10, 0x12,
	0x18, 0x0a, 0x14, 0x4c, 0x49, 0x46, 0x45, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x43, 0x4f,
	0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x70, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x49, 0x46,
	0x45, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x4c, 0x45,
	0x44, 0x10, 0x41, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x49, 0x46, 0x45, 0x5f, 0x43, 0x59, 0x43, 0x4c,
	0x45, 0x5f, 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x42, 0x12, 0x16, 0x0a, 0x12,
	0x4c, 0x49, 0x46, 0x45, 0x5f, 0x43, 0x59, 0x43, 0x4c, 0x45, 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54,
	0x45, 0x44, 0x10, 0x50, 0x22, 0x7f, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x12,
	0x17, 0x0a, 0x13, 0x56, 0x45, 0x52, 0x44, 0x49, 0x43, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45,
	0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x56, 0x45, 0x52, 0x44,
	0x49, 0x43, 0x54, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x45, 0x44, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e,
	0x56, 0x45, 0x52, 0x44, 0x49, 0x43, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02,
	0x12, 0x16, 0x0a, 0x12, 0x56, 0x45, 0x52, 0x44, 0x49, 0x43, 0x54, 0x5f, 0x4e, 0x4f, 0x5f, 0x56,
	0x45, 0x52, 0x44, 0x49, 0x43, 0x54, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x56, 0x45, 0x52, 0x44,
	0x49, 0x43, 0x54, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x45, 0x44, 0x5f, 0x4f, 0x4e, 0x5f, 0x52, 0x45,
	0x54, 0x52, 0x59, 0x10, 0x04, 0x42, 0x39, 0x5a, 0x37, 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,
	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_taskstate_proto_rawDescOnce sync.Once
	file_test_platform_taskstate_proto_rawDescData = file_test_platform_taskstate_proto_rawDesc
)

func file_test_platform_taskstate_proto_rawDescGZIP() []byte {
	file_test_platform_taskstate_proto_rawDescOnce.Do(func() {
		file_test_platform_taskstate_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_taskstate_proto_rawDescData)
	})
	return file_test_platform_taskstate_proto_rawDescData
}

var file_test_platform_taskstate_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
var file_test_platform_taskstate_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_test_platform_taskstate_proto_goTypes = []interface{}{
	(TaskState_LifeCycleMask)(0), // 0: test_platform.TaskState.LifeCycleMask
	(TaskState_LifeCycle)(0),     // 1: test_platform.TaskState.LifeCycle
	(TaskState_Verdict)(0),       // 2: test_platform.TaskState.Verdict
	(*TaskState)(nil),            // 3: test_platform.TaskState
}
var file_test_platform_taskstate_proto_depIdxs = []int32{
	1, // 0: test_platform.TaskState.life_cycle:type_name -> test_platform.TaskState.LifeCycle
	2, // 1: test_platform.TaskState.verdict:type_name -> test_platform.TaskState.Verdict
	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_taskstate_proto_init() }
func file_test_platform_taskstate_proto_init() {
	if File_test_platform_taskstate_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_platform_taskstate_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TaskState); 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_taskstate_proto_rawDesc,
			NumEnums:      3,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_taskstate_proto_goTypes,
		DependencyIndexes: file_test_platform_taskstate_proto_depIdxs,
		EnumInfos:         file_test_platform_taskstate_proto_enumTypes,
		MessageInfos:      file_test_platform_taskstate_proto_msgTypes,
	}.Build()
	File_test_platform_taskstate_proto = out.File
	file_test_platform_taskstate_proto_rawDesc = nil
	file_test_platform_taskstate_proto_goTypes = nil
	file_test_platform_taskstate_proto_depIdxs = nil
}
