
    p1                         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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SKJr  Sr " S S\R4                  5      rg)z@Unit tests for resumable streaming upload functions and classes.    )absolute_import)print_function)division)unicode_literalsN)range)CommandException)#ResumableStreamingJsonUploadWrapper)GetJsonResumableChunkSize)TRANSFER_BUFFER_SIZE)CalculateHashesFromContents)CalculateMd5FromContents)GetMd5ztest.txtc                   T    \ 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S
 rS rSrg)'TestResumableStreamingJsonUploadWrapper'   zAUnit tests for the TestResumableStreamingJsonUploadWrapper class.Nc                     U R                   (       d`  [        R                  " SS[        -  5      U l        U R                  [        U R                  S9U l         [        U R                  5      U l        U R                   $ )Ngslibztests/test_data/%s)	file_namecontents)_temp_test_filepkgutilget_data
_TEST_FILE_temp_test_file_contentsCreateTempFilelen_temp_test_file_len)selfs    7platform/gsutil/gslib/tests/test_resumable_streaming.py_GetTestFile4TestResumableStreamingJsonUploadWrapper._GetTestFile.   sl    &-&6&6
'*4'6d#!00)F)F 1 Hd!$T%B%B!Cd    c                 d   U R                  5       n[        US5       n[        U[        SS9nS[	        5       0n[        X45        S S S 5        [        US5       n[        U5      nS S S 5        U R                  WWS   R                  5       5        g ! , (       d  f       NR= f! , (       d  f       NC= f)NrbTtest_small_buffermd5)	r    openr	   r   r   r   r   assertEqual	hexdigest)r   tmp_filestreamwrapper	hash_dictactuals         r   testReadInChunks8TestResumableStreamingJsonUploadWrapper.testReadInChunks7   s      "H	h	3F4HFJLg &(#i!'5 
 
h	'/f 
VYu-779: 
	 
	s   'BB!
B!
B/c                    U R                  5       n[        S-
  [        [        S-   [        S-  S-
  [        S-  [        S-  S-   [        S-  S-
  [        S-  [        S-  S-   4	 H  n[        S-
  [        [        S-   U R                  S-
  U R                  U R                  S-   4 H  nX0R                  :  n[        US5       n[	        UUSS9nUR                  U5         [        U5      nU(       a  U R                  SU< SU< 35        SSS5        U(       a  Mw  [        US5       n[        U5      n	SSS5        U R                  W	WSU< SU< 35        M     M     g! [         a7  nU(       d&  U R                  S	[        U5      < S
U< SU< 35         SnANSnAff = f! , (       d  f       N= f! , (       d  f       N= f)zAReads one buffer, then seeks to 0 and reads chunks until the end.         r$   Tr%   z<Did not get expected CommandException for initial read size , buffer size !Got unexpected CommandException "z" for initial read size Nz(Digests not equal for initial read size )r    r   r   r(   r	   readr   failr   strr)   )
r   r+   initial_readbuffer_sizeexpect_exceptionr,   r-   
hex_digester/   s
             r   #testReadInChunksWithSeekToBeginningKTestResumableStreamingJsonUploadWrapper.testReadInChunksWithSeekToBeginningD   s     "H-13G-13G!3Ka3O-13G!3Ka3O-1A57Ka7O-1A5	7
 /24H.2D4L4L5!5522Q68+ ')A)AA(D!V78CJNP' ,,|
$
=1':Jii%{4 5 "$  Hd#v-f5F $


j[*+9872 " =#iiQ{< == "!& $#s<   F$ +E (F5 
F!	*-F	F$F!	!F$$
F25
Gc                 r   U R                  5       nSnU H  nXV-  nM	     U R                  X#SU< SU< S35        U R                  XPR                  SU R                  < SU< S35        [	        US5       n[        UUSS9nSn	U HO  nUR                  U5      n
U R                  U R                  XU-    U
S	U	< S
X-   < S35        U	[        U
5      -  n	MQ     UR                  XS-
  5        U R                  UR                  5       XS-
  5        UR                  5       n
U R                  U R                  XS-
  -
  [        U
5      SU< SU< SU R                  XS-
  -
  < S[        U
5      < S3	5        U R                  U R                  [        U
5      * S U
SU	-  5        SSS5        g! , (       d  f       g= f)ar  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 data read after the seek
matches the original file.

Args:
  initial_reads: List of integers containing read sizes to perform
      before seek.
  buffer_size: Maximum buffer size for the wrapper.
  seek_back_amount: Number of bytes to seek backward.

Raises:
  AssertionError on wrong data returned by the wrapper.
r   z4seek_back_amount must be less than initial position z (but was actually: )z2initial_position must be less than test file size r$   Tr%   Data from position  to  did not match file contents.z(Unexpected data length with initial pos z seek_back_amount z. Expected: z
, actual: .N9Data from position %s to EOF did not match file contents.)r    assertGreaterEqual
assertLessr   r(   r	   r8   r)   r   r   seektell)r   initial_readsr<   seek_back_amountr+   initial_position	read_sizer,   r-   positiondatas              r   _testSeekBack5TestResumableStreamingJsonUploadWrapper._testSeekBackm   s   $   "H"	# #%$/1A	CD 	OO22$($<$<>N	PQ
 
h	3F4?FJLg h$)||I&))(i3GH$x+-	. 	CI % ll#67
w||~'7'JK\\^d


"
"&6&I
J
d) -t/G/G/0125d)=> 

'
'T

4d
E
- 
		s   6D)F((
F6c                 F   S/[         S-
  /[         /[         S-   /S[         S-
  /S[         /S[         S-   /[         S-
  S/[         S/[         S-   S/[         S-
  [         S-
  /[         S-
  [         /[         S-
  [         S-   /[         [         S-
  /[         [         /[         [         S-   /[         S-   [         S-
  /[         S-   [         /[         S-   [         S-   /[         [         [         /4 H  nSnU H  nX#-  nM	     X"S-   US-  S-
  US-  4 H  n[        [         S-
  U5      [        [         U5      [        [         S-   U5      [        [         S-  S-
  U5      [        [         S-  U5      [        [         S-  S-   U5      4 H  nU R                  XU5        M     M     M     g)zDTests performing reads on the wrapper, seeking, then reading to EOF.r3   r   r4   N)r   minrS   )r   rM   rO   rP   r<   rN   s         r   testReadSeekAndReadToEOF@TestResumableStreamingJsonUploadWrapper.testReadSeekAndReadToEOF   s   # 4q 89<q !A';a'?#@	C	!# 	!#$)A-.24H14L 1A57KL/!35IA5M 24H14L !57K L/1E1IJ/!35IA5M 2Q68LM/!3/!3535I37#* $)% %*q,@*Q.24Dq4HJ+!$%9A%=%5"7!$%9;K!L!$%9A%=%5"7!$%9A%=%A%5"7!$%9A%=%5"7!$%9A%=%A%5"7
!8 

]9I
J
!8J1r"   c                     [        S [        5       5         [        S [        5       S-
  5        U R                  S5        g ! [         a%  nU R	                  S[        U5      5         S nAg S nAff = f)Nr3   z%Did not get expected CommandExceptionz,Buffer size must be >= JSON resumable upload)r	   r
   r9   r   assertInr:   )r   r?   s     r   testBufferSizeLessThanChunkSizeGTestResumableStreamingJsonUploadWrapper.testBufferSizeLessThanChunkSize   s^    '.G.IJL)$0I0Ka0OP
ii78 L
mmBCFKKLs   (? 
A.	A))A.c                 .   U R                  5       n[        n[        US5       n[        U[        S-  SS9nSn[	        S5       HO  nUR                  U5      nU R                  U R                  XUU-    USU< SXR-   < S35        U[        U5      -  nMQ     UR                  US	-  5      nUS	-  nUR                  U5        UR                  5       nU R                  U R                  [        U5      * S
 USU-  5        S
S
S
5        g
! , (       d  f       g
= f)z/Tests seeking back partially within the buffer.r$   r5   Tr%   r   rD   rE   rF   r4   NrH   )
r    r   r(   r	   r   r8   r)   r   r   rK   )r   r+   rP   r,   r-   rQ   _rR   s           r   testSeekPartialBuffer=TestResumableStreamingJsonUploadWrapper.testSeekPartialBuffer   s     "H$I	h	3F4H14LFJLg hQx!||I&))(i3GH$x+-	. 	CI  \\)q.)d ahll8\\^d


'
'T

4d
E
' 
		s   CD
Dc                 |   U R                  5       n[        S-
  [        [        S-   4 H  n[        S-
  [        [        S-   4 H  nX2:  n[        US5       n[        UUSS9nUR	                  [        5      (       a   UR	                  [        5      (       a  M   UR                  U[        R                  S9  U(       a  U R                  SU< SU< 35        S S S 5        M     M     g ! [         a7  nU(       d&  U R                  S[        U5      < S	U< SU< 35         S nANMS nAff = f! , (       d  f       M  = f)
Nr3   r$   Tr%   )whencez9Did not get expected CommandException for seek_back size r6   r7   z" for seek_back size )r    r   r(   r	   r8   rK   osSEEK_ENDr9   r   r:   )r   r+   r<   	seek_backr=   r,   r-   r?   s           r   testSeekEnd3TestResumableStreamingJsonUploadWrapper.testSeekEnd   s     "H,q02F,q02,q02F,q02)$2(D!V78CJNP' 122 122
:LL2;;L7ii"K1 2 "!22$ " :#iiQK9 :: "!s1   AD,>C((
D)	2-D$	D,$D)	)D,,
D;)r   r   r   )__name__
__module____qualname____firstlineno____doc__r   r   r   r    r0   r@   rS   rW   r[   r_   rf   __static_attributes__ r"   r   r   r   '   sC    I/! ;'+R8t'KRL8:r"   r   )rl   
__future__r   r   r   r   rc   r   	six.movesr   gslib.exceptionr    gslib.resumable_streaming_uploadr	   gslib.tests.testcaseteststestcasegslib.utils.boto_utilr
   gslib.utils.constantsr   gslib.utils.hashing_helperr   r   r   r   GsUtilUnitTestCaser   rn   r"   r   <module>rz      sT    G & %  ' 	   , P ' ' ; 6 B ? -
e:h.I.I e:r"   