Exemplo n.º 1
0
    async def test_sender__do_add_offsets_to_txn_create(self):
        sender = await self._setup_sender()
        add_handler = AddOffsetsToTxnHandler(sender, "some_group")

        req = add_handler.create_request()
        self.assertEqual(req.API_KEY, AddOffsetsToTxnRequest[0].API_KEY)
        self.assertEqual(req.API_VERSION, 0)
        self.assertEqual(req.transactional_id, "test_tid")
        self.assertEqual(req.producer_id, 120)
        self.assertEqual(req.producer_epoch, 22)
        self.assertEqual(req.group_id, "some_group")
Exemplo n.º 2
0
    async def test_sender__do_add_offsets_to_txn_create(self):
        sender = await self._setup_sender()
        add_handler = AddOffsetsToTxnHandler(sender, "some_group")

        req = add_handler.create_request()
        self.assertEqual(req.API_KEY, AddOffsetsToTxnRequest[0].API_KEY)
        self.assertEqual(req.API_VERSION, 0)
        self.assertEqual(req.transactional_id, "test_tid")
        self.assertEqual(req.producer_id, 120)
        self.assertEqual(req.producer_epoch, 22)
        self.assertEqual(req.group_id, "some_group")
Exemplo n.º 3
0
    async def test_sender__do_add_offsets_to_txn_ok(self):
        sender = await self._setup_sender()
        add_handler = AddOffsetsToTxnHandler(sender, "some_group")
        tm = sender._txn_manager
        tm.consumer_group_added = mock.Mock()

        # Handle response
        cls = AddOffsetsToTxnResponse[0]
        resp = cls(throttle_time_ms=300, error_code=NoError.errno)
        backoff = add_handler.handle_response(resp)
        self.assertIsNone(backoff)
        tm.consumer_group_added.assert_called_with("some_group")
Exemplo n.º 4
0
    async def test_sender__do_add_offsets_to_txn_ok(self):
        sender = await self._setup_sender()
        add_handler = AddOffsetsToTxnHandler(sender, "some_group")
        tm = sender._txn_manager
        tm.consumer_group_added = mock.Mock()

        # Handle response
        cls = AddOffsetsToTxnResponse[0]
        resp = cls(
            throttle_time_ms=300,
            error_code=NoError.errno
        )
        backoff = add_handler.handle_response(resp)
        self.assertIsNone(backoff)
        tm.consumer_group_added.assert_called_with("some_group")
Exemplo n.º 5
0
    async def test_sender__do_add_offsets_to_txn_not_ok(self):
        sender = await self._setup_sender()
        add_handler = AddOffsetsToTxnHandler(sender, "some_group")
        tm = sender._txn_manager
        tm.consumer_group_added = mock.Mock()

        def create_response(error_type):
            cls = AddOffsetsToTxnResponse[0]
            resp = cls(throttle_time_ms=300, error_code=error_type.errno)
            return resp

        # Handle coordination errors
        for error_cls in [CoordinatorNotAvailableError, NotCoordinatorError]:
            with mock.patch.object(sender, "_coordinator_dead") as mocked:
                resp = create_response(error_cls)
                backoff = add_handler.handle_response(resp)
                self.assertEqual(backoff, 0.1)
                tm.consumer_group_added.assert_not_called()
                mocked.assert_called_with(CoordinationType.TRANSACTION)

        # Not coordination retriable errors
        for error_cls in [
                CoordinatorLoadInProgressError, ConcurrentTransactions
        ]:
            resp = create_response(error_cls)
            backoff = add_handler.handle_response(resp)
            self.assertEqual(backoff, 0.1)
            tm.consumer_group_added.assert_not_called()

        # ProducerFenced case
        resp = create_response(InvalidProducerEpoch)
        with self.assertRaises(ProducerFenced):
            add_handler.handle_response(resp)
        tm.consumer_group_added.assert_not_called()

        for error_type in [InvalidTxnState]:
            resp = create_response(error_type)
            with self.assertRaises(error_type):
                add_handler.handle_response(resp)
            tm.consumer_group_added.assert_not_called()

        # Handle unknown error
        resp = create_response(UnknownError)
        with self.assertRaises(UnknownError):
            add_handler.handle_response(resp)
        tm.consumer_group_added.assert_not_called()
Exemplo n.º 6
0
    async def test_sender__do_add_offsets_to_txn_not_ok(self):
        sender = await self._setup_sender()
        add_handler = AddOffsetsToTxnHandler(sender, "some_group")
        tm = sender._txn_manager
        tm.begin_transaction()
        tm.consumer_group_added = mock.Mock()

        def create_response(error_type):
            cls = AddOffsetsToTxnResponse[0]
            resp = cls(
                throttle_time_ms=300,
                error_code=error_type.errno
            )
            return resp

        # Handle coordination errors
        for error_cls in [CoordinatorNotAvailableError, NotCoordinatorError]:
            with mock.patch.object(sender, "_coordinator_dead") as mocked:
                resp = create_response(error_cls)
                backoff = add_handler.handle_response(resp)
                self.assertEqual(backoff, 0.1)
                tm.consumer_group_added.assert_not_called()
                mocked.assert_called_with(CoordinationType.TRANSACTION)

        # Not coordination retriable errors
        for error_cls in [
                CoordinatorLoadInProgressError, ConcurrentTransactions]:
            resp = create_response(error_cls)
            backoff = add_handler.handle_response(resp)
            self.assertEqual(backoff, 0.1)
            tm.consumer_group_added.assert_not_called()

        # ProducerFenced case
        resp = create_response(InvalidProducerEpoch)
        with self.assertRaises(ProducerFenced):
            add_handler.handle_response(resp)
        tm.consumer_group_added.assert_not_called()

        for error_type in [InvalidTxnState]:
            resp = create_response(error_type)
            with self.assertRaises(error_type):
                add_handler.handle_response(resp)
            tm.consumer_group_added.assert_not_called()

        # Handle unknown error
        resp = create_response(UnknownError)
        with self.assertRaises(UnknownError):
            add_handler.handle_response(resp)
        tm.consumer_group_added.assert_not_called()

        # Handle authorization error
        resp = create_response(TransactionalIdAuthorizationFailed)
        with self.assertRaises(TransactionalIdAuthorizationFailed) as cm:
            add_handler.handle_response(resp)
        tm.consumer_group_added.assert_not_called()
        self.assertEqual(cm.exception.args[0], "test_tid")

        # Handle group error
        self.assertNotEqual(tm.state, TransactionState.ABORTABLE_ERROR)
        resp = create_response(GroupAuthorizationFailedError)
        backoff = add_handler.handle_response(resp)
        self.assertIsNone(backoff)
        tm.consumer_group_added.assert_not_called()
        self.assertEqual(tm.state, TransactionState.ABORTABLE_ERROR)