// 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.
	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"`
	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
}

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"`
	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
}

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