# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: test_platform/v2/request.proto
"""Generated protocol buffer code."""
from chromite.third_party.google.protobuf import descriptor as _descriptor
from chromite.third_party.google.protobuf import message as _message
from chromite.third_party.google.protobuf import reflection as _reflection
from chromite.third_party.google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


from chromite.api.gen.chromiumos.test.api import coverage_rule_pb2 as chromiumos_dot_test_dot_api_dot_coverage__rule__pb2


DESCRIPTOR = _descriptor.FileDescriptor(
  name='test_platform/v2/request.proto',
  package='test_platform.v2',
  syntax='proto3',
  serialized_options=b'Z:go.chromium.org/chromiumos/infra/proto/go/test_platform/v2',
  create_key=_descriptor._internal_create_key,
  serialized_pb=b'\n\x1etest_platform/v2/request.proto\x12\x10test_platform.v2\x1a\'chromiumos/test/api/coverage_rule.proto\"\x93\x01\n\x11HWTestRequestBeta\x12@\n\ntest_specs\x18\x01 \x03(\x0b\x32,.test_platform.v2.HWTestRequestBeta.TestSpec\x1a<\n\x08TestSpec\x12\x30\n\x05rules\x18\x01 \x01(\x0b\x32!.chromiumos.test.api.CoverageRule\"X\n\x0bRequestBeta\x12>\n\x0fhw_test_request\x18\x01 \x01(\x0b\x32#.test_platform.v2.HWTestRequestBetaH\x00\x42\t\n\x07requestB<Z:go.chromium.org/chromiumos/infra/proto/go/test_platform/v2b\x06proto3'
  ,
  dependencies=[chromiumos_dot_test_dot_api_dot_coverage__rule__pb2.DESCRIPTOR,])




_HWTESTREQUESTBETA_TESTSPEC = _descriptor.Descriptor(
  name='TestSpec',
  full_name='test_platform.v2.HWTestRequestBeta.TestSpec',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  create_key=_descriptor._internal_create_key,
  fields=[
    _descriptor.FieldDescriptor(
      name='rules', full_name='test_platform.v2.HWTestRequestBeta.TestSpec.rules', index=0,
      number=1, type=11, cpp_type=10, label=1,
      has_default_value=False, default_value=None,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=181,
  serialized_end=241,
)

_HWTESTREQUESTBETA = _descriptor.Descriptor(
  name='HWTestRequestBeta',
  full_name='test_platform.v2.HWTestRequestBeta',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  create_key=_descriptor._internal_create_key,
  fields=[
    _descriptor.FieldDescriptor(
      name='test_specs', full_name='test_platform.v2.HWTestRequestBeta.test_specs', index=0,
      number=1, type=11, cpp_type=10, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
  ],
  extensions=[
  ],
  nested_types=[_HWTESTREQUESTBETA_TESTSPEC, ],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
  ],
  serialized_start=94,
  serialized_end=241,
)


_REQUESTBETA = _descriptor.Descriptor(
  name='RequestBeta',
  full_name='test_platform.v2.RequestBeta',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  create_key=_descriptor._internal_create_key,
  fields=[
    _descriptor.FieldDescriptor(
      name='hw_test_request', full_name='test_platform.v2.RequestBeta.hw_test_request', index=0,
      number=1, type=11, cpp_type=10, label=1,
      has_default_value=False, default_value=None,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  serialized_options=None,
  is_extendable=False,
  syntax='proto3',
  extension_ranges=[],
  oneofs=[
    _descriptor.OneofDescriptor(
      name='request', full_name='test_platform.v2.RequestBeta.request',
      index=0, containing_type=None,
      create_key=_descriptor._internal_create_key,
    fields=[]),
  ],
  serialized_start=243,
  serialized_end=331,
)

_HWTESTREQUESTBETA_TESTSPEC.fields_by_name['rules'].message_type = chromiumos_dot_test_dot_api_dot_coverage__rule__pb2._COVERAGERULE
_HWTESTREQUESTBETA_TESTSPEC.containing_type = _HWTESTREQUESTBETA
_HWTESTREQUESTBETA.fields_by_name['test_specs'].message_type = _HWTESTREQUESTBETA_TESTSPEC
_REQUESTBETA.fields_by_name['hw_test_request'].message_type = _HWTESTREQUESTBETA
_REQUESTBETA.oneofs_by_name['request'].fields.append(
  _REQUESTBETA.fields_by_name['hw_test_request'])
_REQUESTBETA.fields_by_name['hw_test_request'].containing_oneof = _REQUESTBETA.oneofs_by_name['request']
DESCRIPTOR.message_types_by_name['HWTestRequestBeta'] = _HWTESTREQUESTBETA
DESCRIPTOR.message_types_by_name['RequestBeta'] = _REQUESTBETA
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

HWTestRequestBeta = _reflection.GeneratedProtocolMessageType('HWTestRequestBeta', (_message.Message,), {

  'TestSpec' : _reflection.GeneratedProtocolMessageType('TestSpec', (_message.Message,), {
    'DESCRIPTOR' : _HWTESTREQUESTBETA_TESTSPEC,
    '__module__' : 'test_platform.v2.request_pb2'
    # @@protoc_insertion_point(class_scope:test_platform.v2.HWTestRequestBeta.TestSpec)
    })
  ,
  'DESCRIPTOR' : _HWTESTREQUESTBETA,
  '__module__' : 'test_platform.v2.request_pb2'
  # @@protoc_insertion_point(class_scope:test_platform.v2.HWTestRequestBeta)
  })
_sym_db.RegisterMessage(HWTestRequestBeta)
_sym_db.RegisterMessage(HWTestRequestBeta.TestSpec)

RequestBeta = _reflection.GeneratedProtocolMessageType('RequestBeta', (_message.Message,), {
  'DESCRIPTOR' : _REQUESTBETA,
  '__module__' : 'test_platform.v2.request_pb2'
  # @@protoc_insertion_point(class_scope:test_platform.v2.RequestBeta)
  })
_sym_db.RegisterMessage(RequestBeta)


DESCRIPTOR._options = None
# @@protoc_insertion_point(module_scope)
