// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromite/api/test.proto

package api

import (
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	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)
)

// The program that manages and runs the tests in the VM.
type VmTestRequest_TestHarness int32

const (
	// No test harness specified.
	VmTestRequest_UNSPECIFIED VmTestRequest_TestHarness = 0
	// Run tests with Tast.
	VmTestRequest_TAST VmTestRequest_TestHarness = 1
	// Run tests with Autotest.
	VmTestRequest_AUTOTEST VmTestRequest_TestHarness = 2
)

// Enum value maps for VmTestRequest_TestHarness.
var (
	VmTestRequest_TestHarness_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "TAST",
		2: "AUTOTEST",
	}
	VmTestRequest_TestHarness_value = map[string]int32{
		"UNSPECIFIED": 0,
		"TAST":        1,
		"AUTOTEST":    2,
	}
)

func (x VmTestRequest_TestHarness) Enum() *VmTestRequest_TestHarness {
	p := new(VmTestRequest_TestHarness)
	*p = x
	return p
}

func (x VmTestRequest_TestHarness) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (VmTestRequest_TestHarness) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_test_proto_enumTypes[0].Descriptor()
}

func (VmTestRequest_TestHarness) Type() protoreflect.EnumType {
	return &file_chromite_api_test_proto_enumTypes[0]
}

func (x VmTestRequest_TestHarness) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use VmTestRequest_TestHarness.Descriptor instead.
func (VmTestRequest_TestHarness) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{10, 0}
}

type BuildTargetUnitTestRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The build target being tested.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The path where the result tarball should be saved.
	ResultPath string `protobuf:"bytes,2,opt,name=result_path,json=resultPath,proto3" json:"result_path,omitempty"`
	// The chroot containing the sysroot.
	Chroot *chromiumos.Chroot `protobuf:"bytes,3,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The flags.
	Flags *BuildTargetUnitTestRequest_Flags `protobuf:"bytes,4,opt,name=flags,proto3" json:"flags,omitempty"`
	// Skipped packages.
	// Deprecated in favor of package_blocklist.
	// Left in place for compatibility for now.
	// TODO(crbug/1126855): Change to reserved after branches R87 and earlier are
	// no longer supported, and recipes have stopped setting the field.
	// Last used in R87.  Remove no earlier than 2021-06-01.
	PackageBlacklist []*chromiumos.PackageInfo `protobuf:"bytes,5,rep,name=package_blacklist,json=packageBlacklist,proto3" json:"package_blacklist,omitempty"`
	// Packages to be tested.
	// Defaults to all testable packages when none are given.
	Packages []*chromiumos.PackageInfo `protobuf:"bytes,6,rep,name=packages,proto3" json:"packages,omitempty"`
	// Skipped packages.
	PackageBlocklist []*chromiumos.PackageInfo `protobuf:"bytes,7,rep,name=package_blocklist,json=packageBlocklist,proto3" json:"package_blocklist,omitempty"`
}

func (x *BuildTargetUnitTestRequest) Reset() {
	*x = BuildTargetUnitTestRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BuildTargetUnitTestRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BuildTargetUnitTestRequest) ProtoMessage() {}

func (x *BuildTargetUnitTestRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_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 BuildTargetUnitTestRequest.ProtoReflect.Descriptor instead.
func (*BuildTargetUnitTestRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{0}
}

func (x *BuildTargetUnitTestRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

func (x *BuildTargetUnitTestRequest) GetResultPath() string {
	if x != nil {
		return x.ResultPath
	}
	return ""
}

func (x *BuildTargetUnitTestRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *BuildTargetUnitTestRequest) GetFlags() *BuildTargetUnitTestRequest_Flags {
	if x != nil {
		return x.Flags
	}
	return nil
}

func (x *BuildTargetUnitTestRequest) GetPackageBlacklist() []*chromiumos.PackageInfo {
	if x != nil {
		return x.PackageBlacklist
	}
	return nil
}

func (x *BuildTargetUnitTestRequest) GetPackages() []*chromiumos.PackageInfo {
	if x != nil {
		return x.Packages
	}
	return nil
}

func (x *BuildTargetUnitTestRequest) GetPackageBlocklist() []*chromiumos.PackageInfo {
	if x != nil {
		return x.PackageBlocklist
	}
	return nil
}

type BuildTargetUnitTestResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The unittest tarball that was created.
	TarballPath string `protobuf:"bytes,1,opt,name=tarball_path,json=tarballPath,proto3" json:"tarball_path,omitempty"`
	// The list of packages that failed.
	FailedPackages []*chromiumos.PackageInfo `protobuf:"bytes,2,rep,name=failed_packages,json=failedPackages,proto3" json:"failed_packages,omitempty"`
	// The metric events that occurred during the running of BuildTargetUnitTest.
	Events []*chromiumos.MetricEvent `protobuf:"bytes,3,rep,name=events,proto3" json:"events,omitempty"`
}

func (x *BuildTargetUnitTestResponse) Reset() {
	*x = BuildTargetUnitTestResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BuildTargetUnitTestResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BuildTargetUnitTestResponse) ProtoMessage() {}

func (x *BuildTargetUnitTestResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_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 BuildTargetUnitTestResponse.ProtoReflect.Descriptor instead.
func (*BuildTargetUnitTestResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{1}
}

func (x *BuildTargetUnitTestResponse) GetTarballPath() string {
	if x != nil {
		return x.TarballPath
	}
	return ""
}

func (x *BuildTargetUnitTestResponse) GetFailedPackages() []*chromiumos.PackageInfo {
	if x != nil {
		return x.FailedPackages
	}
	return nil
}

func (x *BuildTargetUnitTestResponse) GetEvents() []*chromiumos.MetricEvent {
	if x != nil {
		return x.Events
	}
	return nil
}

// Chromite UnitTest request.
type ChromiteUnitTestRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
}

func (x *ChromiteUnitTestRequest) Reset() {
	*x = ChromiteUnitTestRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromiteUnitTestRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromiteUnitTestRequest) ProtoMessage() {}

func (x *ChromiteUnitTestRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[2]
	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 ChromiteUnitTestRequest.ProtoReflect.Descriptor instead.
func (*ChromiteUnitTestRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{2}
}

func (x *ChromiteUnitTestRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

type ChromiteUnitTestResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *ChromiteUnitTestResponse) Reset() {
	*x = ChromiteUnitTestResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromiteUnitTestResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromiteUnitTestResponse) ProtoMessage() {}

func (x *ChromiteUnitTestResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[3]
	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 ChromiteUnitTestResponse.ProtoReflect.Descriptor instead.
func (*ChromiteUnitTestResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{3}
}

type ChromitePytestRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
}

func (x *ChromitePytestRequest) Reset() {
	*x = ChromitePytestRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromitePytestRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromitePytestRequest) ProtoMessage() {}

func (x *ChromitePytestRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[4]
	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 ChromitePytestRequest.ProtoReflect.Descriptor instead.
func (*ChromitePytestRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{4}
}

func (x *ChromitePytestRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

type ChromitePytestResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *ChromitePytestResponse) Reset() {
	*x = ChromitePytestResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ChromitePytestResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ChromitePytestResponse) ProtoMessage() {}

func (x *ChromitePytestResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[5]
	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 ChromitePytestResponse.ProtoReflect.Descriptor instead.
func (*ChromitePytestResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{5}
}

type CrosSigningTestRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required if not in default location.
	// The chroot where the tests should be executed.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
}

func (x *CrosSigningTestRequest) Reset() {
	*x = CrosSigningTestRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *CrosSigningTestRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CrosSigningTestRequest) ProtoMessage() {}

func (x *CrosSigningTestRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[6]
	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 CrosSigningTestRequest.ProtoReflect.Descriptor instead.
func (*CrosSigningTestRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{6}
}

func (x *CrosSigningTestRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

type CrosSigningTestResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *CrosSigningTestResponse) Reset() {
	*x = CrosSigningTestResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *CrosSigningTestResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*CrosSigningTestResponse) ProtoMessage() {}

func (x *CrosSigningTestResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[7]
	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 CrosSigningTestResponse.ProtoReflect.Descriptor instead.
func (*CrosSigningTestResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{7}
}

// Run the debug_info_test script.
type DebugInfoTestRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The sysroot to tests.
	Sysroot *Sysroot `protobuf:"bytes,1,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
}

func (x *DebugInfoTestRequest) Reset() {
	*x = DebugInfoTestRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DebugInfoTestRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DebugInfoTestRequest) ProtoMessage() {}

