SF.net SVN: fclient: [367] trunk/sandbox/fcp2/test_fcp/test_client.py
Status: Pre-Alpha
Brought to you by:
jurner
From: <jU...@us...> - 2008-03-11 11:21:07
|
Revision: 367 http://fclient.svn.sourceforge.net/fclient/?rev=367&view=rev Author: jUrner Date: 2008-03-11 04:21:11 -0700 (Tue, 11 Mar 2008) Log Message: ----------- continued rewrite of tests Modified Paths: -------------- trunk/sandbox/fcp2/test_fcp/test_client.py Modified: trunk/sandbox/fcp2/test_fcp/test_client.py =================================================================== --- trunk/sandbox/fcp2/test_fcp/test_client.py 2008-03-11 11:20:32 UTC (rev 366) +++ trunk/sandbox/fcp2/test_fcp/test_client.py 2008-03-11 11:21:11 UTC (rev 367) @@ -861,8 +861,528 @@ self.failUnless(self.ioOpen()) +#*********************************************************************************** +# NOTE: all the in depth tests for getFile() getKeyInfo() are performed here +#*********************************************************************************** +class Test_getData(BaseTestClient): + + def test_100_request_registered(self): + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key') + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.GetData) + + def test_200_key_object_is_accepted(self): + self.connectClient() + key = self.client.key.CHK() + myIdentifier = self.client.getData(key) + requestsAll = self.client.getRequests() + + + def test_300_message_send(self): + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key') + requestsAll = self.client.getRequests() + + self.assertHasNextMessage( + 'ClientGet', + ('URI', 'arbitrary-key'), + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + def test_400_progress(self): + + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key') + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + self.sendResponseMessage( + 'SimpleProgress', + Identifier=myIdentifier, + Total=0, + Required=0, + Failed=0, + FatallyFailed=0, + Succeeded=0, + ) + + self.assertHasNextEvent( + self.client.events.RequestProgress, + 'ClientGet', + ) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_500_completed_successfuly(self): + + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key') + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + data = 'foo' + params = { + 'Identifier': myIdentifier, + 'Global': 'false', + 'DataLength': len(data), + 'Metadata.ContentType': 'any', + } + self.sendResponseMessage( + 'DataFound', + **params + ) + # we don't expect an event here.... + self.assertHasNextEvent(None) + self.sendResponseMessage( + 'AllData', + data=data, + Identifier=myIdentifier, + Global='false', + DataLength=len(data), + ) + + # client should complete and remove the request + self.assertHasNextEvent( + self.client.events.RequestCompleted, + consts.Message.ClientGet, + ('RequestStatus', consts.RequestStatus.Success | + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), + data=data + ) + + # non persistent requests are removed emidiately + self.failIf(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_600_completed_with_error(self): + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key') + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + self.sendResponseMessage( + 'GetFailed', + Code='28', # All data not found + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + self.assertHasNextEvent( + self.client.events.RequestFailed, + consts.Message.ClientGet, + ('RequestStatus', consts.RequestStatus.Error | + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), + ) + + # non persistent requests are removed emidiately + self.failIf(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_700_peristent_request_auto_retrieve_data(self): + + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + + data = 'foo' + params = { + 'Identifier': myIdentifier, + 'Global': 'false', + 'DataLength': len(data), + 'Metadata.ContentType': 'any', + } + self.sendResponseMessage( + 'DataFound', + **params + ) + + self.assertHasNextMessage('GetRequestStatus') + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + + def test_800_peristent_request_not_removed_on_success(self): + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + data = 'foo' + self.sendResponseMessage( + 'AllData', + data=data, + Identifier=myIdentifier, + Global='false', + DataLength=len(data), + ) + + self.assertHasNextEvent(self.client.events.RequestCompleted) + + # persistent requests are not removed emidiately + self.failUnless(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_900_peristent_request_not_removed_on_error(self): + self.connectClient() + myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + self.sendResponseMessage( + 'GetFailed', + Code='28', # All data not found + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + + self.assertHasNextEvent(self.client.events.RequestFailed) + + # persistent requests are not removed emidiately + self.failUnless(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_910_restore_peristent_request_failure(self): + self.connectClient() + requestsAll = self.client.getRequests() + myIdentifier = '123456789' + self.sendResponseMessage( + 'PersistentGet', + Identifier=myIdentifier, + ClientToken='i-am-invalid', + + callNext=False + ) + self.assertRaises(self.client.ioHandler.MessageParseError, self.client.next) + self.failIf(myIdentifier in requestsAll) + + + def test_920_restore_peristent_request_success(self): + self.connectClient() + requestsAll = self.client.getRequests() + myIdentifier = self.client.getData('arbitrary-key', persistence=self.client.consts.Persistence.Forever) + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + del requestsAll[myIdentifier] + + self.sendResponseMessage( + 'PersistentGet', + **myRequest.params + ) + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + msg = self.assertHasNextEvent( + self.client.events.RequestRestored, + 'ClientGet', + ('Identifier', myIdentifier), + ('RequestStatus', consts.RequestStatus.Restored), # no RequestStatus.Pending flag should be set here + ) + + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_getFile(BaseTestClient): + + def test_100_request_registered(self): + self.connectClient() + myIdentifier = self.client.getFile('arbitrary-key', 'foo.txt') + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.GetFile) + + + def test_200_key_object_is_accepted(self): + self.connectClient() + key = self.client.key.CHK() + + myIdentifier = self.client.getFile(key, 'foo.txt') + requestsAll = self.client.getRequests() + + + def test_300_dda_denied(self): + self.connectClient() + + myIdentifier = self.client.getFile( + 'arbitrary-uri', + os.path.join(DIR, 'DDATest.txt') + ) + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + self.sendResponseMessage( + 'ProtocolError', + Code=25, # DDADenied + Identifier=myIdentifier, + ExtraDescription='An error occured', + Fatal='false', + Global='false', + ) + + # client should respond with a TestDDARequest + self.assertHasNextMessage( + consts.Message.TestDDARequest, + ('Directory', DIR), + ('WantWriteDirectory', True) + ) + + # respond with a TestDDAReply message + writeContent = 'blah' + fd, fpath = tempfile.mkstemp(dir=DIR) + os.close(fd) + self.sendResponseMessage( + 'TestDDAReply', + Directory=DIR, + WriteFilename=fpath, + ContentToWrite=writeContent, + ) + + # client should respond with a TestDDAResponse + self.assertHasNextMessage( + consts.Message.TestDDAResponse, + ('Directory', DIR) + ) + + # check if content was written + with open(fpath) as fp: + self.failUnless(fp.read() == writeContent) + + # respond with a TestDDAComplete message + self.sendResponseMessage( + 'TestDDAComplete', + Directory=DIR, + WriteDirectoryAllowed='true', + ) + + # check if our tempfile was removed + self.failIf(os.path.isfile(fpath)) + + # client sahould send a new ClientGet + msg = self.assertHasNextMessage(consts.Message.ClientGet) + + # no events should have been triggered upo to now + self.assertHasNextEvent(None) + + # respond with a PersistentGet + self.sendResponseMessage( + 'PersistentGet', + Started='false', + **msg.params + ) + + self.failUnless(myIdentifier in requestsAll) + + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_getKeyinfo(BaseTestClient): + + + def test_100_request_registered(self): + self.connectClient() + myIdentifier = self.client.getKeyInfo('arbitrary-key') + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.GetKeyInfo) + + def test_200_key_object_is_accepted(self): + self.connectClient() + key = self.client.key.CHK() + + myIdentifier = self.client.getKeyInfo(key) + requestsAll = self.client.getRequests() + + + def test_300_getKeyInfo_Success(self): + self.connectClient() + myIdentifier = self.client.getKeyInfo('arbitrary-uri') + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage('ClientGet') + + data = 'foo' + params = { + 'Identifier': myIdentifier, + 'Global': 'false', + 'DataLength': 123456, + 'Metadata.ContentType': 'any', + } + self.sendResponseMessage( + 'DataFound', + **params + ) + self.assertHasNextEvent( + self.client.events.RequestCompleted, + consts.Message.ClientGet, + ('RequestStatus', consts.RequestStatus.Success | + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), + ) + self.failIf(myIdentifier in requestsAll) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_400_GetKeyInfo_TooBig(self): + self.connectClient() + + # test specdial case where ProtocolError.TooBig is handled as success + # request a arbitrary uri + myIdentifier = self.client.getKeyInfo('arbitrary-uri') + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(consts.Message.ClientGet) + self.sendResponseMessage( + 'GetFailed', + Code='21', # Too big + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + self.assertHasNextEvent( + self.client.events.RequestCompleted, + consts.Message.ClientGet, + ('RequestStatus', consts.RequestStatus.Success | + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), + ) + self.failIf(myIdentifier in requestsAll) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + + def test_500_GetKeyInfo_Failure(self): + self.connectClient() + + # request a arbitrary file + myIdentifier = self.client.getKeyInfo('arbitrary-uri') + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + + self.assertHasNextMessage(consts.Message.ClientGet) + self.sendResponseMessage( + 'GetFailed', + Code='28', # All data not found + Identifier=myIdentifier, + Global='false', + # blah.. more here + ) + self.assertHasNextEvent( + self.client.events.RequestFailed, + consts.Message.ClientGet, + ('RequestStatus', consts.RequestStatus.Error | + consts.RequestStatus.RemovedFromQueue | + consts.RequestStatus.Completed + ), + ) + self.failIf(myIdentifier in requestsAll) + self.assertHasNextEvent(None) + self.assertHasNextMessage(None) + self.failUnless(self.ioOpen()) + + +#*********************************************************************************** +# +#*********************************************************************************** +class Test_subscribeUSK(BaseTestClient): + + def test_100_subscribeUSK_accepts_key_object(self): + self.connectClient() + key = self.client.key.USK('123456789', 'foo', 0) + myIdentifier = self.client.subscribeUSK(key) + self.assertHasNextMessage( + 'SubscribeUSK', + ('URI', key.toString()), + ) + + + def test_200_subscribeUSK(self): + self.connectClient() + myIdentifier = self.client.subscribeUSK('arbitrary-key') + myRequest = self.client.getRequest(myIdentifier) + requestsAll = self.client.getRequests() + self.failUnless(myIdentifier in requestsAll) + myRequest = self.client.getRequest(myIdentifier) + self.assertEqual(myRequest['RequestType'], self.client.consts.RequestType.SubscribeUSK) + + self.assertHasNextMessage( + 'SubscribeUSK', + ('URI', 'arbitrary-key'), + ) + self.failUnless(myIdentifier in requestsAll) + + # usk update requests are permanent, so the completed flag shuld always be set + myRequest['RequestStatus'] == self.client.consts.RequestStatus.Completed + + self.sendResponseMessage( + 'SubscribedUSKUpdate', + Edition=99, + Identifier=myIdentifier, + URI='arbitrary-uri' + ) + + self.assertHasNextEvent( + self.client.events.USKUpdated, + 'SubscribeUSK', + ('Edition', 99), + ('Identifier', myIdentifier), + ('URI', 'arbitrary-key'), + ) + + + + ################################################### ################################################### ################################################### @@ -2848,6 +3368,10 @@ Test_sendMessage, Test_getConfig, Test_modifyConfig, + Test_getData, + Test_getFile, + Test_getKeyinfo, + Test_subscribeUSK, #TestDisconnectReason, #TestClientGet, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |