Esempio n. 1
0
 def adaptation(operator, operation_context):
   rendezvous = _control.Rendezvous(operator, operation_context)
   outcome = operation_context.add_termination_callback(rendezvous.set_outcome)
   if outcome is None:
     pool.submit(_control.pool_wrap(in_pool, operation_context), rendezvous)
     return utilities.full_subscription(rendezvous)
   else:
     raise abandonment.Abandoned()
Esempio n. 2
0
def _invoke(end, group, method, timeout, initial_metadata, payload, complete):
  rendezvous = _control.Rendezvous(None, None)
  operation_context, operator = end.operate(
      group, method, utilities.full_subscription(rendezvous), timeout,
      initial_metadata=initial_metadata, payload=payload,
      completion=_EMPTY_COMPLETION if complete else None)
  rendezvous.set_operator_and_context(operator, operation_context)
  outcome = operation_context.add_termination_callback(rendezvous.set_outcome)
  if outcome is not None:
    rendezvous.set_outcome(outcome)
  return rendezvous, operation_context, outcome
 def service(self, group, method, context, output_operator):
     with self._condition:
         controller = self._controllers.pop(0)
         if group != self._group or method != self._method:
             controller.fail("%s != %s or %s != %s" % (group, self._group, method, self._method))
             raise base.NoSuchMethodError(None, None)
         else:
             operator = _Operator(controller, controller.on_service_advance, self._pool, output_operator)
             outcome = context.add_termination_callback(controller.service_on_termination)
             if outcome is not None:
                 controller.service_on_termination(outcome)
             return utilities.full_subscription(operator, _ProtocolReceiver())
Esempio n. 4
0
 def adaptation(group, method, operator, operation_context):
   rendezvous = _control.Rendezvous(operator, operation_context)
   outcome = operation_context.add_termination_callback(rendezvous.set_outcome)
   if outcome is None:
     def in_pool():
       request_consumer = multi_method(
           group, method, rendezvous, _ServicerContext(rendezvous))
       for request in rendezvous:
         request_consumer.consume(request)
       request_consumer.terminate()
     pool.submit(_control.pool_wrap(in_pool, operation_context), rendezvous)
     return utilities.full_subscription(rendezvous)
   else:
     raise abandonment.Abandoned()
Esempio n. 5
0
 def service(self, group, method, context, output_operator):
     with self._condition:
         controller = self._controllers.pop(0)
         if group != self._group or method != self._method:
             controller.fail('%s != %s or %s != %s' %
                             (group, self._group, method, self._method))
             raise base.NoSuchMethodError()
         else:
             operator = _Operator(controller, controller.on_service_advance,
                                  self._pool, output_operator)
             outcome = context.add_termination_callback(
                 controller.service_on_termination)
             if outcome is not None:
                 controller.service_on_termination(outcome)
             return utilities.full_subscription(operator)
Esempio n. 6
0
  def test_operation(self):
    invocation = self._controller.invocation()
    if invocation.subscription_kind is base.Subscription.Kind.FULL:
      test_operator = _Operator(
          self._controller, self._controller.on_invocation_advance,
          self._pool, None)
      subscription = utilities.full_subscription(
          test_operator, _ProtocolReceiver())
    else:
      # TODO(nathaniel): support and test other subscription kinds.
      self.fail('Non-full subscriptions not yet supported!')

    servicer = _Servicer(
        invocation.group, invocation.method, (self._controller,), self._pool)

    invocation_end, service_end, memo = self._implementation.instantiate(
        {(invocation.group, invocation.method): _Serialization()}, servicer)

    try:
      invocation_end.start()
      service_end.start()
      operation_context, operator_under_test = invocation_end.operate(
          invocation.group, invocation.method, subscription, invocation.timeout,
          initial_metadata=invocation.initial_metadata, payload=invocation.payload,
          completion=invocation.completion)
      test_operator.set_operator_under_test(operator_under_test)
      outcome = operation_context.add_termination_callback(
          self._controller.invocation_on_termination)
      if outcome is not None:
        self._controller.invocation_on_termination(outcome)
    except Exception as e:  # pylint: disable=broad-except
      self._controller.failed('Exception on invocation: %s' % e)
      self.fail(e)

    while True:
      instruction = self._controller.poll()
      if instruction.kind is _control.Instruction.Kind.ADVANCE:
        try:
          test_operator.advance(
              *instruction.advance_args, **instruction.advance_kwargs)
        except Exception as e:  # pylint: disable=broad-except
          self._controller.failed('Exception on instructed advance: %s' % e)
      elif instruction.kind is _control.Instruction.Kind.CANCEL:
        try:
          operation_context.cancel()
        except Exception as e:  # pylint: disable=broad-except
          self._controller.failed('Exception on cancel: %s' % e)
      elif instruction.kind is _control.Instruction.Kind.CONCLUDE:
        break

    invocation_stop_event = invocation_end.stop(0)
    service_stop_event = service_end.stop(0)
    invocation_stop_event.wait()
    service_stop_event.wait()
    invocation_stats = invocation_end.operation_stats()
    service_stats = service_end.operation_stats()

    self._implementation.destantiate(memo)

    self.assertTrue(
        instruction.conclude_success, msg=instruction.conclude_message)

    expected_invocation_stats = dict(_EMPTY_OUTCOME_KIND_DICT)
    expected_invocation_stats[
        instruction.conclude_invocation_outcome_kind] += 1
    self.assertDictEqual(expected_invocation_stats, invocation_stats)
    expected_service_stats = dict(_EMPTY_OUTCOME_KIND_DICT)
    expected_service_stats[instruction.conclude_service_outcome_kind] += 1
    self.assertDictEqual(expected_service_stats, service_stats)
