
    W&                        S r SSKJr  SSKJr  SSKJr  SSKJr  SSKrSSKJr  SSK	J
r
  SSKJs  Jr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJrJr  \" \" SSS5      5        SSKJr  SrSrSrSrSr Sr!Sr"Sr# " S S\RH                  5      r% " S S\RL                  5      r' " S S\RP                  5      r)g) Unit tests for hash command.    )absolute_import)print_function)division)unicode_literalsN)hash)CommandException)	SkipForS3)ObjectToURI)SetBotoConfigForTest)SetEnvironmentForTest)	shim_util)add_moveMovedModulemockzunittest.mock)r   s   123456
znYmSiA==z9EeyCn/L9TpdW+AT6gsVrw==9D899288 f447b20a7fcbf53a5d5be013ea0b15afs   tmpzM3DYBg==3370D806c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
TestHashUnit0   r   c                     U R                  [        S9nU R                  SU/SS9nU R                  SU5        U R                  S[        -  U5        U R                  S[
        -  U5        g )Ncontentsr   Targsreturn_stdoutHashes [base64]	Hash (crc32c):		%s	Hash (md5):		%s)CreateTempFile_TEST_FILE_CONTENTS
RunCommandassertIn_TEST_FILE_B64_CRC_TEST_FILE_B64_MD5selftmp_filestdouts      (platform/gsutil/gslib/tests/test_hash.pytestHashContentsTestHashUnit.testHashContents3   se    "",?"@H__V8*D_IFMM#V,MM+.@@6JMM(+==G    c                      U R                  SS/S9  U R                  S5        g ! [         a&  nU R                  SUR                  5         S nAg S nAff = f)Nr   znon-existent-file)r   z%Did not get expected CommandExceptionzNo files matched)r#   failr	   r$   reason)r(   es     r+   testHashNoMatchTestHashUnit.testHashNoMatch:   sN    2
oof$7#8o9
ii78 2
mm&112s   "% 
AAAc                     U R                  [        S9nU R                  SSU/SS9nU R                  SU5        U R                  S[        -  U5        U R                  S[
        -  U5        g )	Nr   r   -hTr   Hashes [hex]r   r    )r!   r"   r#   r$   _TEST_FILE_HEX_CRC_TEST_FILE_HEX_MD5r'   s      r+   testHashHexFormatTestHashUnit.testHashHexFormatA   sg    "",?"@H__V4*:$_OFMM.&)MM+.@@6JMM(+==Gr.   c                     SnU R                  US9nU R                  S[        R                  R	                  US5      /SS9nUS-  nU R                  [        UR                  5       5      U5        g )N   )
test_filesr   *Tr      )CreateTempDirr#   ospathjoinassertEquallen
splitlines)r(   num_test_filestmp_dirr*   num_expected_liness        r+   testHashWildcardTestHashUnit.testHashWildcardH   ss    N  N ;G__V#%77<<#=">+/  1F (51S**,-/ABr.   c                 r   U R                  [        S9nU R                  SSU/SS9nU R                  SSU/SS9nU R                  SSSU/SS9nX$4 H  nU R                  S[        -  U5        M     X44 H  nU R                  S[
        -  U5        M     U R                  S	U5        U R                  S
U5        g )Nr   r   -cTr   -mr   r    md5crc32c)r!   r"   r#   r$   r%   r&   assertNotIn)r(   r)   
stdout_crc
stdout_md5stdout_bothr*   s         r+   testHashSelectAlgTestHashUnit.testHashSelectAlgR   s    "",?"@H'+X&6/3 ! 5J '+X&6/3 ! 5J //&(,dH'=04 " 6K +
mm-0BBVL ,+
mm*-??&I ,UJ'Xz*r.    N)__name__
__module____qualname____firstlineno____doc__r,   r3   r:   rK   rV   __static_attributes__rX   r.   r+   r   r   0   s!    $H2HC+r.   r   c                   :    \ rS rSrSrS r\" S5      S 5       rSrg)TestHashe   z#Integration tests for hash command.c                    U R                  S[        S9nU R                  SS[        U5      /SS9nU R	                  SU5        U R
                  S:X  a'  U R	                  S	[        R                  5       -  U5        U R	                  S
