
    W&                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlmZ ddl	m
Z
 ddlmc mZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZmZ  e eddd             ddlmZ dZdZdZdZdZ dZ!dZ"dZ# G d dejH                        Z% G d dejL                        Z' G d dejP                        Z)y) 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                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestHashUnitr   c                     | j                  t              }| j                  d|gd      }| j                  d|       | j                  dt        z  |       | j                  dt
        z  |       y )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testHashContentszTestHashUnit.testHashContents3   se    "",?"@H__V8*D_IFMM#V,MM+.@@6JMM(+==G    c                     	 | j                  ddg       | j                  d       y # t        $ r&}| j                  d|j                         Y d }~y d }~ww xY w)Nr   znon-existent-file)r   z%Did not get expected CommandExceptionzNo files matched)r"   failr	   r#   reason)r'   es     r*   testHashNoMatchzTestHashUnit.testHashNoMatch:   sN    2
oof$7#8o9
ii78 2
mm&112s   %( 	AAAc                     | j                  t              }| j                  dd|gd      }| j                  d|       | j                  dt        z  |       | j                  dt
        z  |       y )	Nr   r   -hTr   Hashes [hex]r   r   )r    r!   r"   r#   _TEST_FILE_HEX_CRC_TEST_FILE_HEX_MD5r&   s      r*   testHashHexFormatzTestHashUnit.testHashHexFormatA   sg    "",?"@H__V4*:$_OFMM.&)MM+.@@6JMM(+==Gr,   c                     d}| j                  |      }| j                  dt        j                  j	                  |d      gd      }|dz  }| j                  t        |j                               |       y )N   )
test_filesr   *Tr      )CreateTempDirr"   ospathjoinassertEquallen
splitlines)r'   num_test_filestmp_dirr)   num_expected_liness        r*   testHashWildcardzTestHashUnit.testHashWildcardH   ss    N  N ;G__V#%77<<#=">+/  1F (51S**,-/ABr,   c                    | j                  t              }| j                  dd|gd      }| j                  dd|gd      }| j                  ddd|gd      }||fD ]  }| j                  dt        z  |        ||fD ]  }| j                  dt
        z  |        | j                  d	|       | j                  d
|       y )Nr   r   -cTr   -mr   r   md5crc32c)r    r!   r"   r#   r$   r%   assertNotIn)r'   r(   
stdout_crc
stdout_md5stdout_bothr)   s         r*   testHashSelectAlgz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____doc__r+   r1   r7   rG   rQ    r,   r*   r   r   0   s!    $H2HC+r,   r   c                   2    e Zd ZdZd Z ed      d        Zy)TestHashz#Integration tests for hash command.c                    | j                  dt              }| j                  ddt        |      gd      }| j	                  d|       | j
                  dk(  r'| j	                  d	t        j                         z  |       | j	                  d
t        z  |       | j                  dt        |      gd      }| j	                  d|       | j
                  dk(  r| j	                  d	t        z  |       | j	                  d
t        z  |       y)z$Test hash command on a cloud object.obj1)object_namer   r   r3   Tr   r4   gsr   r   r   N)CreateObjectr!   	RunGsUtilsurir#   default_providerr5   lowerr6   r$   r%   )r'   rZ   r)   s      r*   testHashCloudObjectz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                 &   | j                         }| j                  |dt              }| j                  |dt              }| j	                  dt        |      t        |      t        |      g       | j	                  ddt        |      gd      }| j                  d	|       | j                  d
t        j                         z  |       | j	                  dt        |      gd      }| j                  d|       | j                  d
t        z  |       y)z@Test hash command on a composite object (which only has crc32c).rZ   )
bucket_urir[   r   tmpcomposer   r3   Tr\   r4   r   r   N)
CreateBucketr^   r!   _TEST_COMPOSITE_ADDED_CONTENTSr_   r`   r#   _TEST_COMPOSITE_HEX_CRCrb   _TEST_COMPOSITE_B64_CRC)r'   bucketrZ   obj2r)   s        r*   testHashCompositeObjectz 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,   N)rR   rS   rT   rU   rc   r
   rn   rV   r,   r*   rX   rX   e   s'    +H, <=P >Pr,   rX   c                      e Zd Zej                  j                  ej                  d ej                               d        Z	ej                  j                  ej                  d ej                               d        Z
ej                  j                  ej                  d ej                               d        Zej                  j                  ej                  d ej                               d        Zy)TestHashShimr"   )newc           	      |   t        ddg      5  t        ddd      5  | j                  dddgd	
      }dj                  |j                  d         }| j                  dj                  t        j                  d      t        j                        |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NGSUtiluse_gcloud_storageTruert   hidden_shim_modedry_runrv   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"   r@   messagesr#   formatr   _get_gcloud_binary_pathr   _GCLOUD_FORMAT_STRINGr'   mock_log_handler
info_liness      r*   'test_shim_translates_basic_hash_commandz4TestHashShim.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#   B2A8B&B2&B/	+B22B;c           	      |   t        ddg      5  t        ddd      5  | j                  dg dd	      }d
j                  |j                  d         }| j                  dj                  t        j                  d      t        j                        |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nrs   rw   rv   rz   r{   r   )rI   rJ   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_flagzJTestHashShim.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           	      |   t        ddg      5  t        ddd      5  | j                  dddgd	
      }dj                  |j                  d         }| j                  dj                  t        j                  d      t        j                        |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nrs   rw   rv   rz   r{   r   rJ   r   Tr~   r   r   zAGcloud Storage Command: {} storage hash {} --skip-crc32c gs://b/or   r   s      r*   ,test_shim_translates_md5_flag_to_skip_crc32cz9TestHashShim.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           	      |   t        ddg      5  t        ddd      5  | j                  dddgd	
      }dj                  |j                  d         }| j                  dj                  t        j                  d      t        j                        |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nrs   rw   rv   rz   r{   r   rI   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_md5z9TestHashShim.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   N)rR   rS   rT   r   patchobjectr   HashCommandMockr   r   r   r   rV   r,   r*   rp   rp      s    ::T%%|ED FD ::T%%|EJ FJ ::T%%|ED FD ::T%%|ED FDr,   rp   )*rU   
__future__r   r   r   r   r>   gslib.commandsr   gslib.exceptionr	   gslib.tests.testcaseteststestcase)gslib.tests.testcase.integration_testcaser
   gslib.tests.utilr   r`   r   r   gslib.utilsr   sixr   r   	six.movesr   r!   r$   r%   r5   r6   ri   rk   rj   GsUtilUnitTestCaser   GsUtilIntegrationTestCaserX   ShimUnitTestBaserp   rV   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,   