
    FA                        d dl mZ d dlZd dlmZ d dlmZ d dlZd dlm	Z	m
Z
mZmZmZmZ d dlmZ d dlmZmZ  G d d	      Zy)
    )annotationsN)
DUMMY_POOL)mock)ConnectTimeoutErrorInvalidHeaderMaxRetryErrorReadTimeoutErrorResponseErrorSSLError)HTTPResponse)RequestHistoryRetryc                     e Zd Zd-dZd-dZd-dZd-dZd-dZd-dZd-dZ	d-dZ
d-d	Zd-d
Zd-dZd-dZd-dZd-dZd-dZd-dZd-dZd-dZej,                  j/                  dddg      d.d       Zd-dZd-dZd-dZd-dZd-dZej,                  j/                  dg d      d/d       Zej,                  j/                  dg d       d0d!       Zej,                  j/                  d"d#d$g      	 	 	 	 d1d%       Z ej,                  j/                  d&g d'      ej,                  j/                  d(g d)d#*      ej,                  jC                  d(      	 	 	 	 	 	 	 	 d2d+                     Z"y,)3	TestRetryc                    t               }t        |      dk(  sJ t        d      D ]  }|j                  d      } t        |      dk(  sJ y)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_stringzTestRetry.test_string   sa    JUV	
V qAOO5O1E  JTU	
U    c                0   t               }t        dd      }|j                  |      }|j                  |      }t        j                  t
              5 }|j                  |       ddd       j                  j                  |k(  sJ y# 1 sw Y   %xY w)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_specifiedz#TestRetry.test_retry_both_specified$   sv    #%aq)e,e,]]=)QOO%O( *ww~~&&& *)s   BBc                    t               }t        dd      }|j                  |      }|j                  |      }t        j                  t
              5  |j                  |       ddd       y# 1 sw Y   yxY w)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_losesz'TestRetry.test_retry_higher_total_loses.   s\    #%aq)e,e,]]=)OO%O( *))s   A11A:c                   t        t        dd      }t        dd      }|j                  d|      }|j                  d|      }t	        j
                  t              5  |j                  d|       ddd       y# 1 sw Y   yxY w)	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   r.   s      r   %test_retry_higher_total_loses_vs_readz/TestRetry.test_retry_higher_total_loses_vs_read7   si     S2BC1A&uE:uE:]]=)OO5O6 *))s   A;;Bc                   t               }t        dd      }|j                  |      }|j                  |      }t        j                  t
              5 }|j                  |       ddd       j                  j                  |k(  sJ t        t        dd      }t        dd      }|j                  d|      }|j                  d|      }|j                  d|      }|j                         rJ y# 1 sw Y   xY w)	z6if Total is none, connect error should take precedencer    Nr!   r$   r1   r2   r   r4   )r   r   r   r&   r'   r   r(   r)   r	   r   is_exhausted)r   r%   r   r+   timeout_errors        r   test_retry_total_nonezTestRetry.test_retry_total_none@   s    #%at,e,e,]]=)QOO%O( *ww~~&&&(S:JKat,uMBuMBuMB%%'''' *)s   C55C>c                6   t               }|j                  dk(  sJ |j                  J |j                  J |j                  J |j
                  J t               }t        d      }|j                  |      }t        j                  t              5  |j                  |       ddd       t        d      }|j                  |      }|j                         rJ t        d      j                  sJ t        d      j                  rJ y# 1 sw Y   hxY w)z7If no value is specified, should retry connects 3 times
   N   r"   r$   r   F)r   r#   r"   r3   redirectotherr   r   r&   r'   r   r7   raise_on_redirect)r   r   r%   s      r   test_retry_defaultzTestRetry.test_retry_defaultQ   s    {{b   }}$$$zz!!!~~%%%{{"""#%a e,]]=)OO%O( * a e,%%'''Qx))))<11111 *)s   DDc                   t               }t        d      }|j                  |      }|j                  |      }|j                         rJ t        d      }|j                  |      }t	        j
                  t              5 }|j                  |       ddd       j                  j                  |k(  sJ y# 1 sw Y   %xY w)z:If an unexpected error is raised, should retry other timesr<   r=   r$   )r?   N)	r   r   r   r7   r&   r'   r   r(   r)   )r   other_errorr   r+   s       r   test_retry_otherzTestRetry.test_retry_otherg   s    ja k2k2%%'''Ak2]]=)QOO+O. *ww~~,,, *)s   B;;Cc                    t        t        dd      }t        d      }t        j                  t
              5 }|j                  d|       ddd       j                  j                  |k(  sJ y# 1 sw Y   %xY w)z.No second chances on read timeouts, by defaultr1   r2   r   )r3   r   r4   N)	r	   r   r   r&   r'   r   r   r(   r)   r*   s       r   test_retry_read_zerozTestRetry.test_retry_read_zerou   s\     S2BC1]]=)QOO5O6 *ww~~&&& *)s   A//A8c                @   t        d      }t        d      }|j                  |      }|j                  |      }t        j                  j                  d      }t        j                  t        |      5  |j                  |       d d d        y # 1 sw Y   y xY w)N  statusr    responsestatus_codematch)	r   r   r   r
   SPECIFIC_ERRORformatr&   r'   r   )r   respr   msgs       r   test_status_counterzTestRetry.test_status_counter}   sv    3'Q..**11c1B]]=4OOTO* 544s   8BBc                R   t         j                  }t        dd      }|j                         dk(  sJ |j                  d      }|j                         dk(  sJ |j                  d      }|j                  dk(  sJ |j
                  dk(  sJ |j                         dk(  sJ |j                  d      }|j                         d	k(  sJ |j                  d      }|j                         d
k(  sJ t        d      D ]  }|j                  d      } |j                         |k(  sJ y)zBackoff is computed correctlyd   皙?)r#   backoff_factorr   r   r   b   皙?皙?g?r;   N)r   DEFAULT_BACKOFF_MAXget_backoff_timer   rY   r#   r   )r   max_backoffr   r   s       r   test_backoffz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                   d}t        dd|      }|j                         dk(  sJ |j                  d      }|j                         dk(  sJ |j                  d      }|j                  dk(  sJ |j                  dk(  sJ |j                         d	k(  sJ |j                  d      }|j                         d
k(  sJ |j                  d      }|j                         |k(  sJ |j                  d      }|j                         |k(  sJ y)z*Configurable backoff is computed correctlyr<   rW   rX   )r#   rY   backoff_maxr   r   r   rZ   r[   r\   Nr   r^   r   rY   r#   )r   r_   r   s      r   test_configurable_backoff_maxz'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                B   d}d}t        dd||      }|j                         dk(  sJ |j                  d      }|j                         dk(  sJ |j                  d      }|j                  dk(  sJ |j                  d	k(  sJ d|j                         cxk  rd
k  sJ  J |j                  d      }d
|j                         cxk  r|k  sJ  J |j                  d      }|j                         |k(  sJ |j                  d      }|j                         |k(  sJ y)z)Backoff with jitter is computed correctlyr<   r[   rW   rX   )r#   rY   rb   backoff_jitterr   r   r   rZ   r\   Nrc   )r   r_   jitterr   s       r   test_backoff_jitterz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                    t               }|j                         dk(  sJ |j                  d      }|j                  d      }|j                         dk(  sJ y )Nr   r   r   )r   r^   r   r   r   s     r   test_zero_backoffzTestRetry.test_zero_backoff   sW    %%'1,,,u-u-%%'1,,,r   c                r   t        ddd      }|j                  d      }|j                  d      }|j                         dk(  sJ t        dd	d
i      }|j                  d|      }|j                         dk(  sJ |j                  d      }|j                  d      }|j                         dk(  sJ y )NrW      rX   )r#   r>   rY   r   r   r[   i.  locationtestrJ   headers)r   rL   r   )r   r   r^   r   )r   r   redirect_responses      r   !test_backoff_reset_after_redirectz+TestRetry.test_backoff_reset_after_redirect   s    C!C@u-u-%%'3...(j&=QRu7HI%%'1,,,u-u-%%'3...r   c                    t        d      }|j                  d      }|j                  d      }|j                          y )Ng-C6?)rY   r   r   )r   r   sleeprj   s     r   
test_sleepzTestRetry.test_sleep   s5    V,u-u-r   c                d   t        t        dd            }|j                  dd      rJ |j                  dd      rJ |j                  dd      sJ t        dd	g
      }|j                  dd      rJ |j                  dd	      sJ t        ddg
      }|j                  dd	      rJ y )N  iX  )status_forcelistr      rM   rH   r<   i  )r#   ry   418)r   r   is_retryrj   s     r   test_status_forcelistz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                    t        dgd       }|j                  dd      sJ |j                  dd      sJ t        dgdg      }|j                  dd      rJ |j                  dd      sJ y )Nrx   )ry   allowed_methodsr   rM   POST)r   r|   rj   s     r   *test_allowed_methods_with_status_forcelistz4TestRetry.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                    t        d      j                         rJ t        d      j                         sJ t        d      j                  d      j                  dk(  sJ y )Nr   r<   r   r   )r   r7   r   r#   )r   s    r   test_exhaustedzTestRetry.test_exhausted  sT    8((***Ry%%'''Qx!!!/55:::r   r#   r   r   c                    t        j                  t              5  t        |      j	                  d       d d d        y # 1 sw Y   y xY w)Nr   r   )r&   r'   r   r   r   )r   r#   s     r   test_disabledzTestRetry.test_disabled  s/    ]]=)%L""%"0 *))s	   ?Ac           	        t        d      }t        j                  t        d      5 }|j	                  dt        t        dd            }d d d        dt        j                        vsJ t        d	      }|j	                  d
