// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.27.1
// 	protoc        v3.17.1
// source: tast/test_result.proto

package tast

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

// A proto representation of tast's TestResult golang / JSON object.
//
// Currently this proto is only used for storing tast results for analysis (e.g.
// by Dremel). The golang definition and comments should be used as a source of
// truth.
type TestResult struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Name             string       `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Pkg              string       `protobuf:"bytes,2,opt,name=pkg,proto3" json:"pkg,omitempty"`
	AdditionalTimeNs int64        `protobuf:"varint,3,opt,name=additional_time_ns,json=additionalTime,proto3" json:"additional_time_ns,omitempty"`
	Desc             string       `protobuf:"bytes,4,opt,name=desc,proto3" json:"desc,omitempty"`
	Contacts         []string     `protobuf:"bytes,5,rep,name=contacts,proto3" json:"contacts,omitempty"`
	Attr             []string     `protobuf:"bytes,6,rep,name=attr,proto3" json:"attr,omitempty"`
	Data             []string     `protobuf:"bytes,7,rep,name=data,proto3" json:"data,omitempty"`
	Vars             []string     `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty"`
	SoftwareDeps     []string     `protobuf:"bytes,9,rep,name=software_deps,json=softwareDeps,proto3" json:"software_deps,omitempty"`
	TimeoutNs        int64        `protobuf:"varint,10,opt,name=timeout_ns,json=timeout,proto3" json:"timeout_ns,omitempty"`
	Errors           []*TestError `protobuf:"bytes,11,rep,name=errors,proto3" json:"errors,omitempty"`
	Start            string       `protobuf:"bytes,12,opt,name=start,proto3" json:"start,omitempty"`
	End              string       `protobuf:"bytes,13,opt,name=end,proto3" json:"end,omitempty"`
	OutDir           string       `protobuf:"bytes,14,opt,name=out_dir,json=outDir,proto3" json:"out_dir,omitempty"`
	SkipReason       string       `protobuf:"bytes,15,opt,name=skip_reason,json=skipReason,proto3" json:"skip_reason,omitempty"`
}

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

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

func (*TestResult) ProtoMessage() {}

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

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

func (x *TestResult) GetPkg() string {
	if x != nil {
		return x.Pkg
	}
	return ""
}

func (x *TestResult) GetAdditionalTimeNs() int64 {
	if x != nil {
		return x.AdditionalTimeNs
	}
	return 0
}

func (x *TestResult) GetDesc() string {
	if x != nil {
		return x.Desc
	}
	return ""
}

func (x *TestResult) GetContacts() []string {
	if x != nil {
		return x.Contacts
	}
	return nil
}

func (x *TestResult) GetAttr() []string {
	if x != nil {
		return x.Attr
	}
	return nil
}

func (x *TestResult) GetData() []string {
	if x != nil {
		return x.Data
	}
	return nil
}

func (x *TestResult) GetVars() []string {
	if x != nil {
		return x.Vars
	}
	return nil
}

func (x *TestResult) GetSoftwareDeps() []string {
	if x != nil {
		return x.SoftwareDeps
	}
	return nil
}

func (x *TestResult) GetTimeoutNs() int64 {
	if x != nil {
		return x.TimeoutNs
	}
	return 0
}

func (x *TestResult) GetErrors() []*TestError {
	if x != nil {
		return x.Errors
	}
	return nil
}

func (x *TestResult) GetStart() string {
	if x != nil {
		return x.Start
	}
	return ""
}

func (x *TestResult) GetEnd() string {
	if x != nil {
		return x.End
	}
	return ""
}

func (x *TestResult) GetOutDir() string {
	if x != nil {
		return x.OutDir
	}
	return ""
}

func (x *TestResult) GetSkipReason() string {
	if x != nil {
		return x.SkipReason
	}
	return ""
}

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

	Time   string `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"`
	Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"`
	File   string `protobuf:"bytes,3,opt,name=file,proto3" json:"file,omitempty"`
	Line   int64  `protobuf:"varint,4,opt,name=line,proto3" json:"line,omitempty"`
	Stack  string `protobuf:"bytes,5,opt,name=stack,proto3" json:"stack,omitempty"`
}

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

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

