
    +                        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rSSKrSSK	J
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r " S S\R2                  5      r " S S\R2                  5      rg)z4Unit tests for hashing helper functions and classes.    )absolute_import)print_function)division)unicode_literalsN)mock)CommandException)StorageUrlFromString)TRANSFER_BUFFER_SIZE)CalculateMd5FromContents)GetMd5)HashingFileUploadWrapperztest.txtc                       \ rS rSrSr\R                  R                  \S5      S 5       r	\R                  R                  \S5      S 5       r
Srg)
TestGetMd5&   z#Unit tests for the GetMd5 function.md5c                 j    SUl         U R                  [        S5      S5        UR                  S5        g )Nhash    )return_valueassertEqualr   assert_called_once_withselfmock_md5s     2platform/gsutil/gslib/tests/test_hashing_helper.py testGetsMd5HashOnNonRedHatSystem+TestGetMd5.testGetsMd5HashOnNonRedHatSystem)   s.     #HVC[&)$$S)r   c           	          [         S/Ul        U R                  [        S5      S5        U R                  UR                  [
        R                  " S5      [
        R                  " SSS9/5        g )Nr   r   F)usedforsecurity)
ValueErrorside_effectr   r   
mock_callsr   callr   s     r   testGetsMd5HashOnRedHatSystem(TestGetMd5.testGetsMd5HashOnRedHatSystem1   sX    
 '/HVC[&)	33>?Ar    N)__name__
__module____qualname____firstlineno____doc__r   patchobjecthashlibr   r$   __static_attributes__r&   r   r   r   r   &   sO    +::We$* %* ::We$A %Ar   r   c                   n    \ rS rSrSrSr\" S5      rS rS r	S r
S rS	 rS
 rS rS rS rS rS rSrg)TestHashingFileUploadWrapper=   z2Unit tests for the HashingFileUploadWrapper class.Nzgs://bucket/objectc                     [         R                  " SS[        -  5      nU R                  (       d  U R	                  [        US9U l        U R                  $ )Ngslibztests/test_data/%s)	file_namecontents)pkgutilget_data
