88from string import Template
99from time import sleep , time
1010from io import BytesIO
11- from base64 import b64encode
11+ from base64 import b64encode , b64decode
1212import subprocess
1313from datetime import timedelta , datetime
1414from tempfile import mkdtemp
@@ -443,13 +443,14 @@ def test_transfer_qc(self):
443443 'filetype_ext' : os .path .splitext (fullp )[1 ][1 :], 'injection_waittime' : 5 }, fp )
444444 sp = self .run_script (False , config = os .path .join (tmpdir , 'config.json' ), session = True )
445445 sleep (5 )
446+
446447 newraw = rm .RawFile .objects .last ()
447448 newsfloc = rm .StoredFileLoc .objects .last ()
448449 self .assertEqual (newraw .pk , lastraw .pk + 1 )
449450 self .assertEqual (newsfloc .sfile_id , lastsf .pk + 1 )
450451 self .assertFalse (newraw .claimed )
451452 self .assertEqual (newraw .usetype , rm .UploadFileType .RAWFILE )
452- # Run rsync
453+ # Run rsync fromweb
453454 self .run_job ()
454455 classifyjob = jm .Job .objects .filter (funcname = 'classify_msrawfile' , kwargs = {
455456 'sfloc_id' : newsfloc .pk , 'token' : self .token })
@@ -758,10 +759,12 @@ def test_transfer_dset_assoc(self):
758759 state = dm .DCStates .NEW )
759760 self .do_transfer_dset_assoc (ds_exists = True , ds_hasfiles = False )
760761
761- def test_classify_fail_nometadata (self ):
762+ def test_classify_fail_nometadata_and_renew_token (self ):
762763 # This file is of filetype self.ft which is is_folder
763764 self .f3raw .delete ()
764765 self .get_token ()
766+ strtoken , _h , _d = b64decode (self .token ['user_token' ]).decode ('utf-8' ).split ('|' )
767+ token = rm .UploadToken .objects .get (token = strtoken )
765768 fpath = os .path .join (self .rootdir , self .newstorctrl .path , self .f3sss .path )
766769 fullp = os .path .join (fpath , self .f3sf .filename )
767770 old_raw = rm .RawFile .objects .last ()
@@ -774,6 +777,10 @@ def test_classify_fail_nometadata(self):
774777 # Run rsync
775778 self .run_job ()
776779 sf .refresh_from_db ()
780+ # Expire token so classify gets 403, make it run again
781+ token .expires = timezone .now ()
782+ token .save ()
783+ self .assertFalse (token .expired )
777784 # Delete classify input xml and run classify
778785 os .unlink (os .path .join (self .rootdir , self .inboxctrl .path , sss .path , sf .filename , 'HyStarMetadata.xml' ))
779786 self .run_job ()
@@ -785,9 +792,29 @@ def test_classify_fail_nometadata(self):
785792 os .killpg (os .getpgid (sp .pid ), signal .SIGTERM )
786793 spout , sperr = sp .communicate ()
787794 self .fail ()
788- cjob = jm .Job .objects .filter (funcname = 'classify_msrawfile' , kwargs__sfloc_id = sss .pk ).get ()
795+ # Classify task call w "old" token, will set token to expired
796+ cjob = jm .Job .objects .filter (funcname = 'classify_msrawfile' , kwargs__sfloc_id = sss .pk )
797+ cj_g = cjob .get ()
798+ token .refresh_from_db ()
799+ self .assertTrue (token .expired )
800+ self .assertEqual (cj_g .task_set .get ().state , states .FAILURE )
801+ # Call retry job which will update the expired
802+ self .user .is_staff = True
803+ self .user .save ()
804+ resp = self .cl .post ('/jobs/retry/' , content_type = 'application/json' ,
805+ data = {'item_id' : cj_g .pk })
806+ self .assertEqual (resp .status_code , 200 )
807+ self .run_job ()
808+ try :
809+ spout , sperr = sp .communicate (timeout = 10 )
810+ except subprocess .TimeoutExpired :
811+ sp .terminate ()
812+ # Properly kill children since upload.py uses multiprocessing
813+ os .killpg (os .getpgid (sp .pid ), signal .SIGTERM )
814+ spout , sperr = sp .communicate ()
815+ self .fail ()
789816 new_raw .refresh_from_db ()
790- self .assertEqual (cjob .task_set .get ().state , states .SUCCESS )
817+ self .assertEqual (cjob .get (). task_set .get ().state , states .SUCCESS )
791818 classifytask = jm .Task .objects .filter (job__funcname = 'classify_msrawfile' , job__kwargs__sfloc_id = sss .pk )
792819 self .assertEqual (classifytask .filter (state = states .SUCCESS ).count (), 1 )
793820 self .assertFalse (new_raw .claimed ) # not QC
0 commit comments