
    &                     \   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rSSKrSSK	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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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,r,  SSKJ-r-  SSKJ.r.  SSKJ/r/  SS KJ0r0  SS!KJ1r1  SS"KJ2r2  SS#KJ3r3  SS$KJ4r4  SS%KJ5r5  SS&KJ6r6  SS'KJ7r7  SS(KJ8r8  SS)KJ9r9  SS*KJ:r:  SS+KJ;r;  SS,KJ<r<  SS-K=J>r?  SS.K@JArA  SS/KBJCrC  SS0KDJErE  SS1KFJGrG  SS2KHJIrI  SS3KJJKrKJLrL  \K" \L" S4S4S55      5        SS6KMJNrN  S7rOS8rP " S9 S:\R                  5      rR " S; S<\R                  5      rT " S= S>\R                  5      rVg)?zTests for ls command.    )absolute_import)print_function)division)unicode_literals)datetimeN)ls)ApiSelector)PopulateProjectId)	SkipForGS)SkipForJSON)	SkipForS3)
SkipForXML)CaptureStdout)ObjectToURI)RUN_S3_TESTS)SetBotoConfigForTest)SetEnvironmentForTest)SkipForP12Creds)TEST_ENCRYPTION_CONTENT1)TEST_ENCRYPTION_CONTENT1_CRC32C)TEST_ENCRYPTION_CONTENT1_MD5)TEST_ENCRYPTION_CONTENT2)TEST_ENCRYPTION_CONTENT2_CRC32C)TEST_ENCRYPTION_CONTENT2_MD5)TEST_ENCRYPTION_CONTENT3)TEST_ENCRYPTION_CONTENT3_CRC32C)TEST_ENCRYPTION_CONTENT3_MD5)TEST_ENCRYPTION_CONTENT4)TEST_ENCRYPTION_CONTENT4_CRC32C)TEST_ENCRYPTION_CONTENT4_MD5)TEST_ENCRYPTION_CONTENT5)TEST_ENCRYPTION_CONTENT5_CRC32C)TEST_ENCRYPTION_CONTENT5_MD5)TEST_ENCRYPTION_KEY1)TEST_ENCRYPTION_KEY1_SHA256_B64)TEST_ENCRYPTION_KEY2)TEST_ENCRYPTION_KEY2_SHA256_B64)TEST_ENCRYPTION_KEY3)TEST_ENCRYPTION_KEY3_SHA256_B64)TEST_ENCRYPTION_KEY4)TEST_ENCRYPTION_KEY4_SHA256_B64)unittest)storage_v1_messages)UTF8)PrintFullInfoAboutObject)Retry)
IS_WINDOWS)	shim_util)add_moveMovedModulemockzunittest.mock)r5   z\gsutil does not support KMS operations for S3 buckets, or listing KMS keys with the XML API.zggsutil does not support bucket lock operations for S3 buckets or listing retention policy with XML API.c                       \ rS rSrSrS r\R                  R                  \	R                  S5      S 5       r\R                  R                  \	R                  S5      S 5       rSrg)	
TestLsUnitX   zUnit tests for ls command.c                 D   U R                   [        R                  :X  a  [        R                  " S5      $ [        SSSSSSSS	S
9n[        R                  " SSUUUSS9n[        R                  " 5       nX#l
        SUl        [        5        n[        U5        S	S	S	5        SR                  W5      n[        R                   " S[        R"                  5      n[        R$                  " XT5      nU R'                  U5        [        SSSSSSSS	S
9n[        R                  " SSUUUSS9n[        R                  " 5       n	Xl
        SU	l        [        5        n
[        U	5        S	S	S	5        SR                  W
5      n
[        R                   " S[        R"                  5      n[        R$                  " X5      nU R)                  U5        UR+                  S5      nU R-                  U[
        R.                  " US5      5        [        R                   " S[        R"                  5      n[        R$                  " X5      nU R)                  U5        UR+                  S5      nU R-                  U[
        R.                  " US5      5        g	! , (       d  f       GN= f! , (       d  f       GN;= f)z/Tests the JSON storage class update time field.z3XML API has no concept of storage class update timei                    N)tzinfofoobar12345)namebuckettimeCreatedupdatedtimeStorageClassUpdatedetag
z<^\s*Storage class update time:+(?P<stor_update_time_val>.+)$   foo2bar2.^\s*Creation time:\s+(?P<time_created_val>.+)$time_created_valz%a, %d %b %Y %H:%M:%S GMTz>^\s*Storage class update time:+(?P<stor_update_time_val_2>.+)$stor_update_time_val_2)test_apir	   XMLr,   skipr   apitools_messagesObjectr5   Mockroot_object
url_stringr   r/   joinrecompile	MULTILINEsearchassertIsNoneassertIsNotNonegroupassertEqualstrftime)selfcurrent_timeobj_metadataobj_refoutputfind_stor_update_restor_update_time_matchnew_update_timeobj_metadata2obj_ref2output2find_time_created_retime_created_matchtime_createdfind_stor_update_re_2stor_update_time_match_2stor_update_times                    &platform/gsutil/gslib/tests/test_ls.py+test_one_object_with_L_storage_class_update6TestLsUnit.test_one_object_with_L_storage_class_update[   sJ   }}']]
?A A D!Q1a4@L$++  ,L iikG&G 
Fw' 
YYvF **G
  YY':C,- tQ1aAdCO%,,  /M yy{H( H 
Gx( 
ii G ::92<<I#7A+,%++,>?L,(CDF JJI
  "yy)>H12/556NO/+FGIa 
8 
s   
I>J>
J
JWildcardIteratorc                 z   U R                  SS9n[        R                  " SSS9nX2l        SUl        [
        R                  " 5       Ul        U/UR                  R                  l        [        S/5         U R                  SS[        U5      /SS9nS S S 5        U R                  WS	5        g ! , (       d  f       N!= f)
NrA   bucket_nameT)rD   satisfiesPZSGSUtilcheck_hashesneverr   -Lbreturn_stdoutzSatisfies PZS:			True)CreateBucketrT   BucketrW   rX   r5   rV   storage_urlreturn_valueIterBucketsr   
RunCommandsuriassertRegexrc   mock_wildcard
bucket_uribucket_metadatastdouts        rt   *test_satisfies_pzs_is_displayed_if_present5TestLsUnit.test_satisfies_pzs_is_displayed_if_present   s    ""u"5J'..EMO,!J!YY[J;E,M**7	BC	DteT*-=%>-1  3f 
E 	V78 
E	Ds   4B,,
B:c                 x   U R                  SS9n[        R                  " SS9nX2l        SUl        [
        R                  " 5       Ul        U/UR                  R                  l        [        S/5         U R                  SS[        U5      /SS9nS	S	S	5        U R                  WS
5        g	! , (       d  f       N!= f)zANon custom dual region buckets should not display placement info.zfoo-non-cdrry   )rD   r|   r   r   Tr   NzPlacement locations:)r   rT   r   rW   rX   r5   rV   r   r   r   r   r   r   assertNotRegexr   s        rt   8test_placement_locations_not_displayed_for_normal_bucketCTestLsUnit.test_placement_locations_not_displayed_for_normal_bucket   s     ""}"=J'..MBO,)J!YY[J;E,M**7	BC	DteT*-=%>-1  3f 
E 	 67 
E	Ds   3B++
B9 N)__name__
__module____qualname____firstlineno____doc__ru   r5   patchobjectr   	LsCommandr   r   __static_attributes__r       rt   r7   r7   X   sa    "GIR ::R\\#569 79 ::R\\#568 78r   r7   c                       \ rS rSrSrS rSrg)TestLsUnitWithShim   z$Unit tests for ls command with shim.c           	      L   [        SS/5         [        SSS.5         U R                  SSS/S	S
9nU R                  SR	                  [
        R                  " S5      5      UR                  S   5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)N)r}   use_gcloud_storageTrue)r}   hidden_shim_modedry_runr   fake_dir)(CLOUDSDK_CORE_PASS_CREDENTIALS_TO_GSUTILCLOUDSDK_ROOT_DIRr   z	-rRlLbeahz-p fooT)return_log_handlerzzGcloud Storage Command: {} storage ls --fetch-encrypted-object-hashes -r -r -l -L -b -e -a --readable-sizes --project  fooinfo)r   r   r   assertInformatr2   _get_gcloud_binary_pathmessages)rc   mock_log_handlers     rt   test_shim_translates_flags-TestLsUnitWithShim.test_shim_translates_flags   s    	GHJ 
K 6<)" 	  ??4+x1H>B + DDDJF11*=E?%%f-	/	
K 
K	 	
K 
Ks#   BAB3B
B	B
B#r   N)r   r   r   r   r   r   r   r   r   rt   r   r      s
    ,/r   r   c                   N   \ 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\" S5      S 5       r\" S5      S 5       r\" S5      \" S5      S 5       5       r\" S5      \" S5      S 5       5       r\" S5      \" S5      S 5       5       rS rS r\" S5      \" S5      S 5       5       rS rS rS r S  r!S! r"\" S"5      S# 5       r#\$RJ                  " S$5      \" S%5      \" S&5      S' 5       5       5       r&\" S"5      S( 5       r'\" S"5      S) 5       r(\" S"5      \" S*5      S+ 5       5       r)S, r*\$RV                  " \,S-5      S. 5       r-S/ r.S0 r/S1 r0\" S25      S3 5       r1S4 r2\" S25      S5 5       r3S6 r4\" S75      S8 5       r5\" S95      S: 5       r6\" S95      S; 5       r7S< r8S= r9\" \:5      \" \:5      S> 5       5       r;\" \:5      \" \:5      S? 5       5       r<\" \=5      \" \=5      S@ 5       5       r>\" \=5      \" \=5      SA 5       5       r?\" \=5      \" \=5      SB 5       5       r@\" \=5      \" \=5      SC 5       5       rA\" SD5      \" SE5      SF 5       5       rB\" SG5      \" SH5      SI 5       5       rC\" SJ5      \" SK5      SL 5       5       rD\" SM5      \" SN5      SO 5       5       rESPrFgQ)RTestLs   z!Integration tests for ls command.c                 @    [         (       d  U R                  S/5        g g )Nr   )r   	RunGsUtilrc   s    rt   test_blank_lsTestLs.test_blank_ls   s    <
nndV r   c                 H    U R                  5       nU R                  US5        g )Nr   )r   AssertNObjectsInBucket)rc   r   s     rt   test_empty_bucketTestLs.test_empty_bucket   s     ""$J
A.r   c                 h   ^ ^ T R                  5       m[        [        SSS9UU 4S j5       nU" 5         g )Nr<   r:   triestimeout_secsc                  z   > TR                  SS[        T5      /SS9n TR                  S[        T5      -  U 5        g )Nr   -bTr   z%s/
r   r   ra   r   r   rc   s    rt   _Check10TestLs.test_empty_bucket_with_b.<locals>._Check1   sA    ~~tT4
+;<,0  2f
wj!116:r   r   r0   AssertionErrorrc   r   r   s   ` @rt   test_empty_bucket_with_bTestLs.test_empty_bucket_with_b   s3    ""$J
>3; 4;
 Ir   c                    U R                  5       nU R                  SS[        U5      /SS9nU R                  [        U5      U5        U R	                  SU5        U R                  SSS[        U5      /5        U R                  SSS	[        U5      /5        U R                  SS[        U5      /SS9n[
        R                  " S
[
        R                  5      n[
        R                  " S[
        R                  5      n[
        R                  " S[
        R                  5      n[
        R                  " X25      n[
        R                  " XB5      n[
        R                  " XR5      nU R                  [        R                  :X  a4  U R                  U5        U R                  U5        U R                  U5        gU R                  [        R                  :X  a  U R                  U5        U R                  U5        U R                  U5        UR                  S5      n	[         R"                  " U	S5      n	UR                  S5      n
[         R"                  " U
S5      n
U R%                  X5        U R'                  SU5        gg)zTests ls -Lb.r   r   Tr   TOTAL:
versioningsetonoffz1^\s*Metageneration:\s+(?P<metageneration_val>.+)$z-^\s*Time created:\s+(?P<time_created_val>.+)$z-^\s*Time updated:\s+(?P<time_updated_val>.+)$rO   %a, %d %b %Y %H:%M:%S %Ztime_updated_valFN)r   r   r   r   assertNotInrZ   r[   r\   r]   rQ   r	   rR   r^   JSONr_   r`   timestrptimeassertGreater_AssertBucketPolicyOnly)rc   r   r   find_metageneration_rern   find_time_updated_remetageneration_matchro   time_updated_matchrp   time_updateds              rt   test_bucket_with_LbTestLs.test_bucket_with_Lb   s   ""$J^^T5$z*:;4^PFMM$z"F+ 	Xv& 	NNL%tJ/?@ANNL%Z0@AB^^T5$z*:;4^PFZZ<bllL::8",,H::8",,H99%;D#7@#7@}}'
,-
*+
*+	+**	*
/0
-.
-.'--.@Al]]<1KLl'--.@Al]]<1KLl
4
""5&1 
+r   c                     U R                   [        R                  :X  a?  U R                  SSS9nU R	                  SS[        U5      /SS9nU R                  SU5        g g )NT)bucket_policy_onlyprefer_json_apir   r   r   )rQ   r	   r   r   r   r   r   rc   r   r   s      rt   &test_bucket_with_Lb_bucket_policy_only-TestLs.test_bucket_with_Lb_bucket_policy_only  sg    }}((($$59 % ;j~~tUD,<=,0  2f
""40 )r   c                     [         R                  " S[         R                  5      n[         R                  " X25      nUR	                  S5      nU R                  [        U5      U5        g )Nz2^\s*Bucket Policy Only enabled:\s+(?P<bpo_val>.+)$bpo_val)rZ   r[   r\   r]   r`   ra   str)rc   valuer   bucket_policy_only_rebucket_policy_only_matchbucket_policy_only_vals         rt   r   TestLs._AssertBucketPolicyOnly"  sQ    JJ=r||M!yy)>G5;;IFSZ!78r   c                 h   ^ ^ T R                  5       m[        [        SSS9UU 4S j5       nU" 5         g)zTests ls -lb.r<   r:   r   c                     > TR                  SS[        T5      /SS9n TR                  [        T5      U 5        TR                  SU 5        g )Nr   -lbTr   r   )r   r   r   r   r   s    rt   r   +TestLs.test_bucket_with_lb.<locals>._Check1-  sJ    ~~tUD,<=,0  2f
mmD$f-
x(r   Nr   r   s   ` @rt   test_bucket_with_lbTestLs.test_bucket_with_lb)  s3    ""$J
>3) 4) Ir   c                   ^ ^^^ T R                  5       nT R                  SUS9nT R                  SUS9nT R                  US9mT R                  US9m[        R                  " [        T5      [        T5      /5      nT R                  UR                  T R                  < SU< S35      5        SU-  m[        [        SSS	9UUU U4S
 j5       nU" 5         g)z/Tests listing multiple buckets with a wildcard.rE   )prefixry   z://z%gsutil-test-test-bucket-list-wildcardz%s*r<   r:   r   c                     > TR                  SST/SS9n [        [        T5      S-   [        T5      S-   /5      n[        U R                  5       5      nTR	                  X5        g )Nr   r   Tr   /)r   r   r   splitra   )r   expectedactualbucket1_uribucket2_urirc   wildcards      rt   r   1TestLs.test_bucket_list_wildcard.<locals>._Check1J  s]    ~~tT84D~Ifd;'#-tK/@3/FGHh6<<>"f
x(r   N)MakeRandomTestStringMakeTempNamer   	posixpathcommonprefixr   
assertTrue
startswithdefault_providerr0   r   )	rc   random_prefixbucket1_namebucket2_namecommon_prefixr   r   r  r  s	   `     @@@rt   test_bucket_list_wildcard TestLs.test_bucket_list_wildcard6  s    --/M$$Xm$DL$$Xm$DL###=K###=K
 **	k	D-.0MOO  ""M3	45 }$H >3) 4) Ir   c                 6   U R                  SSSU R                  -  /SSS9nU R                  SU5        U R                  SSSU R                  -  /SSS9nU R                  SU5        U R                  SS	SU R                  -  /SSS9nU R                  SU5        g
)z*Tests a bucket that is known not to exist.r   r   zgs://%sTr:   return_stderrexpected_status404r   r   N)r   nonexistent_bucket_namer   rc   stderrs     rt   test_nonexistent_bucket_with_ls&TestLs.test_nonexistent_bucket_with_lsS  s    ^^	ui$">">>?  F 	MM% ^^	ui$">">>?  F 	MM% ^^	tY!=!==>  F 	MM% r   c                     U R                  5       nU R                  S[        US5      /SSS9nU R                  SU5        g)z$Tests listing a non-existent object.r   missingTr:   r  zmatched no objectsN)r   r   r   r   )rc   r   r  s      rt   test_list_missing_objectTestLs.test_list_missing_objectg  sH    ""$J^^T4
I#>?*.,-  /F 	MM&/r   c                    ^ ^^ T R                  5       mT R                  TSS9m[        [        SSS9UUU 4S j5       nU" 5         g )N   foor   contentsr<   r:   r   c                  f   > TR                  S[        T5      /SS9n TR                  ST-  U 5        g Nr   Tr   %s
r   )r   r   obj_urirc   s    rt   r   ,TestLs.test_with_one_object.<locals>._Check1s  s4    ~~tT*%56d~Kf
v'0r   r   CreateObjectr0   r   )rc   r   r   r&  s   ` @@rt   test_with_one_objectTestLs.test_with_one_objecto  sH    ""$J:GG
>31 41 Ir   c                 t  ^ ^ SU-  nSU-  n[        SSU4/5         T R                  US9nT R                  USS9mS S S 5        [        [        SSS	9UU 4S
 j5       n[        SSU4/5         U" [        W5      5        U" [        T5      5        S S S 5        g ! , (       d  f       Nb= f! , (       d  f       g = f)Nzs3.%s.amazonaws.coms3hostlocationr   r!  r<   r:   r   c                 T   > TR                  SU /SS9nTR                  ST-  U5        g r$  )r   ra   )urir   r&  rc   s     rt   r   5TestLs.location_redirect_test_helper.<locals>._Check1  s.    ~~tSk~>f
v'0r   )r   r   r)  r0   r   r   )rc   bucket_regionclient_regionbucket_hostclient_hostr   r   r&  s   `      @rt   location_redirect_test_helper$TestLs.location_redirect_test_helperz  s    '-7K'-7K	fk:;	<$$m$<j!!Z&!Ig 
= >31 41 
fk:;	<d:d7m	 
=	< 
=	< 
=	<s    B,#B)
B&)
B7z3Only s3 V4 signatures error on location mismatches.c                 (    U R                  SS5        g )Nz	ap-east-1	us-east-2r8  r   s    rt   test_400_location_redirect!TestLs.test_400_location_redirect  s     	&&{K@r   c                 (    U R                  SS5        g )Nz	eu-west-1r;  r<  r   s    rt   test_301_location_redirect!TestLs.test_301_location_redirect  s    &&{K@r   zNot relevant for S3z6Only the XML API supports changing the calling format.c                     U R                  5       nU R                  USS9nU R                  SS[        U5      /SS9nU R	                  SU5        g )Nr   r!  -Dr   Tr   zHost: storage.googleapis.com)r   r)  r   r   r   )rc   r   
object_urir  s       rt   -test_default_gcs_calling_format_is_path_style4TestLs.test_default_gcs_calling_format_is_path_style  sT     ""$J""j6"JJ^^T4j)9:$^OFMM0&9r   c                    U R                  5       nU R                  USS9nSn[        SSU4/5         U R                  SS[	        U5      /SS	9nS S S 5        U R                  S
UR                  -  W5        g ! , (       d  f       N.= f)Nr   r!  z)boto.s3.connection.SubdomainCallingFormatr-  calling_formatrC  r   Tr   zHost: %s.storage.googleapis.com)r   r)  r   r   r   r   rz   )rc   r   rD  custom_calling_formatr  s        rt   'test_gcs_calling_format_is_configurable.TestLs.test_gcs_calling_format_is_configurable  s     ""$J""j6"JJG	&68MN   
!~~tT4
+;<,0  2f
! 	MM3j6L6LL	
! 
!s   A77
Bz-Credstore file gets created only for json APIzEP12 credentials are not cached, as they are supported via google-authc                   ^ ^^^^ T R                  5       n[        R                  R                  US5      mSR	                  U5      mT R                  5       mT R                  TSS9m[        [        SSS9UUUUU 4S j5       nU" 5         g )	N
credstore2zGSUtil:state_dir={}r   r!  r<   r:   r   c                    > TR                  STS[        T5      /SS9n TR                  ST-  U 5        [        R                  S:X  a  TR                  [        R                  R                  T5      5        [        [        R                  " [        R                  " T5      R                  5      5      nTR                  [        S5      U5        g g )Nz-or   Tr   r%  posixi  )r   r   ra   osrD   r  pathexistsoctstatS_IMODEst_mode)r   moder   filepathr&  optionrc   s     rt   r   6TestLs.test_credfile_lock_permissions.<locals>._Check1  s    ~~tJ/
0  Ff
v'0	G	x014<< 1 9 9:;UT*	 
r   )	CreateTempDirrP  rQ  rY   r   r   r)  r0   r   )rc   tmpdirr   r   rX  r&  rY  s   `  @@@@rt   test_credfile_lock_permissions%TestLs.test_credfile_lock_permissions  s     !Fww||FL1H"))&1F""$J:GG
>3+ + 4+ Ir   c                 J   U R                  SS9nU R                  SS[        U5      /SS9nUR                  5       nU R	                  US   R                  5       5        [        R                  " UR                  5       S   S	5        U R                  US
   [        U5      5        g)z!Tests listing one object with -l.r   r"  r   -lTr   r   r:   z%Y-%m-%dT%H:%M:%SZr;   N)	r)  r   r   r   r  isdigitr   r   ra   )rc   r&  r   output_itemss       rt   test_one_object_with_lTestLs.test_one_object_with_l  s    0G^^T4g7t^LF<<>LOOLO++-.MM&,,.#%9:\!_d7m4r   c                 R   U R                  SS9n[        R                  " S5        U R                  SSS[	        U5      /5        [
        R                  " S[
        R                  5      n[
        R                  " S[
        R                  5      nU R                  S	S
[	        U5      /SS9n[
        R                  " X$5      n[
        R                  " X45      nUR                  S5      nU R                  U5        [        R                  " US5      nU R                  [        R                  :X  a  U R                  U5        gU R                  [        R                   :X  aK  UR                  S5      nU R                  U5        [        R                  " US5      nU R#                  X5        gg)z!Tests listing one object with -L.r   r`  r;   setmetaz-hzx-goog-meta-foo:barrN   z,^\s*Update time:\s+(?P<time_updated_val>.+)$r   -LTr   rO   r   r   N)r)  r   sleepr   r   rZ   r[   r\   r]   r`   r_   r   rQ   r	   rR   r^   r   r   )	rc   r&  rn   r   r   ro   r   rp   r   s	            rt   test_one_object_with_LTestLs.test_one_object_with_L  sM   0GJJqMNNIt%:DMJK::92<<I::7G^^T4g7t^LF#7@#7@%++,>?L&==/IJL}}'
*+	+**	*'--.@Al
<(]]<1KLl
4	 
+r   z<Integration test utils only support GCS JSON for versioning.c                    U R                  SS9nU R                  UR                  SS9nU R                  UR                  UR                  SS9nSR                  UR                  UR                  UR
                  5      nSR                  UR                  UR                  UR
                  5      nU R                  SU/SS	9nU R                  XF5        U R                  XV5        g
)zDTests listing one object by generation when multiple versions exist.T)versioning_enabled   1)rz   r"     2)rz   object_namer"  zgs://{}/{}#{}r   r   N)	CreateBucketJsonCreateObjectJsonrD   r   rE   
generationr   r   r   )rc   rE   object1object2object_url_string1object_url_string2r   s          rt   test_one_object_with_generation&TestLs.test_one_object_with_generation  s     ""d";F##d#KG##07-1 $ 3G )//070B0BD(//070B0BD ^^T#56d^KF'0MM$-r   c                    ^ ^^^ T R                  SS9mT R                  TS5      mT R                  TS5        T R                  TS5      mT R                  TS5        [        [        SSS9UUUU 4S	 j5       nU" 5         g
)z$Tests listing a bucket subdirectory.r:   test_objectsrA   bazdir/foorB   r<   r   c                     > TR                  SS[        T5      -  /SS9n TR                  S[        T5      -  U 5        TR                  S[        T5      /SS9n TR                  S[        T5      -  U 5        g )Nr   z%s/dirTr   r%  r   )r   r   k1_urik2_urirc   s    rt   r   #TestLs.test_subdir.<locals>._Check1  sw    ~~tXZ0@%@A,0  2f
vV,f5~~tT&\2$~Gf
vV,f5r   Nr   StorageUriCloneReplaceNameStorageUriSetContentsFromStringr0   r   )rc   r   r   r  r  s   ` @@@rt   test_subdirTestLs.test_subdir  s|    """2J,,Z?F((7,,ZCF((7
>36 46 Ir   c                   ^ ^^ T R                  SS9mT R                  TS5      mT R                  TS5        T R                  TS5      nT R                  US5        T R                  TS5      nT R                  US5        T R                  TS5      nT R                  US	5        [        [        S
SS9UUU 4S j5       nU" 5         g)zTests listing a bucket subdirectory using -d.

Result will display subdirectory names instead of contents. Uses a wildcard
to show multiple matching subdirectories.
r:   r{  rA   r}  r~  rB   zdir/foo2z	dir2/foo3rL   r<   r   c                    > TR                  SSS[        T5      -  /SS9n TR                  [        T5      < S[        T5      < S3U 5        TR                  S[        T5      /SS9n TR                  S[        T5      -  U 5        g )	Nr   z-dz%s/dir*Tr   z/dir/
z/dir2/
r%  r   )r   r   r  rc   s    rt   r   .TestLs.test_subdir_nocontents.<locals>._Check1  s    ~~y4
#33
4D  Jf
#'
#3T*5E
FP~~tT&\2$~Gf
vV,f5r   Nr  )rc   r  k3_urik4_urir   r   r  s   `    @@rt   test_subdir_nocontentsTestLs.test_subdir_nocontents  s     """2J,,Z?F((7,,ZCF((7,,ZDF((7,,ZEF((8
>36 46 Ir   c                   ^ ^^ T R                  SS9nT R                  SS9mT R                  USSS9  [        UR	                  5       5      mT Vs/ s H  nT R                  X5      R                  PM      snS   nT R                  SU[        T5      /5        T R                  SU[        T5      /5        [        [        SSS9UUU 4S	 j5       nU" 5         g
s  snf )z!Tests listing a versioned bucket.r:   r{  T	versionedr   cpr<   r   c                  "  > TR                  SS[        T5      /SS9n TR                  U S5        TR                  SS[        T5      /SS9n TR                  STR	                  TTS   R
                  5      -  U 5        TR                  S	U 5        g )
Nr   z-aTr   r<   z-laz%s#r   zmetageneration=)r   r   assertNumLinesr   r  rD   )r   r  bucket_listrc   s    rt   _Check2'TestLs.test_versioning.<locals>._Check26  s    ~~tT4+<=,0  2f
&!$~~tUD,=>,0  2f
mm


)
)+{1~7J7J
KL
 mm%v.r   N)r   CreateVersionedBucketr   listlist_bucketStorageUriCloneReplaceKeyversionless_urir   r   r0   r   )rc   r   keyobjurir  r  r  s   `    @@rt   test_versioningTestLs.test_versioning(  s    ###3K,,!,<KQ$?{..01K C 	&&{8HH 	F 	NND&${"345NND&${"345
>3
/ 4
/ I)s   %Cc                   ^ ^^ T R                  5       mT R                  TSS9nUR                  5       R                  R	                  S5      m[        [        SSS9UUU 4S j5       nU" 5         UUU 4S jnU" 5         UUU 4S	 jnU" 5         g
)z*Tests that listing an object with an etag.r   r!  "'r<   r:   r   c                     > TR                  SS[        T5      /SS9n TR                  [        R                  :X  a  TR                  TU 5        g TR                  SU 5        g )Nr   ra  Tr   etag=)r   r   rQ   r	   rR   r   r   r   rI   rc   s    rt   r   !TestLs.test_etag.<locals>._Check1M  sW    ~~tT4
+;<,0  2f	+//	)v&&)r   c                     > TR                  SS[        T5      /SS9n TR                  [        R                  :X  a  TR                  TU 5        g TR                  SU 5        g )Nr   z-leTr   r  r   r   rQ   r	   rR   r   r  s    rt   r  !TestLs.test_etag.<locals>._Check2X  sS    ~~tUD,<=,0  2f	+//	)dF#gv&r   c                     > TR                  SS[        T5      /SS9n TR                  [        R                  :X  a  TR                  TU 5        g TR                  SU 5        g )Nr   z-aleTr   r  r  r  s    rt   _Check3!TestLs.test_etag.<locals>._Check3b  sS    ~~tVT*-=>,0  2f	+//	)dF#gv&r   N)r   r)  get_keyrI   stripr0   r   )rc   r&  r   r  r  r   rI   s   `    @@rt   	test_etagTestLs.test_etagE  s    ""$J:GG ??!!''.D
>3* 4* I' I' Ir   c                 @   U R                  5       n[        U5      nU R                  SSU/SS9nU R                  US5        U R                  SSSS	U/SS
9  U R                  SSU/SS9n[        R
                  " S[        R                  5      nU R                  X45        g)z=Tests listing on a bucket with a label/tagging configuration.r   r   Tr   zLabels:\s+Nonelabelchra  zlabelkey:labelvalueforce_gsutilz.Labels:\s+\{\s+"labelkey":\s+"labelvalue"\s+\}N)r   r   r   r   rZ   r[   r\   )rc   r   bucket_surir   label_regexs        rt   test_labelsTestLs.test_labelsl  s    ""$Jz"K^^T5+6d^KFV./ 	NNGT4)>L $  &^^T5+6d^KF**N\\+KV)r   z8S3 bucket configuration values are not supported via ls.c                     U R                  5       n[        U5      nU R                  SSU/SS9nU R                  SU5        U R                  SSU/SS9nU R	                  US5        g)	0Tests listing a bucket with location constraint.r   r   Tr   zLocation constraint:r   zLocation constraint:\s+\SNr   r   r   r   r   rc   r   r  r   s       rt   test_location_constraintTestLs.test_location_constraint}  sv     ""$Jz"K ^^T5+6d^KF+V4 ^^T5+6d^KF 	V9:r   zb/135700569z7Location type not available when using the GCS XML API.z)Location type not printed for S3 buckets.c                     U R                  5       n[        U5      nU R                  SSU/SS9nU R                  SU5        U R                  SSU/SS9nU R	                  US5        g)	r  r   r   Tr   zLocation type:r   zLocation type:\s+\SNr  r  s       rt   test_location_typeTestLs.test_location_type  st    
 ""$Jz"K ^^T5+6d^KF%v. ^^T5+6d^KFV34r   c                    U R                  5       n[        U5      nU R                  SSU/SS9nU R                  SU5        SnU R                  SSU/SS9nU R	                  SR                  U5      U5        U R                  S	S
SSX"/5        U R                  SSU/SS9nU R	                  SR                  U5      U5        U R                  S	S
SU/5        U R                  SSU/SS9nU R	                  SR                  U5      U5        g)z+Tests listing a bucket with logging config.r   r   Tr   zLogging configuration		r   zLogging configuration:{}Noneloggingr   r   r   zLogging configuration:{}Presentr   Nr   r   r   r   r   r   rc   r   r  r   spacings        rt   test_loggingTestLs.test_logging  s    ""$Jz"K ^^T5+6d^KF,f5G^^T5+6d^KFMM077@&I 	NNIudD+KL^^T5+6d^KFMM3::7CVL 	NNIue[9:^^T5+6d^KFMM077@&Ir   c                    U R                  5       n[        U5      nU R                  SSU/SS9nU R                  SU5        SnU R                  SSU/SS9nU R	                  SR                  U5      U5        U R                  S	S
SSU/5        U R                  SSU/SS9nU R	                  SR                  U5      U5        U R                  S	S
U/5        U R                  SSU/SS9nU R	                  SR                  U5      U5        g)z+Tests listing a bucket with website config.r   r   Tr   zWebsite configurationr  r   zWebsite configuration:{}Nonewebr   z-mz
google.comzWebsite configuration:{}PresentNr  r  s        rt   test_webTestLs.test_web  s    ""$Jz"K ^^T5+6d^KF,f5G^^T5+6d^KFMM077@&I 	NNE5$kBC^^T5+6d^KFMM3::7CVL 	NNE5+./^^T5+6d^KFMM077@&Ir   z0Requester Pays is not supported for the XML API.c                    U R                  5       n[        U5      nSnU R                  SSU/SS9nU R                  SU5        U R                  SSU/SS9nU R	                  SR                  U5      U5        U R                  S	S
SU/5        U R                  SSU/SS9nU R	                  SR                  U5      U5        U R                  S	S
SU/5        U R                  SSU/SS9nU R	                  SR                  U5      U5        g)z<Tests listing a bucket with requester pays (billing) config.r  r   r   Tr   zRequester Pays enabledr   zRequester Pays enabled:{}Nonerequesterpaysr   r   zRequester Pays enabled:{}Truer   zRequester Pays enabled:{}FalseNr  )rc   r   r  r  r   s        rt   test_requesterpaysTestLs.test_requesterpays  s    ""$Jz"KG^^T5+6d^KF-v6 ^^T5+6d^KFMM188A6J 	NNOUD+>?^^T5+6d^KFMM188A6J 	NNOUE;?@^^T5+6d^KFMM299'BFKr   c                   ^ ^ T R                  5       mT R                  TSS9  [        [        SSS9UU 4S j5       nU" 5         [        [        SSS9UU 4S j5       nU" 5         [        [        SSS9UU 4S j5       nU" 5         [        [        SSS9UU 4S	 j5       nU" 5         [        [        SSS9UU 4S
 j5       nU" 5         g)z#Tests various size listing options.s   xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxr!  r<   r:   r   c                  b   > TR                  SS[        T5      /SS9n TR                  SU 5        g )Nr   ra  Tr   2048r   r   r   r   s    rt   r   'TestLs.test_list_sizes.<locals>._Check1  5    ~~tT4
+;<,0  2f
mmFF#r   c                  b   > TR                  SS[        T5      /SS9n TR                  SU 5        g )Nr   rh  Tr   r  r  r   s    rt   r  'TestLs.test_list_sizes.<locals>._Check2  r  r   c                  b   > TR                  SS[        T5      /SS9n TR                  SU 5        g )Nr   z-alTr   r  r  r   s    rt   r  'TestLs.test_list_sizes.<locals>._Check3  s5    ~~tUD,<=,0  2f
mmFF#r   c                  b   > TR                  SS[        T5      /SS9n TR                  SU 5        g )Nr   z-lhTr   2 KiBr  r   s    rt   _Check4'TestLs.test_list_sizes.<locals>._Check4  s5    ~~tUD,<=,0  2f
mmGV$r   c                  b   > TR                  SS[        T5      /SS9n TR                  SU 5        g )Nr   z-alhTr   r  r  r   s    rt   _Check5'TestLs.test_list_sizes.<locals>._Check5  s5    ~~tVT*-=>,0  2f
mmGV$r   Nr(  )rc   r   r  r  r  r  r   s   `     @rt   test_list_sizesTestLs.test_list_sizes  s    ""$JkB >3$ 4$
 I >3$ 4$
 I >3$ 4$
 I >3% 4%
 I >3% 4%
 Ir   z:Unicode handling on Windows requires mods to site-packagesc                 ,   SnU R                  5       nU R                  USUS9nU R                  USSS9  U R                  SS[	        U5      /SS	9nU R                  X5        U R                  S
:X  a  U R                  [        UR                  5      U5        U R                  SUR                  5       R                  -  U5        U R                  [        R                  :X  a:  U R                  UR                  5       R                  R                  S5      U5        gU R                  SU5        gU R                  S:X  aV  U R                  UR                   U5        U R                  UR                  5       R                  R                  S5      U5        gg)z0Tests listing an object with a unicode filename.u   Аудиоархивr   )r   r"  rp  r:   Tr  r   z-aelr   gszmetageneration=%sr  r  r-  N)r  r)  r   r   r   r   r
  r   rs  r  metagenerationrQ   r	   rR   rI   r  
version_id)rc   rp  r   key_urir   s        rt   test_list_unicode_filename!TestLs.test_list_unicode_filename  sR    *K++-J:)/,7   9G 	
A>^^T64=9^NFMM+&$
mmC**+V4
mm''//*;*J*JJ	+//	)goo',,22596B 	gv&			$	&
mmG&&/
mmGOO%**007@ 
'r   c                     U R                  SS9nU R                  SS[        U5      /SS9nU R                  SU5        U R	                  SU5        g	)
z(Tests that long listing includes an ACL.r   r`  r   rh  Tr   zACL:zACCESS DENIEDN)r)  r   r   r   r   )rc   r  r   s      rt   test_list_aclTestLs.test_list_aclA  sP    0G^^T4g7t^LFMM&&!_f-r   c           	         ^ ^^ SmST-  nT R                  USS9nT R                  5       mT R                  SSS[        U5      [        T5      /5        [	        [
        SS	S
9UUU 4S j5       nU" 5         g)zTests listing a gzipped object.i'     xzfoo.txt)r"  	file_namer  z-ztxtr<   r:   r   c                  0  > TR                  SS[        T5      /SS9n TR                  U S5        SnTR                  X5        [        R                  " X5      n[        UR                  S5      5      nTR                  US5        TR                  UT5        g )	Nr   rh  Tr   zContent-Encoding:\s+gzipzContent-Length:\s+(?P<num>\d)numr   )	r   r   r   rZ   r]   intr`   r   
assertLess)r   find_content_length_remcontent_length	file_sizer  rc   s       rt   r   5TestLs.test_list_gzip_content_length.<locals>._Check1Q  s    ~~tT4=9~Nf
v:;?
v6
))*
3a1775>*n
+
ooni0r   N)CreateTempFiler)  r   r   r0   r   )rc   file_contentsfpathr   r  r  s   `   @@rt   test_list_gzip_content_length$TestLs.test_list_gzip_content_lengthH  sx    I9$M)LE!GNND$tE{DMBC >31 41 Ir   c                 N   U R                  SS9n[        R                  S[        R                  S[        U5      /n[        R                  " U[        R                  SS9nUR                  R                  5         UR                  5         U R                  UR                  S5        g)z9Tests that gsutil still succeeds with a truncated stdout.r;   r{  z-ur   r   )r   bufsizeN)r   sys
executablegslibGSUTIL_PATHr   
subprocessPopenPIPEr   closewaitra   
returncode)rc   r   
gsutil_cmdps       rt   test_output_choppedTestLs.test_output_chopped^  s~    """2J 	e//ZJ
 	JOOQGAHHNNFFHQ\\1%r   zCBoto lib required for S3 does not handle paths starting with slash.c                     U R                  5       nU R                  USSS9  U R                  US5        U R                  SS[	        U5      /SS9nU R                  [	        U5      S-   U5        g	)
.Tests listing an object with a trailing slash.r   r   r   rp  r"  r:   r   -RTr   Nr   r)  r   r   r   r   r   s      rt   test_recursive_list_slash_only%TestLs.test_recursive_list_slash_onlyo  so     ""$JvN
A.^^T4j)9:$^OF 	MM$z"S(&1r   c                     U R                  5       nU R                  USSS9  U R                  US5        U R                  SS[	        U5      /SS9nU R                  [	        U5      S	-   U5        g
)r  zfoo/r   r  r:   r   r  Tr   z/foo/Nr  r   s      rt   "test_recursive_list_trailing_slash)TestLs.test_recursive_list_trailing_slash{  su    ""$J"(%  ' 	
A.^^T4j)9:$^OF 	MM$z"W,f5r   c                     U R                  5       nU R                  USSS9  U R                  US5        U R                  SS[	        U5      /SS9nU R                  [	        U5      S-   U5        g	)
z2Tests listing an object with two trailing slashes.z//r   r  r:   r   r  Tr   Nr  r   s      rt   &test_recursive_list_trailing_two_slash-TestLs.test_recursive_list_trailing_two_slash  so     ""$JO
A.^^T4j)9:$^OF 	MM$z"T)62r   c                   ^ ^ T R                  5       mSnSnT R                  TUSS9  T R                  TUSS9  T R                  TS5        T R                  S[	        TS5      /SS	S
9nT R
                  (       a  SnOSnT R                  UR                  [	        T5      5      U5        [        [        SS	S9UU 4S j5       nU" 5         g)zATests that an object name with a wildcard does not infinite loop.z
wildcard*/zwildcard10/foor   r  r;   r   z	wildcard*Tr:   r  zPCloud folders named with wildcards are not supported. API returned {}/wildcard*/z.Cloud folder {}/wildcard*/ contains a wildcardr<   r   c                  d   > TR                  SS[        TS5      /SS9n TR                  U S5        g )Nr   ra  z**Tr   r<   )r   r   r  r   s    rt   _Check+TestLs.test_wildcard_prefix.<locals>._Check  s9    ~~tT4
D+AB,0  2f
&!$r   N)
r   r)  r   r   r   _use_gcloud_storager   r   r0   r   )rc   wildcard_folder_objectobject_matching_folderr  warning_messager!  r   s   `     @rt   test_wildcard_prefixTestLs.test_wildcard_prefix  s    ""$J)-"8%  ' 	"8%  ' 	
A.^^T4
K#@A*.,-  /F 7o IoMM/((j)9:FC >3% 4%
 Hr   z%S3 anonymous access is not supported.c                 B   U R                  5       nU R                  USSS9nU R                  SSS[        U5      /SS9  U R	                  5          U R                  S	S
[        U5      /SS9nU R                  [        U5      U5        S S S 5        g ! , (       d  f       g = f)N	permittedr   r  aclr   zpublic-readTr  r   rh  r   )r   r)  r   r   SetAnonymousBotoCredsr   )rc   r   rD  r   s       rt   .test_get_object_without_list_bucket_permission5TestLs.test_get_object_without_list_bucket_permission  s     ""$J""j/:,2 # 4J 	NNE5-$& $  & 
	#	#	%~~tT4
+;<,0  2f
mmD$f- 
&	%	%s   8B
Bz7S3 customer-supplied encryption keys are not supported.c                   ^ ^ T R                   [        R                  :X  a  [        R                  " S5      $ T R                  S[        [        S9m[        SS[        4/5         [        [        SSS9UU 4S	 j5       nU" 5         S S S 5        [        [        SSS9UU 4S
 j5       nU" 5         [        SS[        4/5         U" 5         S S S 5        g ! , (       d  f       NR= f! , (       d  f       g = f)Nz3gsutil does not support encryption with the XML APIrA   )rp  r"  encryption_keyr}   r0  r<   r:   r   c                     > TR                  SS[        T5      /SS9n TR                  [        U 5        TR                  [        U 5        TR                  [
        R                  " S5      U 5        g )Nr   rh  Tr   ascii)r   r   r   r   r   r%   decoder   rD  rc   s    rt   _ListExpectDecrypted?TestLs.test_list_encrypted_object.<locals>._ListExpectDecrypted  s_    tT*-= >.2   42F;5v>5<<WEvNr   c                    > TR                  SS[        T5      /SS9n TR                  [        U 5        TR                  [        U 5        TR                  SU 5        TR                  [        R                  " S5      U 5        g )Nr   rh  Tr   	encryptedr2  )r   r   r   r   r   r   r%   r3  r4  s    rt   _ListExpectEncrypted?TestLs.test_list_encrypted_object.<locals>._ListExpectEncrypted  sq    ~~tT4
+;<,0  2f
3V<
6?
mmK(
mm3::7CVLr   )rQ   r	   rR   r,   rS   r)  r   r$   r   r0   r   r&   )rc   r5  r9  rD  s   `  @rt   test_list_encrypted_object!TestLs.test_list_encrypted_object  s    }}']]
?A A""u,D2F # HJ
 
*: 4 6 7 
8 ^115O 6O 
8 >3M 4M  
*: 4 6 7 
8
8 
87
8 
86
8 
8s   #!C?C!
C!
C/c                   ^ ^ T R                  5       mT R                  TS[        [        S9  T R                  TS[        [
        S9  T R                  TS[        [        S9  T R                  TS[        [        S9  T R                  TS[        S9  [        SS	[        4SS
[        4SS[        4/5         [        [        SSS9UU 4S j5       nU" 5         SSS5        g! , (       d  f       g= f)z;Tests listing objects with various encryption interactions.rA   )r   rp  r"  r0  rL   foo3foo4foo5r  r}   r0  decryption_key1decryption_key2r<   r:   r   c                  J  > TR                  SS[        T5      /SS9n TR                  [        U 5        TR                  [        U 5        TR                  [
        R                  " S5      U 5        TR                  [        U 5        TR                  [        U 5        TR                  SU 5        TR                  [        R                  " S5      U 5        TR                  [        U 5        TR                  [        U 5        TR                  [        R                  " S5      U 5        TR                  [        U 5        TR                  [        U 5        TR                  [         R                  " S5      U 5        TR                  ["        U 5        TR                  [$        U 5        g)zValidates object listing.r   rh  Tr   r2  r8  N)r   r   r   r   r   r%   r3  r   r   r   r'   r   r   r)   r    r   r+   r#   r"   r   s    rt   _ListExpectMixed;TestLs.test_list_mixed_encryption.<locals>._ListExpectMixed  s9    tT*-= >.2   42F;5v>5<<WEvN5v>8&Ak6*5<<WEvN2F;5v>5<<WEvN2F;5v>5<<WEvN2F;5v>r   N)r   r)  r   r$   r   r&   r   r(   r   r*   r!   r   r0   r   )rc   rD  r   s   ` @rt   test_list_mixed_encryption!TestLs.test_list_mixed_encryption  s    ""$J"'7%9  ; 	"(7%9  ; 	"(7%9  ; 	"(7%9  ; 	"(7  9 
	#%9:	$&:;	$&:; 
 ^115? 6?( 7
 
 
s   3!C
C+c                 N    U R                  / SQSSS9nU R                  SU5        g )N)r   z-p   ãzgs://fobarbazr:   T)r  r  zInvalid non-ASCII)r   r   r  s     rt   test_non_ascii_project_fails#TestLs.test_non_ascii_project_fails'  s/    ^^?,-*.  0F 	MM%v.r   c           	      T   U R                   R                  [        S 5      [        R                  R
                  [        R                  R                  S9nU R                   R                  U[        R                  R                  5      nU R                  SSSU[        U5      /5        U$ )Nr/  kms
encryptionz-k)kms_apiCreateKeyRingr
   testcaseKmsTestingResourcesKEYRING_NAMEKEYRING_LOCATIONCreateCryptoKeyCONSTANT_KEY_NAMEr   r   )rc   r   keyring_fqnkey_fqns       rt   set_default_kms_key_on_bucket$TestLs.set_default_kms_key_on_bucket-  s    ,,,,$$$11-->> - @K ll**X11CCEG 	NNE<wZ8HIJNr   c                    U R                  5       nU R                  SS[        U5      /SS9nU R                  US5        U R	                  U5      nU R                  SS[        U5      /SS9nU R                  USU-  5        g )Nr   r   Tr   zDefault KMS key:\s+NonezDefault KMS key:\s+%s)r   r   r   r   rY  )rc   r   r   rX  s       rt   &test_default_kms_key_listed_for_bucket-TestLs.test_default_kms_key_listed_for_bucket:  s     ""$J ^^T5$z*:;4^PFV78 00<G^^T5$z*:;4^PFV5?@r   c                     U R                  5       nU R                  U5      nU R                  USSUS9nU R                  SS[	        U5      /SS9nU R                  USU-  5        g )	NrA   r   )r   rp  r"  kms_key_namer   rh  Tr   zKMS key:\s+%s)r   rY  r)  r   r   r   )rc   r   rX  r&  r   s        rt   ,test_kms_key_listed_for_kms_encrypted_object3TestLs.test_kms_key_listed_for_kms_encrypted_objectH  sw     ""$J00<G:,1)/-4   6G
 ^^T4g7t^LFV-78r   c                    U R                  SS9nU R                  SS[        U5      /SS9nU R                  US5        U R                  SS	[        U5      /5        U R                  SS[        U5      /SS9nU R	                  US
5        g )Nr:   )retention_period_in_secondsr   r   Tr   zRetention Policy\:\s*Present	retentionclearzRetention Policy:)CreateBucketWithRetentionPolicyr   r   r   r   r   s      rt   test_list_retention_policy!TestLs.test_list_retention_policyW  s     55$% 6 'J^^T5$z*:;4^PFV<=NNK$z*:;<^^T5$z*:;4^PF 45r   c                 T   U R                  5       nU R                  SSS[        U5      /5        U R                  SS[        U5      /SS9nU R                  US5        U R                  SSS	[        U5      /5        U R                  SS[        U5      /SS9nU R	                  US
5        g )Nrd  zevent-defaultr   r   r   Tr   z"Default Event-Based Hold:\t* *TruereleasezDefault Event-Based Hold)r   r   r   r   r   r   s      rt   "test_list_default_event_based_hold)TestLs.test_list_default_event_based_holdc  s     ""$JNNK%j9IJK^^T5$z*:;4^PFVBCNNK)T*=MNO^^T5$z*:;4^PF ;<r   c                 R   U R                  SS9nU R                  SSS[        U5      /5        U R                  SS[        U5      /SS	9nU R                  US
5        U R                  SSS[        U5      /5        U R                  SS[        U5      /SS	9nU R	                  US
5        g )N   contentr`  rd  tempr   r   rh  Tr   zTemporary Holdrj  r)  r   r   r   r   rc   rD  r   s      rt   test_list_temporary_holdTestLs.test_list_temporary_holdo  s     ""J"7JNNKZ0@AB^^T4j)9:$^OFV./NNKD4DEF^^T4j)9:$^OF 12r   c                 R   U R                  SS9nU R                  SSS[        U5      /5        U R                  SS[        U5      /SS	9nU R                  US
5        U R                  SSS[        U5      /5        U R                  SS[        U5      /SS	9nU R	                  US
5        g )Nrn  r`  rd  eventr   r   rh  Tr   zEvent-Based Holdrj  rp  rq  s      rt   test_list_event_based_hold!TestLs.test_list_event_based_hold{  s     ""J"7JNNK%j1ABC^^T4j)9:$^OFV01NNK)T*5EFG^^T4j)9:$^OF 34r   z:public access prevention is not supported for the XML API.z9public access prevention is not supported for S3 buckets.c                    U R                  5       nU R                  SS[        U5      /SS9nU R                  US5        U R                  SSS[        U5      /5        U R                  SS[        U5      /SS9nU R                  US	5        g )
Nr   r   Tr   z3Public access prevention:\s*(unspecified|inherited)papr   enforcedz$Public access prevention:\s*enforcedr   r   r   r   r   s      rt   "test_list_public_access_prevention)TestLs.test_list_public_access_prevention  s     ""$J^^T5$z*:;4^PFVKM 	NNE5*d:.>?@^^T5$z*:;4^PFVDEr   z%RPO is not supported for the XML API.z$RPO is not supported for S3 buckets.c                     U R                  SS9nU R                  SS[        U5      /SS9nU R                  SSS	[        U5      /5        U R                  SS[        U5      /SS9nU R                  US
5        g )Nnam4r/  r   r   Tr   rpor   ASYNC_TURBOzRPO:\t\t\t\tASYNC_TURBOr{  r   s      rt   test_list_Lb_displays_rpo TestLs.test_list_Lb_displays_rpo  s     ""F"3J^^T5$z*:;4^PF 	NNE5-j1ABC^^T5$z*:;4^PFV78r   z4Custom Dual Region is not supported for the XML API.z3Custom Dual Region is not supported for S3 buckets.c                     SU R                  S5      -   nU R                  SSSU/SS9  U R                  SS	U/S
S9nU R                  US5        g )Nzgs://rE   mbz--placementzus-central1,us-west1r   )r  r   r   Tr   z5Placement locations:\t\t\['US-CENTRAL1', 'US-WEST1'\])r  r   r   )rc   rz   r   s      rt   7test_list_Lb_displays_custom_dual_region_placement_info>TestLs.test_list_Lb_displays_custom_dual_region_placement_info  sf     D--h77KNND-)?M#$  &^^T5+6d^KFVMOr   z+Autoclass is not supported for the XML API.z*Autoclass is not supported for S3 buckets.c                    U R                  5       nU R                  SS[        U5      /SS9nU R                  SU5        U R                  SSS[        U5      /5        U R                  SS[        U5      /SS9nU R	                  US	5        g )
Nr   r   Tr   	Autoclass	autoclassr   r   zAutoclass:\t*Enabled on .+)r   r   r   r   r   r   s      rt   test_list_autoclassTestLs.test_list_autoclass  s     ""$J^^T5$z*:;4^PF[&)NNKd:.>?@^^T5$z*:;4^PFV:;r   r   N)Gr   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r*  r8  r   r=  r@  r   r   rE  rJ  r   r   r]  rd  rj  rx  r  r  r  r  r  r  r,   rS   r  r  r  r  r  skipIfr1   r  r  r   r  r  r  r  r'  r-  r;  rF  rJ  rY  KMS_XML_SKIP_MSGr\  r`  BUCKET_LOCK_SKIP_MSGrg  rk  rr  rv  r|  r  r  r  r   r   r   rt   r   r      sy   )/	)2V19:!(0	$ BCA DA
 BCA DA "#GH: I $: "#GH
 I $
 =>Z[ \ ?(556 KLLM. N M."$6:%N*" GH; I;" ==GH895 : I  5 GHJ IJ0 GHJ IJ0 GH@AL B IL00d ??:OQAQAB.,&"  $ %2%2
6  $ %3%3B 45. 6.  FG& H&P FG6 H6p/ 
A   
A 9   9 "#!"6 # $6 "#!"= # $= "#!"3 # $3 "#!"5 # $5 JKHIF J LF 5634
9 5 7
9 DEBCO D FO ;<9:< ; =<r   r   )Wr   
__future__r   r   r   r   r   rP  r  rZ   rT  r  r  r   r  gslib.commandsr   gslib.cs_api_mapr	   gslib.project_idr
   gslib.tests.testcasetestsrQ  )gslib.tests.testcase.integration_testcaser   r   r   r   gslib.tests.utilr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   "gslib.third_party.storage_apitoolsr-   rT   gslib.utils.constantsr.   gslib.utils.ls_helperr/   gslib.utils.retry_utilr0   gslib.utils.system_utilr1   gslib.utilsr2   sixr3   r4   	six.movesr5   r  r  GsUtilUnitTestCaser7   ShimUnitTestBaser   GsUtilIntegrationTestCaser   r   r   rt   <module>r     s    & %  '  	  	   
    ( . ' ' ? A ? @ * 0 ) 1 2 , 5 < 9 5 < 9 5 < 9 5 < 9 5 < 9 1 < 1 < 1 < 1 < % W & : ( . ! % VV_	5 6 < O j8,, j8Z/22 /([<X// [<r   