Exemple #1
0
class TestListenChannel(PyonTestCase):

    def setUp(self):
        self.ch = ListenChannel()

    def test__create_accepted_channel(self):
        newch = self.ch._create_accepted_channel(sentinel.transport, sentinel.msg)
        self.assertIsInstance(newch, ListenChannel.AcceptedListenChannel)
        self.assertEquals(newch._transport, sentinel.transport)

    def test_accept(self):
        rmock = Mock()
        rmock.return_value = sentinel.msg

        cacmock = Mock()
        transport = Mock()

        self.ch.recv = rmock
        self.ch._recv_queue.await_n = MagicMock()
        self.ch._create_accepted_channel = cacmock
        self.ch.on_channel_open(transport)
        self.ch._fsm.current_state = self.ch.S_ACTIVE
        self.ch._consuming = True

        retch = self.ch.accept()
        self.assertEquals(self.ch._fsm.current_state, self.ch.S_ACCEPTED)
        cacmock.assert_called_once_with(transport, [sentinel.msg])
        retch._recv_queue.put.assert_called_once_with(sentinel.msg)

        # we've mocked all the working machinery of accept's return etc, so we must manually exit accept
        # as if we've ack'd/reject'd
        self.ch.exit_accept()

        self.assertEquals(self.ch._fsm.current_state, self.ch.S_ACTIVE)
        self.assertTrue(self.ch._consuming)

    def test_close_while_accepted(self):
        rmock = Mock()
        rmock.return_value = sentinel.msg

        cacmock = Mock()
        transport = Mock()

        self.ch.recv = rmock
        self.ch._recv_queue.await_n = MagicMock()
        self.ch._create_accepted_channel = cacmock
        self.ch.on_channel_open(transport)
        self.ch._fsm.current_state = self.ch.S_ACTIVE
        self.ch._consuming = True

        # to test close to make sure nothing happened
        self.ch.close_impl = Mock()

        # stub out stop consume reaction
        self.ch._on_stop_consume = Mock()

        retch = self.ch.accept()
        self.assertEquals(self.ch._fsm.current_state, self.ch.S_ACCEPTED)

        self.ch.close()

        # ensure nothing close-like got called!
        self.assertFalse(self.ch.close_impl.called)
        self.assertFalse(self.ch._on_stop_consume.called)
        self.assertEquals(self.ch._fsm.current_state, self.ch.S_CLOSING)

        # we've mocked all the working machinery of accept's return etc, so we must manually exit accept
        # as if we've ack'd/reject'd
        self.ch.exit_accept()

        self.assertTrue(self.ch.close_impl.called)
        self.assertTrue(self.ch._on_stop_consume.called)
        self.assertEquals(self.ch._fsm.current_state, self.ch.S_CLOSED)
        self.assertFalse(self.ch._consuming)

    def test_stop_consume_while_accepted(self):
        rmock = Mock()
        rmock.return_value = sentinel.msg

        cacmock = Mock()
        transport = Mock()

        self.ch.recv = rmock
        self.ch._recv_queue.await_n = MagicMock()
        self.ch._create_accepted_channel = cacmock
        self.ch.on_channel_open(transport)
        self.ch._fsm.current_state = self.ch.S_ACTIVE
        self.ch._consuming = True

        # to test stop_consume reaction
        self.ch._on_stop_consume = Mock()

        retch = self.ch.accept()
        self.assertEquals(self.ch._fsm.current_state, self.ch.S_ACCEPTED)

        self.ch.stop_consume()

        # we've stopped consuming, no state transition
        self.assertFalse(self.ch._consuming)
        self.assertTrue(self.ch._on_stop_consume.called)
        self.assertEquals(self.ch._fsm.current_state, self.ch.S_ACCEPTED)

        # we've mocked all the working machinery of accept's return etc, so we must manually exit accept
        # as if we've ack'd/reject'd
        self.ch.exit_accept()

        self.assertEquals(self.ch._fsm.current_state, self.ch.S_ACTIVE)

    def test_AcceptedListenChannel_close_does_not_close_underlying_amqp_channel(self):
        transport = Mock()
        newch = self.ch._create_accepted_channel(transport, sentinel.msg)

        newch.close()
        self.assertEquals(transport.close.call_count, 0)
