def test_add_channel(self): request = _create_mock_request() dispatcher = _MuxMockDispatcher() mux_handler = mux._MuxHandler(request, dispatcher) mux_handler.start() mux_handler.add_channel_slots(mux._INITIAL_NUMBER_OF_CHANNEL_SLOTS, mux._INITIAL_QUOTA_FOR_CLIENT) encoded_handshake = _create_request_header(path='/echo') add_channel_request = _create_add_channel_request_frame( channel_id=2, encoding=0, encoded_handshake=encoded_handshake) request.connection.put_bytes(add_channel_request) flow_control = mux._create_flow_control(channel_id=2, replenished_quota=5, outer_frame_mask=True) request.connection.put_bytes(flow_control) encoded_handshake = _create_request_header(path='/echo') add_channel_request = _create_add_channel_request_frame( channel_id=3, encoding=0, encoded_handshake=encoded_handshake) request.connection.put_bytes(add_channel_request) flow_control = mux._create_flow_control(channel_id=3, replenished_quota=5, outer_frame_mask=True) request.connection.put_bytes(flow_control) request.connection.put_bytes( _create_logical_frame(channel_id=2, message='Hello')) request.connection.put_bytes( _create_logical_frame(channel_id=3, message='World')) request.connection.put_bytes( _create_logical_frame(channel_id=1, message='Goodbye')) request.connection.put_bytes( _create_logical_frame(channel_id=2, message='Goodbye')) request.connection.put_bytes( _create_logical_frame(channel_id=3, message='Goodbye')) mux_handler.wait_until_done(timeout=2) self.assertEqual([], dispatcher.channel_events[1].messages) self.assertEqual(['Hello'], dispatcher.channel_events[2].messages) self.assertEqual(['World'], dispatcher.channel_events[3].messages) # Channel 2 messages = request.connection.get_written_messages(2) self.assertEqual(1, len(messages)) self.assertEqual('Hello', messages[0]) # Channel 3 messages = request.connection.get_written_messages(3) self.assertEqual(1, len(messages)) self.assertEqual('World', messages[0]) control_blocks = request.connection.get_written_control_blocks() # There should be 8 control blocks: # - 1 NewChannelSlot # - 2 AddChannelResponses for channel id 2 and 3 # - 6 FlowControls for channel id 1 (initialize), 'Hello', 'World', # and 3 'Goodbye's self.assertEqual(9, len(control_blocks))
def test_send_ping(self): request = _create_mock_request() dispatcher = _MuxMockDispatcher() mux_handler = mux._MuxHandler(request, dispatcher) mux_handler.start() mux_handler.add_channel_slots(mux._INITIAL_NUMBER_OF_CHANNEL_SLOTS, mux._INITIAL_QUOTA_FOR_CLIENT) encoded_handshake = _create_request_header(path='/ping') add_channel_request = _create_add_channel_request_frame( channel_id=2, encoding=0, encoded_handshake=encoded_handshake) request.connection.put_bytes(add_channel_request) flow_control = mux._create_flow_control(channel_id=2, replenished_quota=5, outer_frame_mask=True) request.connection.put_bytes(flow_control) request.connection.put_bytes( _create_logical_frame(channel_id=1, message='Goodbye')) mux_handler.wait_until_done(timeout=2) messages = request.connection.get_written_control_messages(2) self.assertEqual(common.OPCODE_PING, messages[0]['opcode']) self.assertEqual('Ping!', messages[0]['message'])
def test_channel_slot_violation_by_client(self): request = _create_mock_request() dispatcher = _MuxMockDispatcher() mux_handler = mux._MuxHandler(request, dispatcher) mux_handler.start() mux_handler.add_channel_slots(slots=1, send_quota=mux._INITIAL_QUOTA_FOR_CLIENT) encoded_handshake = _create_request_header(path='/echo') add_channel_request = _create_add_channel_request_frame( channel_id=2, encoding=0, encoded_handshake=encoded_handshake) request.connection.put_bytes(add_channel_request) flow_control = mux._create_flow_control(channel_id=2, replenished_quota=10, outer_frame_mask=True) request.connection.put_bytes(flow_control) request.connection.put_bytes( _create_logical_frame(channel_id=2, message='Hello')) # This request should be rejected. encoded_handshake = _create_request_header(path='/echo') add_channel_request = _create_add_channel_request_frame( channel_id=3, encoding=0, encoded_handshake=encoded_handshake) request.connection.put_bytes(add_channel_request) flow_control = mux._create_flow_control(channel_id=3, replenished_quota=5, outer_frame_mask=True) request.connection.put_bytes(flow_control) request.connection.put_bytes( _create_logical_frame(channel_id=3, message='Hello')) request.connection.put_bytes( _create_logical_frame(channel_id=1, message='Goodbye')) request.connection.put_bytes( _create_logical_frame(channel_id=2, message='Goodbye')) mux_handler.wait_until_done(timeout=2) self.assertEqual(['Hello'], dispatcher.channel_events[2].messages) self.assertFalse(dispatcher.channel_events.has_key(3))
def test_two_flow_control(self): request = _create_mock_request() dispatcher = _MuxMockDispatcher() mux_handler = mux._MuxHandler(request, dispatcher) mux_handler.start() mux_handler.add_channel_slots(mux._INITIAL_NUMBER_OF_CHANNEL_SLOTS, mux._INITIAL_QUOTA_FOR_CLIENT) encoded_handshake = _create_request_header(path='/echo') add_channel_request = _create_add_channel_request_frame( channel_id=2, encoding=0, encoded_handshake=encoded_handshake) request.connection.put_bytes(add_channel_request) # Replenish 5 bytes. flow_control = mux._create_flow_control(channel_id=2, replenished_quota=5, outer_frame_mask=True) request.connection.put_bytes(flow_control) # Send 10 bytes. The server will try echo back 10 bytes. request.connection.put_bytes( _create_logical_frame(channel_id=2, message='HelloWorld')) # Replenish 5 bytes again. flow_control = mux._create_flow_control(channel_id=2, replenished_quota=5, outer_frame_mask=True) request.connection.put_bytes(flow_control) request.connection.put_bytes( _create_logical_frame(channel_id=1, message='Goodbye')) request.connection.put_bytes( _create_logical_frame(channel_id=2, message='Goodbye')) mux_handler.wait_until_done(timeout=2) messages = request.connection.get_written_messages(2) self.assertEqual(['HelloWorld'], messages)