_TEST_FILE_temp_test_fileCreateTempFile)r   r6   s     r   _GetTestFile)TestHashingFileUploadWrapper._GetTestFileC   sM    )=
)JKH!00::B 1 Ddr   c                    S[        5       0nU R                  S[        -  S-  S9n[        US5       n[	        X1S[         0U R
                  U R                  5      nUR                  5         S S S 5        [        US5       n[        U5      nS S S 5        U R                  WUS   R                  5       5        g ! , (       d  f       NR= f! , (       d  f       NC= f)Nr      a   )r6   rb)r   r;   r
   openr   
_dummy_urlloggerreadr   r   	hexdigest)r   	digesterstmp_filestreamwrapperactuals         r   testReadToEOF*TestHashingFileUploadWrapper.testReadToEOFJ   s    !I""D3G,G!,K"LH	h	(UFO)-$++Gglln 
 
h	'/f 
VYu-779: 
	 
	s   9B7?C7
C
Cc           	         U R                  5       n[        R                  R                  U5      nU R	                  XSU< SU< S35        U R                  XSU< SU< S35        S[        5       0n[        US5       n[        XeS[        0U R                  U R                  5      nSnX[        -
  :  a1  UR                  [        5      n	U[        U	5      -  nX[        -
  :  a  M1  UR                  X-
  5        UR                  X-
  5        U R                  UR!                  5       X-
  5        UR                  5       n	U R                  [        U	5      XAU-
  -
  5        SSS5        [        US5       n[#        U5      n
SSS5        U R                  W
US   R%                  5       5        g! , (       d  f       NR= f! , (       d  f       NC= f)	a2  Tests reading then seeking backwards.

This function simulates an upload that is resumed after a connection break.
It reads one transfer buffer at a time until it reaches initial_position,
then seeks backwards (as if the server did not receive some of the bytes)
and reads to the end of the file, ensuring the hash matches the original
file upon completion.

Args:
  initial_position: Initial number of bytes to read before seek.
  seek_back_amount: Number of bytes to seek backward.

Raises:
  AssertionError on wrong amount of data remaining or hash mismatch.
z4seek_back_amount must be less than initial position  (but was actually: )z2initial_position must be less than test file size r   rA   r   N)r<   ospathgetsizeassertGreaterEqual
assertLessr   rB   r   rC   rD   r
   rE   lenseekr   tellr   rF   )r   initial_positionseek_back_amountrH   tmp_file_lenrG   rI   rJ   positiondatarK   s              r   _testSeekBack*TestHashingFileUploadWrapper._testSeekBackU   s       "H77??8,L*$46F	HI 	OO,$02B	DE
 !I	h	(UFO)-$++Ggh*>>>||01CI *>>> ll#./ll#67
w||~'7'JK\\^d
s4y#:J'JKM 
 
h	'/f 
VYu-779: 
	 
	s    >A&F*&A8F*2F;*
F8;
G	c           
          [         S-
  [         [         S-   [         S-  S-
  [         S-  [         S-  S-   [         S-  S-
  [         S-  [         S-  S-   4	 H  nU R                  X5        M     g N         r
   r^   )r   	num_bytess     r   testSeekToBeginning0TestHashingFileUploadWrapper.testSeekToBeginning   su    *Q.0D*Q.0Dq0H10L*Q.0Dq0H10L*Q.24H14L*Q.2	4	
 .4r   c                     [         S-   [         S-  S-
  [         S-  [         S-  S-   [         S-  S-
  [         S-  [         S-  S-   4 H2  n[         S-
  [         [         S-   4 H  nU R                  X5        M     M4     g ra   re   r   rY   rZ   s      r   testSeekBackAroundOneBuffer8TestHashingFileUploadWrapper.testSeekBackAroundOneBuffer   s    1A51A591A51A591A591A51A59;  4a79M3a79
+>9;r   c                     [         S-  S-   [         S-  S-
  [         S-  [         S-  S-   4 H;  n[         S-  S-
  [         S-  [         S-  S-   4 H  nU R                  X5        M     M=     g )Nrc   rb   rd   re   rj   s      r   testSeekBackMoreThanOneBuffer:TestHashingFileUploadWrapper.testSeekBackMoreThanOneBuffer   s    1A591A591A51A59;  4a7!;3a73a7!;=
 	+>=	;r   c           	         U R                  5       n[        R                  R                  U5      nU R	                  XSU< SU< S35        S[        5       0n[        US5       n[        XTS[
        0U R                  U R                  5      nUR                  U5        U R                  UR                  5       U5        UR                  5       nU R                  [        U5      X1-
  5        SSS5        [        US5       n[        U5      nSSS5        U R                  WUS   R!                  5       5        g! , (       d  f       NR= f! , (       d  f       NC= f)a  Tests seeking to an initial position and then reading.

This function simulates an upload that is resumed after a process break.
It seeks from zero to the initial position (as if the server already had
those bytes). Then it reads to the end of the file, ensuring the hash
matches the original file upon completion.

Args:
  initial_seek: Number of bytes to initially seek.

Raises:
  AssertionError on wrong amount of data remaining or hash mismatch.
z.initial_seek must be less than test file size rO   rP   r   rA   N)r<   rQ   rR   rS   rU   r   rB   r   rC   rD   rW   r   rX   rE   rV   r   rF   )	r   initial_seekrH   r[   rG   rI   rJ   r]   rK   s	            r   _testSeekForward-TestHashingFileUploadWrapper._testSeekForward   s      "H77??8,LOOl$0,	@A
 !I	h	(UFO)-$++Ggll< 
w||~|4\\^d
s4y,"=> 
 
h	'/f 
VYu-779: 
	 
	s   #BD6>E6
E
Ec                     S[         S-
  [         [         S-   [         S-  S-
  [         S-  [         S-  S-   4 H  nU R                  U5        M     g Nr   rb   rc   )r
   rr   )r   rq   s     r   testSeekForward,TestHashingFileUploadWrapper.testSeekForward   sV    0146J-13G!3Ka3O-1-1A57 L)	7r   c           	      p   U R                  5       n[        R                  R                  U5      nU R	                  XSU< SU< S35        S[        5       0n[        US5       n[        XTS[
        0U R                  U R                  5      nUR                  U5        U R                  UR                  5       U5        UR                  S[        R                  5        U R                  UR                  5       U5        UR                  U[        R                  5        UR                  5       nU R                  [!        U5      X1-
  5        SSS5        [        US5       n[#        U5      nSSS5        U R                  WUS   R%                  5       5        g! , (       d  f       NR= f! , (       d  f       NC= f)a  Tests reading to an initial position and then seeking to EOF and back.

This function simulates an size check on the input file by seeking to the
end of the file and then back to the current position. Then it reads to
the end of the file, ensuring the hash matches the original file upon
completion.

Args:
  initial_read: Number of bytes to initially read.

Raises:
  AssertionError on wrong amount of data remaining or hash mismatch.
z.initial_read must be less than test file size rO   rP   r   rA   r   N)r<   rQ   rR   rS   rU   r   rB   r   rC   rD   rE   r   rX   rW   SEEK_ENDSEEK_SETrV   r   rF   )	r   initial_readrH   r[   rG   rI   rJ   r]   rK   s	            r   _testSeekAway*TestHashingFileUploadWrapper._testSeekAway   sK      "H77??8,LOOl$0,	@A
 !I	h	(UFO)-$++Ggll< 
w||~|4ll1bkk"
w||~|4ll<-\\^d
s4y,"=> 
 
h	'/f 
VYu-779: 
	 
	s   #C'FF'
F$'
F5c                     S[         S-
  [         [         S-   [         S-  S-
  [         S-  [         S-  S-   4 H  nU R                  U5        M     g ru   )r
   r|   )r   r{   s     r   testValidSeekAway.TestHashingFileUploadWrapper.testValidSeekAway   sV    0146J-13G!3Ka3O-1-1A57 &	7r   c                    U R                  5       nS[        5       0n[        US5       n[        X2S[        0U R                  U R
                  5      nUR                  [        5        UR                  S[        R                  5         UR                  5         U R                  S5        SSS5        g! [         a%  nU R                  S[        U5      5         SnAN3SnAff = f! , (       d  f       g= f)zETests seeking to EOF and then reading without first doing a SEEK_SET.r   rA   r   z+Expected CommandException for invalid seek.z:Read called on hashing file pointer in an unknown positionN)r<   r   rB   r   rC   rD   rE   r
   rW   rQ   ry   failr   assertInstr)r   rH   rG   rI   rJ   es         r   testInvalidSeekAway0TestHashingFileUploadWrapper.testInvalidSeekAway   s      "H!I	h	(UFO)-$++Ggll'(ll1bkk"		?@ 
	  HF	 	 
	s0   AC$!B22
C!<CC$C!!C$$
C2)r:   )r'   r(   r)   r*   r+   r:   r	   rC   r<   rL   r^   rg   rk   rn   rr   rv   r|   r   r   r/   r&   r   r   r1   r1   =   sO    :/#$89* 	;,;\/
?? ;D*#;J'r   r1   )r+   
__future__r   r   r   r   r.   rQ   r7   unittestr   gslib.exceptionr   gslib.storage_urlr	   gslib.tests.testcaseteststestcasegslib.utils.constantsr
   gslib.utils.hashing_helperr   r   r   r9   GsUtilUnitTestCaser   r1   r&   r   r   <module>r      sg    ; & %  '  	   , 2 ' ' 6 ? - ?
A,, A.H8#>#> Hr   