1
# Copyright (c) 2001-2005 Twisted Matrix Laboratories.
2
# See LICENSE for details.
4
from __future__ import generators
8
from zope.interface import implements
10
from twisted.trial import unittest
11
from twisted.test import proto_helpers
13
from twisted.cred import portal, credentials, checkers
14
from twisted.words import ewords, iwords, service
15
from twisted.words.protocols import irc
16
from twisted.spread import pb
17
from twisted.internet.defer import Deferred, DeferredList, maybeDeferred, succeed
18
from twisted.internet.defer import deferredGenerator as dG, waitForDeferred as wFD
19
from twisted.internet import address, reactor
21
class RealmTestCase(unittest.TestCase):
22
def _entityCreationTest(self, kind):
23
# Kind is "user" or "group"
24
realm = service.InMemoryWordsRealm("realmname")
26
name = u'test' + kind.lower()
27
create = getattr(realm, 'create' + kind.title())
28
get = getattr(realm, 'get' + kind.title())
29
flag = 'create' + kind.title() + 'OnRequest'
30
dupExc = getattr(ewords, 'Duplicate' + kind.title())
31
noSuchExc = getattr(ewords, 'NoSuch' + kind.title())
33
# Creating should succeed
37
self.assertEquals(p.name, name)
39
# Creating the same user again should not
42
self.assertRaises(dupExc, d.getResult)
44
# Getting a non-existent user should succeed if createUserOnRequest is True
45
setattr(realm, flag, True)
46
d = wFD(get(u"new" + kind.lower()))
49
self.assertEquals(p.name, "new" + kind.lower())
51
# Getting that user again should return the same object
52
d = wFD(get(u"new" + kind.lower()))
55
self.assertIdentical(p, newp)
57
# Getting a non-existent user should fail if createUserOnRequest is False
58
setattr(realm, flag, False)
59
d = wFD(get(u"another" + kind.lower()))
61
self.assertRaises(noSuchExc, d.getResult)
62
_entityCreationTest = dG(_entityCreationTest)
65
def testUserCreation(self):
66
return self._entityCreationTest("User")
69
def testGroupCreation(self):
70
return self._entityCreationTest("Group")
73
def testUserRetrieval(self):
74
realm = service.InMemoryWordsRealm("realmname")
76
# Make a user to play around with
77
d = wFD(realm.createUser(u"testuser"))
81
# Make sure getting the user returns the same object
82
d = wFD(realm.getUser(u"testuser"))
84
retrieved = d.getResult()
85
self.assertIdentical(user, retrieved)
87
# Make sure looking up the user also returns the same object
88
d = wFD(realm.lookupUser(u"testuser"))
90
lookedUp = d.getResult()
91
self.assertIdentical(retrieved, lookedUp)
93
# Make sure looking up a user who does not exist fails
94
d = wFD(realm.lookupUser(u"nosuchuser"))
96
self.assertRaises(ewords.NoSuchUser, d.getResult)
97
testUserRetrieval = dG(testUserRetrieval)
100
def testUserAddition(self):
101
realm = service.InMemoryWordsRealm("realmname")
103
# Create and manually add a user to the realm
104
p = service.User("testuser")
105
d = wFD(realm.addUser(p))
108
self.assertIdentical(p, user)
110
# Make sure getting that user returns the same object
111
d = wFD(realm.getUser(u"testuser"))
113
retrieved = d.getResult()
114
self.assertIdentical(user, retrieved)
116
# Make sure looking up that user returns the same object
117
d = wFD(realm.lookupUser(u"testuser"))
119
lookedUp = d.getResult()
120
self.assertIdentical(retrieved, lookedUp)
121
testUserAddition = dG(testUserAddition)
124
def testGroupRetrieval(self):
125
realm = service.InMemoryWordsRealm("realmname")
127
d = wFD(realm.createGroup(u"testgroup"))
129
group = d.getResult()
131
d = wFD(realm.getGroup(u"testgroup"))
133
retrieved = d.getResult()
135
self.assertIdentical(group, retrieved)
137
d = wFD(realm.getGroup(u"nosuchgroup"))
139
self.assertRaises(ewords.NoSuchGroup, d.getResult)
140
testGroupRetrieval = dG(testGroupRetrieval)
143
def testGroupAddition(self):
144
realm = service.InMemoryWordsRealm("realmname")
146
p = service.Group("testgroup")
147
d = wFD(realm.addGroup(p))
151
d = wFD(realm.getGroup(u"testGroup"))
153
group = d.getResult()
155
self.assertIdentical(p, group)
156
testGroupAddition = dG(testGroupAddition)
159
def testGroupUsernameCollision(self):
161
Try creating a group with the same name as an existing user and
162
assert that it succeeds, since users and groups should not be in the
163
same namespace and collisions should be impossible.
165
realm = service.InMemoryWordsRealm("realmname")
167
d = wFD(realm.createUser(u"test"))
171
d = wFD(realm.createGroup(u"test"))
173
group = d.getResult()
174
testGroupUsernameCollision = dG(testGroupUsernameCollision)
177
def testEnumeration(self):
178
realm = service.InMemoryWordsRealm("realmname")
179
d = wFD(realm.createGroup(u"groupone"))
183
d = wFD(realm.createGroup(u"grouptwo"))
187
groups = wFD(realm.itergroups())
189
groups = groups.getResult()
191
n = [g.name for g in groups]
193
self.assertEquals(n, ["groupone", "grouptwo"])
194
testEnumeration = dG(testEnumeration)
197
class TestGroup(object):
198
def __init__(self, name, size, topic):
200
self.size = lambda: size
201
self.meta = {'topic': topic}
204
class TestUser(object):
205
def __init__(self, name, groups, signOn, lastMessage):
207
self.itergroups = lambda: iter([TestGroup(g, 3, 'Hello') for g in groups])
209
self.lastMessage = lastMessage
212
class TestPortal(object):
216
def login(self, credentials, mind, *interfaces):
218
self.logins.append((credentials, mind, interfaces, d))
222
class TestCaseUserAgg(object):
223
def __init__(self, user, realm, factory, address=address.IPv4Address('TCP', '127.0.0.1', 54321)):
225
self.transport = proto_helpers.StringTransportWithDisconnection()
226
self.protocol = factory.buildProtocol(address)
227
self.transport.protocol = self.protocol
228
self.user.mind = self.protocol
229
self.protocol.makeConnection(self.transport)
231
def write(self, stuff):
232
if isinstance(stuff, unicode):
233
stuff = stuff.encode('utf-8')
234
self.protocol.dataReceived(stuff)
237
class IRCProtocolTestCase(unittest.TestCase):
239
u'useruser', u'otheruser', u'someguy', u'firstuser', u'username',
240
u'userone', u'usertwo', u'userthree', u'someuser']
243
self.realm = service.InMemoryWordsRealm("realmname")
244
self.checker = checkers.InMemoryUsernamePasswordDatabaseDontUse()
245
self.portal = portal.Portal(self.realm, [self.checker])
246
self.factory = service.IRCFactory(self.realm, self.portal)
249
for nick in self.STATIC_USERS:
250
c.append(self.realm.createUser(nick))
251
self.checker.addUser(nick.encode('ascii'), nick + "_password")
252
return DeferredList(c)
255
def _assertGreeting(self, user):
256
# Make sure we get 1-4 at least
257
response = self._response(user)
258
expected = range(1, 5)
259
for (prefix, command, args) in response:
261
expected.remove(int(command))
264
self.failIf(expected, "Missing responses for %r" % (expected,))
267
def _login(self, user, nick, password=None):
269
password = nick + "_password"
270
user.write('PASS %s\r\n' % (password,))
271
user.write('NICK %s extrainfo\r\n' % (nick,))
274
def _loggedInUser(self, name):
275
d = wFD(self.realm.lookupUser(name))
278
agg = TestCaseUserAgg(user, self.realm, self.factory)
279
self._login(agg, name)
281
_loggedInUser = dG(_loggedInUser)
284
def _response(self, user):
285
response = user.transport.value().splitlines()
286
user.transport.clear()
287
return map(irc.parsemsg, response)
290
def testPASSLogin(self):
291
user = wFD(self._loggedInUser(u'firstuser'))
293
user = user.getResult()
294
self._assertGreeting(user)
295
testPASSLogin = dG(testPASSLogin)
298
def testNickServLogin(self):
299
firstuser = wFD(self.realm.lookupUser(u'firstuser'))
301
firstuser = firstuser.getResult()
303
user = TestCaseUserAgg(firstuser, self.realm, self.factory)
304
user.write('NICK firstuser extrainfo\r\n')
305
response = self._response(user)
306
self.assertEquals(len(response), 1)
307
self.assertEquals(response[0][0], service.NICKSERV)
308
self.assertEquals(response[0][1], 'PRIVMSG')
309
self.assertEquals(response[0][2], ['firstuser', 'Password?'])
310
user.transport.clear()
312
user.write('PRIVMSG nickserv firstuser_password\r\n')
313
self._assertGreeting(user)
314
testNickServLogin = dG(testNickServLogin)
317
def testFailedLogin(self):
318
firstuser = wFD(self.realm.lookupUser(u'firstuser'))
320
firstuser = firstuser.getResult()
322
user = TestCaseUserAgg(firstuser, self.realm, self.factory)
323
self._login(user, "firstuser", "wrongpass")
324
response = self._response(user)
325
self.assertEquals(len(response), 1)
326
self.assertEquals(response[0][2], ['firstuser', 'Login failed. Goodbye.'])
327
testFailedLogin = dG(testFailedLogin)
330
def testLogout(self):
332
firstuser = wFD(self.realm.lookupUser(u'firstuser'))
334
firstuser = firstuser.getResult()
336
user = TestCaseUserAgg(firstuser, self.realm, self.factory)
337
self._login(user, "firstuser")
338
user.protocol.logout = lambda: logout.append(True)
339
user.write('QUIT\r\n')
340
self.assertEquals(logout, [True])
341
testLogout = dG(testLogout)
345
firstuser = wFD(self.realm.lookupUser(u'firstuser'))
347
firstuser = firstuser.getResult()
349
somechannel = wFD(self.realm.createGroup(u"somechannel"))
351
somechannel = somechannel.getResult()
353
# Bring in one user, make sure he gets into the channel sanely
354
user = TestCaseUserAgg(firstuser, self.realm, self.factory)
355
self._login(user, "firstuser")
356
user.transport.clear()
357
user.write('JOIN #somechannel\r\n')
359
response = self._response(user)
360
self.assertEquals(len(response), 5)
363
self.assertEquals(response[0][0], 'firstuser!firstuser@realmname')
364
self.assertEquals(response[0][1], 'JOIN')
365
self.assertEquals(response[0][2], ['#somechannel'])
368
self.assertEquals(response[1][1], '353')
369
self.assertEquals(response[2][1], '366')
371
# Topic (or lack thereof, as the case may be)
372
self.assertEquals(response[3][1], '332')
373
self.assertEquals(response[4][1], '333')
376
# Hook up another client! It is a CHAT SYSTEM!!!!!!!
377
other = wFD(self._loggedInUser(u'otheruser'))
379
other = other.getResult()
381
other.transport.clear()
382
user.transport.clear()
383
other.write('JOIN #somechannel\r\n')
385
# At this point, both users should be in the channel
386
response = self._response(other)
388
event = self._response(user)
389
self.assertEquals(len(event), 1)
390
self.assertEquals(event[0][0], 'otheruser!otheruser@realmname')
391
self.assertEquals(event[0][1], 'JOIN')
392
self.assertEquals(event[0][2], ['#somechannel'])
394
self.assertEquals(response[1][0], 'realmname')
395
self.assertEquals(response[1][1], '353')
396
self.assertEquals(response[1][2], ['otheruser', '=', '#somechannel', 'firstuser otheruser'])
397
testJoin = dG(testJoin)
401
user = wFD(self._loggedInUser(u'useruser'))
403
user = user.getResult()
405
somechannel = wFD(self.realm.createGroup(u"somechannel"))
407
somechannel = somechannel.getResult()
409
user.write('JOIN #somechannel\r\n')
410
user.transport.clear()
412
other = wFD(self._loggedInUser(u'otheruser'))
414
other = other.getResult()
416
other.write('JOIN #somechannel\r\n')
418
user.transport.clear()
419
other.transport.clear()
421
user.write('PART #somechannel\r\n')
423
response = self._response(user)
424
event = self._response(other)
426
self.assertEquals(len(response), 1)
427
self.assertEquals(response[0][0], 'useruser!useruser@realmname')
428
self.assertEquals(response[0][1], 'PART')
429
self.assertEquals(response[0][2], ['#somechannel', 'leaving'])
430
self.assertEquals(response, event)
432
# Now again, with a part message
433
user.write('JOIN #somechannel\r\n')
435
user.transport.clear()
436
other.transport.clear()
438
user.write('PART #somechannel :goodbye stupidheads\r\n')
440
response = self._response(user)
441
event = self._response(other)
443
self.assertEquals(len(response), 1)
444
self.assertEquals(response[0][0], 'useruser!useruser@realmname')
445
self.assertEquals(response[0][1], 'PART')
446
self.assertEquals(response[0][2], ['#somechannel', 'goodbye stupidheads'])
447
self.assertEquals(response, event)
448
testLeave = dG(testLeave)
451
def testGetTopic(self):
452
user = wFD(self._loggedInUser(u'useruser'))
454
user = user.getResult()
456
group = service.Group("somechannel")
457
group.meta["topic"] = "This is a test topic."
458
group.meta["topic_author"] = "some_fellow"
459
group.meta["topic_date"] = 77777777
461
add = wFD(self.realm.addGroup(group))
465
user.transport.clear()
466
user.write("JOIN #somechannel\r\n")
468
response = self._response(user)
470
self.assertEquals(response[3][0], 'realmname')
471
self.assertEquals(response[3][1], '332')
473
# XXX Sigh. irc.parsemsg() is not as correct as one might hope.
474
self.assertEquals(response[3][2], ['useruser', '#somechannel', 'This is a test topic.'])
475
self.assertEquals(response[4][1], '333')
476
self.assertEquals(response[4][2], ['useruser', '#somechannel', 'some_fellow', '77777777'])
478
user.transport.clear()
480
user.write('TOPIC #somechannel\r\n')
482
response = self._response(user)
484
self.assertEquals(response[0][1], '332')
485
self.assertEquals(response[0][2], ['useruser', '#somechannel', 'This is a test topic.'])
486
self.assertEquals(response[1][1], '333')
487
self.assertEquals(response[1][2], ['useruser', '#somechannel', 'some_fellow', '77777777'])
488
testGetTopic = dG(testGetTopic)
491
def testSetTopic(self):
492
user = wFD(self._loggedInUser(u'useruser'))
494
user = user.getResult()
496
add = wFD(self.realm.createGroup(u"somechannel"))
498
somechannel = add.getResult()
500
user.write("JOIN #somechannel\r\n")
502
other = wFD(self._loggedInUser(u'otheruser'))
504
other = other.getResult()
506
other.write("JOIN #somechannel\r\n")
508
user.transport.clear()
509
other.transport.clear()
511
other.write('TOPIC #somechannel :This is the new topic.\r\n')
513
response = self._response(other)
514
event = self._response(user)
516
self.assertEquals(response, event)
518
self.assertEquals(response[0][0], 'otheruser!otheruser@realmname')
519
self.assertEquals(response[0][1], 'TOPIC')
520
self.assertEquals(response[0][2], ['#somechannel', 'This is the new topic.'])
522
other.transport.clear()
524
somechannel.meta['topic_date'] = 12345
525
other.write('TOPIC #somechannel\r\n')
527
response = self._response(other)
528
self.assertEquals(response[0][1], '332')
529
self.assertEquals(response[0][2], ['otheruser', '#somechannel', 'This is the new topic.'])
530
self.assertEquals(response[1][1], '333')
531
self.assertEquals(response[1][2], ['otheruser', '#somechannel', 'otheruser', '12345'])
533
other.transport.clear()
534
other.write('TOPIC #asdlkjasd\r\n')
536
response = self._response(other)
537
self.assertEquals(response[0][1], '403')
538
testSetTopic = dG(testSetTopic)
541
def testGroupMessage(self):
542
user = wFD(self._loggedInUser(u'useruser'))
544
user = user.getResult()
546
add = wFD(self.realm.createGroup(u"somechannel"))
548
somechannel = add.getResult()
550
user.write("JOIN #somechannel\r\n")
552
other = wFD(self._loggedInUser(u'otheruser'))
554
other = other.getResult()
556
other.write("JOIN #somechannel\r\n")
558
user.transport.clear()
559
other.transport.clear()
561
user.write('PRIVMSG #somechannel :Hello, world.\r\n')
563
response = self._response(user)
564
event = self._response(other)
566
self.failIf(response)
567
self.assertEquals(len(event), 1)
568
self.assertEquals(event[0][0], 'useruser!useruser@realmname')
569
self.assertEquals(event[0][1], 'PRIVMSG', -1)
570
self.assertEquals(event[0][2], ['#somechannel', 'Hello, world.'])
571
testGroupMessage = dG(testGroupMessage)
574
def testPrivateMessage(self):
575
user = wFD(self._loggedInUser(u'useruser'))
577
user = user.getResult()
579
other = wFD(self._loggedInUser(u'otheruser'))
581
other = other.getResult()
583
user.transport.clear()
584
other.transport.clear()
586
user.write('PRIVMSG otheruser :Hello, monkey.\r\n')
588
response = self._response(user)
589
event = self._response(other)
591
self.failIf(response)
592
self.assertEquals(len(event), 1)
593
self.assertEquals(event[0][0], 'useruser!useruser@realmname')
594
self.assertEquals(event[0][1], 'PRIVMSG')
595
self.assertEquals(event[0][2], ['otheruser', 'Hello, monkey.'])
597
user.write('PRIVMSG nousernamedthis :Hello, monkey.\r\n')
599
response = self._response(user)
601
self.assertEquals(len(response), 1)
602
self.assertEquals(response[0][0], 'realmname')
603
self.assertEquals(response[0][1], '401')
604
self.assertEquals(response[0][2], ['useruser', 'nousernamedthis', 'No such nick/channel.'])
605
testPrivateMessage = dG(testPrivateMessage)
609
user = wFD(self._loggedInUser(u'useruser'))
611
user = user.getResult()
613
user.transport.clear()
614
user.write('OPER user pass\r\n')
615
response = self._response(user)
617
self.assertEquals(len(response), 1)
618
self.assertEquals(response[0][1], '491')
619
testOper = dG(testOper)
622
def testGetUserMode(self):
623
user = wFD(self._loggedInUser(u'useruser'))
625
user = user.getResult()
627
user.transport.clear()
628
user.write('MODE useruser\r\n')
630
response = self._response(user)
631
self.assertEquals(len(response), 1)
632
self.assertEquals(response[0][0], 'realmname')
633
self.assertEquals(response[0][1], '221')
634
self.assertEquals(response[0][2], ['useruser', '+'])
635
testGetUserMode = dG(testGetUserMode)
638
def testSetUserMode(self):
639
user = wFD(self._loggedInUser(u'useruser'))
641
user = user.getResult()
643
user.transport.clear()
644
user.write('MODE useruser +abcd\r\n')
646
response = self._response(user)
647
self.assertEquals(len(response), 1)
648
self.assertEquals(response[0][1], '472')
649
testSetUserMode = dG(testSetUserMode)
652
def testGetGroupMode(self):
653
user = wFD(self._loggedInUser(u'useruser'))
655
user = user.getResult()
657
add = wFD(self.realm.createGroup(u"somechannel"))
659
somechannel = add.getResult()
661
user.write('JOIN #somechannel\r\n')
663
user.transport.clear()
664
user.write('MODE #somechannel\r\n')
666
response = self._response(user)
667
self.assertEquals(len(response), 1)
668
self.assertEquals(response[0][1], '324')
669
testGetGroupMode = dG(testGetGroupMode)
672
def testSetGroupMode(self):
673
user = wFD(self._loggedInUser(u'useruser'))
675
user = user.getResult()
677
group = wFD(self.realm.createGroup(u"groupname"))
679
group = group.getResult()
681
user.write('JOIN #groupname\r\n')
683
user.transport.clear()
684
user.write('MODE #groupname +abcd\r\n')
686
response = self._response(user)
687
self.assertEquals(len(response), 1)
688
self.assertEquals(response[0][1], '472')
689
testSetGroupMode = dG(testSetGroupMode)
693
group = service.Group('groupname')
694
add = wFD(self.realm.addGroup(group))
699
for nick in u'userone', u'usertwo', u'userthree':
700
u = wFD(self._loggedInUser(nick))
704
users[-1].write('JOIN #groupname\r\n')
706
user.transport.clear()
708
users[0].write('WHO #groupname\r\n')
710
r = self._response(users[0])
711
self.failIf(self._response(users[1]))
712
self.failIf(self._response(users[2]))
714
wantusers = ['userone', 'usertwo', 'userthree']
715
for (prefix, code, stuff) in r[:-1]:
716
self.assertEquals(prefix, 'realmname')
717
self.assertEquals(code, '352')
719
(myname, group, theirname, theirhost, theirserver, theirnick, flag, extra) = stuff
720
self.assertEquals(myname, 'userone')
721
self.assertEquals(group, '#groupname')
722
self.failUnless(theirname in wantusers)
723
self.assertEquals(theirhost, 'realmname')
724
self.assertEquals(theirserver, 'realmname')
725
wantusers.remove(theirnick)
726
self.assertEquals(flag, 'H')
727
self.assertEquals(extra, '0 ' + theirnick)
728
self.failIf(wantusers)
730
prefix, code, stuff = r[-1]
731
self.assertEquals(prefix, 'realmname')
732
self.assertEquals(code, '315')
733
myname, channel, extra = stuff
734
self.assertEquals(myname, 'userone')
735
self.assertEquals(channel, '#groupname')
736
self.assertEquals(extra, 'End of /WHO list.')
737
testWho = dG(testWho)
741
user = wFD(self._loggedInUser(u"someuser"))
743
user = user.getResult()
744
user.transport.clear()
746
somegroup = wFD(self.realm.createGroup(u"somegroup"))
748
somegroup = somegroup.getResult()
749
somegroup.size = lambda: succeed(17)
750
somegroup.meta['topic'] = 'this is the topic woo'
753
user.write('LIST #somegroup\r\n')
755
r = self._response(user)
756
self.assertEquals(len(r), 2)
759
self.assertEquals(resp[0], 'realmname')
760
self.assertEquals(resp[1], '322')
761
self.assertEquals(resp[2][0], 'someuser')
762
self.assertEquals(resp[2][1], 'somegroup')
763
self.assertEquals(resp[2][2], '17')
764
self.assertEquals(resp[2][3], 'this is the topic woo')
766
self.assertEquals(end[0], 'realmname')
767
self.assertEquals(end[1], '323')
768
self.assertEquals(end[2][0], 'someuser')
769
self.assertEquals(end[2][1], 'End of /LIST')
771
user.transport.clear()
774
user.write('LIST\r\n')
775
r = self._response(user)
776
self.assertEquals(len(r), 2)
780
self.assertEquals(fg1[1], '322')
781
self.assertEquals(fg1[2][1], 'somegroup')
782
self.assertEquals(fg1[2][2], '17')
783
self.assertEquals(fg1[2][3], 'this is the topic woo')
785
self.assertEquals(end[1], '323')
786
testList = dG(testList)
790
user = wFD(self._loggedInUser(u'someguy'))
792
user = user.getResult()
794
otherguy = service.User("otherguy")
795
otherguy.itergroups = lambda: iter([
796
service.Group('groupA'),
797
service.Group('groupB')])
799
otherguy.lastMessage = time.time() - 15
801
add = wFD(self.realm.addUser(otherguy))
805
user.transport.clear()
806
user.write('WHOIS otherguy\r\n')
807
r = self._response(user)
809
self.assertEquals(len(r), 5)
810
wuser, wserver, idle, channels, end = r
812
self.assertEquals(wuser[0], 'realmname')
813
self.assertEquals(wuser[1], '311')
814
self.assertEquals(wuser[2][0], 'someguy')
815
self.assertEquals(wuser[2][1], 'otherguy')
816
self.assertEquals(wuser[2][2], 'otherguy')
817
self.assertEquals(wuser[2][3], 'realmname')
818
self.assertEquals(wuser[2][4], '*')
819
self.assertEquals(wuser[2][5], 'otherguy')
821
self.assertEquals(wserver[0], 'realmname')
822
self.assertEquals(wserver[1], '312')
823
self.assertEquals(wserver[2][0], 'someguy')
824
self.assertEquals(wserver[2][1], 'otherguy')
825
self.assertEquals(wserver[2][2], 'realmname')
826
self.assertEquals(wserver[2][3], 'Hi mom!')
828
self.assertEquals(idle[0], 'realmname')
829
self.assertEquals(idle[1], '317')
830
self.assertEquals(idle[2][0], 'someguy')
831
self.assertEquals(idle[2][1], 'otherguy')
832
self.assertEquals(idle[2][2], '15')
833
self.assertEquals(idle[2][3], '10')
834
self.assertEquals(idle[2][4], "seconds idle, signon time")
836
self.assertEquals(channels[0], 'realmname')
837
self.assertEquals(channels[1], '319')
838
self.assertEquals(channels[2][0], 'someguy')
839
self.assertEquals(channels[2][1], 'otherguy')
840
self.assertEquals(channels[2][2], '#groupA #groupB')
842
self.assertEquals(end[0], 'realmname')
843
self.assertEquals(end[1], '318')
844
self.assertEquals(end[2][0], 'someguy')
845
self.assertEquals(end[2][1], 'otherguy')
846
self.assertEquals(end[2][2], 'End of WHOIS list.')
847
testWhois = dG(testWhois)
850
class TestMind(service.PBMind):
851
def __init__(self, *a, **kw):
857
def remote_userJoined(self, user, group):
858
self.joins.append((user, group))
860
def remote_userLeft(self, user, group, reason):
861
self.parts.append((user, group, reason))
863
def remote_receive(self, sender, recipient, message):
864
self.messages.append((sender, recipient, message))
866
def remote_groupMetaUpdate(self, group, meta):
867
self.meta.append((group, meta))
868
pb.setUnjellyableForClass(TestMind, service.PBMindReference)
871
class PBProtocolTestCase(unittest.TestCase):
873
self.realm = service.InMemoryWordsRealm("realmname")
874
self.checker = checkers.InMemoryUsernamePasswordDatabaseDontUse()
875
self.portal = portal.Portal(
876
self.realm, [self.checker])
877
self.serverFactory = pb.PBServerFactory(self.portal)
878
self.serverFactory.protocol = self._protocolFactory
879
self.serverFactory.unsafeTracebacks = True
880
self.clientFactory = pb.PBClientFactory()
881
self.clientFactory.unsafeTracebacks = True
882
self.serverPort = reactor.listenTCP(0, self.serverFactory)
883
self.clientConn = reactor.connectTCP(
885
self.serverPort.getHost().port,
888
def _protocolFactory(self, *args, **kw):
889
self._serverProtocol = pb.Broker(0)
890
return self._serverProtocol
894
self._serverProtocol.notifyOnDisconnect(lambda: d3.callback(None))
895
return DeferredList([
896
maybeDeferred(self.serverPort.stopListening),
897
maybeDeferred(self.clientConn.disconnect), d3])
899
def _loggedInAvatar(self, name, password, mind):
900
creds = credentials.UsernamePassword(name, password)
901
self.checker.addUser(name.encode('ascii'), password)
902
d = self.realm.createUser(name)
903
d.addCallback(lambda ign: self.clientFactory.login(creds, mind))
906
def testGroups(self):
908
one = wFD(self._loggedInAvatar(u"one", "p1", mindone))
910
one = one.getResult()
913
two = wFD(self._loggedInAvatar(u"two", "p2", mindtwo))
915
two = two.getResult()
917
add = wFD(self.realm.createGroup(u"foobar"))
921
groupone = wFD(one.join(u"foobar"))
923
groupone = groupone.getResult()
925
grouptwo = wFD(two.join(u"foobar"))
927
grouptwo = grouptwo.getResult()
929
msg = wFD(groupone.send({"text": "hello, monkeys"}))
931
msg = msg.getResult()
933
leave = wFD(groupone.leave())
935
leave = leave.getResult()
936
testGroups = dG(testGroups)