// 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/skylab_test_runner/result.proto

package skylab_test_runner

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

// Verdict defines the test case result to be reported.
type Result_Autotest_TestCase_Verdict int32

const (
	Result_Autotest_TestCase_VERDICT_UNDEFINED  Result_Autotest_TestCase_Verdict = 0
	Result_Autotest_TestCase_VERDICT_PASS       Result_Autotest_TestCase_Verdict = 1
	Result_Autotest_TestCase_VERDICT_FAIL       Result_Autotest_TestCase_Verdict = 2
	Result_Autotest_TestCase_VERDICT_NO_VERDICT Result_Autotest_TestCase_Verdict = 3
)

// Enum value maps for Result_Autotest_TestCase_Verdict.
var (
	Result_Autotest_TestCase_Verdict_name = map[int32]string{
		0: "VERDICT_UNDEFINED",
		1: "VERDICT_PASS",
		2: "VERDICT_FAIL",
		3: "VERDICT_NO_VERDICT",
	}
	Result_Autotest_TestCase_Verdict_value = map[string]int32{
		"VERDICT_UNDEFINED":  0,
		"VERDICT_PASS":       1,
		"VERDICT_FAIL":       2,
		"VERDICT_NO_VERDICT": 3,
	}
)

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

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

func (Result_Autotest_TestCase_Verdict) Descriptor() protoreflect.EnumDescriptor {
	return file_test_platform_skylab_test_runner_result_proto_enumTypes[0].Descriptor()
}

func (Result_Autotest_TestCase_Verdict) Type() protoreflect.EnumType {
	return &file_test_platform_skylab_test_runner_result_proto_enumTypes[0]
}

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

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

// Verdict defines the final step status. Eventually may have different
// cases from the test case verdict, e.g. VERDICT_SKIPPED.
type Result_Prejob_Step_Verdict int32

const (
	Result_Prejob_Step_VERDICT_UNDEFINED Result_Prejob_Step_Verdict = 0
	Result_Prejob_Step_VERDICT_PASS      Result_Prejob_Step_Verdict = 1
	Result_Prejob_Step_VERDICT_FAIL      Result_Prejob_Step_Verdict = 2
)

// Enum value maps for Result_Prejob_Step_Verdict.
var (
	Result_Prejob_Step_Verdict_name = map[int32]string{
		0: "VERDICT_UNDEFINED",
		1: "VERDICT_PASS",
		2: "VERDICT_FAIL",
	}
	Result_Prejob_Step_Verdict_value = map[string]int32{
		"VERDICT_UNDEFINED": 0,
		"VERDICT_PASS":      1,
		"VERDICT_FAIL":      2,
	}
)

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

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

func (Result_Prejob_Step_Verdict) Descriptor() protoreflect.EnumDescriptor {
	return file_test_platform_skylab_test_runner_result_proto_enumTypes[1].Descriptor()
}

func (Result_Prejob_Step_Verdict) Type() protoreflect.EnumType {
	return &file_test_platform_skylab_test_runner_result_proto_enumTypes[1]
}

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

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

