// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

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

package testplans

import (
	_struct "github.com/golang/protobuf/ptypes/struct"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

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

	// Serialized buildbucket Build protos that are part of this orchestrator run.
	// See https://chromium.googlesource.com/infra/luci/luci-go/+/master/buildbucket/proto/build.proto
	BuildbucketProtos []*ProtoBytes `protobuf:"bytes,5,rep,name=buildbucket_protos,json=buildbucketProtos,proto3" json:"buildbucket_protos,omitempty"`
	// The manifest-internal snapshot commit hash that's being used for the current build.
	// Note that manifest_commit will be soon replaced with gitiles_commit below.
	ManifestCommit string `protobuf:"bytes,7,opt,name=manifest_commit,json=manifestCommit,proto3" json:"manifest_commit,omitempty"`
	// Serialized buildbucket GitilesCommit, representing the manifest or
	// manifest-internal commit to which the build is synced.
	GitilesCommit *ProtoBytes `protobuf:"bytes,9,opt,name=gitiles_commit,json=gitilesCommit,proto3" json:"gitiles_commit,omitempty"`
	// Serialized buildbucket GerritChanges, or none if this is a postsubmit run
	// or similar. Explicit proto import is avoided here to prevent a dependency
	// on the luci-go repo.
	// See https://chromium.googlesource.com/infra/luci/luci-go/+/master/buildbucket/proto/common.proto
	GerritChanges []*ProtoBytes `protobuf:"bytes,8,rep,name=gerrit_changes,json=gerritChanges,proto3" json:"gerrit_changes,omitempty"`
}

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

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

func (*GenerateTestPlanRequest) ProtoMessage() {}

func (x *GenerateTestPlanRequest) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_generate_test_plan_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GenerateTestPlanRequest.ProtoReflect.Descriptor instead.
func (*GenerateTestPlanRequest) Descriptor() ([]byte, []int) {
	return file_testplans_generate_test_plan_proto_rawDescGZIP(), []int{0}
}

func (x *GenerateTestPlanRequest) GetBuildbucketProtos() []*ProtoBytes {
	if x != nil {
		return x.BuildbucketProtos
	}
	return nil
}

func (x *GenerateTestPlanRequest) GetManifestCommit() string {
	if x != nil {
		return x.ManifestCommit
	}
	return ""
}

func (x *GenerateTestPlanRequest) GetGitilesCommit() *ProtoBytes {
	if x != nil {
		return x.GitilesCommit
	}
	return nil
}

func (x *GenerateTestPlanRequest) GetGerritChanges() []*ProtoBytes {
	if x != nil {
		return x.GerritChanges
	}
	return nil
}

// The final test plan.
type GenerateTestPlanResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	HwTestUnits           []*HwTestUnit     `protobuf:"bytes,3,rep,name=hw_test_units,json=hwTestUnits,proto3" json:"hw_test_units,omitempty"`
	VmTestUnits           []*VmTestUnit     `protobuf:"bytes,6,rep,name=vm_test_units,json=vmTestUnits,proto3" json:"vm_test_units,omitempty"`
	DirectTastVmTestUnits []*TastVmTestUnit `protobuf:"bytes,7,rep,name=direct_tast_vm_test_units,json=directTastVmTestUnits,proto3" json:"direct_tast_vm_test_units,omitempty"`
}

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

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

func (*GenerateTestPlanResponse) ProtoMessage() {}

func (x *GenerateTestPlanResponse) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_generate_test_plan_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GenerateTestPlanResponse.ProtoReflect.Descriptor instead.
func (*GenerateTestPlanResponse) Descriptor() ([]byte, []int) {
	return file_testplans_generate_test_plan_proto_rawDescGZIP(), []int{1}
}

func (x *GenerateTestPlanResponse) GetHwTestUnits() []*HwTestUnit {
	if x != nil {
		return x.HwTestUnits
	}
	return nil
}

func (x *GenerateTestPlanResponse) GetVmTestUnits() []*VmTestUnit {
	if x != nil {
		return x.VmTestUnits
	}
	return nil
}

