]> code.delx.au - pymsnt/blobdiff - src/tlib/msn/test_msn.py
Preliminary p2p file transfer passing tests! :)
[pymsnt] / src / tlib / msn / test_msn.py
index 6009ed91078141f13cb061d627ec5413d69ca34e..5e55e1ac7729c06ee5bb35a07f83058ff80cf53a 100644 (file)
@@ -15,7 +15,7 @@ from twisted.python import failure
 from twisted.trial import unittest
 
 # System imports
-import StringIO, sys, urllib
+import StringIO, sys, urllib, random, struct
 
 import msn
 import msnft
@@ -965,6 +965,9 @@ class DummySwitchboardP2PClient(msn.SwitchboardClient):
         if message.message == "Test Message" and message.userHandle == "foo1@bar.com":
             self.status = "GOTMESSAGE"
 
+    def gotFileReceive(self, fileReceive):
+        self.fileReceive = fileReceive
+
 class SwitchboardP2PTests(unittest.TestCase):
     def setUp(self):
         self.server  = DummySwitchboardP2PServer()
@@ -982,17 +985,27 @@ class SwitchboardP2PTests(unittest.TestCase):
         self.loop1.disconnect()
         self.loop2.disconnect()
 
+    def _loop(self, steps=1):
+        for i in xrange(steps):
+            self.loop1.doSteps(1)
+            self.loop2.doSteps(1)
+
     def testMessage(self):
         self.client1.sendMessage(msn.MSNMessage(message='Test Message'))
-        self.loop1.doSteps(10)
-        self.loop2.doSteps(10)
+        self._loop()
         self.failUnless((self.client2.status == "GOTMESSAGE"), "Fake switchboard server not working.")
+
+    def _generateData(self):
+        data = ''
+        for i in xrange(3000):
+            data += struct.pack("<L", random.randint(0, sys.maxint))
+        return data
     
     def testAvatars(self):
         self.gotAvatar = False
 
         # Set up the avatar for client1
-        imageData = 'avatar image data' * 1000
+        imageData = self._generateData()
         self.client1.msnobj = msn.MSNObject()
         self.client1.msnobj.setData('foo1@bar.com', imageData)
         self.client1.msnobj.makeText()
@@ -1005,13 +1018,44 @@ class SwitchboardP2PTests(unittest.TestCase):
         d.addCallback(avatarCallback)
 
         # Let them do their thing
-        for i in xrange(10):
-            self.loop1.doSteps(1)
-            self.loop2.doSteps(1)
+        self._loop(10)
 
         # Check that client2 got the avatar
         self.failUnless((self.gotAvatar), "Failed to transfer avatar")
 
+    def testFiles(self):
+        fileData = self._generateData()
+        self.gotFile = False
+
+        # Send the file (client2->client1)
+        msnContact = msn.MSNContact(userHandle='foo1@bar.com', caps=msn.MSNContact.MSNC1)
+        fileSend, d = self.client2.sendFile(msnContact, "myfile.txt", len(fileData))
+        def accepted((yes,)):
+            if yes:
+                fileSend.write(fileData)
+                fileSend.close()
+            else:
+                raise "TransferDeclined"
+        def failed():
+            raise "TransferError"
+        d.addCallback(accepted)
+        d.addErrback(failed)
+
+        # Let the request get pushed to client1
+        self._loop(10)
+
+        # Receive the file
+        def finished(data):
+            self.gotFile = (data == fileData)
+        fileBuffer = msn.StringBuffer(finished)
+        fileReceive = self.client1.fileReceive
+        fileReceive.accept(fileBuffer)
+
+        # Lets transfer!!
+        self._loop(100)
+
+        self.failUnless((self.gotFile), "Failed to transfer file")
+
 
 ################
 # MSNFTP tests #