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

package phosphorus

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

// Values should be consistent with https://aip.dev/216
type RunTestResponse_State int32

const (
	// Should not be used.
	RunTestResponse_STATE_UNSPECIFIED RunTestResponse_State = 0
	// The test succeeded.
	//
	// Some test failures may not be detectable during execution. These
	// failures will be detected when parsing results off the test logs in a
	// later step of test_runner.
	RunTestResponse_SUCCEEDED RunTestResponse_State = 1
	// The test failed.
	RunTestResponse_FAILED RunTestResponse_State = 2
	// The test hit the requested timeout.
	RunTestResponse_TIMED_OUT RunTestResponse_State = 3
	// The test was aborted externally.
	RunTestResponse_ABORTED RunTestResponse_State = 4
)

var RunTestResponse_State_name = map[int32]string{
	0: "STATE_UNSPECIFIED",
	1: "SUCCEEDED",
	2: "FAILED",
	3: "TIMED_OUT",
	4: "ABORTED",
}

var RunTestResponse_State_value = map[string]int32{
	"STATE_UNSPECIFIED": 0,
	"SUCCEEDED":         1,
	"FAILED":            2,
	"TIMED_OUT":         3,
	"ABORTED":           4,
}

func (x RunTestResponse_State) String() string {
	return proto.EnumName(RunTestResponse_State_name, int32(x))
}

func (RunTestResponse_State) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c8a06e1d821d63d9, []int{1, 0}
}

// RunTestRequest defines the input of `phosphorus runtest`.
type RunTestRequest struct {
	Config *Config `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
	// A test may use more than one DUT at once.
	DutHostnames []string `protobuf:"bytes,2,rep,name=dut_hostnames,json=dutHostnames,proto3" json:"dut_hostnames,omitempty"`
	// Types that are valid to be assigned to Test:
	//	*RunTestRequest_Autotest_
	Test isRunTestRequest_Test `protobuf_oneof:"test"`
	// Hard deadline for execution.
	//
	// All test execution should abort beyond this deadline.
	Deadline             *timestamp.Timestamp `protobuf:"bytes,5,opt,name=deadline,proto3" json:"deadline,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_RunTestRequest proto.InternalMessageInfo

func (m *RunTestRequest) GetConfig() *Config {
	if m != nil {
		return m.Config
	}
	return nil
}

func (m *RunTestRequest) GetDutHostnames() []string {
	if m != nil {
		return m.DutHostnames
	}
	return nil
}

type isRunTestRequest_Test interface {
	isRunTestRequest_Test()
}

type RunTestRequest_Autotest_ struct {
	Autotest *RunTestRequest_Autotest `protobuf:"bytes,3,opt,name=autotest,proto3,oneof"`
}

func (*RunTestRequest_Autotest_) isRunTestRequest_Test() {}

func (m *RunTestRequest) GetTest() isRunTestRequest_Test {
	if m != nil {
		return m.Test
	}
	return nil
}

func (m *RunTestRequest) GetAutotest() *RunTestRequest_Autotest {
	if x, ok := m.GetTest().(*RunTestRequest_Autotest_); ok {
		return x.Autotest
	}
	return nil
}

func (m *RunTestRequest) GetDeadline() *timestamp.Timestamp {
	if m != nil {
		return m.Deadline
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*RunTestRequest) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*RunTestRequest_Autotest_)(nil),
	}
}

