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()
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())
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()
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)
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)
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)