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

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