// Autotest describes the DUT-agnostic parameters of an autotest test run.
type RunTestRequest_Autotest struct {
	// Test name as given in the control file.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Args to pass into the test run (meaning depends on the test).
	TestArgs string `protobuf:"bytes,2,opt,name=test_args,json=testArgs,proto3" json:"test_args,omitempty"`
	// Name to be used to display this test's output artifacts, e.g. logs,
	// results etc. By default display_name is the same as name.
	DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// True for client-side tests, false for server-side tests.
	IsClientTest bool `protobuf:"varint,4,opt,name=is_client_test,json=isClientTest,proto3" json:"is_client_test,omitempty"`
	// Key:value pairs added to the autoserv command. These are metadata which
	// should not affect code execution.
	Keyvals              map[string]string `protobuf:"bytes,5,rep,name=keyvals,proto3" json:"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 *RunTestRequest_Autotest) Reset()         { *m = RunTestRequest_Autotest{} }
func (m *RunTestRequest_Autotest) String() string { return proto.CompactTextString(m) }
func (*RunTestRequest_Autotest) ProtoMessage()    {}
func (*RunTestRequest_Autotest) Descriptor() ([]byte, []int) {
	return fileDescriptor_c8a06e1d821d63d9, []int{0, 0}
}

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

var xxx_messageInfo_RunTestRequest_Autotest proto.InternalMessageInfo

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

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

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

func (m *RunTestRequest_Autotest) GetIsClientTest() bool {
	if m != nil {
		return m.IsClientTest
	}
	return false
}

func (m *RunTestRequest_Autotest) GetKeyvals() map[string]string {
	if m != nil {
		return m.Keyvals
	}
	return nil
}

// RunTestResponse defines the output of `phosphorus runtest`.
type RunTestResponse struct {
	// `phosphorus runtest` exits with exit code 0 unless there is an
	// infrastructure failure. When the exit code is 0, `state` indicates the
	// best known state of the test execution (see comments on State enum).
	State RunTestResponse_State `protobuf:"varint,1,opt,name=state,proto3,enum=test_platform.phosphorus.RunTestResponse_State" json:"state,omitempty"`
	// Absolute path to the test results directory created by `runtest`.
	// Must be inside config.task.results_dir (the overall results directory).
	ResultsDir           string   `protobuf:"bytes,2,opt,name=results_dir,json=resultsDir,proto3" json:"results_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RunTestResponse proto.InternalMessageInfo

func (m *RunTestResponse) GetState() RunTestResponse_State {
	if m != nil {
		return m.State
	}
	return RunTestResponse_STATE_UNSPECIFIED
}

func (m *RunTestResponse) GetResultsDir() string {
	if m != nil {
		return m.ResultsDir
	}
	return ""
}

func init() {
	proto.RegisterEnum("test_platform.phosphorus.RunTestResponse_State", RunTestResponse_State_name, RunTestResponse_State_value)
	proto.RegisterType((*RunTestRequest)(nil), "test_platform.phosphorus.RunTestRequest")
	proto.RegisterType((*RunTestRequest_Autotest)(nil), "test_platform.phosphorus.RunTestRequest.Autotest")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.phosphorus.RunTestRequest.Autotest.KeyvalsEntry")
	proto.RegisterType((*RunTestResponse)(nil), "test_platform.phosphorus.RunTestResponse")
}

func init() {
	proto.RegisterFile("test_platform/phosphorus/runtest.proto", fileDescriptor_c8a06e1d821d63d9)
}

var fileDescriptor_c8a06e1d821d63d9 = []byte{
	// 562 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0xdd, 0x6e, 0xda, 0x30,
	0x18, 0x2d, 0x10, 0x28, 0x7c, 0xd0, 0x2e, 0xb3, 0x36, 0x09, 0xb1, 0x8b, 0xb2, 0xee, 0x47, 0x5c,
	0x25, 0x5a, 0x27, 0x4d, 0x55, 0x2f, 0x26, 0x01, 0x49, 0x55, 0xf6, 0xd3, 0x4e, 0x26, 0x48, 0xd3,
	0x6e, 0xa2, 0x14, 0x4c, 0xb0, 0x9a, 0xd8, 0x99, 0xed, 0x54, 0xe2, 0x55, 0xf6, 0x14, 0x7b, 0x94,
	0x3d, 0xd2, 0x64, 0x27, 0x61, 0xeb, 0x05, 0xd2, 0x76, 0x67, 0x7f, 0xdf, 0x39, 0xc7, 0xe7, 0x1c,
	0xc9, 0xf0, 0x5a, 0x11, 0xa9, 0xc2, 0x2c, 0x89, 0xd4, 0x9a, 0x8b, 0xd4, 0xcd, 0x36, 0x5c, 0x66,
	0x1b, 0x2e, 0x72, 0xe9, 0x8a, 0x9c, 0xe9, 0x9d, 0x93, 0x09, 0xae, 0x38, 0xea, 0x3f, 0xc0, 0x39,
	0x7f, 0x70, 0x83, 0x93, 0x98, 0xf3, 0x38, 0x21, 0xae, 0xc1, 0xdd, 0xe6, 0x6b, 0x57, 0xd1, 0x94,
	0x48, 0x15, 0xa5, 0x59, 0x41, 0x1d, 0xbc, 0xda, 0xfb, 0xc4, 0x92, 0xa7, 0x29, 0x67, 0x05, 0xec,
	0xf4, 0xa7, 0x05, 0xc7, 0x38, 0x67, 0x01, 0x91, 0x0a, 0x93, 0xef, 0x39, 0x91, 0x0a, 0x9d, 0x43,
	0x6b, 0xc9, 0xd9, 0x9a, 0xc6, 0xfd, 0xda, 0xb0, 0x36, 0xea, 0x9e, 0x0d, 0x9d, 0x7d, 0x2e, 0x9c,
	0xa9, 0xc1, 0xe1, 0x12, 0x8f, 0x5e, 0xc0, 0xd1, 0x2a, 0x57, 0xe1, 0x86, 0x4b, 0xc5, 0xa2, 0x94,
	0xc8, 0x7e, 0x7d, 0xd8, 0x18, 0x75, 0x70, 0x6f, 0x95, 0xab, 0xab, 0x6a, 0x86, 0x6e, 0xa0, 0x1d,
	0xe5, 0x8a, 0x6b, 0xcd, 0x7e, 0xc3, 0x3c, 0xf0, 0x66, 0xff, 0x03, 0x0f, 0xad, 0x39, 0xe3, 0x92,
	0x78, 0x75, 0x80, 0x77, 0x22, 0xe8, 0x1d, 0xb4, 0x57, 0x24, 0x5a, 0x25, 0x94, 0x91, 0x7e, 0xd3,
	0x08, 0x0e, 0x9c, 0xa2, 0x1d, 0xa7, 0x6a, 0xc7, 0x09, 0xaa, 0x76, 0xf0, 0x0e, 0x3b, 0xf8, 0x51,
	0x87, 0x76, 0x25, 0x88, 0x10, 0x58, 0xda, 0x9e, 0x89, 0xdc, 0xc1, 0xe6, 0x8c, 0x9e, 0x41, 0xc7,
	0x18, 0x8b, 0x44, 0xac, 0xa3, 0xe8, 0x45, 0x5b, 0x0f, 0xc6, 0x22, 0x96, 0xe8, 0x39, 0xf4, 0x56,
	0x54, 0x66, 0x49, 0xb4, 0x0d, 0x0d, 0xb1, 0x61, 0xf6, 0xdd, 0x72, 0x76, 0xad, 0xf9, 0x2f, 0xe1,
	0x98, 0xca, 0x70, 0x99, 0x50, 0xc2, 0x54, 0x68, 0xf2, 0x5a, 0xc3, 0xda, 0xa8, 0x8d, 0x7b, 0x54,
	0x4e, 0xcd, 0x50, 0x47, 0x43, 0x5f, 0xe1, 0xf0, 0x8e, 0x6c, 0xef, 0xa3, 0x44, 0xf6, 0x9b, 0xc3,
	0xc6, 0xa8, 0x7b, 0xf6, 0xfe, 0xbf, 0xeb, 0x70, 0x3e, 0x16, 0x02, 0x3e, 0x53, 0x62, 0x8b, 0x2b,
	0xb9, 0xc1, 0x05, 0xf4, 0xfe, 0x5e, 0x20, 0x1b, 0x1a, 0x77, 0x64, 0x5b, 0x46, 0xd4, 0x47, 0xf4,
	0x04, 0x9a, 0xf7, 0x51, 0x92, 0x93, 0x32, 0x5d, 0x71, 0xb9, 0xa8, 0x9f, 0xd7, 0x26, 0x2d, 0xb0,
	0xb4, 0xf2, 0x07, 0xab, 0x6d, 0xd9, 0x4d, 0xdc, 0x25, 0xec, 0x9e, 0x0a, 0xce, 0x52, 0xc2, 0xd4,
	0xe9, 0xaf, 0x1a, 0x3c, 0xda, 0x19, 0x91, 0x19, 0x67, 0x92, 0x20, 0x1f, 0x9a, 0x52, 0x45, 0xaa,
	0xe8, 0xef, 0xf8, 0xcc, 0xfd, 0x87, 0x08, 0x05, 0xd3, 0x99, 0x6b, 0x1a, 0x2e, 0xd8, 0xe8, 0x04,
	0xba, 0x82, 0xc8, 0x3c, 0x51, 0x32, 0x5c, 0x51, 0x51, 0xba, 0x82, 0x72, 0xe4, 0x51, 0x71, 0xba,
	0x80, 0xa6, 0x21, 0xa0, 0xa7, 0xf0, 0x78, 0x1e, 0x8c, 0x03, 0x3f, 0x5c, 0x5c, 0xcf, 0xbf, 0xf8,
	0xd3, 0xd9, 0xe5, 0xcc, 0xf7, 0xec, 0x03, 0x74, 0x04, 0x9d, 0xf9, 0x62, 0x3a, 0xf5, 0x7d, 0xcf,
	0xf7, 0xec, 0x1a, 0x02, 0x68, 0x5d, 0x8e, 0x67, 0x9f, 0x7c, 0xcf, 0xae, 0xeb, 0x55, 0x30, 0xfb,
	0xec, 0x7b, 0xe1, 0xcd, 0x22, 0xb0, 0x1b, 0xa8, 0x0b, 0x87, 0xe3, 0xc9, 0x0d, 0x0e, 0x7c, 0xcf,
	0xb6, 0x26, 0xde, 0xb7, 0x49, 0xcc, 0x9d, 0xe5, 0x46, 0xf0, 0x94, 0xe6, 0xa9, 0xc3, 0x45, 0xec,
	0x56, 0x17, 0x2e, 0x5d, 0xca, 0xd6, 0x22, 0x2a, 0x7e, 0x9a, 0x1b, 0x73, 0x77, 0xdf, 0xc7, 0xba,
	0x6d, 0x19, 0xc8, 0xdb, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd3, 0x69, 0x9f, 0xc7, 0xde, 0x03,
	0x00, 0x00,
}