func (x *GenerateTestPlanResponse) GetDirectTastVmTestUnits() []*TastVmTestUnit {
	if x != nil {
		return x.DirectTastVmTestUnits
	}
	return nil
}

// The files that should be tested in a test plan.
type BuildPayload struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The GS bucket in which artifacts for the build are stored, e.g.
	// gs://chromeos-image-archive
	ArtifactsGsBucket string `protobuf:"bytes,1,opt,name=artifacts_gs_bucket,json=artifactsGsBucket,proto3" json:"artifacts_gs_bucket,omitempty"`
	// The path in the bucket in which artifacts for the build are stored, e.g.
	// eve-paladin/R73-11588.0.0-rc4
	ArtifactsGsPath string `protobuf:"bytes,2,opt,name=artifacts_gs_path,json=artifactsGsPath,proto3" json:"artifacts_gs_path,omitempty"`
	// Artifact type to files available for that type. e.g.
	// "AUTOTEST_FILES": [ "control_files.tar" ]
	FilesByArtifact *_struct.Struct `protobuf:"bytes,3,opt,name=files_by_artifact,json=filesByArtifact,proto3" json:"files_by_artifact,omitempty"`
}

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

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

func (*BuildPayload) ProtoMessage() {}

func (x *BuildPayload) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_generate_test_plan_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BuildPayload.ProtoReflect.Descriptor instead.
func (*BuildPayload) Descriptor() ([]byte, []int) {
	return file_testplans_generate_test_plan_proto_rawDescGZIP(), []int{2}
}

func (x *BuildPayload) GetArtifactsGsBucket() string {
	if x != nil {
		return x.ArtifactsGsBucket
	}
	return ""
}

func (x *BuildPayload) GetArtifactsGsPath() string {
	if x != nil {
		return x.ArtifactsGsPath
	}
	return ""
}

func (x *BuildPayload) GetFilesByArtifact() *_struct.Struct {
	if x != nil {
		return x.FilesByArtifact
	}
	return nil
}

// The parts of a TestUnit that are common among all test types.
type TestUnitCommon struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The build target for this test unit.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// A builder name for this test unit, e.g. eve-arcvm-cq.
	BuilderName string `protobuf:"bytes,4,opt,name=builder_name,json=builderName,proto3" json:"builder_name,omitempty"`
	// The build files provided to run this test unit.
	BuildPayload *BuildPayload `protobuf:"bytes,3,opt,name=build_payload,json=buildPayload,proto3" json:"build_payload,omitempty"`
}

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

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

func (*TestUnitCommon) ProtoMessage() {}

func (x *TestUnitCommon) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_generate_test_plan_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestUnitCommon.ProtoReflect.Descriptor instead.
func (*TestUnitCommon) Descriptor() ([]byte, []int) {
	return file_testplans_generate_test_plan_proto_rawDescGZIP(), []int{3}
}

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

func (x *TestUnitCommon) GetBuilderName() string {
	if x != nil {
		return x.BuilderName
	}
	return ""
}

func (x *TestUnitCommon) GetBuildPayload() *BuildPayload {
	if x != nil {
		return x.BuildPayload
	}
	return nil
}

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

	Common    *TestUnitCommon `protobuf:"bytes,1,opt,name=common,proto3" json:"common,omitempty"`
	HwTestCfg *HwTestCfg      `protobuf:"bytes,2,opt,name=hw_test_cfg,json=hwTestCfg,proto3" json:"hw_test_cfg,omitempty"`
}

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

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

func (*HwTestUnit) ProtoMessage() {}

func (x *HwTestUnit) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_generate_test_plan_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use HwTestUnit.ProtoReflect.Descriptor instead.
func (*HwTestUnit) Descriptor() ([]byte, []int) {
	return file_testplans_generate_test_plan_proto_rawDescGZIP(), []int{4}
}

func (x *HwTestUnit) GetCommon() *TestUnitCommon {
	if x != nil {
		return x.Common
	}
	return nil
}