func (x *DebugInfoTestRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[8]
	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 DebugInfoTestRequest.ProtoReflect.Descriptor instead.
func (*DebugInfoTestRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{8}
}

func (x *DebugInfoTestRequest) GetSysroot() *Sysroot {
	if x != nil {
		return x.Sysroot
	}
	return nil
}

func (x *DebugInfoTestRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

type DebugInfoTestResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *DebugInfoTestResponse) Reset() {
	*x = DebugInfoTestResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DebugInfoTestResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DebugInfoTestResponse) ProtoMessage() {}

func (x *DebugInfoTestResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[9]
	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 DebugInfoTestResponse.ProtoReflect.Descriptor instead.
func (*DebugInfoTestResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{9}
}

type VmTestRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The build target under test. Required.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The chroot in which to run commands. Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Required. The VM image path.
	VmPath *chromiumos.Path `protobuf:"bytes,3,opt,name=vm_path,json=vmPath,proto3" json:"vm_path,omitempty"`
	// Options for SSHing into the VM.
	SshOptions  *VmTestRequest_SshOptions `protobuf:"bytes,4,opt,name=ssh_options,json=sshOptions,proto3" json:"ssh_options,omitempty"`
	TestHarness VmTestRequest_TestHarness `protobuf:"varint,5,opt,name=test_harness,json=testHarness,proto3,enum=chromite.api.VmTestRequest_TestHarness" json:"test_harness,omitempty"`
	// All VM tests that should be run. At least one must be specified.
	VmTests []*VmTestRequest_VmTest `protobuf:"bytes,6,rep,name=vm_tests,json=vmTests,proto3" json:"vm_tests,omitempty"`
}

func (x *VmTestRequest) Reset() {
	*x = VmTestRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *VmTestRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*VmTestRequest) ProtoMessage() {}

func (x *VmTestRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[10]
	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 VmTestRequest.ProtoReflect.Descriptor instead.
func (*VmTestRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{10}
}

func (x *VmTestRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

func (x *VmTestRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *VmTestRequest) GetVmPath() *chromiumos.Path {
	if x != nil {
		return x.VmPath
	}
	return nil
}

func (x *VmTestRequest) GetSshOptions() *VmTestRequest_SshOptions {
	if x != nil {
		return x.SshOptions
	}
	return nil
}

func (x *VmTestRequest) GetTestHarness() VmTestRequest_TestHarness {
	if x != nil {
		return x.TestHarness
	}
	return VmTestRequest_UNSPECIFIED
}

func (x *VmTestRequest) GetVmTests() []*VmTestRequest_VmTest {
	if x != nil {
		return x.VmTests
	}
	return nil
}

type VmTestResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *VmTestResponse) Reset() {
	*x = VmTestResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *VmTestResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*VmTestResponse) ProtoMessage() {}

func (x *VmTestResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[11]
	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 VmTestResponse.ProtoReflect.Descriptor instead.
func (*VmTestResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{11}
}

type MoblabVmTestRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Chroot in which to run the VM tests.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Effectively the full output produced by the image builder.
	ImagePayload *MoblabVmTestRequest_Payload `protobuf:"bytes,2,opt,name=image_payload,json=imagePayload,proto3" json:"image_payload,omitempty"`
	// Payloads to be loaded into the Moblab VM's cache.
	CachePayloads []*MoblabVmTestRequest_Payload `protobuf:"bytes,3,rep,name=cache_payloads,json=cachePayloads,proto3" json:"cache_payloads,omitempty"`
}

func (x *MoblabVmTestRequest) Reset() {
	*x = MoblabVmTestRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *MoblabVmTestRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*MoblabVmTestRequest) ProtoMessage() {}

func (x *MoblabVmTestRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[12]
	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 MoblabVmTestRequest.ProtoReflect.Descriptor instead.
func (*MoblabVmTestRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{12}
}

func (x *MoblabVmTestRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *MoblabVmTestRequest) GetImagePayload() *MoblabVmTestRequest_Payload {
	if x != nil {
		return x.ImagePayload
	}
	return nil
}

func (x *MoblabVmTestRequest) GetCachePayloads() []*MoblabVmTestRequest_Payload {
	if x != nil {
		return x.CachePayloads
	}
	return nil
}

type MoblabVmTestResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *MoblabVmTestResponse) Reset() {
	*x = MoblabVmTestResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *MoblabVmTestResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*MoblabVmTestResponse) ProtoMessage() {}

func (x *MoblabVmTestResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[13]
	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 MoblabVmTestResponse.ProtoReflect.Descriptor instead.
func (*MoblabVmTestResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{13}
}

type SimpleChromeWorkflowTestRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The sysroot for which SimpleChrome flow will be run.
	// The path and build_target are required.
	// Chrome will be built for the specified board using the sysroot.
	Sysroot *Sysroot `protobuf:"bytes,1,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// Chrome source directory under which chromium will be built and tested
	// using cros chrome-sdk.
	ChromeRoot string `protobuf:"bytes,2,opt,name=chrome_root,json=chromeRoot,proto3" json:"chrome_root,omitempty"`
	// Options for using goma when building Chrome.
	GomaConfig *chromiumos.GomaConfig `protobuf:"bytes,3,opt,name=goma_config,json=gomaConfig,proto3" json:"goma_config,omitempty"`
}

func (x *SimpleChromeWorkflowTestRequest) Reset() {
	*x = SimpleChromeWorkflowTestRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[14]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SimpleChromeWorkflowTestRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SimpleChromeWorkflowTestRequest) ProtoMessage() {}

func (x *SimpleChromeWorkflowTestRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[14]
	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 SimpleChromeWorkflowTestRequest.ProtoReflect.Descriptor instead.
func (*SimpleChromeWorkflowTestRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{14}
}

func (x *SimpleChromeWorkflowTestRequest) GetSysroot() *Sysroot {
	if x != nil {
		return x.Sysroot
	}
	return nil
}

func (x *SimpleChromeWorkflowTestRequest) GetChromeRoot() string {
	if x != nil {
		return x.ChromeRoot
	}
	return ""
}

func (x *SimpleChromeWorkflowTestRequest) GetGomaConfig() *chromiumos.GomaConfig {
	if x != nil {
		return x.GomaConfig
	}
	return nil
}

type SimpleChromeWorkflowTestResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *SimpleChromeWorkflowTestResponse) Reset() {
	*x = SimpleChromeWorkflowTestResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[15]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SimpleChromeWorkflowTestResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SimpleChromeWorkflowTestResponse) ProtoMessage() {}

func (x *SimpleChromeWorkflowTestResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[15]
	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 SimpleChromeWorkflowTestResponse.ProtoReflect.Descriptor instead.
func (*SimpleChromeWorkflowTestResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{15}
}

type BuildTargetUnitTestRequest_Flags struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Assume the sysroot is empty.
	EmptySysroot bool `protobuf:"varint,1,opt,name=empty_sysroot,json=emptySysroot,proto3" json:"empty_sysroot,omitempty"`
	// Whether a toolchain change has occurred.
	ToolchainChanged bool `protobuf:"varint,2,opt,name=toolchain_changed,json=toolchainChanged,proto3" json:"toolchain_changed,omitempty"`
	// Whether to produce code coverage data.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
	// Whether to allow no testable packages to be found.
	TestablePackagesOptional bool `protobuf:"varint,4,opt,name=testable_packages_optional,json=testablePackagesOptional,proto3" json:"testable_packages_optional,omitempty"`
}

func (x *BuildTargetUnitTestRequest_Flags) Reset() {
	*x = BuildTargetUnitTestRequest_Flags{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[16]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BuildTargetUnitTestRequest_Flags) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BuildTargetUnitTestRequest_Flags) ProtoMessage() {}

func (x *BuildTargetUnitTestRequest_Flags) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[16]
	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 BuildTargetUnitTestRequest_Flags.ProtoReflect.Descriptor instead.
func (*BuildTargetUnitTestRequest_Flags) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{0, 0}
}

func (x *BuildTargetUnitTestRequest_Flags) GetEmptySysroot() bool {
	if x != nil {
		return x.EmptySysroot
	}
	return false
}

func (x *BuildTargetUnitTestRequest_Flags) GetToolchainChanged() bool {
	if x != nil {
		return x.ToolchainChanged
	}
	return false
}

func (x *BuildTargetUnitTestRequest_Flags) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

func (x *BuildTargetUnitTestRequest_Flags) GetTestablePackagesOptional() bool {
	if x != nil {
		return x.TestablePackagesOptional
	}
	return false
}

// Options for SSHing into the VM.
type VmTestRequest_SshOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Path to the private key to the VM.
	PrivateKeyPath *chromiumos.Path `protobuf:"bytes,1,opt,name=private_key_path,json=privateKeyPath,proto3" json:"private_key_path,omitempty"`
	// SSH port to communicate with VM.
	Port int32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"`
}

func (x *VmTestRequest_SshOptions) Reset() {
	*x = VmTestRequest_SshOptions{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[17]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *VmTestRequest_SshOptions) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*VmTestRequest_SshOptions) ProtoMessage() {}

func (x *VmTestRequest_SshOptions) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[17]
	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 VmTestRequest_SshOptions.ProtoReflect.Descriptor instead.
func (*VmTestRequest_SshOptions) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{10, 0}
}

func (x *VmTestRequest_SshOptions) GetPrivateKeyPath() *chromiumos.Path {
	if x != nil {
		return x.PrivateKeyPath
	}
	return nil
}

func (x *VmTestRequest_SshOptions) GetPort() int32 {
	if x != nil {
		return x.Port
	}
	return 0
}

// A specific VM test to run.
type VmTestRequest_VmTest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The name pattern for the VM test.
	// For Autotest, this pattern matches against the test suite name.
	// For Tast, this pattern matches against the Tast test name.
	Pattern string `protobuf:"bytes,1,opt,name=pattern,proto3" json:"pattern,omitempty"`
}

