// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/rtd/v1/invocation.proto

package invocation

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	lab "go.chromium.org/chromiumos/infra/proto/go/lab"
	services "go.chromium.org/chromiumos/infra/proto/go/lab/services"
	math "math"
	common "test/common"
)

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

// Input to a Remote Test Driver invocation.
//
// TODO(crbug.com/1051691): Link to a reference implementation of Remote Test
// Server & Remote Test Driver.
type Invocation struct {
	// Progress sink to be used to report progress of the Remote Test Driver
	// invocation to the surrounding Remote Test Server.
	ProgressSinkClientConfig *ProgressSinkClientConfig `protobuf:"bytes,1,opt,name=progress_sink_client_config,json=progressSinkClientConfig,proto3" json:"progress_sink_client_config,omitempty"`
	// Set of DUTs used for each of the requests in this invocation.
	Duts []*DUT `protobuf:"bytes,2,rep,name=duts,proto3" json:"duts,omitempty"`
	// Smallest unit of an invocation request for which results must be reported.
	//
	// An invocation must execute all requests serially in-order. This assumption
	// is necessary for future support of test sequences in test plans.
	Requests []*Request `protobuf:"bytes,3,rep,name=requests,proto3" json:"requests,omitempty"`
	// Configuration information for using Test Lab Services to interact
	// with DUTs and their peripherals.
	TestLabServicesConfig *services.ClientConfig `protobuf:"bytes,4,opt,name=test_lab_services_config,json=testLabServicesConfig,proto3" json:"test_lab_services_config,omitempty"`
	XXX_NoUnkeyedLiteral  struct{}               `json:"-"`
	XXX_unrecognized      []byte                 `json:"-"`
	XXX_sizecache         int32                  `json:"-"`
}

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

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

var xxx_messageInfo_Invocation proto.InternalMessageInfo

func (m *Invocation) GetProgressSinkClientConfig() *ProgressSinkClientConfig {
	if m != nil {
		return m.ProgressSinkClientConfig
	}
	return nil
}

func (m *Invocation) GetDuts() []*DUT {
	if m != nil {
		return m.Duts
	}
	return nil
}

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

func (m *Invocation) GetTestLabServicesConfig() *services.ClientConfig {
	if m != nil {
		return m.TestLabServicesConfig
	}
	return nil
}