func (x *HwTestUnit) GetHwTestCfg() *HwTestCfg {
	if x != nil {
		return x.HwTestCfg
	}
	return nil
}

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

	Common        *TestUnitCommon `protobuf:"bytes,1,opt,name=common,proto3" json:"common,omitempty"`
	TastVmTestCfg *TastVmTestCfg  `protobuf:"bytes,2,opt,name=tast_vm_test_cfg,json=tastVmTestCfg,proto3" json:"tast_vm_test_cfg,omitempty"`
}

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

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

func (*TastVmTestUnit) ProtoMessage() {}

func (x *TastVmTestUnit) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_generate_test_plan_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TastVmTestUnit.ProtoReflect.Descriptor instead.
func (*TastVmTestUnit) Descriptor() ([]byte, []int) {
	return file_testplans_generate_test_plan_proto_rawDescGZIP(), []int{5}
}

func (x *TastVmTestUnit) GetCommon() *TestUnitCommon {
	if x != nil {
		return x.Common
	}
	return nil
}

func (x *TastVmTestUnit) GetTastVmTestCfg() *TastVmTestCfg {
	if x != nil {
		return x.TastVmTestCfg
	}
	return nil
}

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

	Common    *TestUnitCommon `protobuf:"bytes,1,opt,name=common,proto3" json:"common,omitempty"`
	VmTestCfg *VmTestCfg      `protobuf:"bytes,2,opt,name=vm_test_cfg,json=vmTestCfg,proto3" json:"vm_test_cfg,omitempty"`
}

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

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

func (*VmTestUnit) ProtoMessage() {}

