
    eO                     d   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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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SKJr  SSKrSSKrSSKrSSKJrJr  \" \" SSS5      5        SSKJ r    " S S\RB                  5      r"g)z#Tests for gsutil utility functions.    )absolute_import)print_function)division)unicode_literals)	boto_util)	constants)system_util)	ls_helper)
retry_util)	text_util)	unit_utilN)SetEnvironmentForTest)
TestParams)CompareVersions)DecimalShort)HumanReadableWithDecimalPlaces)
PrettyTime)add_moveMovedModulemockzunittest.mock)r   c                   f   \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 r\R                  R                  \R"                  S5      \R                  R                  \R$                  S5      S 5       5       rS rS rS rS rS rS rS rS r\R                  R                  \S5      S 5       rSrg)TestUtil6   zTests for utility functions.c                    U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S	5      S
5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        g)z7Tests converting byte counts to human-readable strings.r   0 B  z1023 B   1 KiB   1 MiB   @1 GiB333333Az5.3 GiB皙Bz2.7 TiB           z1 PiB            z1 EiBN)assertEqualr   MakeHumanReadableselfs    (platform/gsutil/gslib/tests/test_util.pytestMakeHumanReadableTestUtil.testMakeHumanReadable9   s    Y003U;Y006AY006@Y0097CY0097CY00?KY00?KY0097CY0097C    c                    U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S	5      S
5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        g)z6Tests converting bit counts to human-readable strings.r   z0 bitr   z1023 bitr   z1 Kibitr   z1 Mibitr!   z1 Gibitr#   z	5.3 Gibitr$   z	2.7 Tibitr%   z1 Pibitr&   z1 EibitN)r'   r   MakeBitsHumanReadabler)   s    r+   testMakeBitsHumanReadable"TestUtil.testMakeBitsHumanReadableE   s    Y44Q7AY44T:JGY44T:IFY44W=yIY44W=yIY44]C "Y44]C "Y44W=yIY44W=yIr.   c                 8	   U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S	5        U R                  [        R                  " S
5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S5      S5        U R                  [        R                  " S 5      S5        U R                  [        R                  " S!5      S"5        U R                  [        R                  " S#5      S"5        U R                  [        R                  " S$5      S"5        U R                  [        R                  " S%5      S"5        U R                  [        R                  " S&5      S'5        U R                  [        R                  " S(5      S'5        U R                  [        R                  " S)5      S'5        U R                  [        R                  " S*5      S'5        g+),z7Tests converting human-readable strings to byte counts.1   15   z15.3z15.7   1023r   1kr   2048i   z1 kz1 Kz1 KBr   z1 mr   z1 Mz1 MBr    z1 gr!   z1 Gz1 GBr"   1tl        1T1TB1TiBz1	   pr%   z1	   Pz1	   PBz1	   PiB1er&   1E1EB1EiBN)r'   r   HumanReadableToBytesr)   s    r+   testHumanReadableToBytes!TestUtil.testHumanReadableToBytesS   sG   Y33C8!<Y33D92>Y33F;R@Y33F;R@Y33F;TBY33D94@Y33F;TBY33E:DAY33E:DAY33F;TBY33G<dCY33E:GDY33E:GDY33F;WEY33G<gFY33E:GDY33E:GDY33F;WEY33G<gFY33D97CY33D97CY33E:GDY33F;WEY33I>HY33I>HY33J?IY33K@'JY33D97CY33D97CY33E:GDY33F;WEr.   c                    [        SS5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        [        SS	5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        [        S
S
5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        [        SS5      u  pU R                  U5        U R                  U5        g)z,Tests CompareVersions for various use cases.z3.37z3.272z3.32z3.32prez3.31z3.4prez3.3preez3.3prefoobarbazz3.4z3.3z4.1z3.33z3.10z3.1N)r   
assertTrueassertFalse)r*   gms      r+   testCompareVersionsTestUtil.testCompareVersionsu   s   
 VU+FQOOAQS#&FQOOAOOAVY/FQOOAQY/FQOOAQXy1FQOOAQUF+FQQQS#&FQQQY/FQQQVY/FQQQXx0FQQQXu-FQQQVU+FQQQUE*FQOOAQUE*FQQQUF+FQOOAOOAVU+FQOOAQr.   c                    U R                  UR                  UR                  5        U R                  UR                  UR                  5        U R                  UR                  UR                  5        U R                  UR                  UR                  5        U R                  UR
                  UR
                  5        U R                  UR                  UR                  5        g N)r'   