func (*TestError) ProtoMessage() {}

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

func (x *TestError) GetTime() string {
	if x != nil {
		return x.Time
	}
	return ""
}

func (x *TestError) GetReason() string {
	if x != nil {
		return x.Reason
	}
	return ""
}

func (x *TestError) GetFile() string {
	if x != nil {
		return x.File
	}
	return ""
}

func (x *TestError) GetLine() int64 {
	if x != nil {
		return x.Line
	}
	return 0
}

func (x *TestError) GetStack() string {
	if x != nil {
		return x.Stack
	}
	return ""
}

var File_tast_test_result_proto protoreflect.FileDescriptor

var file_tast_test_result_proto_rawDesc = []byte{
	0x0a, 0x16, 0x74, 0x61, 0x73, 0x74, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75,
	0x6c, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x74, 0x61, 0x73, 0x74, 0x22, 0x97,
	0x03, 0x0a, 0x0a, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a,
	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
	0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x6b, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
	0x70, 0x6b, 0x67, 0x12, 0x2a, 0x0a, 0x12, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61,
	0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52,
	0x0e, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12,
	0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,
	0x65, 0x73, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x18,
	0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x73, 0x12,
	0x12, 0x0a, 0x04, 0x61, 0x74, 0x74, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61,
	0x74, 0x74, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x07, 0x20, 0x03, 0x28,
	0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18,
	0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73,
	0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x64, 0x65, 0x70, 0x73, 0x18, 0x09, 0x20, 0x03,
	0x28, 0x09, 0x52, 0x0c, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x44, 0x65, 0x70, 0x73,
	0x12, 0x1b, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x6e, 0x73, 0x18, 0x0a,
	0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x27, 0x0a,
	0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e,
	0x74, 0x61, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x06,
	0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18,
	0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03,
	0x65, 0x6e, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x12, 0x17,
	0x0a, 0x07, 0x6f, 0x75, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x06, 0x6f, 0x75, 0x74, 0x44, 0x69, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x5f,
	0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6b,
	0x69, 0x70, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x75, 0x0a, 0x09, 0x54, 0x65, 0x73, 0x74,
	0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61,
	0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f,
	0x6e, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x04, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x04, 0x20,
	0x01, 0x28, 0x03, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61,
	0x63, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x42,
	0x2d, 0x5a, 0x2b, 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, 0x74, 0x61, 0x73, 0x74, 0x62, 0x06,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_tast_test_result_proto_rawDescOnce sync.Once
	file_tast_test_result_proto_rawDescData = file_tast_test_result_proto_rawDesc
)

func file_tast_test_result_proto_rawDescGZIP() []byte {
	file_tast_test_result_proto_rawDescOnce.Do(func() {
		file_tast_test_result_proto_rawDescData = protoimpl.X.CompressGZIP(file_tast_test_result_proto_rawDescData)
	})
	return file_tast_test_result_proto_rawDescData
}

var file_tast_test_result_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_tast_test_result_proto_goTypes = []interface{}{
	(*TestResult)(nil), // 0: tast.TestResult
	(*TestError)(nil),  // 1: tast.TestError
}
var file_tast_test_result_proto_depIdxs = []int32{
	1, // 0: tast.TestResult.errors:type_name -> tast.TestError
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_tast_test_result_proto_init() }
func file_tast_test_result_proto_init() {
	if File_tast_test_result_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_tast_test_result_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestResult); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_tast_test_result_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestError); 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_tast_test_result_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_tast_test_result_proto_goTypes,
		DependencyIndexes: file_tast_test_result_proto_depIdxs,
		MessageInfos:      file_tast_test_result_proto_msgTypes,
	}.Build()
	File_tast_test_result_proto = out.File
	file_tast_test_result_proto_rawDesc = nil
	file_tast_test_result_proto_goTypes = nil
	file_tast_test_result_proto_depIdxs = nil
}
