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

package steps

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	api "go.chromium.org/chromiumos/infra/proto/go/chromite/api"
	test_platform "go.chromium.org/chromiumos/infra/proto/go/test_platform"
	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

type EnumerationRequests struct {
	// Each EnumerationRequest is handled independently.
	Requests             []*EnumerationRequest          `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty"`
	TaggedRequests       map[string]*EnumerationRequest `protobuf:"bytes,2,rep,name=tagged_requests,json=taggedRequests,proto3" json:"tagged_requests,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

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

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

var xxx_messageInfo_EnumerationRequests proto.InternalMessageInfo

func (m *EnumerationRequests) GetRequests() []*EnumerationRequest {
	if m != nil {
		return m.Requests
	}
	return nil
}

func (m *EnumerationRequests) GetTaggedRequests() map[string]*EnumerationRequest {
	if m != nil {
		return m.TaggedRequests
	}
	return nil
}

type EnumerationResponses struct {
	// Each EnumerationResponse corresponds to a single EnumerationRequest
	// handled independently.
	Responses            []*EnumerationResponse          `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
	TaggedResponses      map[string]*EnumerationResponse `protobuf:"bytes,2,rep,name=tagged_responses,json=taggedResponses,proto3" json:"tagged_responses,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

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

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

var xxx_messageInfo_EnumerationResponses proto.InternalMessageInfo

func (m *EnumerationResponses) GetResponses() []*EnumerationResponse {
	if m != nil {
		return m.Responses
	}
	return nil
}

func (m *EnumerationResponses) GetTaggedResponses() map[string]*EnumerationResponse {
	if m != nil {
		return m.TaggedResponses
	}
	return nil
}

// EnumerationRequest defines the input of the test enumeration step.
type EnumerationRequest struct {
	Metadata             *test_platform.Request_Params_Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
	TestPlan             *test_platform.Request_TestPlan        `protobuf:"bytes,4,opt,name=test_plan,json=testPlan,proto3" json:"test_plan,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
	XXX_unrecognized     []byte                                 `json:"-"`
	XXX_sizecache        int32                                  `json:"-"`
}

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

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

var xxx_messageInfo_EnumerationRequest proto.InternalMessageInfo

func (m *EnumerationRequest) GetMetadata() *test_platform.Request_Params_Metadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *EnumerationRequest) GetTestPlan() *test_platform.Request_TestPlan {
	if m != nil {
		return m.TestPlan
	}
	return nil
}

// EnumerationResponse defines the output of the test enumeration step.
//
// This is copied in test_platform.Request.Enumeration
// Keep in sync.
type EnumerationResponse struct {
	AutotestInvocations []*EnumerationResponse_AutotestInvocation `protobuf:"bytes,2,rep,name=autotest_invocations,json=autotestInvocations,proto3" json:"autotest_invocations,omitempty"`
	// If set, a summary of the errors encountered during enumeration.
	//
	// If set, the corresponding request's final verdict must reflect failure.
	//
	// autotest_invocations may be non-empty even when error_summary is set.
	// In that case all included autotest_invocations must be executed, despite
	// the error_summary.
	ErrorSummary         string   `protobuf:"bytes,3,opt,name=error_summary,json=errorSummary,proto3" json:"error_summary,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *EnumerationResponse) Reset()         { *m = EnumerationResponse{} }
func (m *EnumerationResponse) String() string { return proto.CompactTextString(m) }
func (*EnumerationResponse) ProtoMessage()    {}
func (*EnumerationResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_2e663b0bcf1c9d2c, []int{3}
}

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

var xxx_messageInfo_EnumerationResponse proto.InternalMessageInfo

func (m *EnumerationResponse) GetAutotestInvocations() []*EnumerationResponse_AutotestInvocation {
	if m != nil {
		return m.AutotestInvocations
	}
	return nil
}

func (m *EnumerationResponse) GetErrorSummary() string {
	if m != nil {
		return m.ErrorSummary
	}
	return ""
}

type EnumerationResponse_AutotestInvocation struct {
	Test *api.AutotestTest `protobuf:"bytes,1,opt,name=test,proto3" json:"test,omitempty"`
	// Passthrough arguments from test_platform.Request_Test
	TestArgs    string `protobuf:"bytes,2,opt,name=test_args,json=testArgs,proto3" json:"test_args,omitempty"`
	DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// result_keyvals are autotest keyvals that should be included in the
	// results corresponding to this invocation.
	//
	// These keyvals are overridden by Request.Decorations.autotest_keyvals.
	ResultKeyvals        map[string]string `protobuf:"bytes,4,rep,name=result_keyvals,json=resultKeyvals,proto3" json:"result_keyvals,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_EnumerationResponse_AutotestInvocation proto.InternalMessageInfo

func (m *EnumerationResponse_AutotestInvocation) GetTest() *api.AutotestTest {
	if m != nil {
		return m.Test
	}
	return nil
}

func (m *EnumerationResponse_AutotestInvocation) GetTestArgs() string {
	if m != nil {
		return m.TestArgs
	}
	return ""
}

func (m *EnumerationResponse_AutotestInvocation) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *EnumerationResponse_AutotestInvocation) GetResultKeyvals() map[string]string {
	if m != nil {
		return m.ResultKeyvals
	}
	return nil
}

func init() {
	proto.RegisterType((*EnumerationRequests)(nil), "test_platform.steps.EnumerationRequests")
	proto.RegisterMapType((map[string]*EnumerationRequest)(nil), "test_platform.steps.EnumerationRequests.TaggedRequestsEntry")
	proto.RegisterType((*EnumerationResponses)(nil), "test_platform.steps.EnumerationResponses")
	proto.RegisterMapType((map[string]*EnumerationResponse)(nil), "test_platform.steps.EnumerationResponses.TaggedResponsesEntry")
	proto.RegisterType((*EnumerationRequest)(nil), "test_platform.steps.EnumerationRequest")
	proto.RegisterType((*EnumerationResponse)(nil), "test_platform.steps.EnumerationResponse")
	proto.RegisterType((*EnumerationResponse_AutotestInvocation)(nil), "test_platform.steps.EnumerationResponse.AutotestInvocation")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.steps.EnumerationResponse.AutotestInvocation.ResultKeyvalsEntry")
}

func init() {
	proto.RegisterFile("test_platform/steps/enumeration.proto", fileDescriptor_2e663b0bcf1c9d2c)
}

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