proxy_type
proxy_host
proxy_port
proxy_rdns
proxy_user
proxy_pass)r*   pi1pi2s      r+   _AssertProxyInfosEqualTestUtil._AssertProxyInfosEqual   s    S^^S^^4S^^S^^4S^^S^^4S^^S^^4S^^S^^4S^^S^^4r.   c                     [        SSS9[        SSS9[        SSS0S	S
9[        SSS94nU HH  n[        R                  " UR                  0 UR                  D6nU R                  X2R                  5        MJ     g )N)AFairlyShortKeyValuez!    AFairlyShortKey:        Value)argsexpected) r`   z!    :                       Value)
AnotherKeyr`   indent   z!        AnotherKey:         Value)ra   kwargsrb   )AKeyMuchLongerThanTheLastr`   z#    AKeyMuchLongerThanTheLast:Value)r   r
   MakeMetadataLinera   rg   r'   rb   )r*   test_paramsparamslines       r+   testMakeMetadataLineTestUtil.testMakeMetadataLine   s    #?'JL='JL#:&.]'JL #I(MPQK ''&++J6==Jd
t__- r.   c                 f   / SQn/ SQnSS/nSS/nSS/n/ SQn[         R                  R                  [         R                  R                  [         R                  R                  [         R                  R                  S	.nU VV	V
VVVs/ s H>  nU  H4  n	U  H*  n
U  H   nU  H  nU  H  nUUU
UU	US
.PM     M     M"     M,     M6     M@     nnnn
n	nn[        SS05         U GH%  nUR                  UR                  S5      5      nUR                  S5      nUR                  S5      nUR                  S5      nUR                  S5      n[        UR                  S5      5      nUUS   :X  d  Sn[         R                  " UUUUUUS
9nUR                  (       a  UR                  (       d7  [         R                  " US   SS5      nUR                  S5      S:X  a  SUl        U R                  [        R                  " U5      U5        GM(     SSS5        gs  snnnn
n	nf ! , (       d  f       g= f)z<Tests SetProxyInfo for various proxy use cases in boto file.)socks4socks5http)hostname1.2.3.4Ni"  r   fooNBar)TFN)rp   rq   rr   https)rU   rT   rV   rX   rY   rW   
http_proxyzhttp://host:50rT   rU   rV   rX   rY   rW   rr   Fhost2   T)httplib2socksPROXY_TYPE_SOCKS4PROXY_TYPE_SOCKS5PROXY_TYPE_HTTPr   getbool	ProxyInforU   rV   rW   r\   r   SetProxyInfo)r*   valid_proxy_typesvalid_proxy_hostvalid_proxy_portvalid_proxy_uservalid_proxy_passvalid_proxy_rdnsproxy_type_specp_hp_sp_pp_up_tp_dboto_proxy_config_test_valuestest_valuesrT   rU   rV   rX   rY   rW   rb   s                          r+   testSetProxyInfoTestUtil.testSetProxyInfo   s3   44ayt}t}* ..22..22..//	O  1A%B %B 1A0@0@0@0A0@ & 1A& 1B& 1A& 1A& 1A& 1A " %B  
.>?	@6+$(()FG
 __\2
 __\2
 __\2
 __\2
+//,78
 of55*%%1;1;1;1;1;= ##(;(;''(?L(__\*d2"&H##I$:$:;$G$,	.5 7 
A	@!%B  
A	@s   	AH"D-H""
H0c                 *   SS/n[         R                  (       d  UR                  S5        0 nU H  nSX#'   M	     [        U5         U GHU  nS H  n[        XE05         U R	                  [
        R                  " U5      [        R                  " [        R                  R                  SUR                  5       R                  S5      (       a  SOS	5      5        U H^  nXd:X  a  M
  U R	                  [
        R                  " U5      [        R                  " [        R                  R                  SS
5      5        M`     SSS5        M     S Hl  n[        XE05         U R	                  [
        R                  " U5      [        R                  " [        R                  R                  SS5      5        SSS5        Mn     S Hl  n[        XE05         U R	                  [
        R                  " U5      [        R                  " [        R                  R                  SSSSS95        SSS5        Mn     S Hk  n[        XE05         U R	                  [
        R                  " U5      [        R                  " [        R                  R                  SSSS95        SSS5        Mm     GMX     S Hu  nS Hl  n[        XE05         U R	                  [
        R                  " U5      [        R                  " [        R                  R                  SS
5      5        SSS5        Mn     Mw     SSS5        g! , (       d  f       GM  = f! , (       d  f       GM  = f! , (       d  f       GM  = f! , (       d  f       GMA  = f! , (       d  f       M  = f! , (       d  f       g= f)z4Tests ProxyInfoFromEnvironmentVar for various cases.rx   https_proxyHTTPS_PROXYN)rs   zhttp://hostnamezhttps://hostnamers   rw   i  P   r   )
1.2.3.4:50http://1.2.3.4:50zhttps://1.2.3.4:50rt   rz   )zfoo:bar@1.2.3.4:50zhttp://foo:bar@1.2.3.4:50zhttps://foo:bar@1.2.3.4:50ru   bar)rX   rY   )zbar@1.2.3.4:50zhttp://bar@1.2.3.4:50zhttps://bar@1.2.3.4:50)rX   )proxynoproxygarbage)r   r   )r	   
IS_WINDOWSappendr   r\   r   ProxyInfoFromEnvironmentVarr{   r   r|   r   lower
startswith)r*   valid_variables
clear_dictkeyenv_var
url_stringother_env_vars          r+   testProxyInfoFromEnvironmentVar(TestUtil.testProxyInfoFromEnvironmentVar  s   #]3O!!]+Jjo 	z	*$'MJ$g%:;''55g>""NN22J"==?55g>>CBHI "1)))77F$$X^^%C%CT1MO "1 <; N
J %g%:;''55g>""8>>#A#A9#%'( <;

J %g%:;''55g>""8>>#A#A#,#%.3.3	56 <;	

J %g%:;''55g>""8>>#A#A#,#%.356 <;
G %Z 5'=J$g%:;''55g>""8>>#A#A4KM <; > 5] 
+	* <;  <; <; <; <;a 
+	*s   NCL&	<NAL9	.NAM	 N=AM	'N8AM2	N&
L60	N9
M		N
M	N
M/)	N2
N<N
N)HandleExceptionsAndRebuildHttpConnectionsinfoc           	         [         R                  R                  S S S SS [        R                  S-   5      n[         R                  R                  S S S SS [        R                  S-
  5      n[         R
                  " 5       " U5        U R                  UR                  5        U R                  UR                  5        [         R
                  " 5       " U5        U R                  UR                  S5        U R                  UR                  5        g )N   r5   rf   )r   http_wrapperExceptionRetryArgsr   LONG_RETRY_WARN_SECLogAndHandleRetriesrL   calledrM   r'   
call_count)r*   mock_log_info_fnmock_wrapped_fnretry_args_over_thresholdretry_args_under_thresholds        r+   testWarnAfterManyRetriesHandler(TestUtil.testWarnAfterManyRetriesHandlerC  s     !+ 7 7 J JdD!T9#@#@1#D!F!+!8!8!K!KdD!T9#@#@1#D"F ""$%?@OOO**+%,,-""$%>?_//3OO$++,r.   c                    U R                  S[        S5      5        U R                  S[        S5      5        U R                  S[        S5      5        U R                  S[        S5      5        U R                  S	[        S
5      5        U R                  S[        S5      5        U R                  S[        S5      5        U R                  S[        S5      5        g)zTests DecimalShort for UI.z12.3bl   >? z123.5mi[z1.2ki  z1.0ki  432i  z43.2tg  zqBz43.2qg $Ѫ4cCz43250.0qg(=DN)r'   r   r)   s    r+   testUIDecimalShortTestUtil.testUIDecimalShortX  s    Wl;78X|I67V\$/0V\$/0UL-.Wl>:;Wl>:;Zn!=>r.   c                    U R                  S[        S5      5        U R                  S[        S5      5        U R                  S[        S5      5        U R                  S[        S5      5        U R                  S	[        S
5      5        g)zTests PrettyTime for UI.z25:02:10i` z01:00:00i  z00:59:59i  z100+ hrsi@~ z999+ hrsi Q%N)r'   r   r)   s    r+   testUIPrettyTimeTestUtil.testUIPrettyTimec  sk    ZE!23ZD!12ZD!12ZJ!78ZL!9:r.   c                    U R                  S[        SS5      5        U R                  S[        S5      S5        U R                  S[        SS5      5        U R                  S[        SS	5      5        U R                  S
[        SS5      5        U R                  S[        SS	5      5        U R                  S[        SS5      5        U R                  S[        SS5      5        U R                  S[        SS5      5        U R                  S[        SS5      5        U R                  S[        SS5      5        U R                  S[        SS5      5        g)z,Tests HumanReadableWithDecimalPlaces for UI.z1.0 GiBi  @r5   r!   z1.01 GiBrf   z	1.000 GiBi  P@r   z1.10 GiBi  @Fz	1.100 GiBz	10.00 MiBi   z2.01 GiBl     @ z2.0 GiBr   r   z0.00 Bz	0.00000 B   N)r'   r   r)   s    r+   $testUIHumanReadableWithDecimalPlaces-TestUtil.testUIHumanReadableWithDecimalPlacesk  s;   Y34JANPY >w GKZ34JANP[34I1MOZ34KQOQ[34KQOQ[3L!DF 	Z!?
A!NOY >z1 MNU:1a@AX=aCD["@A"FGr.   c                     [         R                  " S5      nSnU R                  [        R                  " U5      U5        U R                  [        R
                  " U5      U5        g )N 9PpsRjBGjBh90IvIS96dgRc_UL6NyGqDl   Dqr9Ya*5LjSIdAvHHT98P9)six
ensure_strr'   r   DecodeLongAsStringEncodeStringAsLong)r*   amz_gen_as_stramz_gen_as_longs      r+    testAmzGenerationTypeConversions)TestUtil.testAmzGenerationTypeConversions  sR    ^^$FGNcOY11/B#%Y11.A$&r.   c                 T    [         R                  " XU5      nU R                  XT5        g rS   )r   AddQueryParamToUrlr'   )r*   url
param_name	param_valexpected_urlnew_urls         r+   DoTestAddQueryParamToUrl!TestUtil.DoTestAddQueryParamToUrl  s"    **3IFGW+r.   c                 X    SnSnSnSR                  XU5      nU R                  XX45        g )Nz+http://foo.bar/path/endpoint?a=1&a=2&b=3&c=newparamnevalue{}&{}={}formatr   r*   old_urlr   r   r   s        r+   )testAddQueryParamToUrlWorksForASCIIValues2TestUtil.testAddQueryParamToUrlWorksForASCIIValues  s3    ;GJI$$W)DL!!'yOr.   c                 X    SnSnSnSR                  XU5      nU R                  XX45        g Nu.   http://foo.bar/path/êndpoint?Â=1&a=2&ß=3&c=u	   nêwparamu	   nêwvaluer   r   r   s        r+   (testAddQueryParamToUrlWorksForUTF8Values1TestUtil.testAddQueryParamToUrlWorksForUTF8Values  3    >GJI$$W)DL!!'yOr.   c                 X    SnSnSnSR                  XU5      nU R                  XX45        g r   r   r   s        r+   .testAddQueryParamToUrlWorksForRawUnicodeValues7TestUtil.testAddQueryParamToUrlWorksForRawUnicodeValues  r   r.   !GetMaxUploadCompressionBufferSizec                     SUl         U R                  [        R                  " 5       S5        SUl         U R                  [        R                  " 5       S5        g)z:Test GetMaxConcurrentCompressedUploads returns at least 1.r   r5   N)return_valuer'   r   !GetMaxConcurrentCompressedUploads)r*   mock_configs     r+   ,testGetMaxConcurrentCompressedUploadsMinimum5TestUtil.testGetMaxConcurrentCompressedUploadsMinimum  sF      !KY@@BAF!KY@@BAFr.    N)__name__
__module____qualname____firstlineno____doc__r,   r1   rE   rP   r\   rm   r   r   r   patchobjectr   r   loggingr   r   r   r   r   r   r   r   r   r   r   __static_attributes__r   r.   r+   r   r   6   s    $
DJ FD7r5.=.~=M@ ::Z,,@B::Z''0- 1B-$	?;H,&,PPP ::Y CDG EGr.   r   )#r   
__future__r   r   r   r   gslib.utilsr   r   r	   r
   r   r   r   gslib.tests.testcaseteststestcasegslib.tests.utilr   r   gslib.utils.text_utilr   gslib.utils.unit_utilr   r   r   r{   osr   r   r   	six.movesr   GsUtilUnitTestCaser   r   r.   r+   <module>r	     sy   , * & %  ' ! ! # ! " ! ! ' ' 2 ' 1 . @ ,  	 
 % VV_	5 6 xGx** xGr.   