// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.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
}
