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

package rtd

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	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

// 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 *TLSClientConfig `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() *TLSClientConfig {
	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 {
	// Name for the DUT for using Test Lab Services to interact with the
	// device and its peripherals.
	//
	// The RTD MUST pass this to Test Lab Service RPCs that act on a particular
	// DUT. See the tls.OpenDutPortRequest message for an example of where
	// this is used.
	TlsDutName           string   `protobuf:"bytes,1,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) 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 ""
}

// Configuration information required for using Test Lab & Wiring Services.
type TLSClientConfig struct {
	// Address where Test Lab Services is reachable.
	// This should be an IPv4 or IPv6 address to avoid name
	// resolution issues.
	// IPv4 addresses will be in standard dotted decimal notation.
	// IPv6 addresses will be formatted according to RFC4291, Section
	// 2.2, 1. (no zero compression)
	// If this is a hostname, the RTS should ensure that the hostname
	// can be resolved by the RTD via standard name resolution
	// facilities.
	TlsAddress string `protobuf:"bytes,1,opt,name=tls_address,json=tlsAddress,proto3" json:"tls_address,omitempty"`
	// Port on the tls_address where the service is reachable.
	TlsPort int32 `protobuf:"varint,2,opt,name=tls_port,json=tlsPort,proto3" json:"tls_port,omitempty"`
	// Address where Test Lab Services Wiring is reachable.
	// This has the same format as tls_address.
	TlwAddress string `protobuf:"bytes,3,opt,name=tlw_address,json=tlwAddress,proto3" json:"tlw_address,omitempty"`
	// Port on the tlw_address where the service is reachable.
	TlwPort              int32    `protobuf:"varint,4,opt,name=tlw_port,json=tlwPort,proto3" json:"tlw_port,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TLSClientConfig proto.InternalMessageInfo

func (m *TLSClientConfig) GetTlsAddress() string {
	if m != nil {
		return m.TlsAddress
	}
	return ""
}

func (m *TLSClientConfig) GetTlsPort() int32 {
	if m != nil {
		return m.TlsPort
	}
	return 0
}

func (m *TLSClientConfig) GetTlwAddress() string {
	if m != nil {
		return m.TlwAddress
	}
	return ""
}

func (m *TLSClientConfig) GetTlwPort() int32 {
	if m != nil {
		return m.TlwPort
	}
	return 0
}

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")
	proto.RegisterType((*TLSClientConfig)(nil), "test.rtd.v1.TLSClientConfig")
}

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

