
    FA                        S SK Jr  S SKrS SKJr  S SKJr  S SKrS SKJ	r	J
r
JrJrJrJr  S SKJr  S SKJrJr   " S S	5      rg)
    )annotationsN)
DUMMY_POOL)mock)ConnectTimeoutErrorInvalidHeaderMaxRetryErrorReadTimeoutErrorResponseErrorSSLError)HTTPResponse)RequestHistoryRetryc                  
   \ rS rSrS/S jrS/S jrS/S jrS/S jrS/S jrS/S jr	S/S jr
S/S	 jrS/S
 jrS/S jrS/S jrS/S jrS/S jrS/S jrS/S jrS/S jrS/S jrS/S jr\R.                  R1                  SSS/5      S0S j5       rS/S jrS/S jrS/S jrS/S jrS/S jr\R.                  R1                  S/ SQ5      S1S j5       r\R.                  R1                  S / S!Q5      S2S" j5       r \R.                  R1                  S#S$S%/5          S3S& j5       r!\R.                  R1                  S'/ S(Q5      \R.                  R1                  S)/ S*QS$S+9\R.                  RE                  S)5              S4S, j5       5       5       r#S-r$g.)5	TestRetry   c                    [        5       n[        U5      S:X  d   e[        S5       H  nUR                  SS9nM     [        U5      S:X  d   eg)z3Retry string representation looks the way we expectzDRetry(total=10, connect=None, read=None, redirect=None, status=None)   GETmethodzCRetry(total=7, connect=None, read=None, redirect=None, status=None)N)r   strrange	increment)selfretry_s      6platform/gsutil/third_party/urllib3/test/test_retry.pytest_stringTestRetry.test_string   sa    JUV	
