// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/test.proto

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	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

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

var VmTestRequest_TestHarness_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "TAST",
	2: "AUTOTEST",
}

var VmTestRequest_TestHarness_value = map[string]int32{
	"UNSPECIFIED": 0,
	"TAST":        1,
	"AUTOTEST":    2,
}

func (x VmTestRequest_TestHarness) String() string {
	return proto.EnumName(VmTestRequest_TestHarness_name, int32(x))
}

func (VmTestRequest_TestHarness) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{10, 0}
}

type BuildTargetUnitTestRequest struct {
	// 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: Change to reserved after 2021-06-01 and recipes have been updated.
	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"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_BuildTargetUnitTestRequest proto.InternalMessageInfo

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

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

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

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

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

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

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

type BuildTargetUnitTestRequest_Flags struct {
	// 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"`
	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
	XXX_unrecognized         []byte   `json:"-"`
	XXX_sizecache            int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuildTargetUnitTestRequest_Flags proto.InternalMessageInfo

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

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

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

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

type BuildTargetUnitTestResponse struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

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

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

var xxx_messageInfo_BuildTargetUnitTestResponse proto.InternalMessageInfo

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

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

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

// Chromite UnitTest request.
type ChromiteUnitTestRequest struct {
	// The chroot to use to execute the endpoint.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_ChromiteUnitTestRequest proto.InternalMessageInfo

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

type ChromiteUnitTestResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ChromiteUnitTestResponse proto.InternalMessageInfo

type ChromitePytestRequest struct {
	// The chroot to use to execute the endpoint.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *ChromitePytestRequest) Reset()         { *m = ChromitePytestRequest{} }
func (m *ChromitePytestRequest) String() string { return proto.CompactTextString(m) }
func (*ChromitePytestRequest) ProtoMessage()    {}
func (*ChromitePytestRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{4}
}

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

var xxx_messageInfo_ChromitePytestRequest proto.InternalMessageInfo

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

type ChromitePytestResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ChromitePytestResponse) Reset()         { *m = ChromitePytestResponse{} }
func (m *ChromitePytestResponse) String() string { return proto.CompactTextString(m) }
func (*ChromitePytestResponse) ProtoMessage()    {}
func (*ChromitePytestResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{5}
}

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

var xxx_messageInfo_ChromitePytestResponse proto.InternalMessageInfo

type CrosSigningTestRequest struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *CrosSigningTestRequest) Reset()         { *m = CrosSigningTestRequest{} }
func (m *CrosSigningTestRequest) String() string { return proto.CompactTextString(m) }
func (*CrosSigningTestRequest) ProtoMessage()    {}
func (*CrosSigningTestRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{6}
}

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

var xxx_messageInfo_CrosSigningTestRequest proto.InternalMessageInfo

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

type CrosSigningTestResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CrosSigningTestResponse) Reset()         { *m = CrosSigningTestResponse{} }
func (m *CrosSigningTestResponse) String() string { return proto.CompactTextString(m) }
func (*CrosSigningTestResponse) ProtoMessage()    {}
func (*CrosSigningTestResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{7}
}

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

var xxx_messageInfo_CrosSigningTestResponse proto.InternalMessageInfo

// Run the debug_info_test script.
type DebugInfoTestRequest struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *DebugInfoTestRequest) Reset()         { *m = DebugInfoTestRequest{} }
func (m *DebugInfoTestRequest) String() string { return proto.CompactTextString(m) }
func (*DebugInfoTestRequest) ProtoMessage()    {}
func (*DebugInfoTestRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{8}
}

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

var xxx_messageInfo_DebugInfoTestRequest proto.InternalMessageInfo

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

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

type DebugInfoTestResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DebugInfoTestResponse) Reset()         { *m = DebugInfoTestResponse{} }
func (m *DebugInfoTestResponse) String() string { return proto.CompactTextString(m) }
func (*DebugInfoTestResponse) ProtoMessage()    {}
func (*DebugInfoTestResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{9}
}

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

var xxx_messageInfo_DebugInfoTestResponse proto.InternalMessageInfo