// Result defines the output format of skylab_test_runner.
// It contains a summary of test results from a single Swarming task run.
type Result struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Which test harness was used.
	//
	// Types that are assignable to Harness:
	//	*Result_AutotestResult
	Harness     isResult_Harness    `protobuf_oneof:"harness"`
	Prejob      *Result_Prejob      `protobuf:"bytes,2,opt,name=prejob,proto3" json:"prejob,omitempty"`
	LogData     *common.TaskLogData `protobuf:"bytes,3,opt,name=log_data,json=logData,proto3" json:"log_data,omitempty"`
	StateUpdate *Result_StateUpdate `protobuf:"bytes,4,opt,name=state_update,json=stateUpdate,proto3" json:"state_update,omitempty"`
	// Set of test results. The string is a UUID used to identify each test, and
	// comes from the client.
	AutotestResults map[string]*Result_Autotest `protobuf:"bytes,6,rep,name=autotest_results,json=autotestResults,proto3" json:"autotest_results,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

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

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

func (*Result) ProtoMessage() {}

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

func (m *Result) GetHarness() isResult_Harness {
	if m != nil {
		return m.Harness
	}
	return nil
}

func (x *Result) GetAutotestResult() *Result_Autotest {
	if x, ok := x.GetHarness().(*Result_AutotestResult); ok {
		return x.AutotestResult
	}
	return nil
}

func (x *Result) GetPrejob() *Result_Prejob {
	if x != nil {
		return x.Prejob
	}
	return nil
}

func (x *Result) GetLogData() *common.TaskLogData {
	if x != nil {
		return x.LogData
	}
	return nil
}

func (x *Result) GetStateUpdate() *Result_StateUpdate {
	if x != nil {
		return x.StateUpdate
	}
	return nil
}

func (x *Result) GetAutotestResults() map[string]*Result_Autotest {
	if x != nil {
		return x.AutotestResults
	}
	return nil
}

type isResult_Harness interface {
	isResult_Harness()
}

type Result_AutotestResult struct {
	AutotestResult *Result_Autotest `protobuf:"bytes,1,opt,name=autotest_result,json=autotestResult,proto3,oneof"`
}

func (*Result_AutotestResult) isResult_Harness() {}

// Autotest describes the result summary for the case of autotest harness.
type Result_Autotest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	TestCases []*Result_Autotest_TestCase `protobuf:"bytes,1,rep,name=test_cases,json=testCases,proto3" json:"test_cases,omitempty"`
	// False if test_cases represents all of the test cases to be run by the
	// task. True otherwise (e.g. the task was aborted early).
	Incomplete bool `protobuf:"varint,2,opt,name=incomplete,proto3" json:"incomplete,omitempty"`
}

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

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

func (*Result_Autotest) ProtoMessage() {}

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

func (x *Result_Autotest) GetTestCases() []*Result_Autotest_TestCase {
	if x != nil {
		return x.TestCases
	}
	return nil
}

func (x *Result_Autotest) GetIncomplete() bool {
	if x != nil {
		return x.Incomplete
	}
	return false
}

// Prejob contains all preparatory operations that run before the actual
// test cases.
type Result_Prejob struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Step []*Result_Prejob_Step `protobuf:"bytes,1,rep,name=step,proto3" json:"step,omitempty"`
}

func (x *Result_Prejob) Reset() {
	*x = Result_Prejob{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_skylab_test_runner_result_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Result_Prejob) ProtoMessage() {}

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

func (x *Result_Prejob) GetStep() []*Result_Prejob_Step {
	if x != nil {
		return x.Step
	}
	return nil
}

// StateUpdate contains Skylab state changes that resulted from the test run.
// It is consumed by `skylab_local_state save`.
type Result_StateUpdate struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// E.g. "needs_repair", "ready" etc.
	DutState string `protobuf:"bytes,1,opt,name=dut_state,json=dutState,proto3" json:"dut_state,omitempty"`
}

func (x *Result_StateUpdate) Reset() {
	*x = Result_StateUpdate{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_skylab_test_runner_result_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Result_StateUpdate) ProtoMessage() {}

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

func (x *Result_StateUpdate) GetDutState() string {
	if x != nil {
		return x.DutState
	}
	return ""
}

// TestCase describes the result of an individual test case.
// A single control file may correspond to multiple test cases.
type Result_Autotest_TestCase struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Test case name as it appears in status.log.
	Name    string                           `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Verdict Result_Autotest_TestCase_Verdict `protobuf:"varint,2,opt,name=verdict,proto3,enum=test_platform.skylab_test_runner.Result_Autotest_TestCase_Verdict" json:"verdict,omitempty"`
	// A one line human readable description of what happened during test
	// case execution (e.g. error/warning message). Not intended to be machine
	// parseable. There's no guarantee that a given root cause will always
	// resolve to the same summary.
	HumanReadableSummary string `protobuf:"bytes,3,opt,name=human_readable_summary,json=humanReadableSummary,proto3" json:"human_readable_summary,omitempty"`
}