func (x *VmTestUnit) ProtoReflect() protoreflect.Message {
	mi := &file_testplans_generate_test_plan_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use VmTestUnit.ProtoReflect.Descriptor instead.
func (*VmTestUnit) Descriptor() ([]byte, []int) {
	return file_testplans_generate_test_plan_proto_rawDescGZIP(), []int{6}
}

func (x *VmTestUnit) GetCommon() *TestUnitCommon {
	if x != nil {
		return x.Common
	}
	return nil
}

func (x *VmTestUnit) GetVmTestCfg() *VmTestCfg {
	if x != nil {
		return x.VmTestCfg
	}
	return nil
}

var File_testplans_generate_test_plan_proto protoreflect.FileDescriptor

var file_testplans_generate_test_plan_proto_rawDesc = []byte{
	0x0a, 0x22, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x67, 0x65, 0x6e, 0x65,
	0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x2e, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x1a,
	0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d,
	0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e,
	0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2f,
	0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
	0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e,
	0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
	0x84, 0x02, 0x0a, 0x17, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74,
	0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x12, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c,
	0x61, 0x6e, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x11,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f,
	0x73, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f,
	0x6d, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x61, 0x6e, 0x69,
	0x66, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x67, 0x69,
	0x74, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x50,
	0x72, 0x6f, 0x74, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x0d, 0x67, 0x69, 0x74, 0x69, 0x6c,
	0x65, 0x73, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x3c, 0x0a, 0x0e, 0x67, 0x65, 0x72, 0x72,
	0x69, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x50, 0x72, 0x6f,
	0x74, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x0d, 0x67, 0x65, 0x72, 0x72, 0x69, 0x74, 0x43,
	0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x22, 0xf7, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x6e, 0x65, 0x72,
	0x61, 0x74, 0x65, 0x54, 0x65, 0x73, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x68, 0x77, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x75,
	0x6e, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73,
	0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x48, 0x77, 0x54, 0x65, 0x73, 0x74, 0x55, 0x6e, 0x69,
	0x74, 0x52, 0x0b, 0x68, 0x77, 0x54, 0x65, 0x73, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x73, 0x12, 0x39,
	0x0a, 0x0d, 0x76, 0x6d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x18,
	0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e,
	0x73, 0x2e, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x0b, 0x76, 0x6d,
	0x54, 0x65, 0x73, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x73, 0x12, 0x53, 0x0a, 0x19, 0x64, 0x69, 0x72,
	0x65, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x74, 0x5f, 0x76, 0x6d, 0x5f, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x74, 0x56, 0x6d, 0x54,
	0x65, 0x73, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x52, 0x15, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x54,
	0x61, 0x73, 0x74, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x73, 0x4a, 0x04,
	0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06,
	0x22, 0xaf, 0x01, 0x0a, 0x0c, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61,
	0x64, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x67,
	0x73, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11,
	0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x47, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65,
	0x74, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x67,
	0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x72,
	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x47, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x43, 0x0a,
	0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61,
	0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63,
	0x74, 0x52, 0x0f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x79, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61,
	0x63, 0x74, 0x22, 0xad, 0x01, 0x0a, 0x0e, 0x54, 0x65, 0x73, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x43,
	0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74,
	0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61,
	0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65,
	0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d,
	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72,
	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x70, 0x61,
	0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x61, 0x79,
	0x6c, 0x6f, 0x61, 0x64, 0x52, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x50, 0x61, 0x79, 0x6c, 0x6f,
	0x61, 0x64, 0x22, 0x75, 0x0a, 0x0a, 0x48, 0x77, 0x54, 0x65, 0x73, 0x74, 0x55, 0x6e, 0x69, 0x74,
	0x12, 0x31, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x19, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x65, 0x73,
	0x74, 0x55, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6d,
	0x6d, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x0b, 0x68, 0x77, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63,
	0x66, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70,
	0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x48, 0x77, 0x54, 0x65, 0x73, 0x74, 0x43, 0x66, 0x67, 0x52, 0x09,
	0x68, 0x77, 0x54, 0x65, 0x73, 0x74, 0x43, 0x66, 0x67, 0x22, 0x86, 0x01, 0x0a, 0x0e, 0x54, 0x61,
	0x73, 0x74, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x06,
	0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x55, 0x6e, 0x69,
	0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12,
	0x41, 0x0a, 0x10, 0x74, 0x61, 0x73, 0x74, 0x5f, 0x76, 0x6d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x63, 0x66, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x61, 0x73, 0x74, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74,
	0x43, 0x66, 0x67, 0x52, 0x0d, 0x74, 0x61, 0x73, 0x74, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x43,
	0x66, 0x67, 0x22, 0x75, 0x0a, 0x0a, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x55, 0x6e, 0x69, 0x74,
	0x12, 0x31, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x19, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x54, 0x65, 0x73,
	0x74, 0x55, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x52, 0x06, 0x63, 0x6f, 0x6d,
	0x6d, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x0b, 0x76, 0x6d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63,
	0x66, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x70,
	0x6c, 0x61, 0x6e, 0x73, 0x2e, 0x56, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x43, 0x66, 0x67, 0x52, 0x09,
	0x76, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x43, 0x66, 0x67, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x6f, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x70, 0x6c, 0x61, 0x6e, 0x73,
	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_testplans_generate_test_plan_proto_rawDescOnce sync.Once
	file_testplans_generate_test_plan_proto_rawDescData = file_testplans_generate_test_plan_proto_rawDesc
)

func file_testplans_generate_test_plan_proto_rawDescGZIP() []byte {
	file_testplans_generate_test_plan_proto_rawDescOnce.Do(func() {
		file_testplans_generate_test_plan_proto_rawDescData = protoimpl.X.CompressGZIP(file_testplans_generate_test_plan_proto_rawDescData)
	})
	return file_testplans_generate_test_plan_proto_rawDescData
}

var file_testplans_generate_test_plan_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
var file_testplans_generate_test_plan_proto_goTypes = []interface{}{
	(*GenerateTestPlanRequest)(nil),  // 0: testplans.GenerateTestPlanRequest
	(*GenerateTestPlanResponse)(nil), // 1: testplans.GenerateTestPlanResponse
	(*BuildPayload)(nil),             // 2: testplans.BuildPayload
	(*TestUnitCommon)(nil),           // 3: testplans.TestUnitCommon
	(*HwTestUnit)(nil),               // 4: testplans.HwTestUnit
	(*TastVmTestUnit)(nil),           // 5: testplans.TastVmTestUnit
	(*VmTestUnit)(nil),               // 6: testplans.VmTestUnit
	(*ProtoBytes)(nil),               // 7: testplans.ProtoBytes
	(*_struct.Struct)(nil),           // 8: google.protobuf.Struct
	(*chromiumos.BuildTarget)(nil),   // 9: chromiumos.BuildTarget
	(*HwTestCfg)(nil),                // 10: testplans.HwTestCfg
	(*TastVmTestCfg)(nil),            // 11: testplans.TastVmTestCfg
	(*VmTestCfg)(nil),                // 12: testplans.VmTestCfg
}
var file_testplans_generate_test_plan_proto_depIdxs = []int32{
	7,  // 0: testplans.GenerateTestPlanRequest.buildbucket_protos:type_name -> testplans.ProtoBytes
	7,  // 1: testplans.GenerateTestPlanRequest.gitiles_commit:type_name -> testplans.ProtoBytes
	7,  // 2: testplans.GenerateTestPlanRequest.gerrit_changes:type_name -> testplans.ProtoBytes
	4,  // 3: testplans.GenerateTestPlanResponse.hw_test_units:type_name -> testplans.HwTestUnit
	6,  // 4: testplans.GenerateTestPlanResponse.vm_test_units:type_name -> testplans.VmTestUnit
	5,  // 5: testplans.GenerateTestPlanResponse.direct_tast_vm_test_units:type_name -> testplans.TastVmTestUnit
	8,  // 6: testplans.BuildPayload.files_by_artifact:type_name -> google.protobuf.Struct
	9,  // 7: testplans.TestUnitCommon.build_target:type_name -> chromiumos.BuildTarget
	2,  // 8: testplans.TestUnitCommon.build_payload:type_name -> testplans.BuildPayload
	3,  // 9: testplans.HwTestUnit.common:type_name -> testplans.TestUnitCommon
	10, // 10: testplans.HwTestUnit.hw_test_cfg:type_name -> testplans.HwTestCfg
	3,  // 11: testplans.TastVmTestUnit.common:type_name -> testplans.TestUnitCommon
	11, // 12: testplans.TastVmTestUnit.tast_vm_test_cfg:type_name -> testplans.TastVmTestCfg
	3,  // 13: testplans.VmTestUnit.common:type_name -> testplans.TestUnitCommon
	12, // 14: testplans.VmTestUnit.vm_test_cfg:type_name -> testplans.VmTestCfg
	15, // [15:15] is the sub-list for method output_type
	15, // [15:15] is the sub-list for method input_type
	15, // [15:15] is the sub-list for extension type_name
	15, // [15:15] is the sub-list for extension extendee
	0,  // [0:15] is the sub-list for field type_name
}

func init() { file_testplans_generate_test_plan_proto_init() }
func file_testplans_generate_test_plan_proto_init() {
	if File_testplans_generate_test_plan_proto != nil {
		return
	}
	file_testplans_common_proto_init()
	file_testplans_target_test_requirements_config_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_testplans_generate_test_plan_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GenerateTestPlanRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_generate_test_plan_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GenerateTestPlanResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_generate_test_plan_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildPayload); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_generate_test_plan_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestUnitCommon); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_generate_test_plan_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*HwTestUnit); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_generate_test_plan_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TastVmTestUnit); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_testplans_generate_test_plan_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*VmTestUnit); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_testplans_generate_test_plan_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   7,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_testplans_generate_test_plan_proto_goTypes,
		DependencyIndexes: file_testplans_generate_test_plan_proto_depIdxs,
		MessageInfos:      file_testplans_generate_test_plan_proto_msgTypes,
	}.Build()
	File_testplans_generate_test_plan_proto = out.File
	file_testplans_generate_test_plan_proto_rawDesc = nil
	file_testplans_generate_test_plan_proto_goTypes = nil
	file_testplans_generate_test_plan_proto_depIdxs = nil
}