d      }t        j                  t        t        j                        5 }|j	                  d
d      }d d d        dt        |j                        vsJ t        |j                  j                  t              sJ t        d	      }t        d      }t        j                  j                  d      }|j	                  d
d|      }t        j                  t        |      5 }|j	                  d
d|      }d d d        dt        |j                        vsJ t        d	      }|j	                  t!        d            }t        j                  t        d      5 }|j	                  t!        d            }d d d        dt        |j                        vsJ y # 1 sw Y   xY w# 1 sw Y   sxY w# 1 sw Y   xY w# 1 sw Y   IxY w)Nr   )r#   r2   rO   r   r1   r4   zCaused by redirectr<   r   rx   rI   rM   rK   r=   conntimeoutr$   )r   r&   r'   r   r   r	   r   r   r(   r
   GENERIC_ERROR
isinstancer)   r   rQ   rR   r   )r   r   r+   rL   rT   s        r   test_error_messagez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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*3H74I,I*H47IIIc           	     H   t        dt        ddg            }|j                  t               k(  sJ t	        d      }|j                  ddd |      }t        dd|d d       f}|j                  |k(  sJ t        t        dd      }|j                  ddd |      }t        dd|d d       t        dd|d d       f}|j                  |k(  sJ t        d	
      }|j                  dd|d       }t        dd|d d       t        dd|d d       t        ddd d	d       f}|j                  |k(  sJ y )Nr;   r   r   )r#   r   r   z/test1z/test2r2   rx   rI   z/test3)