class TestListenChannel(PyonTestCase):
    def setUp(self):
        self.ch = ListenChannel()

    def test__create_accepted_channel(self):
        newch = self.ch._create_accepted_channel(sentinel.transport,
                                                 sentinel.msg)
        self.assertIsInstance(newch, ListenChannel.AcceptedListenChannel)
        self.assertEquals(newch._transport, sentinel.transport)

    def test_accept(self):
        rmock = Mock()
        rmock.return_value = sentinel.msg

        cacmock = Mock()
        transport = Mock()

        self.ch.recv = rmock
        self.ch._recv_queue.await_n = MagicMock()
        self.ch._create_accepted_channel = cacmock
        self.ch.on_channel_open(transport)
        self.ch._fsm.current_state = self.ch.S_ACTIVE
        self.ch._consuming = True

        retch = self.ch.accept()
        self.assertEquals(self.ch._fsm.current_state, self.ch.S_ACCEPTED)
        cacmock.assert_called_once_with(transport, [sentinel.msg])
        retch._recv_queue.put.assert_called_once_with(sentinel.msg)

        # we've mocked all the working machinery of accept's return etc, so we must manually exit accept
        # as if we've ack'd/reject'd
        self.ch.exit_accept()

        self.assertEquals(self.ch._fsm.current_state, self.ch.S_ACTIVE)
        self.assertTrue(self.ch._consuming)

    def test_close_while_accepted(self):
        rmock = Mock()
        rmock.return_value = sentinel.msg

        cacmock = Mock()
        transport = Mock()

        self.ch.recv = rmock
        self.ch._recv_queue.await_n = MagicMock()
        self.ch._create_accepted_channel = cacmock
        self.ch.on_channel_open(transport)
        self.ch._fsm.current_state = self.ch.S_ACTIVE
        self.ch._consuming = True

        # to test close to make sure nothing happened
        self.ch.close_impl = Mock()

        # stub out stop consume reaction
        self.ch._on_stop_consume = Mock()

        retch = self.ch.accept()
        self.assertEquals(self.ch._fsm.current_state, self.ch.S_ACCEPTED)

        self.ch.close()

        # ensure nothing close-like got called!
        self.assertFalse(self.ch.close_impl.called)
        self.assertFalse(self.ch._on_stop_consume.called)
        self.assertEquals(self.ch._fsm.current_state, self.ch.S_CLOSING)

        # we've mocked all the working machinery of accept's return etc, so we must manually exit accept
        # as if we've ack'd/reject'd
        self.ch.exit_accept()

        self.assertTrue(self.ch.close_impl.called)
        self.assertTrue(self.ch._on_stop_consume.called)
        self.assertEquals(self.ch._fsm.current_state, self.ch.S_CLOSED)
        self.assertFalse(self.ch._consuming)

    def test_stop_consume_while_accepted(self):
        rmock = Mock()
        rmock.return_value = sentinel.msg

        cacmock = Mock()
        transport = Mock()

        self.ch.recv = rmock
        self.ch._recv_queue.await_n = MagicMock()
        self.ch._create_accepted_channel = cacmock
        self.ch.on_channel_open(transport)
        self.ch._fsm.current_state = self.ch.S_ACTIVE
        self.ch._consuming = True

        # to test stop_consume reaction
        self.ch._on_stop_consume = Mock()

        retch = self.ch.accept()
        self.assertEquals(self.ch._fsm.current_state, self.ch.S_ACCEPTED)

        self.ch.stop_consume()

        # we've stopped consuming, no state transition
        self.assertFalse(self.ch._consuming)
        self.assertTrue(self.ch._on_stop_consume.called)
        self.assertEquals(self.ch._fsm.current_state, self.ch.S_ACCEPTED)

        # we've mocked all the working machinery of accept's return etc, so we must manually exit accept
        # as if we've ack'd/reject'd
        self.ch.exit_accept()

        self.assertEquals(self.ch._fsm.current_state, self.ch.S_ACTIVE)

    def test_AcceptedListenChannel_close_does_not_close_underlying_amqp_channel(
            self):
        transport = Mock()
        newch = self.ch._create_accepted_channel(transport, sentinel.msg)

        newch.close()
        self.assertEquals(transport.close.call_count, 0)