
    8                         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	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
r " S S\R,                  5      rg)z)Unit tests for daisy chain wrapper class.    )absolute_import)print_function)division)unicode_literalsN)DaisyChainWrapper)StorageUrlFromString)TRANSFER_BUFFER_SIZEztest.txtc                      ^  \ rS rSrSrSr\" S5      rU 4S jrS r	 " S S\
R                  R                  5      rS	 rS
 rS rS rS rS rS rS rS rS rSrU =r$ )TestDaisyChainWrapper$   z+Unit tests for the DaisyChainWrapper class.Nzgs://bucket/objectc                    > [         [        U ]  5         U R                  5       U l        [
        R                  R                  U R                  5      U l        g )N)	superr   setUp_GetTestFiletest_data_fileospathgetsizetest_data_file_len)self	__class__s    7platform/gsutil/gslib/tests/test_daisy_chain_wrapper.pyr   TestDaisyChainWrapper.setUp*   s=    	
,.++-D ggood.A.ABD    c                     [         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   r   s     r   r   "TestDaisyChainWrapper._GetTestFile/   sM    )=
)JKH!00::B 1 Ddr   c                   ,    \ rS rSrSrS r  SS jrSrg)*TestDaisyChainWrapper.MockDownloadCloudApi7   z9Mock CloudApi that implements GetObjectMedia for testing.c                     Xl         SU l        g)a4  Initialize the mock that will be used by the download thread.

Args:
  write_values: List of values that will be used for calls to write(),
      in order, by the download thread. An Exception class may be part of
      the list; if so, the Exception will be raised after previous
      values are consumed.
