[apt-proxy-devel] r662 - trunk/apt_proxy/test

Chris Halls halls at alioth.debian.org
Wed Jul 4 10:36:36 UTC 2007


Author: halls
Date: Wed Jul  4 10:36:35 2007
New Revision: 662

Log:
* Add test for exception handling in add request
* Hang test work

Modified:
   trunk/apt_proxy/test/test_requests.py

Modified: trunk/apt_proxy/test/test_requests.py
==============================================================================
--- trunk/apt_proxy/test/test_requests.py	(original)
+++ trunk/apt_proxy/test/test_requests.py	Wed Jul  4 10:36:35 2007
@@ -36,7 +36,7 @@
     """
     class containing test data for a request
     """
-    def __init__(self, filename, expectedResponse, if_modified_since=None, expectedSize=None, filePath=None, abortTransfer=False):
+    def __init__(self, filename, expectedResponse, if_modified_since=None, expectedSize=None, filePath=None, abortTransfer=False, passOnDataRcvd=False):
         """
         Initialise data for client testing
         @param filename Name of file to be sent in request from apt client
@@ -44,12 +44,14 @@
         @param expectedSize Size of file that should be sent back to client. See also filePath
         @param filePath Path to source file - used to automatically calculate expectedSize instead of supplying expectedSize directly
         @param abortTransfer Close connection before transfer is complete to test error handling
+        @param passOnDataRcvd Trigger deferred on first data packet received
         """
         self.filename = filename 
         self.expectedResponse = expectedResponse
         self.if_modified_since = if_modified_since
         self.filePath = filePath # Path to source file, used to calculate expected size
         self.abortTransfer = abortTransfer
+        self.passOnDataRcvd = passOnDataRcvd
 
         if expectedSize is not None:
             self.expectedSize = expectedSize # If not none, the file sent should have this size
@@ -123,7 +125,7 @@
         self.firstLine = 1 
         #self.length = None
         self.__buffer = ''
-        log.debug("getNextTest")
+        log.debug("getNextTest", 'uriRequester')
 
         if len(self.tests):
             self.nextTest = self.tests[0]
@@ -144,20 +146,23 @@
         if key.lower() == 'transfer-encoding' and value.lower() == 'chunked':
             # There doesn't seem to be any support for chunked mode in twisted-web's http
             # client, so use fromChunk ourselves
-            log.debug("Chunked mode")
+            log.debug("Chunked mode", 'uriRequester')
             self.chunked = True
     
     def dataReceived(self, data):
         self.received_len = self.received_len + len(data)
         log.debug("data received, len: %s" % (self.received_len), 'uriRequester')
-        if self.nextTest.abortTransfer == False:
-            http.HTTPClient.dataReceived(self, data)
-        else:
+        if self.nextTest.abortTransfer == True:
             log.debug("aborting transfer", 'uriRequester')
             self.disconnect()
-            log.debug("============ callback 150")
+            log.debug("============ callback 150", 'uriRequester')
             self.deferred.callback(None)
             #self.passed() # Trigger disconnection of connection
+	elif self.nextTest.passOnDataRcvd == True:
+            log.debug("returning early test passed", 'uriRequester')
+	    self.passed()
+        else:
+            http.HTTPClient.dataReceived(self, data)
 
     class ResponseError(Exception):
         def __init__(self, received, expected):
@@ -176,7 +181,7 @@
         if self.chunked:
             buffer, rest = http.fromChunk(buffer)
             while len(rest)>0:
-                log.debug("buf size=%s rest size=%s" % (len(buffer), len(rest)))
+                log.debug("buf size=%s rest size=%s" % (len(buffer), len(rest)), 'uriRequester')
                 data, rest = http.fromChunk(rest)
                 buffer += data
         received_len = len(buffer)
@@ -198,7 +203,7 @@
     def failed(self, data):
         log.debug('test failed', 'uriRequester')
         self.disconnect()
-        log.debug("============ errorback 193")
+        log.debug("============ errorback 193", 'uriRequester')
         self.deferred.errback(data)
     def disconnect(self):
         reactor.callLater(0, self.connection.disconnect)
@@ -467,6 +472,32 @@
         self.assertEquals(len(queues), 0)
     testCloseFetcherImmediately.timeout = 2
 
+    def testDownloadQueueException(self):
+        self.testResult = defer.Deferred()
+        self.fnsave = DownloadQueue.addFile
+        def raiseException(fetcher, cacheentry):
+            self.fnsave(fetcher,cacheentry)
+            raise RuntimeError('Dummy')
+        def restoreException(x):
+            DownloadQueue.addFile = self.fnsave
+        DownloadQueue.addFile = raiseException
+        filename, sourcepath, self.destpath = self.getFilePaths('/packages/Packages')
+        d = self.doRequest(uriData(filename, http.INTERNAL_SERVER_ERROR))
+        d.addBoth(restoreException)
+        d.addCallback(self.DownloadQueueException2)
+        reactor.callLater(2, self.DownloadQueueExceptionTimeout) # timeout will trigger errorBack if necessary
+        return self.testResult
+    def DownloadQueueException2(self, x):
+        queues = self.factory.getBackend(self.backendName).queue.queues.values()
+        self.assertEquals(len(queues), 0)
+        log.debug("disconnecting")
+        self.connection.disconnect()
+        self.testResult.callback()
+    def DownloadQueueExceptionTimeout(self):
+        DownloadQueue.addFile = self.fnsave
+        log.debug("testDownloadQueueException: timed out")
+        self.testResult.errback(failure.Failure(self.UnknownFailure))
+
     def testLeaveFetcherOpen(self):
         DownloadQueue.closeTimeout = 2 # 2 second delay to close
         return self.downloadFile().addCallback(self.LeaveFetcherOpen2)
@@ -693,6 +724,18 @@
         return self.port.getHost().port
     def stop(self):
         self.port.stopListening()
+
+class ClientCleanupTest(BackendTestBase):
+    def setUp(self):
+	BackendTestBase.setUp(self, 'ClientCleanupTest', 'http', HangServer)
+    def tearDown(self):
+	BackendTestBase.tearDown(self)
+    def testClientCleanup(self):
+	b = self.factory.getBackend(self.backendName)
+	b.config.timeout = 1
+	filename, sourcepath, destpath = self.getFilePaths('/packages/apt_0.0.1_test.deb')
+	d = self.doRequest(uriData(filename, http.SERVICE_UNAVAILABLE))
+
 class HangTestBase(BackendTestBase):
     def setUp(self, protocol):
         BackendTestBase.setUp(self,protocol + 'HangTest', protocol, HangServer)



More information about the apt-proxy-devel mailing list