type VmTestRequest struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

func (m *VmTestRequest) Reset()         { *m = VmTestRequest{} }
func (m *VmTestRequest) String() string { return proto.CompactTextString(m) }
func (*VmTestRequest) ProtoMessage()    {}
func (*VmTestRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{10}
}

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

var xxx_messageInfo_VmTestRequest proto.InternalMessageInfo

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

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

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

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

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

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

// Options for SSHing into the VM.
type VmTestRequest_SshOptions struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_VmTestRequest_SshOptions proto.InternalMessageInfo

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

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

// A specific VM test to run.
type VmTestRequest_VmTest struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_VmTestRequest_VmTest proto.InternalMessageInfo

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

type VmTestResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *VmTestResponse) Reset()         { *m = VmTestResponse{} }
func (m *VmTestResponse) String() string { return proto.CompactTextString(m) }
func (*VmTestResponse) ProtoMessage()    {}
func (*VmTestResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{11}
}

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

var xxx_messageInfo_VmTestResponse proto.InternalMessageInfo

type MoblabVmTestRequest struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

func (m *MoblabVmTestRequest) Reset()         { *m = MoblabVmTestRequest{} }
func (m *MoblabVmTestRequest) String() string { return proto.CompactTextString(m) }
func (*MoblabVmTestRequest) ProtoMessage()    {}
func (*MoblabVmTestRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{12}
}

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

var xxx_messageInfo_MoblabVmTestRequest proto.InternalMessageInfo

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

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

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

