示例#1
0
    def test_receive_middle_of_header(self):
        """
        This test concatenates two messsages (as they're sent over the network),
        and lets DelugeTransferProtocol receive the data in two parts.
        The first part contains the first message, plus two bytes of the next message.
        The next part contains the rest of the message.

        This is a special case, as DelugeTransferProtocol can't start parsing
        a message until it has at least 4 bytes (the size of the header) to be able
        to read and parse the size of the payload.

        """
        two_concatenated = base64.b64decode(self.msg1_expected_compressed_base64) + base64.b64decode(self.msg2_expected_compressed_base64)
        first_len = len(base64.b64decode(self.msg1_expected_compressed_base64))

        # Now found the entire first message, and half the header of the next message  (2 bytes into the header)
        self.transfer.dataReceived(two_concatenated[:first_len+2])

        # Should be 1 message in the list
        self.assertEquals(1, len(self.transfer.get_messages_in()))

        # Send the rest
        self.transfer.dataReceived(two_concatenated[first_len+2:])

        # Should be 2 messages in the list
        self.assertEquals(2, len(self.transfer.get_messages_in()))

        # Get the data as sent by DelugeTransferProtocol
        message1 = self.transfer.get_messages_in().pop(0)
        self.assertEquals(rencode.dumps(self.msg1), rencode.dumps(message1))
        message2 = self.transfer.get_messages_in().pop(0)
        self.assertEquals(rencode.dumps(self.msg2), rencode.dumps(message2))
示例#2
0
    def test_receive_middle_of_header(self):
        """
        This test concatenates two messsages (as they're sent over the network),
        and lets DelugeTransferProtocol receive the data in two parts.
        The first part contains the first message, plus two bytes of the next message.
        The next part contains the rest of the message.

        This is a special case, as DelugeTransferProtocol can't start parsing
        a message until it has at least 4 bytes (the size of the header) to be able
        to read and parse the size of the payload.

        """
        two_concatenated = base64.b64decode(
            self.msg1_expected_compressed_base64) + base64.b64decode(
                self.msg2_expected_compressed_base64)
        first_len = len(base64.b64decode(self.msg1_expected_compressed_base64))

        # Now found the entire first message, and half the header of the next message  (2 bytes into the header)
        self.transfer.dataReceived(two_concatenated[:first_len + 2])

        # Should be 1 message in the list
        self.assertEquals(1, len(self.transfer.get_messages_in()))

        # Send the rest
        self.transfer.dataReceived(two_concatenated[first_len + 2:])

        # Should be 2 messages in the list
        self.assertEquals(2, len(self.transfer.get_messages_in()))

        # Get the data as sent by DelugeTransferProtocol
        message1 = self.transfer.get_messages_in().pop(0)
        self.assertEquals(rencode.dumps(self.msg1), rencode.dumps(message1))
        message2 = self.transfer.get_messages_in().pop(0)
        self.assertEquals(rencode.dumps(self.msg2), rencode.dumps(message2))
示例#3
0
    def test_receive_one_message(self):
        """
        Receive one message and test that it has been sent to the
        method 'message_received'.

        """
        self.transfer.dataReceived(base64.b64decode(self.msg1_expected_compressed_base64))
        # Get the data as sent by DelugeTransferProtocol
        messages = self.transfer.get_messages_in().pop(0)
        self.assertEquals(rencode.dumps(self.msg1), rencode.dumps(messages))
示例#4
0
    def test_receive_one_message(self):
        """
        Receive one message and test that it has been sent to the
        method 'message_received'.

        """
        self.transfer.dataReceived(
            base64.b64decode(self.msg1_expected_compressed_base64))
        # Get the data as sent by DelugeTransferProtocol
        messages = self.transfer.get_messages_in().pop(0)
        self.assertEquals(rencode.dumps(self.msg1), rencode.dumps(messages))
示例#5
0
    def test_receive_two_concatenated_messages(self):
        """
        This test simply concatenates two messsages (as they're sent over the network),
        and lets DelugeTransferProtocol receive the data as one string.

        """
        two_concatenated = base64.b64decode(self.msg1_expected_compressed_base64) + base64.b64decode(self.msg2_expected_compressed_base64)
        self.transfer.dataReceived(two_concatenated)

        # Get the data as sent by DelugeTransferProtocol
        message1 = self.transfer.get_messages_in().pop(0)
        self.assertEquals(rencode.dumps(self.msg1), rencode.dumps(message1))
        message2 = self.transfer.get_messages_in().pop(0)
        self.assertEquals(rencode.dumps(self.msg2), rencode.dumps(message2))
示例#6
0
    def test_receive_two_concatenated_messages(self):
        """
        This test simply concatenates two messsages (as they're sent over the network),
        and lets DelugeTransferProtocol receive the data as one string.

        """
        two_concatenated = base64.b64decode(self.msg1_expected_compressed_base64) + \
            base64.b64decode(self.msg2_expected_compressed_base64)
        self.transfer.dataReceived(two_concatenated)

        # Get the data as sent by DelugeTransferProtocol
        message1 = self.transfer.get_messages_in().pop(0)
        self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message1))
        message2 = self.transfer.get_messages_in().pop(0)
        self.assertEqual(rencode.dumps(self.msg2), rencode.dumps(message2))
