[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