func (x *Result_Autotest_TestCase) Reset() {
	*x = Result_Autotest_TestCase{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_skylab_test_runner_result_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Result_Autotest_TestCase) ProtoMessage() {}

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

func (x *Result_Autotest_TestCase) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *Result_Autotest_TestCase) GetVerdict() Result_Autotest_TestCase_Verdict {
	if x != nil {
		return x.Verdict
	}
	return Result_Autotest_TestCase_VERDICT_UNDEFINED
}

func (x *Result_Autotest_TestCase) GetHumanReadableSummary() string {
	if x != nil {
		return x.HumanReadableSummary
	}
	return ""
}

// Step describes an individual prejob operation e.g. provision.
type Result_Prejob_Step struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Step name, e.g. as it appears in status.log.
	Name    string                     `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Verdict Result_Prejob_Step_Verdict `protobuf:"varint,2,opt,name=verdict,proto3,enum=test_platform.skylab_test_runner.Result_Prejob_Step_Verdict" json:"verdict,omitempty"`
	// A one line human readable description of what happened during step
	// execution (e.g. error/warning message). Not intended to be machine
	// parseable. There's no guarantee that a given root cause will always
	// resolve to the same summary.
	HumanReadableSummary string `protobuf:"bytes,3,opt,name=human_readable_summary,json=humanReadableSummary,proto3" json:"human_readable_summary,omitempty"`
}

func (x *Result_Prejob_Step) Reset() {
	*x = Result_Prejob_Step{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_skylab_test_runner_result_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Result_Prejob_Step) ProtoMessage() {}

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

func (x *Result_Prejob_Step) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *Result_Prejob_Step) GetVerdict() Result_Prejob_Step_Verdict {
	if x != nil {
		return x.Verdict
	}
	return Result_Prejob_Step_VERDICT_UNDEFINED
}

func (x *Result_Prejob_Step) GetHumanReadableSummary() string {
	if x != nil {
		return x.HumanReadableSummary
	}
	return ""
}

var File_test_platform_skylab_test_runner_result_proto protoreflect.FileDescriptor

var file_test_platform_skylab_test_runner_result_proto_rawDesc = []byte{
	0x0a, 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, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
	0x20, 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, 0x1a, 0x1f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x22, 0xf4, 0x0a, 0x0a, 0x06, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x5c, 0x0a,
	0x0f, 0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 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, 0x73, 0x75, 0x6c, 0x74,
	0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x61, 0x75, 0x74,
	0x6f, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x47, 0x0a, 0x06, 0x70,
	0x72, 0x65, 0x6a, 0x6f, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 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, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x50, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x52, 0x06, 0x70, 0x72,
	0x65, 0x6a, 0x6f, 0x62, 0x12, 0x3c, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x54, 0x61,
	0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x44, 0x61,
	0x74, 0x61, 0x12, 0x57, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61,
	0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 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, 0x73, 0x75,
	0x6c, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0b,
	0x73, 0x74, 0x61, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x68, 0x0a, 0x10, 0x61,
	0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18,
	0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 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, 0x73, 0x75, 0x6c, 0x74, 0x2e,
	0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x45,
	0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0xb8, 0x03, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65,
	0x73, 0x74, 0x12, 0x59, 0x0a, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x73,
	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 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, 0x73, 0x75, 0x6c, 0x74,
	0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61,
	0x73, 0x65, 0x52, 0x09, 0x74, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x73, 0x12, 0x1e, 0x0a,
	0x0a, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x08, 0x52, 0x0a, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x90, 0x02,
	0x0a, 0x08, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61,
	0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x5c,
	0x0a, 0x07, 0x76, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x42, 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, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65,
	0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x64,
	0x69, 0x63, 0x74, 0x52, 0x07, 0x76, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x12, 0x34, 0x0a, 0x16,
	0x68, 0x75, 0x6d, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73,
	0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x68, 0x75,
	0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61,
	0x72, 0x79, 0x22, 0x5c, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x12, 0x15, 0x0a,
	0x11, 0x56, 0x45, 0x52, 0x44, 0x49, 0x43, 0x54, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e,
	0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x56, 0x45, 0x52, 0x44, 0x49, 0x43, 0x54, 0x5f,
	0x50, 0x41, 0x53, 0x53, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x56, 0x45, 0x52, 0x44, 0x49, 0x43,
	0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 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,
	0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x52, 0x18, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e,
	0x6f, 0x75, 0x73, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x72, 0x6c,
	0x1a, 0xc3, 0x02, 0x0a, 0x06, 0x50, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x12, 0x48, 0x0a, 0x04, 0x73,
	0x74, 0x65, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 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, 0x73,
	0x75, 0x6c, 0x74, 0x2e, 0x50, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x52,
	0x04, 0x73, 0x74, 0x65, 0x70, 0x1a, 0xee, 0x01, 0x0a, 0x04, 0x53, 0x74, 0x65, 0x70, 0x12, 0x12,
	0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61,
	0x6d, 0x65, 0x12, 0x56, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x3c, 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, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x50, 0x72,
	0x65, 0x6a, 0x6f, 0x62, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x56, 0x65, 0x72, 0x64, 0x69, 0x63,
	0x74, 0x52, 0x07, 0x76, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x68, 0x75,
	0x6d, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x75, 0x6d,
	0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x68, 0x75, 0x6d, 0x61,
	0x6e, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79,
	0x22, 0x44, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x12, 0x15, 0x0a, 0x11, 0x56,
	0x45, 0x52, 0x44, 0x49, 0x43, 0x54, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44,
	0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x56, 0x45, 0x52, 0x44, 0x49, 0x43, 0x54, 0x5f, 0x50, 0x41,
	0x53, 0x53, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x56, 0x45, 0x52, 0x44, 0x49, 0x43, 0x54, 0x5f,
	0x46, 0x41, 0x49, 0x4c, 0x10, 0x02, 0x1a, 0x2a, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55,
	0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x75, 0x74, 0x5f, 0x73, 0x74, 0x61,
	0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x75, 0x74, 0x53, 0x74, 0x61,
	0x74, 0x65, 0x1a, 0x75, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x05,
	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 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, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x52, 0x05,
	0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x68, 0x61, 0x72,
	0x6e, 0x65, 0x73, 0x73, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x52, 0x0d, 0x61, 0x73, 0x79, 0x6e,
	0x63, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x42, 0x4c, 0x5a, 0x4a, 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, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_skylab_test_runner_result_proto_rawDescOnce sync.Once
	file_test_platform_skylab_test_runner_result_proto_rawDescData = file_test_platform_skylab_test_runner_result_proto_rawDesc
)

func file_test_platform_skylab_test_runner_result_proto_rawDescGZIP() []byte {
	file_test_platform_skylab_test_runner_result_proto_rawDescOnce.Do(func() {
		file_test_platform_skylab_test_runner_result_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_skylab_test_runner_result_proto_rawDescData)
	})
	return file_test_platform_skylab_test_runner_result_proto_rawDescData
}

var file_test_platform_skylab_test_runner_result_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_test_platform_skylab_test_runner_result_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
var file_test_platform_skylab_test_runner_result_proto_goTypes = []interface{}{
	(Result_Autotest_TestCase_Verdict)(0), // 0: test_platform.skylab_test_runner.Result.Autotest.TestCase.Verdict
	(Result_Prejob_Step_Verdict)(0),       // 1: test_platform.skylab_test_runner.Result.Prejob.Step.Verdict
	(*Result)(nil),                        // 2: test_platform.skylab_test_runner.Result
	(*Result_Autotest)(nil),               // 3: test_platform.skylab_test_runner.Result.Autotest
	(*Result_Prejob)(nil),                 // 4: test_platform.skylab_test_runner.Result.Prejob
	(*Result_StateUpdate)(nil),            // 5: test_platform.skylab_test_runner.Result.StateUpdate
	nil,                                   // 6: test_platform.skylab_test_runner.Result.AutotestResultsEntry
	(*Result_Autotest_TestCase)(nil),      // 7: test_platform.skylab_test_runner.Result.Autotest.TestCase
	(*Result_Prejob_Step)(nil),            // 8: test_platform.skylab_test_runner.Result.Prejob.Step
	(*common.TaskLogData)(nil),            // 9: test_platform.common.TaskLogData
}
var file_test_platform_skylab_test_runner_result_proto_depIdxs = []int32{
	3,  // 0: test_platform.skylab_test_runner.Result.autotest_result:type_name -> test_platform.skylab_test_runner.Result.Autotest
	4,  // 1: test_platform.skylab_test_runner.Result.prejob:type_name -> test_platform.skylab_test_runner.Result.Prejob
	9,  // 2: test_platform.skylab_test_runner.Result.log_data:type_name -> test_platform.common.TaskLogData
	5,  // 3: test_platform.skylab_test_runner.Result.state_update:type_name -> test_platform.skylab_test_runner.Result.StateUpdate
	6,  // 4: test_platform.skylab_test_runner.Result.autotest_results:type_name -> test_platform.skylab_test_runner.Result.AutotestResultsEntry
	7,  // 5: test_platform.skylab_test_runner.Result.Autotest.test_cases:type_name -> test_platform.skylab_test_runner.Result.Autotest.TestCase
	8,  // 6: test_platform.skylab_test_runner.Result.Prejob.step:type_name -> test_platform.skylab_test_runner.Result.Prejob.Step
	3,  // 7: test_platform.skylab_test_runner.Result.AutotestResultsEntry.value:type_name -> test_platform.skylab_test_runner.Result.Autotest
	0,  // 8: test_platform.skylab_test_runner.Result.Autotest.TestCase.verdict:type_name -> test_platform.skylab_test_runner.Result.Autotest.TestCase.Verdict
	1,  // 9: test_platform.skylab_test_runner.Result.Prejob.Step.verdict:type_name -> test_platform.skylab_test_runner.Result.Prejob.Step.Verdict
	10, // [10:10] is the sub-list for method output_type
	10, // [10:10] is the sub-list for method input_type
	10, // [10:10] is the sub-list for extension type_name
	10, // [10:10] is the sub-list for extension extendee
	0,  // [0:10] is the sub-list for field type_name
}

func init() { file_test_platform_skylab_test_runner_result_proto_init() }
func file_test_platform_skylab_test_runner_result_proto_init() {
	if File_test_platform_skylab_test_runner_result_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_platform_skylab_test_runner_result_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Result); 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_result_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Result_Autotest); 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_result_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Result_Prejob); 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_result_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Result_StateUpdate); 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_result_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Result_Autotest_TestCase); 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_result_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Result_Prejob_Step); 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_result_proto_msgTypes[0].OneofWrappers = []interface{}{
		(*Result_AutotestResult)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_platform_skylab_test_runner_result_proto_rawDesc,
			NumEnums:      2,
			NumMessages:   7,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_skylab_test_runner_result_proto_goTypes,
		DependencyIndexes: file_test_platform_skylab_test_runner_result_proto_depIdxs,
		EnumInfos:         file_test_platform_skylab_test_runner_result_proto_enumTypes,
		MessageInfos:      file_test_platform_skylab_test_runner_result_proto_msgTypes,
	}.Build()
	File_test_platform_skylab_test_runner_result_proto = out.File
	file_test_platform_skylab_test_runner_result_proto_rawDesc = nil
	file_test_platform_skylab_test_runner_result_proto_goTypes = nil
	file_test_platform_skylab_test_runner_result_proto_depIdxs = nil
}