示例#7
0
    def test_receive_old_message(self):
        """
        Receive an old message (with no header) and verify that the data is discarded.

        """
        self.transfer.dataReceived(rencode.dumps(self.msg1))
        self.assertEquals(len(self.transfer.get_messages_in()), 0)
        self.assertEquals(self.transfer._message_length, 0)
        self.assertEquals(len(self.transfer._buffer), 0)
示例#8
0
    def test_receive_old_message(self):
        """
        Receive an old message (with no header) and verify that the data is discarded.

        """
        self.transfer.dataReceived(rencode.dumps(self.msg1))
        self.assertEquals(len(self.transfer.get_messages_in()), 0)
        self.assertEquals(self.transfer._message_length, 0)
        self.assertEquals(len(self.transfer._buffer), 0)
示例#9
0
    def _test_rencode_fail_protocol(self):
        """
        This test tries to test the protocol that relies on errors from rencode.

        """
        msg_bytes = base64.b64decode(self.msg1_expected_compressed_base64) + \
            base64.b64decode(self.msg2_expected_compressed_base64) + \
            base64.b64decode(self.msg1_expected_compressed_base64)
        packet_size = 149

        one_message_byte_count = len(
            base64.b64decode(self.msg1_expected_compressed_base64))
        two_messages_byte_count = one_message_byte_count + \
            len(base64.b64decode(self.msg2_expected_compressed_base64))
        three_messages_byte_count = two_messages_byte_count + \
            len(base64.b64decode(self.msg1_expected_compressed_base64))

        print()

        print('Msg1 size:',
              len(base64.b64decode(self.msg1_expected_compressed_base64)) - 4)
        print('Msg2 size:',
              len(base64.b64decode(self.msg2_expected_compressed_base64)) - 4)
        print('Msg3 size:',
              len(base64.b64decode(self.msg1_expected_compressed_base64)) - 4)

        print('one_message_byte_count:', one_message_byte_count)
        print('two_messages_byte_count:', two_messages_byte_count)
        print('three_messages_byte_count:', three_messages_byte_count)

        for d in self.receive_parts_helper(
                msg_bytes, packet_size,
                self.transfer.data_received_old_protocol):
            bytes_received = self.transfer.get_bytes_recv()

            if bytes_received >= three_messages_byte_count:
                expected_msgs_received_count = 3
            elif bytes_received >= two_messages_byte_count:
                expected_msgs_received_count = 2
            elif bytes_received >= one_message_byte_count:
                expected_msgs_received_count = 1
            else:
                expected_msgs_received_count = 0
            # Verify that the expected number of complete messages has arrived
            if expected_msgs_received_count != len(
                    self.transfer.get_messages_in()):
                print(
                    'Expected number of messages received is %d, but %d have been received.'
                    % (expected_msgs_received_count,
                       len(self.transfer.get_messages_in())))

        # Get the data as received by DelugeTransferProtocol
        message1 = self.transfer.get_messages_in().pop(0)
        self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message1))
        message2 = self.transfer.get_messages_in().pop(0)
        self.assertEqual(rencode.dumps(self.msg2), rencode.dumps(message2))
        message3 = self.transfer.get_messages_in().pop(0)
        self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message3))
示例#10
0
    def send(self, method, *args, **kwargs):
        self.rlock.acquire()
        self.request_id += 1

        self.last_sent = self.request_id

        rpc = zlib.compress(rencode.dumps(
                ((self.request_id, method, args, kwargs),)))

        self.sock.write(rpc)
        recv = self.receive()

        self.rlock.release()

        return recv
