# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: test_platform/v2/request.proto

from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()


from chromite.api.gen_sdk.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',
  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,
  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),
  ],
  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,
  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),
  ],
  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,
  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),
  ],
  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, 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)
