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