def testRetryOnServiceUnavailableFailsAfter3Times(self): eventLogger = CallTrace('eventlogger') uploader = SruUpdateUploader(self.target, eventLogger) answers = [(SERVICE_UNAVAILABLE, ''), (SERVICE_UNAVAILABLE, ''), (SERVICE_UNAVAILABLE, ''), (HTTP_OK, SUCCES_RESPONSE)] datas = [] def sendDataToRemote(data): answer = answers.pop(0) datas.append(data) return answer uploader._sendDataToRemote = sendDataToRemote exception = None try: uploader._sendData(1, "HOW IS EVERYTHING") self.fail() except Exception as e: exception = e self.assertFalse(exception == None) self.assertEqual('uploadId: "1", message: "HTTP 503: "', str(exception)) self.assertEqual(1, len(answers)) self.assertEqual(3, len(datas)) self.assertEqual(3, len(eventLogger.calledMethods))
def testRetryOnServiceUnavailable(self): eventLogger = CallTrace('eventlogger') uploader = SruUpdateUploader(self.target, eventLogger) answers = [(HTTP_OK, SUCCES_RESPONSE)] datas = [] def sendDataToRemote(data): answer = answers.pop(0) datas.append(data) return answer uploader._sendDataToRemote = sendDataToRemote uploader._sendData(1, b"HOW IS EVERYTHING") self.assertEqual(0, len(answers)) self.assertEqual(1, len(datas)) answers = [(SERVICE_UNAVAILABLE, ''), (HTTP_OK, SUCCES_RESPONSE)] datas = [] uploader._sendData(1, b"HOW IS EVERYTHING") self.assertEqual(0, len(answers)) self.assertEqual(2, len(datas)) self.assertEqual(1, len(eventLogger.calledMethods)) self.assertEqual( "Status 503, SERVICE_UNAVAILABLE received while trying to upload", eventLogger.calledMethods[0].args[0])
def testParseMessage(self): SRU_MESSAGE = _parse(SUCCES_RESPONSE) eventLogger = CallTrace('eventlogger') uploader = SruUpdateUploader(self.target, eventLogger) version, operationStatus, diagnostics = uploader._parseMessage( SRU_MESSAGE) self.assertEqual("1.0", version) self.assertEqual("success", operationStatus) self.assertEqual(None, diagnostics)
def setUp(self): SeecrTestCase.setUp(self) self.target = CallTrace('SruUpdateTarget', verbose=True) self.uploader = SruUpdateUploader(self.target, CallTrace('eventlogger')) self.sentData = [] def sendData(anId, data): self.sentData.append(data) self.uploader._sendData = sendData self.upload = CallTrace('Upload') self.upload.id = 'some:id' self.upload.parts = { 'meta': '<meta>....</meta>', 'otherdata': '<stupidXML>ßabcdefgh' }
def testException(self): possibleSRUError = b"""<?xml version="1.0" encoding="UTF-8"?> <srw:updateResponse xmlns:srw="http://www.loc.gov/zing/srw/" xmlns:ucp="info:lc/xmlns/update-v1"> <srw:version>1.0</srw:version> <ucp:operationStatus>fail</ucp:operationStatus> <srw:diagnostics> <diag:diagnostic xmlns:diag="http://www.loc.gov/zing/srw/diagnostic/"> <diag:uri>info:srw/diagnostic/12/1</diag:uri> <diag:details>Traceback (most recent call last): File "../meresco/components/sru/srurecordupdate.py", line 47, in handleRequest File "../meresco/framework/transaction.py", line 63, in unknown File "../meresco/framework/observable.py", line 101, in __call__ File "../meresco/framework/observable.py", line 109, in _callonce File "../meresco/framework/observable.py", line 109, in _callonce File "../meresco/framework/observable.py", line 109, in _callonce File "../meresco/framework/observable.py", line 106, in _callonce KeyError: '__id__' </diag:details> <diag:message>Invalid component: record rejected</diag:message> </diag:diagnostic> </srw:diagnostics> </srw:updateResponse>""" eventLogger = CallTrace('eventlogger') uploader = SruUpdateUploader(self.target, eventLogger) uploader._sendDataToRemote = lambda data: (HTTP_OK, possibleSRUError) try: uploader.send(self.upload) self.fail() except InvalidComponentException as e: self.assertEqual(self.upload.id, e.uploadId)
def testParseMessageWithDiagnostic(self): SRU_MESSAGE = _parse("""<?xml version="1.0" encoding="UTF-8"?> <srw:updateResponse xmlns:srw="http://www.loc.gov/zing/srw/" xmlns:ucp="info:lc/xmlns/update-v1"> <srw:version>1.0</srw:version> <ucp:operationStatus>fail</ucp:operationStatus> <srw:diagnostics> <diag:diagnostic xmlns:diag="http://www.loc.gov/zing/srw/diagnostic/"> <diag:uri>info:srw/diagnostic/12/12</diag:uri> <diag:details>Xsd Validation error</diag:details> <diag:message>Invalid component: record rejected</diag:message> </diag:diagnostic> </srw:diagnostics> </srw:updateResponse>""") eventLogger = CallTrace('eventlogger') uploader = SruUpdateUploader(self.target, eventLogger) version, operationStatus, diagnostics = uploader._parseMessage( SRU_MESSAGE) self.assertEqual("1.0", version) self.assertEqual("fail", operationStatus) self.assertEqual(("info:srw/diagnostic/12/12", "Xsd Validation error", "Invalid component: record rejected"), diagnostics)
def testInvalidDataException(self): possibleSRUValidationError = b"""<?xml version="1.0" encoding="UTF-8"?> <srw:updateResponse xmlns:srw="http://www.loc.gov/zing/srw/" xmlns:ucp="info:lc/xmlns/update-v1"> <srw:version>1.0</srw:version> <ucp:operationStatus>fail</ucp:operationStatus> <srw:diagnostics> <diag:diagnostic xmlns:diag="http://www.loc.gov/zing/srw/diagnostic/"> <diag:uri>info:srw/diagnostic/12/12</diag:uri> <diag:details>Xsd Validation error</diag:details> <diag:message>Invalid data structure: record rejected</diag:message> </diag:diagnostic> </srw:diagnostics> </srw:updateResponse>""" eventLogger = CallTrace('eventlogger') uploader = SruUpdateUploader(self.target, eventLogger) uploader._sendDataToRemote = lambda data: (HTTP_OK, possibleSRUValidationError) try: uploader.send(self.upload) self.fail("Diagnostic code 12 should raise a validation exception") except InvalidDataException as e: self.assertEqual(self.upload.id, e.uploadId)