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

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