// Data used in the test.
type MoblabVmTestRequest_Payload struct {
	// Directory containing the payload.
	Path                 *chromiumos.Path `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_MoblabVmTestRequest_Payload proto.InternalMessageInfo

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

type MoblabVmTestResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *MoblabVmTestResponse) Reset()         { *m = MoblabVmTestResponse{} }
func (m *MoblabVmTestResponse) String() string { return proto.CompactTextString(m) }
func (*MoblabVmTestResponse) ProtoMessage()    {}
func (*MoblabVmTestResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{13}
}

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

var xxx_messageInfo_MoblabVmTestResponse proto.InternalMessageInfo

type SimpleChromeWorkflowTestRequest struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *SimpleChromeWorkflowTestRequest) Reset()         { *m = SimpleChromeWorkflowTestRequest{} }
func (m *SimpleChromeWorkflowTestRequest) String() string { return proto.CompactTextString(m) }
func (*SimpleChromeWorkflowTestRequest) ProtoMessage()    {}
func (*SimpleChromeWorkflowTestRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{14}
}

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

var xxx_messageInfo_SimpleChromeWorkflowTestRequest proto.InternalMessageInfo

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

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

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

type SimpleChromeWorkflowTestResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SimpleChromeWorkflowTestResponse) Reset()         { *m = SimpleChromeWorkflowTestResponse{} }
func (m *SimpleChromeWorkflowTestResponse) String() string { return proto.CompactTextString(m) }
func (*SimpleChromeWorkflowTestResponse) ProtoMessage()    {}
func (*SimpleChromeWorkflowTestResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_f5c91b4ac6233d9e, []int{15}
}

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

var xxx_messageInfo_SimpleChromeWorkflowTestResponse proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("chromite.api.VmTestRequest_TestHarness", VmTestRequest_TestHarness_name, VmTestRequest_TestHarness_value)
	proto.RegisterType((*BuildTargetUnitTestRequest)(nil), "chromite.api.BuildTargetUnitTestRequest")
	proto.RegisterType((*BuildTargetUnitTestRequest_Flags)(nil), "chromite.api.BuildTargetUnitTestRequest.Flags")
	proto.RegisterType((*BuildTargetUnitTestResponse)(nil), "chromite.api.BuildTargetUnitTestResponse")
	proto.RegisterType((*ChromiteUnitTestRequest)(nil), "chromite.api.ChromiteUnitTestRequest")
	proto.RegisterType((*ChromiteUnitTestResponse)(nil), "chromite.api.ChromiteUnitTestResponse")
	proto.RegisterType((*ChromitePytestRequest)(nil), "chromite.api.ChromitePytestRequest")
	proto.RegisterType((*ChromitePytestResponse)(nil), "chromite.api.ChromitePytestResponse")
	proto.RegisterType((*CrosSigningTestRequest)(nil), "chromite.api.CrosSigningTestRequest")
	proto.RegisterType((*CrosSigningTestResponse)(nil), "chromite.api.CrosSigningTestResponse")
	proto.RegisterType((*DebugInfoTestRequest)(nil), "chromite.api.DebugInfoTestRequest")
	proto.RegisterType((*DebugInfoTestResponse)(nil), "chromite.api.DebugInfoTestResponse")
	proto.RegisterType((*VmTestRequest)(nil), "chromite.api.VmTestRequest")
	proto.RegisterType((*VmTestRequest_SshOptions)(nil), "chromite.api.VmTestRequest.SshOptions")
	proto.RegisterType((*VmTestRequest_VmTest)(nil), "chromite.api.VmTestRequest.VmTest")
	proto.RegisterType((*VmTestResponse)(nil), "chromite.api.VmTestResponse")
	proto.RegisterType((*MoblabVmTestRequest)(nil), "chromite.api.MoblabVmTestRequest")
	proto.RegisterType((*MoblabVmTestRequest_Payload)(nil), "chromite.api.MoblabVmTestRequest.Payload")
	proto.RegisterType((*MoblabVmTestResponse)(nil), "chromite.api.MoblabVmTestResponse")
	proto.RegisterType((*SimpleChromeWorkflowTestRequest)(nil), "chromite.api.SimpleChromeWorkflowTestRequest")
	proto.RegisterType((*SimpleChromeWorkflowTestResponse)(nil), "chromite.api.SimpleChromeWorkflowTestResponse")
}

func init() { proto.RegisterFile("chromite/api/test.proto", fileDescriptor_f5c91b4ac6233d9e) }

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

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// TestServiceClient is the client API for TestService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type TestServiceClient interface {
	// Run a build target's ebuild unit tests.
	BuildTargetUnitTest(ctx context.Context, in *BuildTargetUnitTestRequest, opts ...grpc.CallOption) (*BuildTargetUnitTestResponse, error)
	// Run the chromite unit tests.
	ChromiteUnitTest(ctx context.Context, in *ChromiteUnitTestRequest, opts ...grpc.CallOption) (*ChromiteUnitTestResponse, error)
	// Run Pytest in chromite.
	ChromitePytest(ctx context.Context, in *ChromitePytestRequest, opts ...grpc.CallOption) (*ChromitePytestResponse, error)
	// Run the cros-signing unit tests.
	CrosSigningTest(ctx context.Context, in *CrosSigningTestRequest, opts ...grpc.CallOption) (*CrosSigningTestResponse, error)
	// Run the debug info tests on a sysroot.
	DebugInfoTest(ctx context.Context, in *DebugInfoTestRequest, opts ...grpc.CallOption) (*DebugInfoTestResponse, error)
	// Run VM tests and report failures.
	VmTest(ctx context.Context, in *VmTestRequest, opts ...grpc.CallOption) (*VmTestResponse, error)
	// Run Moblab VM tests and report failures.
	MoblabVmTest(ctx context.Context, in *MoblabVmTestRequest, opts ...grpc.CallOption) (*MoblabVmTestResponse, error)
	// Run the Simple Chrome workflow unit tests.
	SimpleChromeWorkflowTest(ctx context.Context, in *SimpleChromeWorkflowTestRequest, opts ...grpc.CallOption) (*SimpleChromeWorkflowTestResponse, error)
}

type testServiceClient struct {
	cc *grpc.ClientConn
}

func NewTestServiceClient(cc *grpc.ClientConn) TestServiceClient {
	return &testServiceClient{cc}
}

func (c *testServiceClient) BuildTargetUnitTest(ctx context.Context, in *BuildTargetUnitTestRequest, opts ...grpc.CallOption) (*BuildTargetUnitTestResponse, error) {
	out := new(BuildTargetUnitTestResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.TestService/BuildTargetUnitTest", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *testServiceClient) ChromiteUnitTest(ctx context.Context, in *ChromiteUnitTestRequest, opts ...grpc.CallOption) (*ChromiteUnitTestResponse, error) {
	out := new(ChromiteUnitTestResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.TestService/ChromiteUnitTest", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *testServiceClient) ChromitePytest(ctx context.Context, in *ChromitePytestRequest, opts ...grpc.CallOption) (*ChromitePytestResponse, error) {
	out := new(ChromitePytestResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.TestService/ChromitePytest", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *testServiceClient) CrosSigningTest(ctx context.Context, in *CrosSigningTestRequest, opts ...grpc.CallOption) (*CrosSigningTestResponse, error) {
	out := new(CrosSigningTestResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.TestService/CrosSigningTest", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *testServiceClient) DebugInfoTest(ctx context.Context, in *DebugInfoTestRequest, opts ...grpc.CallOption) (*DebugInfoTestResponse, error) {
	out := new(DebugInfoTestResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.TestService/DebugInfoTest", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *testServiceClient) VmTest(ctx context.Context, in *VmTestRequest, opts ...grpc.CallOption) (*VmTestResponse, error) {
	out := new(VmTestResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.TestService/VmTest", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *testServiceClient) MoblabVmTest(ctx context.Context, in *MoblabVmTestRequest, opts ...grpc.CallOption) (*MoblabVmTestResponse, error) {
	out := new(MoblabVmTestResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.TestService/MoblabVmTest", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *testServiceClient) SimpleChromeWorkflowTest(ctx context.Context, in *SimpleChromeWorkflowTestRequest, opts ...grpc.CallOption) (*SimpleChromeWorkflowTestResponse, error) {
	out := new(SimpleChromeWorkflowTestResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.TestService/SimpleChromeWorkflowTest", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// TestServiceServer is the server API for TestService service.
type TestServiceServer interface {
	// Run a build target's ebuild unit tests.
	BuildTargetUnitTest(context.Context, *BuildTargetUnitTestRequest) (*BuildTargetUnitTestResponse, error)
	// Run the chromite unit tests.
	ChromiteUnitTest(context.Context, *ChromiteUnitTestRequest) (*ChromiteUnitTestResponse, error)
	// Run Pytest in chromite.
	ChromitePytest(context.Context, *ChromitePytestRequest) (*ChromitePytestResponse, error)
	// Run the cros-signing unit tests.
	CrosSigningTest(context.Context, *CrosSigningTestRequest) (*CrosSigningTestResponse, error)
	// Run the debug info tests on a sysroot.
	DebugInfoTest(context.Context, *DebugInfoTestRequest) (*DebugInfoTestResponse, error)
	// Run VM tests and report failures.
	VmTest(context.Context, *VmTestRequest) (*VmTestResponse, error)
	// Run Moblab VM tests and report failures.
	MoblabVmTest(context.Context, *MoblabVmTestRequest) (*MoblabVmTestResponse, error)
	// Run the Simple Chrome workflow unit tests.
	SimpleChromeWorkflowTest(context.Context, *SimpleChromeWorkflowTestRequest) (*SimpleChromeWorkflowTestResponse, error)
}

// UnimplementedTestServiceServer can be embedded to have forward compatible implementations.
type UnimplementedTestServiceServer struct {
}

func (*UnimplementedTestServiceServer) BuildTargetUnitTest(ctx context.Context, req *BuildTargetUnitTestRequest) (*BuildTargetUnitTestResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BuildTargetUnitTest not implemented")
}
func (*UnimplementedTestServiceServer) ChromiteUnitTest(ctx context.Context, req *ChromiteUnitTestRequest) (*ChromiteUnitTestResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ChromiteUnitTest not implemented")
}
func (*UnimplementedTestServiceServer) ChromitePytest(ctx context.Context, req *ChromitePytestRequest) (*ChromitePytestResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ChromitePytest not implemented")
}
func (*UnimplementedTestServiceServer) CrosSigningTest(ctx context.Context, req *CrosSigningTestRequest) (*CrosSigningTestResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method CrosSigningTest not implemented")
}
func (*UnimplementedTestServiceServer) DebugInfoTest(ctx context.Context, req *DebugInfoTestRequest) (*DebugInfoTestResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method DebugInfoTest not implemented")
}
func (*UnimplementedTestServiceServer) VmTest(ctx context.Context, req *VmTestRequest) (*VmTestResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method VmTest not implemented")
}
func (*UnimplementedTestServiceServer) MoblabVmTest(ctx context.Context, req *MoblabVmTestRequest) (*MoblabVmTestResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method MoblabVmTest not implemented")
}
func (*UnimplementedTestServiceServer) SimpleChromeWorkflowTest(ctx context.Context, req *SimpleChromeWorkflowTestRequest) (*SimpleChromeWorkflowTestResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method SimpleChromeWorkflowTest not implemented")
}

func RegisterTestServiceServer(s *grpc.Server, srv TestServiceServer) {
	s.RegisterService(&_TestService_serviceDesc, srv)
}

func _TestService_BuildTargetUnitTest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BuildTargetUnitTestRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TestServiceServer).BuildTargetUnitTest(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.TestService/BuildTargetUnitTest",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TestServiceServer).BuildTargetUnitTest(ctx, req.(*BuildTargetUnitTestRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TestService_ChromiteUnitTest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ChromiteUnitTestRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TestServiceServer).ChromiteUnitTest(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.TestService/ChromiteUnitTest",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TestServiceServer).ChromiteUnitTest(ctx, req.(*ChromiteUnitTestRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TestService_ChromitePytest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ChromitePytestRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TestServiceServer).ChromitePytest(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.TestService/ChromitePytest",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TestServiceServer).ChromitePytest(ctx, req.(*ChromitePytestRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TestService_CrosSigningTest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(CrosSigningTestRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TestServiceServer).CrosSigningTest(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.TestService/CrosSigningTest",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TestServiceServer).CrosSigningTest(ctx, req.(*CrosSigningTestRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TestService_DebugInfoTest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(DebugInfoTestRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TestServiceServer).DebugInfoTest(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.TestService/DebugInfoTest",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TestServiceServer).DebugInfoTest(ctx, req.(*DebugInfoTestRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TestService_VmTest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(VmTestRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TestServiceServer).VmTest(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.TestService/VmTest",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TestServiceServer).VmTest(ctx, req.(*VmTestRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TestService_MoblabVmTest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(MoblabVmTestRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TestServiceServer).MoblabVmTest(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.TestService/MoblabVmTest",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TestServiceServer).MoblabVmTest(ctx, req.(*MoblabVmTestRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _TestService_SimpleChromeWorkflowTest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(SimpleChromeWorkflowTestRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(TestServiceServer).SimpleChromeWorkflowTest(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.TestService/SimpleChromeWorkflowTest",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(TestServiceServer).SimpleChromeWorkflowTest(ctx, req.(*SimpleChromeWorkflowTestRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _TestService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.TestService",
	HandlerType: (*TestServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "BuildTargetUnitTest",
			Handler:    _TestService_BuildTargetUnitTest_Handler,
		},
		{
			MethodName: "ChromiteUnitTest",
			Handler:    _TestService_ChromiteUnitTest_Handler,
		},
		{
			MethodName: "ChromitePytest",
			Handler:    _TestService_ChromitePytest_Handler,
		},
		{
			MethodName: "CrosSigningTest",
			Handler:    _TestService_CrosSigningTest_Handler,
		},
		{
			MethodName: "DebugInfoTest",
			Handler:    _TestService_DebugInfoTest_Handler,
		},
		{
			MethodName: "VmTest",
			Handler:    _TestService_VmTest_Handler,
		},
		{
			MethodName: "MoblabVmTest",
			Handler:    _TestService_MoblabVmTest_Handler,
		},
		{
			MethodName: "SimpleChromeWorkflowTest",
			Handler:    _TestService_SimpleChromeWorkflowTest_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/test.proto",
}