func (x *VmTestRequest_VmTest) Reset() {
	*x = VmTestRequest_VmTest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[18]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *VmTestRequest_VmTest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*VmTestRequest_VmTest) ProtoMessage() {}

func (x *VmTestRequest_VmTest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[18]
	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 VmTestRequest_VmTest.ProtoReflect.Descriptor instead.
func (*VmTestRequest_VmTest) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{10, 1}
}

func (x *VmTestRequest_VmTest) GetPattern() string {
	if x != nil {
		return x.Pattern
	}
	return ""
}

// Data used in the test.
type MoblabVmTestRequest_Payload struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Directory containing the payload.
	Path *chromiumos.Path `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
}

func (x *MoblabVmTestRequest_Payload) Reset() {
	*x = MoblabVmTestRequest_Payload{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_test_proto_msgTypes[19]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *MoblabVmTestRequest_Payload) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*MoblabVmTestRequest_Payload) ProtoMessage() {}

func (x *MoblabVmTestRequest_Payload) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_test_proto_msgTypes[19]
	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 MoblabVmTestRequest_Payload.ProtoReflect.Descriptor instead.
func (*MoblabVmTestRequest_Payload) Descriptor() ([]byte, []int) {
	return file_chromite_api_test_proto_rawDescGZIP(), []int{12, 0}
}

func (x *MoblabVmTestRequest_Payload) GetPath() *chromiumos.Path {
	if x != nil {
		return x.Path
	}
	return nil
}

var File_chromite_api_test_proto protoreflect.FileDescriptor

var file_chromite_api_test_proto_rawDesc = []byte{
	0x0a, 0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x74,
	0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x70, 0x69, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f,
	0x61, 0x70, 0x69, 0x2f, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x1a, 0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f,
	0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x22, 0xeb, 0x04, 0x0a, 0x1a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61,
	0x72, 0x67, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67,
	0x65, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12,
	0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x50, 0x61, 0x74, 0x68,
	0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68,
	0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x44, 0x0a, 0x05,
	0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x52, 0x05, 0x66, 0x6c, 0x61,
	0x67, 0x73, 0x12, 0x44, 0x0a, 0x11, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x6c,
	0x61, 0x63, 0x6b, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61,
	0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x42,
	0x6c, 0x61, 0x63, 0x6b, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x61, 0x63, 0x6b,
	0x61, 0x67, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49,
	0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x44, 0x0a,
	0x11, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x6c, 0x69,
	0x73, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66,
	0x6f, 0x52, 0x10, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x6c,
	0x69, 0x73, 0x74, 0x1a, 0xbc, 0x01, 0x0a, 0x05, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x23, 0x0a,
	0x0d, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x5f, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x53, 0x79, 0x73, 0x72, 0x6f,
	0x6f, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f,
	0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x74,
	0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12,
	0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65,
	0x72, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x1a, 0x74, 0x65, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65,
	0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
	0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x74, 0x65, 0x73, 0x74, 0x61, 0x62,
	0x6c, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
	0x61, 0x6c, 0x22, 0xb3, 0x01, 0x0a, 0x1b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67,
	0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x61, 0x72, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x61,
	0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x62, 0x61, 0x6c,
	0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x40, 0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x5f,
	0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61, 0x63, 0x6b,
	0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x50,
	0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74,
	0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74,
	0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x45, 0x0a, 0x17, 0x43, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73,
	0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x22,
	0x1a, 0x0a, 0x18, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x54,
	0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x0a, 0x15, 0x43,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x50, 0x79, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74,
	0x22, 0x18, 0x0a, 0x16, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x50, 0x79, 0x74, 0x65,
	0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x0a, 0x16, 0x43, 0x72,
	0x6f, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74,
	0x22, 0x19, 0x0a, 0x17, 0x43, 0x72, 0x6f, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x54,
	0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x73, 0x0a, 0x14, 0x44,
	0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75,
	0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x53, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x07, 0x73, 0x79, 0x73,
	0x72, 0x6f, 0x6f, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74,
	0x22, 0x17, 0x0a, 0x15, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x54, 0x65, 0x73,
	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb0, 0x04, 0x0a, 0x0d, 0x56, 0x6d,
	0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f,
	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72,
	0x6f, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x07, 0x76, 0x6d, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x06, 0x76, 0x6d, 0x50, 0x61, 0x74, 0x68, 0x12, 0x47,
	0x0a, 0x0b, 0x73, 0x73, 0x68, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x2e, 0x53, 0x73, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x73, 0x73, 0x68,
	0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4a, 0x0a, 0x0c, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x68, 0x61, 0x72, 0x6e, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x6d, 0x54,
	0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x48,
	0x61, 0x72, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x74, 0x65, 0x73, 0x74, 0x48, 0x61, 0x72, 0x6e,
	0x65, 0x73, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x76, 0x6d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x73, 0x18,
	0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x2e, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x52, 0x07, 0x76, 0x6d, 0x54, 0x65, 0x73,
	0x74, 0x73, 0x1a, 0x5c, 0x0a, 0x0a, 0x53, 0x73, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
	0x12, 0x3a, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f,
	0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0e, 0x70, 0x72,
	0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04,
	0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74,
	0x1a, 0x22, 0x0a, 0x06, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61,
	0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x74,
	0x74, 0x65, 0x72, 0x6e, 0x22, 0x36, 0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x48, 0x61, 0x72, 0x6e,
	0x65, 0x73, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
	0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x41, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0c,
	0x0a, 0x08, 0x41, 0x55, 0x54, 0x4f, 0x54, 0x45, 0x53, 0x54, 0x10, 0x02, 0x22, 0x10, 0x0a, 0x0e,
	0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x94,
	0x02, 0x0a, 0x13, 0x4d, 0x6f, 0x62, 0x6c, 0x61, 0x62, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x52,
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f,
	0x6f, 0x74, 0x12, 0x4e, 0x0a, 0x0d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c,
	0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x62, 0x6c, 0x61, 0x62, 0x56,
	0x6d, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x79,
	0x6c, 0x6f, 0x61, 0x64, 0x52, 0x0c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f,
	0x61, 0x64, 0x12, 0x50, 0x0a, 0x0e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x70, 0x61, 0x79, 0x6c,
	0x6f, 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x62, 0x6c, 0x61, 0x62,
	0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61,
	0x79, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x50, 0x61, 0x79, 0x6c,
	0x6f, 0x61, 0x64, 0x73, 0x1a, 0x2f, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12,
	0x24, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61, 0x74, 0x68, 0x52,
	0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x16, 0x0a, 0x14, 0x4d, 0x6f, 0x62, 0x6c, 0x61, 0x62, 0x56,
	0x6d, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xac, 0x01,
	0x0a, 0x1f, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x57, 0x6f,
	0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x53, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x07, 0x73, 0x79, 0x73, 0x72, 0x6f,
	0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x5f, 0x72, 0x6f, 0x6f,
	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x52,
	0x6f, 0x6f, 0x74, 0x12, 0x37, 0x0a, 0x0b, 0x67, 0x6f, 0x6d, 0x61, 0x5f, 0x63, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x47, 0x6f, 0x6d, 0x61, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x52, 0x0a, 0x67, 0x6f, 0x6d, 0x61, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x22, 0x0a, 0x20,
	0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b,
	0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x32, 0xb1, 0x06, 0x0a, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
	0x12, 0x72, 0x0a, 0x13, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55,
	0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x12, 0x28, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67,
	0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x1a, 0x29, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74,
	0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xc2, 0xed,
	0x1a, 0x02, 0x10, 0x02, 0x12, 0x61, 0x0a, 0x10, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x12, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
	0x26, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x74, 0x54, 0x65, 0x73, 0x74, 0x52,
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x50, 0x79, 0x74, 0x65, 0x73, 0x74, 0x12, 0x23, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x50, 0x79, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x50, 0x79, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70,
	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0f, 0x43, 0x72, 0x6f, 0x73, 0x53, 0x69, 0x67, 0x6e,
	0x69, 0x6e, 0x67, 0x54, 0x65, 0x73, 0x74, 0x12, 0x24, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x69,
	0x6e, 0x67, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x6f,
	0x73, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70,
	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66,
	0x6f, 0x54, 0x65, 0x73, 0x74, 0x12, 0x22, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x54, 0x65,
	0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e,
	0x66, 0x6f, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43,
	0x0a, 0x06, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x12, 0x5d, 0x0a, 0x0c, 0x4d, 0x6f, 0x62, 0x6c, 0x61, 0x62, 0x56, 0x6d, 0x54,
	0x65, 0x73, 0x74, 0x12, 0x21, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x62, 0x6c, 0x61, 0x62, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x52,
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x6f, 0x62, 0x6c, 0x61, 0x62, 0x56, 0x6d, 0x54, 0x65,
	0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06, 0xc2, 0xed, 0x1a, 0x02,
	0x10, 0x02, 0x12, 0x81, 0x01, 0x0a, 0x18, 0x53, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x68, 0x72,
	0x6f, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x73, 0x74, 0x12,
	0x2d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53,
	0x69, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66,
	0x6c, 0x6f, 0x77, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x69,
	0x6d, 0x70, 0x6c, 0x65, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c,
	0x6f, 0x77, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x06,
	0xc2, 0xed, 0x1a, 0x02, 0x10, 0x02, 0x1a, 0x0c, 0xc2, 0xed, 0x1a, 0x08, 0x0a, 0x04, 0x74, 0x65,
	0x73, 0x74, 0x10, 0x01, 0x42, 0x38, 0x5a, 0x36, 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, 0x67,
	0x6f, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromite_api_test_proto_rawDescOnce sync.Once
	file_chromite_api_test_proto_rawDescData = file_chromite_api_test_proto_rawDesc
)

func file_chromite_api_test_proto_rawDescGZIP() []byte {
	file_chromite_api_test_proto_rawDescOnce.Do(func() {
		file_chromite_api_test_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_test_proto_rawDescData)
	})
	return file_chromite_api_test_proto_rawDescData
}

var file_chromite_api_test_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_chromite_api_test_proto_msgTypes = make([]protoimpl.MessageInfo, 20)
var file_chromite_api_test_proto_goTypes = []interface{}{
	(VmTestRequest_TestHarness)(0),           // 0: chromite.api.VmTestRequest.TestHarness
	(*BuildTargetUnitTestRequest)(nil),       // 1: chromite.api.BuildTargetUnitTestRequest
	(*BuildTargetUnitTestResponse)(nil),      // 2: chromite.api.BuildTargetUnitTestResponse
	(*ChromiteUnitTestRequest)(nil),          // 3: chromite.api.ChromiteUnitTestRequest
	(*ChromiteUnitTestResponse)(nil),         // 4: chromite.api.ChromiteUnitTestResponse
	(*ChromitePytestRequest)(nil),            // 5: chromite.api.ChromitePytestRequest
	(*ChromitePytestResponse)(nil),           // 6: chromite.api.ChromitePytestResponse
	(*CrosSigningTestRequest)(nil),           // 7: chromite.api.CrosSigningTestRequest
	(*CrosSigningTestResponse)(nil),          // 8: chromite.api.CrosSigningTestResponse
	(*DebugInfoTestRequest)(nil),             // 9: chromite.api.DebugInfoTestRequest
	(*DebugInfoTestResponse)(nil),            // 10: chromite.api.DebugInfoTestResponse
	(*VmTestRequest)(nil),                    // 11: chromite.api.VmTestRequest
	(*VmTestResponse)(nil),                   // 12: chromite.api.VmTestResponse
	(*MoblabVmTestRequest)(nil),              // 13: chromite.api.MoblabVmTestRequest
	(*MoblabVmTestResponse)(nil),             // 14: chromite.api.MoblabVmTestResponse
	(*SimpleChromeWorkflowTestRequest)(nil),  // 15: chromite.api.SimpleChromeWorkflowTestRequest
	(*SimpleChromeWorkflowTestResponse)(nil), // 16: chromite.api.SimpleChromeWorkflowTestResponse
	(*BuildTargetUnitTestRequest_Flags)(nil), // 17: chromite.api.BuildTargetUnitTestRequest.Flags
	(*VmTestRequest_SshOptions)(nil),         // 18: chromite.api.VmTestRequest.SshOptions
	(*VmTestRequest_VmTest)(nil),             // 19: chromite.api.VmTestRequest.VmTest
	(*MoblabVmTestRequest_Payload)(nil),      // 20: chromite.api.MoblabVmTestRequest.Payload
	(*chromiumos.BuildTarget)(nil),           // 21: chromiumos.BuildTarget
	(*chromiumos.Chroot)(nil),                // 22: chromiumos.Chroot
	(*chromiumos.PackageInfo)(nil),           // 23: chromiumos.PackageInfo
	(*chromiumos.MetricEvent)(nil),           // 24: chromiumos.MetricEvent
	(*Sysroot)(nil),                          // 25: chromite.api.Sysroot
	(*chromiumos.Path)(nil),                  // 26: chromiumos.Path
	(*chromiumos.GomaConfig)(nil),            // 27: chromiumos.GomaConfig
}
var file_chromite_api_test_proto_depIdxs = []int32{
	21, // 0: chromite.api.BuildTargetUnitTestRequest.build_target:type_name -> chromiumos.BuildTarget
	22, // 1: chromite.api.BuildTargetUnitTestRequest.chroot:type_name -> chromiumos.Chroot
	17, // 2: chromite.api.BuildTargetUnitTestRequest.flags:type_name -> chromite.api.BuildTargetUnitTestRequest.Flags
	23, // 3: chromite.api.BuildTargetUnitTestRequest.package_blacklist:type_name -> chromiumos.PackageInfo
	23, // 4: chromite.api.BuildTargetUnitTestRequest.packages:type_name -> chromiumos.PackageInfo
	23, // 5: chromite.api.BuildTargetUnitTestRequest.package_blocklist:type_name -> chromiumos.PackageInfo
	23, // 6: chromite.api.BuildTargetUnitTestResponse.failed_packages:type_name -> chromiumos.PackageInfo
	24, // 7: chromite.api.BuildTargetUnitTestResponse.events:type_name -> chromiumos.MetricEvent
	22, // 8: chromite.api.ChromiteUnitTestRequest.chroot:type_name -> chromiumos.Chroot
	22, // 9: chromite.api.ChromitePytestRequest.chroot:type_name -> chromiumos.Chroot
	22, // 10: chromite.api.CrosSigningTestRequest.chroot:type_name -> chromiumos.Chroot
	25, // 11: chromite.api.DebugInfoTestRequest.sysroot:type_name -> chromite.api.Sysroot
	22, // 12: chromite.api.DebugInfoTestRequest.chroot:type_name -> chromiumos.Chroot
	21, // 13: chromite.api.VmTestRequest.build_target:type_name -> chromiumos.BuildTarget
	22, // 14: chromite.api.VmTestRequest.chroot:type_name -> chromiumos.Chroot
	26, // 15: chromite.api.VmTestRequest.vm_path:type_name -> chromiumos.Path
	18, // 16: chromite.api.VmTestRequest.ssh_options:type_name -> chromite.api.VmTestRequest.SshOptions
	0,  // 17: chromite.api.VmTestRequest.test_harness:type_name -> chromite.api.VmTestRequest.TestHarness
	19, // 18: chromite.api.VmTestRequest.vm_tests:type_name -> chromite.api.VmTestRequest.VmTest
	22, // 19: chromite.api.MoblabVmTestRequest.chroot:type_name -> chromiumos.Chroot
	20, // 20: chromite.api.MoblabVmTestRequest.image_payload:type_name -> chromite.api.MoblabVmTestRequest.Payload
	20, // 21: chromite.api.MoblabVmTestRequest.cache_payloads:type_name -> chromite.api.MoblabVmTestRequest.Payload
	25, // 22: chromite.api.SimpleChromeWorkflowTestRequest.sysroot:type_name -> chromite.api.Sysroot
	27, // 23: chromite.api.SimpleChromeWorkflowTestRequest.goma_config:type_name -> chromiumos.GomaConfig
	26, // 24: chromite.api.VmTestRequest.SshOptions.private_key_path:type_name -> chromiumos.Path
	26, // 25: chromite.api.MoblabVmTestRequest.Payload.path:type_name -> chromiumos.Path
	1,  // 26: chromite.api.TestService.BuildTargetUnitTest:input_type -> chromite.api.BuildTargetUnitTestRequest
	3,  // 27: chromite.api.TestService.ChromiteUnitTest:input_type -> chromite.api.ChromiteUnitTestRequest
	5,  // 28: chromite.api.TestService.ChromitePytest:input_type -> chromite.api.ChromitePytestRequest
	7,  // 29: chromite.api.TestService.CrosSigningTest:input_type -> chromite.api.CrosSigningTestRequest
	9,  // 30: chromite.api.TestService.DebugInfoTest:input_type -> chromite.api.DebugInfoTestRequest
	11, // 31: chromite.api.TestService.VmTest:input_type -> chromite.api.VmTestRequest
	13, // 32: chromite.api.TestService.MoblabVmTest:input_type -> chromite.api.MoblabVmTestRequest
	15, // 33: chromite.api.TestService.SimpleChromeWorkflowTest:input_type -> chromite.api.SimpleChromeWorkflowTestRequest
	2,  // 34: chromite.api.TestService.BuildTargetUnitTest:output_type -> chromite.api.BuildTargetUnitTestResponse
	4,  // 35: chromite.api.TestService.ChromiteUnitTest:output_type -> chromite.api.ChromiteUnitTestResponse
	6,  // 36: chromite.api.TestService.ChromitePytest:output_type -> chromite.api.ChromitePytestResponse
	8,  // 37: chromite.api.TestService.CrosSigningTest:output_type -> chromite.api.CrosSigningTestResponse
	10, // 38: chromite.api.TestService.DebugInfoTest:output_type -> chromite.api.DebugInfoTestResponse
	12, // 39: chromite.api.TestService.VmTest:output_type -> chromite.api.VmTestResponse
	14, // 40: chromite.api.TestService.MoblabVmTest:output_type -> chromite.api.MoblabVmTestResponse
	16, // 41: chromite.api.TestService.SimpleChromeWorkflowTest:output_type -> chromite.api.SimpleChromeWorkflowTestResponse
	34, // [34:42] is the sub-list for method output_type
	26, // [26:34] is the sub-list for method input_type
	26, // [26:26] is the sub-list for extension type_name
	26, // [26:26] is the sub-list for extension extendee
	0,  // [0:26] is the sub-list for field type_name
}

func init() { file_chromite_api_test_proto_init() }
func file_chromite_api_test_proto_init() {
	if File_chromite_api_test_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	file_chromite_api_sysroot_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildTargetUnitTestRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildTargetUnitTestResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromiteUnitTestRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromiteUnitTestResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromitePytestRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromitePytestResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CrosSigningTestRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CrosSigningTestResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DebugInfoTestRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DebugInfoTestResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*VmTestRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*VmTestResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MoblabVmTestRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MoblabVmTestResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SimpleChromeWorkflowTestRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SimpleChromeWorkflowTestResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildTargetUnitTestRequest_Flags); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*VmTestRequest_SshOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*VmTestRequest_VmTest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_test_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MoblabVmTestRequest_Payload); 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_chromite_api_test_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   20,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_test_proto_goTypes,
		DependencyIndexes: file_chromite_api_test_proto_depIdxs,
		EnumInfos:         file_chromite_api_test_proto_enumTypes,
		MessageInfos:      file_chromite_api_test_proto_msgTypes,
	}.Build()
	File_chromite_api_test_proto = out.File
	file_chromite_api_test_proto_rawDesc = nil
	file_chromite_api_test_proto_goTypes = nil
	file_chromite_api_test_proto_depIdxs = nil
}