示例#11
0
    def _test_rencode_fail_protocol(self):
        """
        This test tries to test the protocol that relies on errors from rencode.

        """
        msg_bytes = base64.b64decode(self.msg1_expected_compressed_base64) + \
            base64.b64decode(self.msg2_expected_compressed_base64) + \
            base64.b64decode(self.msg1_expected_compressed_base64)
        packet_size = 149

        one_message_byte_count = len(base64.b64decode(self.msg1_expected_compressed_base64))
        two_messages_byte_count = one_message_byte_count + \
            len(base64.b64decode(self.msg2_expected_compressed_base64))
        three_messages_byte_count = two_messages_byte_count + \
            len(base64.b64decode(self.msg1_expected_compressed_base64))

        print()

        print('Msg1 size:', len(base64.b64decode(self.msg1_expected_compressed_base64)) - 4)
        print('Msg2 size:', len(base64.b64decode(self.msg2_expected_compressed_base64)) - 4)
        print('Msg3 size:', len(base64.b64decode(self.msg1_expected_compressed_base64)) - 4)

        print('one_message_byte_count:', one_message_byte_count)
        print('two_messages_byte_count:', two_messages_byte_count)
        print('three_messages_byte_count:', three_messages_byte_count)

        for d in self.receive_parts_helper(msg_bytes, packet_size, self.transfer.data_received_old_protocol):
            bytes_received = self.transfer.get_bytes_recv()

            if bytes_received >= three_messages_byte_count:
                expected_msgs_received_count = 3
            elif bytes_received >= two_messages_byte_count:
                expected_msgs_received_count = 2
            elif bytes_received >= one_message_byte_count:
                expected_msgs_received_count = 1
            else:
                expected_msgs_received_count = 0
            # Verify that the expected number of complete messages has arrived
            if expected_msgs_received_count != len(self.transfer.get_messages_in()):
                print('Expected number of messages received is %d, but %d have been received.' %
                      (expected_msgs_received_count, len(self.transfer.get_messages_in())))

        # Get the data as received by DelugeTransferProtocol
        message1 = self.transfer.get_messages_in().pop(0)
        self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message1))
        message2 = self.transfer.get_messages_in().pop(0)
        self.assertEqual(rencode.dumps(self.msg2), rencode.dumps(message2))
        message3 = self.transfer.get_messages_in().pop(0)
        self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message3))
示例#12
0
    def test_receive_three_messages_in_parts(self):
        """
        This test concatenates three messsages (as they're sent over the network),
        and lets DelugeTransferProtocol receive the data in multiple parts.

        """
        msg_bytes = base64.b64decode(self.msg1_expected_compressed_base64) + \
                    base64.b64decode(self.msg2_expected_compressed_base64) + \
                    base64.b64decode(self.msg1_expected_compressed_base64)
        packet_size = 40

        one_message_byte_count = len(
            base64.b64decode(self.msg1_expected_compressed_base64))
        two_messages_byte_count = one_message_byte_count + len(
            base64.b64decode(self.msg2_expected_compressed_base64))
        three_messages_byte_count = two_messages_byte_count + len(
            base64.b64decode(self.msg1_expected_compressed_base64))

        for d in self.receive_parts_helper(msg_bytes, packet_size):
            bytes_received = self.transfer.get_bytes_recv()

            if bytes_received >= three_messages_byte_count:
                expected_msgs_received_count = 3
            elif bytes_received >= two_messages_byte_count:
                expected_msgs_received_count = 2
            elif bytes_received >= one_message_byte_count:
                expected_msgs_received_count = 1
            else:
                expected_msgs_received_count = 0
            # Verify that the expected number of complete messages has arrived
            self.assertEquals(expected_msgs_received_count,
                              len(self.transfer.get_messages_in()))

        # Get the data as received by DelugeTransferProtocol
        message1 = self.transfer.get_messages_in().pop(0)
        self.assertEquals(rencode.dumps(self.msg1), rencode.dumps(message1))
        message2 = self.transfer.get_messages_in().pop(0)
        self.assertEquals(rencode.dumps(self.msg2), rencode.dumps(message2))
        message3 = self.transfer.get_messages_in().pop(0)
        self.assertEquals(rencode.dumps(self.msg1), rencode.dumps(message3))
示例#13
0
    def test_receive_three_messages_in_parts(self):
        """
        This test concatenates three messsages (as they're sent over the network),
        and lets DelugeTransferProtocol receive the data in multiple parts.

        """
        msg_bytes = base64.b64decode(self.msg1_expected_compressed_base64) + \
            base64.b64decode(self.msg2_expected_compressed_base64) + \
            base64.b64decode(self.msg1_expected_compressed_base64)
        packet_size = 40

        one_message_byte_count = len(base64.b64decode(self.msg1_expected_compressed_base64))
        two_messages_byte_count = one_message_byte_count + \
            len(base64.b64decode(self.msg2_expected_compressed_base64))
        three_messages_byte_count = two_messages_byte_count + \
            len(base64.b64decode(self.msg1_expected_compressed_base64))

        for d in self.receive_parts_helper(msg_bytes, packet_size):
            bytes_received = self.transfer.get_bytes_recv()

            if bytes_received >= three_messages_byte_count:
                expected_msgs_received_count = 3
            elif bytes_received >= two_messages_byte_count:
                expected_msgs_received_count = 2
            elif bytes_received >= one_message_byte_count:
                expected_msgs_received_count = 1
            else:
                expected_msgs_received_count = 0
            # Verify that the expected number of complete messages has arrived
            self.assertEqual(expected_msgs_received_count, len(self.transfer.get_messages_in()))

        # Get the data as received by DelugeTransferProtocol
        message1 = self.transfer.get_messages_in().pop(0)
        self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message1))
        message2 = self.transfer.get_messages_in().pop(0)
        self.assertEqual(rencode.dumps(self.msg2), rencode.dumps(message2))
        message3 = self.transfer.get_messages_in().pop(0)
        self.assertEqual(rencode.dumps(self.msg1), rencode.dumps(message3))