1
2"""
3Test that long messages (over 512 characters -- the IRC max message length)
4are split properly and sent in multiple messages that are sent within the same
5message delivery timeout (Bug #17392)
6"""
7
8from idletest import exec_test, BaseIRCServer
9from servicetest import EventPattern, call_async
10from constants import *
11import dbus
12
13class LongMessageMangler(BaseIRCServer):
14    host = "my.host.name"
15    def get_relay_prefix(self):
16        return '%s!%s@%s' % (self.nick, self.user, self.host)
17
18    def handlePRIVMSG(self, args, prefix):
19        sender = prefix
20        recipient = args[0]
21        sent_message = args[1]
22        # 'bounce' the message back to all participants, but truncate to the
23        # max IRC message size
24        return_msg = ':%s PRIVMSG %s :%s' % (self.get_relay_prefix(), recipient, sent_message)
25        # 510 rather than 512 since sendLine will tack on \r\n
26        self.sendLine(return_msg[:510])
27
28    def handleWHOIS(self, args, prefix):
29        self.sendMessage('311', self.nick, self.nick, self.user, self.host, '*', ':Full Name', prefix='idle.test.server')
30
31
32LONG_MESSAGE='one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty twenty-one twenty-two twenty-three twenty-four twenty-five twenty-six twenty-seven twenty-eight twenty-nine thirty thirty-one thirty-two thirty-three thirty-four thirty-five thirty-six thirty-seven thirty-eight thirty-nine forty forty-one forty-two forty-three forty-four forty-five forty-six forty-seven forty-eight forty-nine fifty fifty-one fifty-two fifty-three fifty-four fifty-five fifty-six fifty-seven fifty-eight fifty-nine sixty sixty-one sixty-two sixty-three sixty-four sixty-five sixty-six sixty-seven sixty-eight sixty-nine'
33
34def test(q, bus, conn, stream):
35    conn.Connect()
36    q.expect('dbus-signal', signal='StatusChanged', args=[0, 1])
37    CHANNEL_NAME = '#idletest'
38    room_handles = conn.RequestHandles(HT_ROOM, [CHANNEL_NAME])
39    call_async(q, conn, 'RequestChannel', CHANNEL_TYPE_TEXT, HT_ROOM,
40            room_handles[0], True)
41
42    ret = q.expect('dbus-return', method='RequestChannel')
43    q.expect('dbus-signal', signal='MembersChanged')
44    chan = bus.get_object(conn.bus_name, ret.value[0])
45
46    text_chan = dbus.Interface(chan, CHANNEL_TYPE_TEXT)
47    # send a whole bunch of messages in a row
48    call_async(q, text_chan, 'Send', 0, LONG_MESSAGE)
49
50    # apparently we only emit one 'Sent' signal even if we split a message up
51    # and send it in multiple messages
52    q.expect('dbus-signal', signal='Sent')
53
54    part1 = q.expect('dbus-signal', signal='Received')
55    n = len(part1.args[5])
56    assert n <= 512, "Message exceeds IRC maximum: %d" % n
57    part2 = q.expect('dbus-signal', signal='Received')
58    n = len(part2.args[5])
59    assert n <= 512, "Message exceeds IRC maximum: %d" % n
60    received_msg = part1.args[5] + part2.args[5]
61
62    assert received_msg == LONG_MESSAGE, received_msg
63
64    call_async(q, conn, 'Disconnect')
65    return True
66
67if __name__ == '__main__':
68    exec_test(test, protocol=LongMessageMangler)
69
70