// Contains all configuration data required to interact with a single device
// under test during a test invocation.
type DUT struct {
	// Device Under Test sepcification.
	Device *common.Device `protobuf:"bytes,1,opt,name=device,proto3" json:"device,omitempty"`
	// Peripherals information about the lab deployment of the device.
	Peripherals *lab.Peripherals `protobuf:"bytes,2,opt,name=peripherals,proto3" json:"peripherals,omitempty"`
	// Name for the DUT for using Test Lab Services to interact with the
	// device and its peripherals.
	// The RTD must pass this to certain Test Lab Service RPCs to specify
	// DUTs to act on.
	// See the tls.OpenDutPortRequest message for an example of where
	// this is used.
	TlsDutName           string   `protobuf:"bytes,3,opt,name=tls_dut_name,json=tlsDutName,proto3" json:"tls_dut_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DUT proto.InternalMessageInfo

func (m *DUT) GetDevice() *common.Device {
	if m != nil {
		return m.Device
	}
	return nil
}

func (m *DUT) GetPeripherals() *lab.Peripherals {
	if m != nil {
		return m.Peripherals
	}
	return nil
}

func (m *DUT) GetTlsDutName() string {
	if m != nil {
		return m.TlsDutName
	}
	return ""
}

// Request for execution of a single test.metadata.Test
type Request struct {
	// name must be unique across all requests in this invocation.
	//
	// Remote Test Drivers are recommended to use name as the opaque tag
	// required by the Test Lab Services API. Thus, name should be unique across
	// all invocations to simplify analytics. UUIDs are recommended.
	//
	// See also:
	//   Test Lab Services API: tls/README.md
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The test to execute, identified by the test.metadata.Test.name field.
	//
	// Note that the request does not contain a reference to the Remote Test
	// Driver to use, as the request is an input to the Remote Test Driver
	// invocation.
	Test string `protobuf:"bytes,2,opt,name=test,proto3" json:"test,omitempty"`
	// Environment configuration set by the Remote Test Server for a specific
	// request of the Remote Test Driver.
	Environment          *Request_Environment `protobuf:"bytes,3,opt,name=environment,proto3" json:"environment,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_Request proto.InternalMessageInfo

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

func (m *Request) GetTest() string {
	if m != nil {
		return m.Test
	}
	return ""
}

func (m *Request) GetEnvironment() *Request_Environment {
	if m != nil {
		return m.Environment
	}
	return nil
}

// Per-request Remote Test Server environment configuration.
type Request_Environment struct {
	// Absolute path to a directory for writing arbitrary files.
	//
	// This directory must be created by Remote Test Server prior to the Remote
	// Test Driver invocation.
	//
	// * Remote Test Drivers should use
	// test.invocation.ProgressClient.ReportLog() to report logs.
	// * Remote Test Drivers should use
	// test.invocation.ProgressClient.ArchiveArtifact() to archive critical
	// artifacts.
	//
	// Remote Test Servers may archive the work_dir contents to non-ephemeral
	// storage as a best effort asynchronous task.
	WorkDir string `protobuf:"bytes,1,opt,name=work_dir,json=workDir,proto3" json:"work_dir,omitempty"`
	// Absolute path to a directory for writing temporary files.
	//
	// This directory must be created by Remote Test Server prior to the Remote
	// Test Driver invocation.
	//
	// Remote Test Drivers must use this directory for temporary files and must
	// not attempt to use defaults like /tmp or the TMP environment variable.
	//
	// See also: Environment.work_dir
	TempDir              string   `protobuf:"bytes,2,opt,name=temp_dir,json=tempDir,proto3" json:"temp_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Request_Environment proto.InternalMessageInfo

func (m *Request_Environment) GetWorkDir() string {
	if m != nil {
		return m.WorkDir
	}
	return ""
}

func (m *Request_Environment) GetTempDir() string {
	if m != nil {
		return m.TempDir
	}
	return ""
}

func init() {
	proto.RegisterType((*Invocation)(nil), "test.rtd.v1.Invocation")
	proto.RegisterType((*DUT)(nil), "test.rtd.v1.DUT")
	proto.RegisterType((*Request)(nil), "test.rtd.v1.Request")
	proto.RegisterType((*Request_Environment)(nil), "test.rtd.v1.Request.Environment")
}

func init() { proto.RegisterFile("test/rtd/v1/invocation.proto", fileDescriptor_8ce9aeaf734a34de) }

var fileDescriptor_8ce9aeaf734a34de = []byte{
	// 465 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x93, 0xdf, 0x6e, 0xd3, 0x30,
	0x14, 0x87, 0x95, 0xb6, 0x5a, 0x37, 0x87, 0x8b, 0xc9, 0x30, 0x29, 0x0b, 0x5c, 0x44, 0x15, 0x48,
	0x95, 0x90, 0x6c, 0x56, 0xae, 0x10, 0x77, 0x6b, 0xb8, 0x40, 0x42, 0x68, 0x4a, 0xb7, 0x1b, 0x6e,
	0xa2, 0xfc, 0xf1, 0x32, 0xab, 0x89, 0x1d, 0x6c, 0x27, 0xbc, 0x02, 0x6f, 0xc1, 0x7b, 0xf0, 0x74,
	0xc8, 0x27, 0x4e, 0x9b, 0x4a, 0xec, 0x2e, 0x3e, 0xdf, 0xe7, 0x73, 0x7e, 0x3d, 0x4d, 0xd0, 0x1b,
	0xc3, 0xb4, 0xa1, 0xca, 0x94, 0xb4, 0xbf, 0xa1, 0x5c, 0xf4, 0xb2, 0xc8, 0x0c, 0x97, 0x82, 0xb4,
	0x4a, 0x1a, 0x89, 0x7d, 0x4b, 0x89, 0x32, 0x25, 0xe9, 0x6f, 0xc2, 0xab, 0x3a, 0xcb, 0x69, 0xcb,
	0x14, 0x6f, 0x9f, 0x98, 0xca, 0x6a, 0x3d, 0x38, 0xe1, 0xb5, 0x2d, 0x6b, 0xa6, 0x7a, 0x5e, 0x30,
	0x4d, 0x8b, 0x9a, 0x33, 0x61, 0x1c, 0x0a, 0xa0, 0x79, 0x21, 0x9b, 0x46, 0x0a, 0x5a, 0x32, 0x6b,
	0x38, 0x12, 0x4e, 0xc7, 0xb6, 0x4a, 0x56, 0x8a, 0x69, 0xd7, 0x70, 0xf5, 0x67, 0x86, 0xd0, 0xd7,
	0x43, 0x12, 0x5c, 0xa2, 0xd7, 0xa3, 0x90, 0x6a, 0x2e, 0xf6, 0xe9, 0x30, 0x22, 0x2d, 0xa4, 0x78,
	0xe4, 0x55, 0xe0, 0x45, 0xde, 0xda, 0xdf, 0xbc, 0x23, 0x93, 0xa4, 0xe4, 0xce, 0xf9, 0x3b, 0x2e,
	0xf6, 0x5b, 0xb0, 0xb7, 0x20, 0x27, 0x41, 0xfb, 0x0c, 0xc1, 0x6f, 0xd1, 0xa2, 0xec, 0x8c, 0x0e,
	0x66, 0xd1, 0x7c, 0xed, 0x6f, 0x2e, 0x4f, 0xda, 0xc5, 0x0f, 0xf7, 0x09, 0x50, 0xfc, 0x01, 0x9d,
	0x2b, 0xf6, 0xb3, 0x63, 0xda, 0xe8, 0x60, 0x0e, 0xe6, 0xab, 0x13, 0x33, 0x19, 0x60, 0x72, 0xb0,
	0xf0, 0x0e, 0xc1, 0x12, 0xd2, 0x3a, 0xcb, 0xd3, 0x71, 0x49, 0x63, 0xf4, 0x05, 0x44, 0x0f, 0x49,
	0x9d, 0xe5, 0x64, 0x64, 0xe4, 0x24, 0xef, 0x95, 0xbd, 0xfb, 0x2d, 0xcb, 0x77, 0x8e, 0x0e, 0xe5,
	0xd5, 0x6f, 0x0f, 0xcd, 0xe3, 0x87, 0x7b, 0xfc, 0x1e, 0x9d, 0x0d, 0x5b, 0x75, 0x5b, 0x78, 0x39,
	0x84, 0x19, 0x16, 0x4e, 0x62, 0x40, 0x89, 0x53, 0xf0, 0x06, 0xf9, 0x93, 0x3f, 0x2f, 0x98, 0xc1,
	0x8d, 0x4b, 0x18, 0x7e, 0x77, 0xac, 0x27, 0x53, 0x09, 0x47, 0xe8, 0x85, 0xa9, 0x75, 0x5a, 0x76,
	0x26, 0x15, 0x59, 0xc3, 0x82, 0x79, 0xe4, 0xad, 0x2f, 0x12, 0x64, 0x6a, 0x1d, 0x77, 0xe6, 0x7b,
	0xd6, 0xb0, 0xd5, 0x5f, 0x0f, 0x2d, 0xdd, 0xaf, 0xc6, 0x18, 0x2d, 0xc0, 0xf2, 0xc0, 0x82, 0x67,
	0x5b, 0xb3, 0x99, 0x60, 0xdc, 0x45, 0x02, 0xcf, 0xf8, 0x16, 0xf9, 0x4c, 0xf4, 0x5c, 0x49, 0xd1,
	0x30, 0x61, 0xa0, 0xa9, 0xbf, 0x89, 0xfe, 0xb7, 0x48, 0xf2, 0xe5, 0xe8, 0x25, 0xd3, 0x4b, 0xe1,
	0x16, 0xf9, 0x13, 0x86, 0xaf, 0xd1, 0xf9, 0x2f, 0xa9, 0xf6, 0x69, 0xc9, 0x95, 0x1b, 0xbf, 0xb4,
	0xe7, 0x98, 0x2b, 0x8b, 0x0c, 0x6b, 0x5a, 0x40, 0x43, 0x8a, 0xa5, 0x3d, 0xc7, 0x5c, 0xdd, 0x7e,
	0xfe, 0xf1, 0xa9, 0x92, 0xa4, 0x78, 0x52, 0xb2, 0xe1, 0x5d, 0x43, 0xa4, 0xaa, 0xe8, 0x78, 0x90,
	0x9a, 0x72, 0xf1, 0xa8, 0x32, 0x0a, 0xef, 0x24, 0xad, 0x24, 0x85, 0x37, 0xf6, 0xf8, 0x85, 0xe4,
	0x67, 0x40, 0x3e, 0xfe, 0x0b, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x32, 0x0a, 0x48, 0x42, 0x03, 0x00,
	0x00,
}
