// 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: test_platform/autotest/dynamic_suite.proto

package autotest

import (
	api "go.chromium.org/chromiumos/infra/proto/go/chromite/api"
	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)
)

// TestPlatformArgs defines the input format used by autotest's dynamic suite
// (see https://chromium.googlesource.com/chromiumos/third_party/autotest/+/refs/heads/master/server/cros/dynamic_suite/dynamic_suite.py)
// This argument is available to the control.cros_test_platform suite, as an
// autotest entry point for cros_test_platform.
//
// These arguments are in addition to the standard dynamic_suite arguments
// passed in via the run_suite command line
// (see https://chromium.googlesource.com/chromiumos/third_party/autotest/+/refs/heads/master/site_utils/run_suite.py).
type TestPlatformArgs struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Tests []*api.AutotestTest `protobuf:"bytes,1,rep,name=tests,proto3" json:"tests,omitempty"`
}

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

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

func (*TestPlatformArgs) ProtoMessage() {}

func (x *TestPlatformArgs) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_autotest_dynamic_suite_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 TestPlatformArgs.ProtoReflect.Descriptor instead.
func (*TestPlatformArgs) Descriptor() ([]byte, []int) {
	return file_test_platform_autotest_dynamic_suite_proto_rawDescGZIP(), []int{0}
}

func (x *TestPlatformArgs) GetTests() []*api.AutotestTest {
	if x != nil {
		return x.Tests
	}
	return nil
}

var File_test_platform_autotest_dynamic_suite_proto protoreflect.FileDescriptor

var file_test_platform_autotest_dynamic_suite_proto_rawDesc = []byte{
	0x0a, 0x2a, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x64, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63,
	0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x74, 0x65,
	0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x61, 0x75, 0x74, 0x6f,
	0x74, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61,
	0x70, 0x69, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x44, 0x0a, 0x10, 0x54, 0x65, 0x73, 0x74, 0x50, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x41, 0x72, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x74, 0x65,
	0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73,
	0x74, 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x74, 0x65, 0x73, 0x74, 0x73, 0x42, 0x42, 0x5a, 0x40,
	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, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x74, 0x65, 0x73, 0x74,
	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_autotest_dynamic_suite_proto_rawDescOnce sync.Once
	file_test_platform_autotest_dynamic_suite_proto_rawDescData = file_test_platform_autotest_dynamic_suite_proto_rawDesc
)

func file_test_platform_autotest_dynamic_suite_proto_rawDescGZIP() []byte {
	file_test_platform_autotest_dynamic_suite_proto_rawDescOnce.Do(func() {
		file_test_platform_autotest_dynamic_suite_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_autotest_dynamic_suite_proto_rawDescData)
	})
	return file_test_platform_autotest_dynamic_suite_proto_rawDescData
}

var file_test_platform_autotest_dynamic_suite_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_test_platform_autotest_dynamic_suite_proto_goTypes = []interface{}{
	(*TestPlatformArgs)(nil), // 0: test_platform.autotest.TestPlatformArgs
	(*api.AutotestTest)(nil), // 1: chromite.api.AutotestTest
}
var file_test_platform_autotest_dynamic_suite_proto_depIdxs = []int32{
	1, // 0: test_platform.autotest.TestPlatformArgs.tests:type_name -> chromite.api.AutotestTest
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_test_platform_autotest_dynamic_suite_proto_init() }
func file_test_platform_autotest_dynamic_suite_proto_init() {
	if File_test_platform_autotest_dynamic_suite_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_platform_autotest_dynamic_suite_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestPlatformArgs); 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_test_platform_autotest_dynamic_suite_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_autotest_dynamic_suite_proto_goTypes,
		DependencyIndexes: file_test_platform_autotest_dynamic_suite_proto_depIdxs,
		MessageInfos:      file_test_platform_autotest_dynamic_suite_proto_msgTypes,
	}.Build()
	File_test_platform_autotest_dynamic_suite_proto = out.File
	file_test_platform_autotest_dynamic_suite_proto_rawDesc = nil
	file_test_platform_autotest_dynamic_suite_proto_goTypes = nil
	file_test_platform_autotest_dynamic_suite_proto_depIdxs = nil
}