r   	frozensethistorytupler   r   r   r	   r   r   )r   r   connection_errortest_history1
read_errortest_history2rL   test_history3s           r   test_historyz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                    t        t        dd      }t               }t        j                  t               5  |j                  d|       d d d        y # 1 sw Y   y xY w)Nr1   r2   r   r4   )r	   r   r   r&   r'   r   r.   s      r   test_retry_method_not_allowedz'TestRetry.test_retry_method_not_allowedH  sA     S2BC]]+,OO6O7 -,,s   AAc                >    t               }|j                  h dk(  sJ y )N>   proxy-authorizationcookieauthorizationr   remove_headers_on_redirectrj   s     r   -test_retry_default_remove_headers_on_redirectz7TestRetry.test_retry_default_remove_headers_on_redirectN  s&    // 4
 
 	
 
r   c                B    t        dg      }|j                  dhk(  sJ y )NzX-API-Secret)r   zx-api-secretr   rj   s     r   )test_retry_set_remove_headers_on_redirectz3TestRetry.test_retry_set_remove_headers_on_redirectW  s&    .1AB//N3CCCCr   r(   )z-1z+1z1.0   ²c                    t               }t        j                  t              5  |j	                  |       d d d        y # 1 sw Y   y xY wN)r   r&   r'   r   parse_retry_after)r   r(   r   s      r   test_parse_retry_after_invalidz(TestRetry.test_parse_retry_after_invalid\  s/    ]]=)##E* *))s	   ?Azvalue, expected))0r   )1000i  )z	42 *   c                D    t               }|j                  |      |k(  sJ y r   )r   r   )r   r(   expectedr   s       r   test_parse_retry_afterz TestRetry.test_parse_retry_afterb  s$     &&u-999r   respect_retry_after_headerTFc                ^    t        |      }|j                         }|j                  |k(  sJ y )Nr   )r   newr   )r   r   r   	new_retrys       r   *test_respect_retry_after_header_propagatedz4TestRetry.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           
        t        |      }t        j                  dt        j                  ddddt        j                  j
                        j                               5  t        j                  d	      5 }t        d
d|i      }|j                  |       |r||j                  |       n|j                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   z	time.timei     r      )tzinfo)return_valuez
time.sleepi  zRetry-Afterrp   )r   r   patchdatetimetimezoneutc	timestampr   ru   assert_called_withassert_not_called)r   retry_after_headerr   sleep_durationr   
sleep_mockrL   s          r   %test_respect_retry_after_header_sleepz/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8A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__r   r,   r/   r5   r9   rA   rD   rF   rU   r`   rd   rh   rk   rs   rv   r}   r   r   r&   markparametrizer   r   r   r   r   r   r   r   r   usefixturesr    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   ro   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   