V qAOO5O1E  JTU	
U    c                &   [        5       n[        SSS9nUR                  US9nUR                  US9n[        R                  " [
        5       nUR                  US9  SSS5        WR                  R                  U:X  d   eg! , (       d  f       N+= f)z2Total can win if it's lower than the connect valuer      connecttotalerrorN)r   r   r   pytestraisesr   valuereasonr   r'   r   es       r   test_retry_both_specified#TestRetry.test_retry_both_specified$   sv    #%aq)e,e,]]=)QOO%O( *ww~~&&& *)s   B
Bc                    [        5       n[        SSS9nUR                  US9nUR                  US9n[        R                  " [
        5         UR                  US9  SSS5        g! , (       d  f       g= f)z1A lower connect timeout than the total is honoredr"   r   r#   r&   N)r   r   r   r(   r)   r   r   r'   r   s      r   test_retry_higher_total_loses'TestRetry.test_retry_higher_total_loses.   s\    #%aq)e,e,]]=)OO%O( *))s   A&&
A4c                   [        [        SS5      n[        SSS9nUR                  SUS9nUR                  SUS9n[        R
                  " [        5         UR                  SUS9  SSS5        g! , (       d  f       g= f)	z.A lower read timeout than the total is honored/read timed outr"   r   )readr%   r   r   r'   N)r	   r   r   r   r(   r)   r   r1   s      r   %test_retry_higher_total_loses_vs_read/TestRetry.test_retry_higher_total_loses_vs_read7   si     S2BC1A&uE:uE:]]=)OO5O6 *))s   A00
A>c                   [        5       n[        SSS9nUR                  US9nUR                  US9n[        R                  " [
        5       nUR                  US9  SSS5        WR                  R                  U:X  d   e[        [        SS5      n[        SSS9nUR                  SUS9nUR                  SUS9nUR                  SUS9nUR                  5       (       a   eg! , (       d  f       N= f)	z6if Total is none, connect error should take precedencer"   Nr#   r&   r5   r6   r   r8   )r   r   r   r(   r)   r   r*   r+   r	   r   is_exhausted)r   r'   r   r-   timeout_errors        r   test_retry_total_noneTestRetry.test_retry_total_none@   s    #%at,e,e,]]=)QOO%O( *ww~~&&&(S:JKat,uMBuMBuMB%%''''' *)s   C$$
C2c                L   [        5       nUR                  S:X  d   eUR                  b   eUR                  b   eUR                  b   eUR
                  b   e[        5       n[        SS9nUR                  US9n[        R                  " [        5         UR                  US9  SSS5        [        SS9nUR                  US9nUR                  5       (       a   e[        S5      R                  (       d   e[        S5      R                  (       a   eg! , (       d  f       Nv= f)z7If no value is specified, should retry connects 3 times
   N   r$   r&   r   F)r   r%   r$   r7   redirectotherr   r   r(   r)   r   r<   raise_on_redirect)r   r   r'   s      r   test_retry_defaultTestRetry.test_retry_defaultQ   s    {{b   }}$$$zz!!!~~%%%{{"""#%a e,]]=)OO%O( * a e,%%''''Qx))))<11111 *)s   D
D#c                   [        5       n[        SS9nUR                  US9nUR                  US9nUR                  5       (       a   e[        SS9nUR                  US9n[        R
                  " [        5       nUR                  US9  SSS5        WR                  R                  U:X  d   eg! , (       d  f       N+= f)z:If an unexpected error is raised, should retry other timesrB   rC   r&   )rE   N)	r   r   r   r<   r(   r)   r   r*   r+   )r   other_errorr   r-   s       r   test_retry_otherTestRetry.test_retry_otherg   s    ja k2k2%%''''Ak2]]=)QOO+O. *ww~~,,, *)s   ;B00
B>c                    [        [        SS5      n[        SS9n[        R                  " [
        5       nUR                  SUS9  SSS5        WR                  R                  U:X  d   eg! , (       d  f       N+= f)z.No second chances on read timeouts, by defaultr5   r6   r   )r7   r   r8   N)	r	   r   r   r(   r)   r   r   r*   r+   r,   s       r   test_retry_read_zeroTestRetry.test_retry_read_zerou   s\     S2BC1]]=)QOO5O6 *ww~~&&& *)s   A++
A9c                "   [        SS9n[        SS9nUR                  US9nUR                  US9n[        R                  R                  SS9n[        R                  " [        US9   UR                  US9  S S S 5        g ! , (       d  f       g = f)N  statusr"   responsestatus_codematch)	r   r   r   r
   SPECIFIC_ERRORformatr(   r)   r   )r   respr   msgs       r   test_status_counterTestRetry.test_status_counter}   sv    3'Q..**11c1B]]=4OOTO* 544s   'B  
Bc                B   [         R                  n[        SSS9nUR                  5       S:X  d   eUR                  SS9nUR                  5       S:X  d   eUR                  SS9nUR                  S:X  d   eUR
                  S:X  d   eUR                  5       S:X  d   eUR                  SS9nUR                  5       S	:X  d   eUR                  SS9nUR                  5       S
:X  d   e[        S5       H  nUR                  SS9nM     UR                  5       U:X  d   eg)zBackoff is computed correctlyd   皙?)r%   backoff_factorr   r   r   b   皙?皙?g?rA   N)r   DEFAULT_BACKOFF_MAXget_backoff_timer   rc   r%   r   )r   max_backoffr   r   s       r   test_backoffTestRetry.test_backoff   s)   //C4%%'1,,,u-%%'1,,,u-##s***{{b   %%'3...u-%%'3...u-%%'3...rAOO5O1E  %%';666r    c                   Sn[        SSUS9nUR                  5       S:X  d   eUR                  SS9nUR                  5       S:X  d   eUR                  SS9nUR                  S:X  d   eUR                  S:X  d   eUR                  5       S	:X  d   eUR                  SS9nUR                  5       S
:X  d   eUR                  SS9nUR                  5       U:X  d   eUR                  SS9nUR                  5       U:X  d   eg)z*Configurable backoff is computed correctlyrB   ra   rb   )r%   rc   backoff_maxr   r   r   rd   re   rf   Nr   rh   r   rc   r%   )r   ri   r   s      r   test_configurable_backoff_max'TestRetry.test_configurable_backoff_max   s   CM%%'1,,,u-%%'1,,,u-##s***{{b   %%'3...u-%%'3...u-%%';666u-%%';666r    c                2   SnSn[        SSUUS9nUR                  5       S:X  d   eUR                  SS9nUR                  5       S:X  d   eUR                  SS9nUR                  S:X  d   eUR                  S	:X  d   eSUR                  5       s=::  a  S
::  d   e   eUR                  SS9nS
UR                  5       s=::  a  U::  d   e   eUR                  SS9nUR                  5       U:X  d   eUR                  SS9nUR                  5       U:X  d   eg)z)Backoff with jitter is computed correctlyrB   re   ra   rb   )r%   rc   rm   backoff_jitterr   r   r   rd   rf   Nrn   )r   ri   jitterr   s       r   test_backoff_jitterTestRetry.test_backoff_jitter   s:   #!	
 %%'1,,,u-%%'1,,,u-##s***{{b   e,,.5#55555u-e,,.=+=====u-%%';666u-%%';666r    c                    [        5       nUR                  5       S:X  d   eUR                  SS9nUR                  SS9nUR                  5       S:X  d   eg )Nr   r   r   )r   rh   r   r   r   s     r   test_zero_backoffTestRetry.test_zero_backoff   sW    %%'1,,,u-u-%%'1,,,r    c                N   [        SSSS9nUR                  SS9nUR                  SS9nUR                  5       S:X  d   e[        SS	S
0S9nUR                  SUS9nUR                  5       S:X  d   eUR                  SS9nUR                  SS9nUR                  5       S:X  d   eg )Nra      rb   )r%   rD   rc   r   r   re   i.  locationtestrS   headers)r   rU   r   )r   r   rh   r   )r   r   redirect_responses      r   !test_backoff_reset_after_redirect+TestRetry.test_backoff_reset_after_redirect   s    C!C@u-u-%%'3...(j&=QRu7HI%%'1,,,u-u-%%'3...r    c                r    [        SS9nUR                  SS9nUR                  SS9nUR                  5         g )Ng-C6?)rc   r   r   )r   r   sleeprw   s     r   
test_sleepTestRetry.test_sleep   s5    V,u-u-r    c                j   [        [        SS5      S9nUR                  SSS9(       a   eUR                  SSS9(       a   eUR                  SSS9(       d   e[        SS	/S
9nUR                  SSS9(       a   eUR                  SS	S9(       d   e[        SS/S
9nUR                  SS	S9(       a   eg )N  iX  )status_forcelistr      rV   rQ   rB   i  )r%   r   418)r   r   is_retryrw   s     r   test_status_forcelistTestRetry.test_status_forcelist   s    uS#7>>%S>999>>%S>999~~e~555A6>>%S>999~~e~555 A8>>%S>9999r    c                    [        S/S S9nUR                  SSS9(       d   eUR                  SSS9(       d   e[        S/S/S9nUR                  SSS9(       a   eUR                  SSS9(       d   eg )Nr   )r   allowed_methodsr   rV   POST)r   r   rw   s     r   *test_allowed_methods_with_status_forcelist4TestRetry.test_allowed_methods_with_status_forcelist   sz    udC~~e~555~~f#~666 uvhG>>%S>999~~f#~666r    c                    [        S5      R                  5       (       a   e[        S5      R                  5       (       d   e[        S5      R                  SS9R                  S:X  d   eg )Nr   rB   r   r   )r   r<   r   r%   )r   s    r   test_exhaustedTestRetry.test_exhausted  sZ    8((****Ry%%''''Qx!!!/55:::r    r%   r   r   c                    [         R                  " [        5         [        U5      R	                  SS9  S S S 5        g ! , (       d  f       g = f)Nr   r   )r(   r)   r   r   r   )r   r%   s     r   test_disabledTestRetry.test_disabled  s/    ]]=)%L""%"0 *))s	   =
Ac           	        [        SS9n[        R                  " [        SS9 nUR	                  S[        [        SS5      S9nS S S 5        S[        WR                  5      ;  d   e[        S	S9nUR	                  S
S5      n[        R                  " [        [        R                  S9 nUR	                  S
S5      nS S S 5        S[        UR                  5      ;  d   e[        UR                  R                  [        5      (       d   e[        S	S9n[        SS9n[        R                  R                  SS9nUR	                  S
SUS9n[        R                  " [        US9 nUR	                  S
SUS9nS S S 5        S[        UR                  5      ;  d   e[        S	S9nUR	                  [!        S5      S9n[        R                  " [        SS9 nUR	                  [!        S5      S9nS S S 5        S[        UR                  5      ;  d   eg ! , (       d  f       GN= f! , (       d  f       GNl= f! , (       d  f       N= f! , (       d  f       N_= f)Nr   )r%   r6   rX   r   r5   r8   zCaused by redirectrB   r   r   rR   rV   rT   rC   conntimeoutr&   )r   r(   r)   r   r   r	   r   r   r*   r
   GENERIC_ERROR
isinstancer+   r   rZ   r[   r   )r   r   r-   rU   r]   s        r   test_error_messageTestRetry.test_error_message  s   A]]=0@AQOO$4ZFV$W $ E B $3qww<777A,]]=0K0KLPQOOFC0E M#3qww<777!''..-8888As+**11c1Bh?]]=4OOFC(OCE 5#3qww<777a &9-&HI]]=>!OO*=m*LOME ?#3qww<7773 BA ML 54 ?>s/    H(H "H2I
H 
H/2
I 
Ic           	     D   [        S[        SS/5      S9nUR                  [        5       :X  d   e[	        S5      nUR                  SSS U5      n[        SSUS S 5      4nUR                  U:X  d   e[        [        SS5      nUR                  SSS U5      n[        SSUS S 5      [        SSUS S 5      4nUR                  U:X  d   e[        S	S
9nUR                  SSUS 5      n[        SSUS S 5      [        SSUS S 5      [        SSS S	S 5      4nUR                  U:X  d   eg )NrA   r   r   )r%   r   r   z/test1z/test2r6   r   rR   z/test3)
r   	frozensethistorytupler   r   r   r	   r   r   )r   r   connection_errortest_history1
read_errortest_history2rU   test_history3s           r   test_historyTestRetry.test_history/  s=   B	5&/0JK}}'''.}=x7GH'x9I4QUVX}}---%j(<LM
$
C5(,<dDI68ZtD
 }}---s+x4@5(,<dDI68ZtD5(D#t<

 }}---r    c                    [        [        SS5      n[        5       n[        R                  " [         5         UR                  SUS9  S S S 5        g ! , (       d  f       g = f)Nr5   r6   r   r8   )r	   r   r   r(   r)   r   r1   s      r   test_retry_method_not_allowed'TestRetry.test_retry_method_not_allowedH  sA     S2BC]]+,OO6O7 -,,s   A
Ac                @    [        5       nUR                  1 Sk:X  d   eg )N>   cookieauthorizationproxy-authorizationr   remove_headers_on_redirectrw   s     r   -test_retry_default_remove_headers_on_redirect7TestRetry.test_retry_default_remove_headers_on_redirectN  s&    // 4
 
 	
 
r    c                >    [        S/S9nUR                  S1:X  d   eg )NzX-API-Secret)r   zx-api-secretr   rw   s     r   )test_retry_set_remove_headers_on_redirect3TestRetry.test_retry_set_remove_headers_on_redirectW  s&    .1AB//N3CCCCr    r*   )z-1z+1z1.0   ²c                    [        5       n[        R                  " [        5         UR	                  U5        S S S 5        g ! , (       d  f       g = fN)r   r(   r)   r   parse_retry_after)r   r*   r   s      r   test_parse_retry_after_invalid(TestRetry.test_parse_retry_after_invalid\  s/    ]]=)##E* *))s   A  
Azvalue, expected))0r   )1000i  )z	42 *   c                F    [        5       nUR                  U5      U:X  d   eg r   )r   r   )r   r*   expectedr   s       r   test_parse_retry_after TestRetry.test_parse_retry_afterb  s$     &&u-999r    respect_retry_after_headerTFc                Z    [        US9nUR                  5       nUR                  U:X  d   eg )Nr   )r   newr   )r   r   r   	new_retrys       r   *test_respect_retry_after_header_propagated4TestRetry.test_respect_retry_after_header_propagatedi  s/     1KLIIK	337QQQQr    z<retry_after_header,respect_retry_after_header,sleep_duration)	)3600T  )r   FN)Mon, 3 Jun 2019 12:00:00 UTCTr   )r   FN)Mon, 3 Jun 2019 11:00:00 UTCTN)r   FN)zMon, 03 Jun 2019 11:30:12 GMTT  )zMonday, 03-Jun-19 11:30:12 GMTTr   )zMon Jun  3 11:30:12 2019Tr   stub_timezone)UTCzAsia/JerusalemN)indirectc                   [        US9n[        R                  " S[        R                  " SSSS[        R                  R
                  S9R                  5       S9   [        R                  " S	5       n[        S
SU0S9nUR                  U5        U(       a  Ub  UR                  U5        OUR                  5         S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   z	time.timei     r      )tzinfo)return_valuez
time.sleepi  zRetry-Afterr~   )r   r   patchdatetimetimezoneutc	timestampr   r   assert_called_withassert_not_called)r   retry_after_headerr   sleep_durationr   
sleep_mockrU   s          r   %test_respect_retry_after_header_sleep/TestRetry.test_respect_retry_after_header_sleepq  s    H 1KLZZ!**aBx'8'8'<'<ik	

 ::l#z#]4F$GH KK! *n.H--n=,,. $
 

 $#
 
s%   C2A
C<C
C	C
C, N)returnNone)r%   intr   r   )r*   r   r   r   )r*   r   r   r   r   r   )r   boolr   r   )r   r   r   r   r   z
int | Noner   r   )%__name__
__module____qualname____firstlineno__r   r.   r2   r9   r>   rG   rK   rN   r^   rj   ro   rt   rx   r   r   r   r   r   r(   markparametrizer   r   r   r   r   r   r   r   r   usefixturesr   __static_attributes__r   r    r   r   r      s   
')7("2,-'+74707:-
/:	7;
 [[Wr1g.1 /18:.28
D
 [[W&AB+ C+
 [[D:: [[9D%=IR*.R	R JR [[F	
( [[	

    [[_-// %)/ #	/
 
/ .)</r    r   )
__future__r   r   r}   r   unittestr   r(   urllib3.exceptionsr   r   r   r	   r
   r   urllib3.responser   urllib3.util.retryr   r   r   r   r    r   <module>r      s2    "      * 4T/ T/r    