[        -  U5        U R                  S[        U5      /SS9nU R	                  SU5        U R
                  S:X  a  U R	                  S	[        -  U5        U R	                  S
[        -  U5        g)z$Test hash command on a cloud object.obj1)object_namer   r   r6   Tr   r7   gsr   r    r   N)CreateObjectr"   	RunGsUtilsurir$   default_providerr8   lowerr9   r%   r&   )r(   rc   r*   s      r+   testHashCloudObjectTestHash.testHashCloudObjecth   s    :MND ^^VT4:6d^KFMM.&)$ mm-0B0H0H0JJMM(+==G ^^VT$Z0^EFMM#V,$
mm-0BBVLMM(+==Gr.   z-No composite object or crc32c support for S3.c                    U R                  5       nU R                  US[        S9nU R                  US[        S9nU R	                  S[        U5      [        U5      [        U5      /5        U R	                  SS[        U5      /SS9nU R                  S	U5        U R                  S
[        R                  5       -  U5        U R	                  S[        U5      /SS9nU R                  SU5        U R                  S
[        -  U5        g)z@Test hash command on a composite object (which only has crc32c).rc   )
bucket_urird   r   tmpcomposer   r6   Tre   r7   r   r   N)
CreateBucketrg   r"   _TEST_COMPOSITE_ADDED_CONTENTSrh   ri   r$   _TEST_COMPOSITE_HEX_CRCrk   _TEST_COMPOSITE_B64_CRC)r(   bucketrc   obj2r*   s        r+   testHashCompositeObject TestHash.testHashCompositeObject~   s     F)/&9  ;D ).&D  FD 	NNItDz4:tDzBC^^VT4:6d^KFMM.&) 	MM+.E.K.K.MM ^^VT$Z0^EFMM#V,MM+.EEOr.   rX   N)	rY   rZ   r[   r\   r]   rl   r
   rx   r^   rX   r.   r+   r`   r`   e   s'    +H, <=P >Pr.   r`   c                      \ rS rSr\R
                  R                  \R                  S\R                  " 5       S9S 5       r
\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       rSrg	)
TestHashShim   r#   )newc           	         [        SS/5         [        SSS.5         U R                  SSS/S	S
9nSR                  UR                  S   5      nU R                  SR                  [        R                  " S5      [        R                  5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)NGSUtiluse_gcloud_storageTruer   hidden_shim_modedry_runr   fake_dir(CLOUDSDK_CORE_PASS_CREDENTIALS_TO_GSUTILCLOUDSDK_ROOT_DIRr   z	gs://b/o1z	gs://b/o2Treturn_log_handler
infoz>Gcloud Storage Command: {} storage hash {} gs://b/o1 gs://b/o2r   r   r#   rD   messagesr$   formatr   _get_gcloud_binary_pathr   _GCLOUD_FORMAT_STRINGr(   mock_log_handler
info_liness      r+   'test_shim_translates_basic_hash_command4TestHashShim.test_shim_translates_basic_hash_command   s    	GHJ 
K 6<)" 	  ??6K3M>B + DYY/88@A
 ./5v$<<ZH55078B	D	
K 
K	 	
K 
K#   B5A6B$B5$
B2	.B55
Cc           	         [        SS/5         [        SSS.5         U R                  S/ SQSS	9nS
R                  UR                  S   5      nU R                  SR                  [        R                  " S5      [        R                  5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   r   r   r   r   r   )rN   rO   gs://b/oTr   r   r   z3Gcloud Storage Command: {} storage hash {} gs://b/or   r   s      r+   =test_shim_translates_both_crc32c_and_md5_to_skip_nothing_flagJTestHashShim.test_shim_translates_both_crc32c_and_md5_to_skip_nothing_flag   s    	GHJ 
K 6<)" 	  ??63K>B + DYY/88@A
 &!B!B:!N!%!;!;=>H	J	
K 
K	 	
K 
Kr   c           	         [        SS/5         [        SSS.5         U R                  SSS/S	S
9nSR                  UR                  S   5      nU R                  SR                  [        R                  " S5      [        R                  5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   r   r   r   r   r   rO   r   Tr   r   r   zAGcloud Storage Command: {} storage hash {} --skip-crc32c gs://b/or   r   s      r+   ,test_shim_translates_md5_flag_to_skip_crc32c9TestHashShim.test_shim_translates_md5_flag_to_skip_crc32c   s    	GHJ 
K 6<)" 	  ??6D*3E>B + DYY/88@A
 128&$<<ZH55378B	D	
K 
K	 	
K 
Kr   c           	         [        SS/5         [        SSS.5         U R                  SSS/S	S
9nSR                  UR                  S   5      nU R                  SR                  [        R                  " S5      [        R                  5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   r   r   r   r   r   rN   r   Tr   r   r   z>Gcloud Storage Command: {} storage hash {} --skip-md5 gs://b/or   r   s      r+   ,test_shim_translates_crc32c_flag_to_skip_md59TestHashShim.test_shim_translates_crc32c_flag_to_skip_md5   s    	GHJ 
K 6<)" 	  ??6D*3E>B + DYY/88@A
 ./5v$<<ZH55078B	D	
K 
K	 	
K 
Kr   rX   N)rY   rZ   r[   r\   r   patchobjectr   HashCommandMockr   r   r   r   r^   rX   r.   r+   r{   r{      s    ::T%%|ED FD ::T%%|EJ FJ ::T%%|ED FD ::T%%|ED FDr.   r{   )*r]   
__future__r   r   r   r   rB   gslib.commandsr   gslib.exceptionr	   gslib.tests.testcaseteststestcase)gslib.tests.testcase.integration_testcaser
   gslib.tests.utilr   ri   r   r   gslib.utilsr   sixr   r   	six.movesr   r"   r%   r&   r8   r9   rs   ru   rt   GsUtilUnitTestCaser   GsUtilIntegrationTestCaser`   ShimUnitTestBaser{   rX   r.   r+   <module>r      s    # & %  ' 	  , ' ' ? 0 1 2 ! % VV_	5 6 !  /  7 !' $ $ 2+8.. 2+j.Px11 .Pb@D8,, @Dr.   