r   N_write_values	get_calls)r   write_valuess     r   __init__3TestDaisyChainWrapper.MockDownloadCloudApi.__init__:   s     (dnr   Nc                 
   U =R                   S-  sl         SnU R                   H\  nXt:  a  U[        U5      -  nM  U(       a  Xu:  a    g[        U[        5      (       a  UeUR                  U5        U[        U5      -  nM^     g)z1Writes self._write_values to the download_stream.   r   N)r+   r*   len
isinstance	Exceptionwrite)	r   unused_bucket_nameunused_object_namedownload_stream
start_byteend_bytekwargs
bytes_readwrite_values	            r   GetObjectMedia9TestDaisyChainWrapper.MockDownloadCloudApi.GetObjectMediaF   sz     nnnj+++"
K(
(*

.
k9--
k*c+&&
 ,r   r)   )r   N)__name__
__module____qualname____firstlineno____doc__r-   r=   __static_attributes__ r   r   MockDownloadCloudApir&   7   s    C
  #$ $'r   rF   c                     [        US5       n UR                  [        5      nU(       d  OUR                  U5        M0  SSS5        g! , (       d  f       g= f)zAWrites all contents from the DaisyChainWrapper to the named file.wbN)openreadr	   r4   )r   daisy_chain_wrapper	file_pathupload_streamdatas        r   _WriteFromWrapperToFile-TestDaisyChainWrapper._WriteFromWrapperToFile^   sG    	i	-"''(<=
D!	  
		s   2A
Ac                    / n[        U R                  S5       n UR                  [        5      nU(       d  OUR	                  U5        M0  SSS5        U R                  5       nU R                  U R                  S-   4 H  nU R                  U5      n[        U R                  U R                  UUS9nU R                  Xt5        U R                  UR                  S5        [        US5       n[        U R                  S5       n	U R                  UR                  5       U	R                  5       5        SSS5        SSS5        M     g! , (       d  f       GN= f! , (       d  f       N-= f! , (       d  f       M  = f)z&Tests a single call to GetObjectMedia.rbNr0   download_chunk_size)rI   r   rJ   r	   appendr#   r   rF   r   
_dummy_urlrO   assertEqualr+   )
r   r,   streamrN   upload_file
chunk_sizemock_apirK   rM   r7   s
             r   testDownloadSingleChunk-TestDaisyChainWrapper.testDownloadSingleChunkg   s<   L	d!!4	(F{{/0
D!	  
) %%'K..0G0G!0KL
**<8h-doo.2.E.E.6BLN ""#6D x))1-T"m$%%t,


=--/1E1E1G
H - #" M 
)	(& -, #"s/   2E+E)/E1E)
E
E&"E))
E8	c                    U R                  5       n/ n[        U R                  S5       n UR                  [        5      nU(       d  OUR                  U5        M0  SSS5        U R                  U5      n[        U R                  U R                  U[        S9nU R                  Xa5        U R                  [        -  nU R                  [        -  (       a  US-  nU R                  UR                  U5        [        US5       n[        U R                  S5       n	U R                  UR                  5       U	R                  5       5        SSS5        SSS5        g! , (       d  f       GN= f! , (       d  f       N)= f! , (       d  f       g= f)'Tests multiple calls to GetObjectMedia.rR   NrS   r0   )r#   rI   r   rJ   r	   rU   rF   r   rV   r   rO   rW   r+   )
r   rY   r,   rX   rN   r[   rK   num_expected_callsrM   r7   s
             r   testDownloadMultiChunk,TestDaisyChainWrapper.testDownloadMultiChunk   sH   %%'KL	d!!4	(F{{/0
D!	  
) ((6H+0	2
 	  !4B004HH!55A 	X'');<	k4	 M##T*o++-/C/C/EF + 
!	 ' 
)	(( +* 
!	 s/   2EE;/E*E;
E'*
E8	4E;;
F	c                    U R                  5       n/ n[        U R                  S5       n[        S-  S-   n UR	                  U5      nU(       d  OUR                  U5        M,  SSS5        U R                  U5      n[        U R                  U R                  U[        S9nU R                  Xq5        [        R                  " U R                  [        -  5      nU R                  UR                  U5        [        US5       n	[        U R                  S5       n
U R                  U	R	                  5       U
R	                  5       5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g= f)r_   rR      
   NrS   )r#   rI   r   r	   rJ   rU   rF   r   rV   r   rO   mathceilrW   r+   )r   rY   r,   rX   buffer_write_sizerN   r[   rK   r`   rM   r7   s              r   "testDownloadWithDifferentChunkSize8TestDaisyChainWrapper.testDownloadWithDifferentChunkSize   sM   %%'KL	d!!4	(F /2R7{{,-
D!  
) ((6H+0	2
 	  !4B4#:#:#7$8 9 	X'');<	k4	 M##T*o++-/C/C/EF + 
!	 / 
)	(0 +* 
!	 s/   :E E9/E(E9
E%(
E6	2E99
Fc                    / n[        U R                  S5       n UR                  S5        UR                  [        5      nUR                  S5        U(       d  OUR                  U5        MR  SSS5        U R                  5       nU R                  U5      n[        U R                  U R                  UU R                  S9nU R                  Xd5        U R                  UR                  S5        [        US5       n[        U R                  S5       nU R                  UR                  5       UR                  5       5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g= f)z?Tests 0-byte writes to the download stream from GetObjectMedia.rR   r   NrS   r0   )rI   r   rU   rJ   r	   r#   rF   r   rV   r   rO   rW   r+   	r   r,   rX   rN   rY   r[   rK   rM   r7   s	            r   testDownloadWithZeroWrites0TestDaisyChainWrapper.testDownloadWithZeroWrites   s;   L	d!!4	(FC {{/0C 
D!  
) %%'K((6H+ 33	5
 	  !4BX''+	k4	 M##T*o++-/C/C/EF + 
!	 # 
)	($ +* 
!	 s0   AE9E2/E!?E2
E!
E/	+E22
F c                    [        U R                  S5       nUR                  [        5      nSSS5        WSS nUS[         nUS[        S-   nX4X"4XBU4X#XB4X$X24X"X44X"XC4XUU4X5X5UXBX5U4
S.nU R	                  5       n[
        R                  " U5       H  u  pSn
U	 H  nX-  n
M	     U R                  U	5      n[        U R                  [        U
5      UU R                  S9nU R                  X5        [        US5       nU R                  UR                  5       U
S	U-  5        SSS5        M     g! , (       d  f       GN= f! , (       d  f       M  = f)
zBTests unaligned writes to the download stream from GetObjectMedia.rR   Nr   r0   rd   )z First byte first chunk unalignedzLast byte first chunk unalignedz!First byte second chunk unalignedz Last byte second chunk unalignedz First byte final chunk unalignedzLast byte final chunk unalignedzHalf chunkszMany unalignedr   rS   z0Uploaded file contents for case %s did not match)rI   r   rJ   r	   r#   six	iteritemsrF   r   rV   r1   r   rO   rW   )r   rX   chunkone_bytechunk_minus_one_byte
half_chunkwrite_values_dictrY   	case_namer,   expected_contentsr<   r[   rK   rM   s                  r   testDownloadWithPartialWrite2TestDaisyChainWrapper.testDownloadWithPartialWrite   s   	d!!4	(Fkk./e 
)
 QqzH #78q-23J U:,@+O2:(:8:/:"
;8!(J" %%'K#&==1B#C	%+( &**<8h-
//

 
"55	7
 ""#6DT"m "3>J	L #" $D7 
)	(L #"s   D1?%E1
E 
E	c                 ,   / n[        U R                  S5       n UR                  [        5      nU(       d  OUR	                  U5        M0  SSS5        U R                  5       nU R                  U5      n[        U R                  U R                  UU R                  S9n[        US5       nSnUR                  S[        R                  S9  UR                  U5         UR                  [        5      nU[        U5      -  nUR                  S[        R                  S9  UR                  U5        U(       d  OUR                  U5        Mm  SSS5        U R                  UR                   S5        [        US5       n[        U R                  S5       n	U R                  UR                  5       U	R                  5       5        SSS5        SSS5        g! , (       d  f       GN= f! , (       d  f       N= f! , (       d  f       N:= f! , (       d  f       g= f)zATests seeking to the end of the wrapper (simulates getting size).rR   NrS   rH   r   whencer0   )rI   r   rJ   r	   rU   r#   rF   r   rV   r   seekr   SEEK_ENDr1   r4   rW   r+   )
r   r,   rX   rN   rY   r[   rK   rM   current_positionr7   s
             r   testSeekAndReturn'TestDaisyChainWrapper.testSeekAndReturn   s   L	d!!4	(F{{/0
D!	  
) %%'K((6H+ 33	5
 
k4	 Mq5/0"''(<=CI%  2;; 7  !12
D! 	 
! 	X''+	k4	 M##T*o++-/C/C/EF + 
!	 5 
)	( 
!	  +* 
!	 s<   2G*B G#:H/G4 H
G #
G14
H	>H
Hc                 :   / n[        U R                  S5       n UR                  [        5      nU(       d  OUR	                  U5        M0  SSS5        U R                  5       nU R                  U5      n[        U R                  U R                  UU R                  S9nUR                  [        5        UR                  [        5        UR                  S5        U R                  Xd5        U R                  UR                  S5        [        US5       n[        U R                  S5       nU R                  UR                  5       UR                  5       5        SSS5        SSS5        g! , (       d  f       GN%= f! , (       d  f       N)= f! , (       d  f       g= f)zETests seek to non-stored position; this restarts the download thread.rR   NrS   r   rd   )rI   r   rJ   r	   rU   r#   rF   r   rV   r   r~   rO   rW   r+   rl   s	            r   testRestartDownloadThread/TestDaisyChainWrapper.testRestartDownloadThread   sK   L	d!!4	(F{{/0
D!	  
) %%'K((6H+ 33	5
 1212Q  !4BX''+	k4	 M##T*o++-/C/C/EF + 
!	 % 
)	(& +* 
!	 s/   2E)F)/E;F)
E8;
F		F
Fc                 p    " S S[         5      nSSU" S5      /nU R                  5       nU R                  U5      n[        U R                  U R
                  UU R
                  S9n U R                  XS5        U R                  S5        g! U a%  nU R                  S[        U5      5         SnAgSnAff = f)	z<Tests that an exception is propagated via the upload thread.c                       \ rS rSrSrg)LTestDaisyChainWrapper.testDownloadThreadException.<locals>.DownloadExceptioni<  rE   N)r?   r@   rA   rB   rD   rE   r   r   DownloadExceptionr   <  s    
r   r      a   bzDownload thread forces failurerS   Expected exceptionN)
r3   r#   rF   r   rV   r   rO   failassertInstr)r   r   r,   rY   r[   rK   es          r   testDownloadThreadException1TestDaisyChainWrapper.testDownloadThreadException9  s    I  	d:;L %%'K((6H+ 33	5
>
""#6D
ii$% >
mm4c!f==>s   '"B
 
B5B00B5c                    [        U R                  U R                  U R                  / 5      5      n UR	                  S[
        R                  S9  U R                  S5         UR	                  S[
        R                  S9  U R                  S5        g! [         a%  nU R                  S[        U5      5         SnAN[SnAff = f! [         a%  nU R                  S[        U5      5         SnAgSnAff = f)z8Tests that seeking fails for unsupported seek arguments.r   r|   r   zdoes not support seek modeNr0   zInvalid seek during daisy chain)r   rV   r   rF   r~   r   SEEK_CURr   IOErrorr   r   r   )r   rK   r   s      r   testInvalidSeek%TestDaisyChainWrapper.testInvalidSeekP  s    +DOO,0,C,C,0,E,Eb,IK:q5
ii$%?q5
ii$%  :
mm0#a&99:  ?
mm5s1v>>?s/   /B "/C 
CB<<C
C3C..C3)r"   r   r   )r?   r@   rA   rB   rC   r"   r   rV   r   r   r   	cloud_apiCloudApirF   rO   r\   ra   ri   rm   ry   r   r   r   r   rD   __classcell__)r   s   @r   r   r   $   sx    3/#$89*C
 %'U__55 %'N"I2G6G>G0+LZGBG2>.? ?r   r   )rC   
__future__r   r   r   r   rf   r   r   rp   gslib.cloud_apir   gslib.daisy_chain_wrapperr   gslib.storage_urlr   gslib.tests.testcaseteststestcasegslib.utils.constantsr	   r!   GsUtilUnitTestCaser   rE   r   r   <module>r      sM    0 & %  '  	  
  7 2 ' ' 6
}?H77 }?r   