Esempio n. 7
0
  def test_operation(self):
    invocation = self._controller.invocation()
    if invocation.subscription_kind is base.Subscription.Kind.FULL:
      test_operator = _Operator(
          self._controller, self._controller.on_invocation_advance,
          self._pool, None)
      subscription = utilities.full_subscription(
          test_operator, _ProtocolReceiver())
    else:
      # TODO(nathaniel): support and test other subscription kinds.
      self.fail('Non-full subscriptions not yet supported!')

    servicer = _Servicer(
        invocation.group, invocation.method, (self._controller,), self._pool)

    invocation_end, service_end, memo = self._implementation.instantiate(
        {(invocation.group, invocation.method): _Serialization()}, servicer)

    try:
      invocation_end.start()
      service_end.start()
      operation_context, operator_under_test = invocation_end.operate(
          invocation.group, invocation.method, subscription, invocation.timeout,
          initial_metadata=invocation.initial_metadata, payload=invocation.payload,
          completion=invocation.completion)
      test_operator.set_operator_under_test(operator_under_test)
      outcome = operation_context.add_termination_callback(
          self._controller.invocation_on_termination)
      if outcome is not None:
        self._controller.invocation_on_termination(outcome)
    except Exception as e:  # pylint: disable=broad-except
      self._controller.failed('Exception on invocation: %s' % e)
      self.fail(e)

    while True:
      instruction = self._controller.poll()
      if instruction.kind is _control.Instruction.Kind.ADVANCE:
        try:
          test_operator.advance(
              *instruction.advance_args, **instruction.advance_kwargs)
        except Exception as e:  # pylint: disable=broad-except
          self._controller.failed('Exception on instructed advance: %s' % e)
      elif instruction.kind is _control.Instruction.Kind.CANCEL:
        try:
          operation_context.cancel()
        except Exception as e:  # pylint: disable=broad-except
          self._controller.failed('Exception on cancel: %s' % e)
      elif instruction.kind is _control.Instruction.Kind.CONCLUDE:
        break

    invocation_stop_event = invocation_end.stop(0)
    service_stop_event = service_end.stop(0)
    invocation_stop_event.wait()
    service_stop_event.wait()
    invocation_stats = invocation_end.operation_stats()
    service_stats = service_end.operation_stats()

    self._implementation.destantiate(memo)

    self.assertTrue(
        instruction.conclude_success, msg=instruction.conclude_message)

    expected_invocation_stats = dict(_EMPTY_OUTCOME_KIND_DICT)
    expected_invocation_stats[
        instruction.conclude_invocation_outcome_kind] += 1
    self.assertDictEqual(expected_invocation_stats, invocation_stats)
    expected_service_stats = dict(_EMPTY_OUTCOME_KIND_DICT)
    expected_service_stats[instruction.conclude_service_outcome_kind] += 1
    self.assertDictEqual(expected_service_stats, service_stats)