var fileDescriptor_8ce9aeaf734a34de = []byte{
	// 444 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x92, 0xc1, 0x8e, 0xd3, 0x30,
	0x10, 0x86, 0xd5, 0xa6, 0xd0, 0xc5, 0x41, 0x02, 0x59, 0x20, 0x85, 0xb2, 0x12, 0x55, 0x05, 0x62,
	0x4f, 0x09, 0xbb, 0x9c, 0xd0, 0x9e, 0xd8, 0x86, 0x03, 0xd2, 0x0a, 0xad, 0xd2, 0xf6, 0xc2, 0x25,
	0x4a, 0x63, 0x6f, 0xb0, 0x9a, 0xd8, 0x61, 0x3c, 0x49, 0x9e, 0x81, 0xc7, 0xe0, 0x35, 0x78, 0x3a,
	0x64, 0xbb, 0x29, 0x09, 0x82, 0x5b, 0x66, 0xfe, 0xef, 0x1f, 0xff, 0xe3, 0x98, 0x9c, 0x23, 0xd7,
	0x18, 0x01, 0xb2, 0xa8, 0xbd, 0x8c, 0x84, 0x6c, 0x55, 0x9e, 0xa1, 0x50, 0x32, 0xac, 0x41, 0xa1,
	0xa2, 0xbe, 0x51, 0x43, 0x40, 0x16, 0xb6, 0x97, 0x8b, 0xc5, 0x10, 0xad, 0x41, 0x15, 0xc0, 0xb5,
	0x76, 0xe0, 0xea, 0xe7, 0x94, 0x90, 0xcf, 0x27, 0x37, 0x65, 0xe4, 0x65, 0x0f, 0xa4, 0x5a, 0xc8,
	0x43, 0x9a, 0x97, 0x82, 0x4b, 0x4c, 0x73, 0x25, 0xef, 0x45, 0x11, 0x4c, 0x96, 0x93, 0x0b, 0xff,
	0xea, 0x4d, 0x38, 0x98, 0x1e, 0xde, 0x1d, 0xf9, 0x8d, 0x90, 0x87, 0xb5, 0xa5, 0xd7, 0x16, 0x4e,
	0x82, 0xfa, 0x3f, 0x0a, 0x7d, 0x4d, 0x66, 0xac, 0x41, 0x1d, 0x4c, 0x97, 0xde, 0x85, 0x7f, 0xf5,
	0x74, 0x34, 0x2e, 0xde, 0x6d, 0x13, 0xab, 0xd2, 0x77, 0xe4, 0x0c, 0xf8, 0xf7, 0x86, 0x6b, 0xd4,
	0x81, 0x67, 0xc9, 0x67, 0x23, 0x32, 0x71, 0x62, 0x72, 0xa2, 0xe8, 0x8e, 0x04, 0x06, 0x48, 0xcb,
	0x6c, 0x9f, 0x6a, 0x0e, 0xad, 0xc8, 0xb9, 0xee, 0xa3, 0xcf, 0x6c, 0xf4, 0xf3, 0xd1, 0x84, 0xed,
	0xed, 0x66, 0x94, 0xf8, 0xb9, 0x11, 0x6f, 0xb3, 0xfd, 0xe6, 0xe8, 0x75, 0xed, 0xd5, 0x5b, 0xe2,
	0xc5, 0xbb, 0x2d, 0x5d, 0x92, 0xc7, 0x58, 0xea, 0x94, 0x35, 0x98, 0xca, 0xac, 0xe2, 0xf6, 0x32,
	0x1e, 0x25, 0x04, 0x4b, 0x1d, 0x37, 0xf8, 0x25, 0xab, 0xf8, 0xea, 0xd7, 0x84, 0xcc, 0x8f, 0xa9,
	0x28, 0x25, 0xb3, 0x01, 0x65, 0xbf, 0x4d, 0xcf, 0x9c, 0x10, 0x4c, 0x5d, 0xcf, 0x7c, 0xd3, 0x1b,
	0xe2, 0x73, 0xd9, 0x0a, 0x50, 0xb2, 0xe2, 0x12, 0x03, 0xcf, 0xc6, 0x5c, 0xfe, 0x6b, 0xd1, 0xf0,
	0xd3, 0x1f, 0x2e, 0x19, 0x9a, 0x16, 0x6b, 0xe2, 0x0f, 0x34, 0xfa, 0x82, 0x9c, 0x75, 0x0a, 0x0e,
	0x29, 0x13, 0x70, 0x3c, 0x7e, 0x6e, 0xea, 0x58, 0x80, 0x91, 0x90, 0x57, 0xb5, 0x95, 0x5c, 0x8a,
	0xb9, 0xa9, 0x63, 0x01, 0xab, 0x1f, 0x13, 0xf2, 0xe4, 0xaf, 0x0b, 0xa1, 0xaf, 0x88, 0x6f, 0x56,
	0xce, 0x18, 0x33, 0xff, 0x71, 0xb0, 0xf1, 0x47, 0xd7, 0xb1, 0xf3, 0x4a, 0x9d, 0xd6, 0x0a, 0xdc,
	0x56, 0x0f, 0x92, 0x39, 0x96, 0xfa, 0x4e, 0x01, 0x3a, 0x6f, 0x77, 0xf2, 0x7a, 0xbd, 0xb7, 0x1b,
	0x79, 0x3b, 0xe7, 0x9d, 0xf5, 0xde, 0xce, 0x78, 0x6f, 0xae, 0xbf, 0x7e, 0x28, 0x54, 0x98, 0x7f,
	0x03, 0x55, 0x89, 0xa6, 0x0a, 0x15, 0x14, 0x51, 0x5f, 0x28, 0x1d, 0x09, 0x79, 0x0f, 0x59, 0x64,
	0xdf, 0x6f, 0x54, 0xa8, 0x68, 0xf0, 0xba, 0xaf, 0x01, 0xd9, 0xfe, 0xa1, 0x55, 0xde, 0xff, 0x0e,
	0x00, 0x00, 0xff, 0xff, 0xe2, 0x21, 0x46, 0x7a, 0x22, 0x03, 0x00, 0x00,
}
