def test_mark_retry(self): original_packet = packets.AcknowledgementPacket(3) conversation = TFTPConversation(self.client_host, self.client_port, StubResponseRouterTwo()) conversation.cached_packet = original_packet retry_packet = conversation.mark_retry() self.assertEqual(conversation.retries_made, 1) self.assertEqual(retry_packet, original_packet)
def test_illegal_acknowledgement_packet_during_uninitialized_state(self): packet = packets.AcknowledgementPacket(3) conversation = TFTPConversation(self.client_host, self.client_port, StubResponseRouterTwo()) response_packet = conversation.handle_packet(packet) self.assertEqual(conversation.state, tftp_conversation.COMPLETED) self.assertEqual(response_packet.__class__, packets.ErrorPacket) self.assertEqual(response_packet.error_code, 5)
def test_no_action_for_writing(self): packet = packets.WriteRequestPacket("example_filename", "netascii") conversation = TFTPConversation(self.client_host, self.client_port, NoActionAvailableResponseRouterStub()) response_packet = conversation.handle_packet(packet) self.assertEqual(conversation.state, tftp_conversation.COMPLETED) self.assertEqual(response_packet.__class__, packets.ErrorPacket) self.assertEqual(response_packet.error_code, 2)
def test_begin_reading(self): packet = packets.ReadRequestPacket("example_filename", "netascii") conversation = TFTPConversation(self.client_host, self.client_port, StubResponseRouter()) response_packet = conversation.handle_packet(packet) self.assertEqual(conversation.state, tftp_conversation.READING) self.assertEqual(conversation.filename, "example_filename") self.assertEqual(conversation.mode, "netascii") self.assertEqual(conversation.current_block_num, 1) self.assertEqual(conversation.read_buffer.__class__, StubReadBuffer) self.assertEqual(response_packet.__class__, packets.DataPacket) self.assertEqual(conversation.cached_packet, response_packet)
def test_begin_writing(self): packet = packets.WriteRequestPacket("example_filename", "netascii") conversation = TFTPConversation(self.client_host, self.client_port, StubResponseRouter()) response_packet = conversation.handle_packet(packet) self.assertEqual(conversation.state, tftp_conversation.WRITING) self.assertEqual(conversation.filename, "example_filename") self.assertEqual(conversation.mode, "netascii") self.assertEqual(conversation.current_block_num, 0) self.assertEqual(conversation.write_buffer.__class__, WriteBuffer) self.assertEqual(conversation.cached_packet, response_packet) self.assertEqual(response_packet.__class__, packets.AcknowledgementPacket) self.assertEqual(response_packet.block_num, 0)
def get_conversation(self, client_host, client_port, packet): """Given a packet and client address information, retrieves the corresponding conversation. Read and Write request packets initiate new conversations, adding them to the conversation manager. Everything else retrieves preexisting conversations. Args: client_host: A hostname or ip address of the client. client_port: The port from which the client is connecting. packet: The packet that the client sent unpacked. Returns: A conversation. """ if (isinstance( packet, (packets.WriteRequestPacket, packets.ReadRequestPacket))): conversation = TFTPConversation(client_host, client_port, self.response_router) self.conversation_table.add_conversation(client_host, client_port, conversation) else: conversation = (self.conversation_table.get_conversation( client_host, client_port)) return conversation
def test_get_conversation_old_with_data_packet(self): conversation_table = ConversationTable() packet = packets.DataPacket('stub block number', 'stub data') old_conversation = TFTPConversation('10.26.0.1', 3942, 'stub_router') conversation_table.add_conversation('10.26.0.1', 3942, old_conversation) reactor = Reactor('stub_socket', 'stub_router', conversation_table) conversation = reactor.get_conversation('10.26.0.1', 3942, packet) self.assertEqual(len(conversation_table), 1) self.assertTrue(isinstance(conversation, TFTPConversation)) self.assertEqual(conversation, old_conversation)
def test_reset_retry_and_time_data(self): conversation = TFTPConversation(self.client_host, self.client_port, StubResponseRouterTwo()) conversation.retries_made = 39 conversation.time_of_last_interaction = 42 conversation._reset_retry_and_time_data(9001) self.assertEqual(conversation.retries_made, 0) self.assertEqual(conversation.time_of_last_interaction, 9001)
def test_finish_reading(self): packet = packets.AcknowledgementPacket(3) conversation = TFTPConversation(self.client_host, self.client_port, StubResponseRouterTwo()) conversation.filename = "example_filename" conversation.state = tftp_conversation.READING conversation.current_block_num = 3 conversation.read_buffer = StubReadBufferTwo() response_packet = conversation.handle_packet(packet) self.assertEqual(conversation.state, tftp_conversation.COMPLETED) self.assertEqual(response_packet.__class__, packets.NoOpPacket) self.assertEqual(conversation.cached_packet, response_packet)
def test_out_of_lock_step_block_num(self): packet = packets.DataPacket(2, "") conversation = TFTPConversation(self.client_host, self.client_port, StubResponseRouterTwo()) conversation.cached_packet = "stub packet" conversation.state = tftp_conversation.WRITING conversation.current_block_num = 3 response_packet = conversation.handle_packet(packet) self.assertEqual(conversation.state, tftp_conversation.WRITING) self.assertEqual(response_packet.__class__, packets.NoOpPacket)
def test_illegal_packet_type_during_writing_state(self): packet = packets.AcknowledgementPacket(2) conversation = TFTPConversation(self.client_host, self.client_port, StubResponseRouterTwo()) conversation.cached_packet = "stub packet" conversation.state = tftp_conversation.WRITING conversation.read_buffer = StubReadBufferTwo() response_packet = conversation.handle_packet(packet) self.assertEqual(conversation.state, tftp_conversation.WRITING) self.assertEqual(response_packet.__class__, packets.ErrorPacket) self.assertEqual(response_packet.error_code, 0) self.assertEqual(conversation.cached_packet, "stub packet")
def test_finish_writing(self): packet = packets.DataPacket(3, "O" * 511) conversation = TFTPConversation(self.client_host, self.client_port, StubResponseRouterTwo()) conversation.state = tftp_conversation.WRITING conversation.write_buffer = WriteBuffer() conversation.write_buffer.data = "X" * 512 conversation.filename = "stub_filename" conversation.current_block_num = 2 write_action_wrapper = StubWriteActionWrapper() conversation.write_action = write_action_wrapper.stub_action response_packet = conversation.handle_packet(packet) self.assertEqual(conversation.state, tftp_conversation.COMPLETED) self.assertEqual(conversation.current_block_num, 3) self.assertEqual(conversation.cached_packet, response_packet) self.assertEqual(response_packet.__class__, packets.AcknowledgementPacket) self.assertEqual(response_packet.block_num, 3) # action should get invoked, saving this state in the wrapper class self.assertEqual(write_action_wrapper.received_state, ("10.26.0.3", 12345, "stub_filename", "X" * 512 + "O" * 511))
def test_continue_reading(self): packet = packets.AcknowledgementPacket(1) conversation = TFTPConversation(self.client_host, self.client_port, StubResponseRouterTwo()) conversation.state = tftp_conversation.READING conversation.read_buffer = StubReadBufferTwo() conversation.current_block_num = 1 response_packet = conversation.handle_packet(packet) self.assertEqual(conversation.state, tftp_conversation.READING) self.assertEqual(conversation.current_block_num, 2) self.assertEqual(response_packet.data, "X" * 512) self.assertEqual(response_packet.__class__, packets.DataPacket) self.assertEqual(conversation.cached_packet, response_packet)
def test_init(self): conversation = TFTPConversation(self.client_host, self.client_port, StubResponseRouter()) self.assertEqual(conversation.client_host, "10.26.0.3") self.assertEqual(conversation.client_port, 12345)