
                         J   S r SSKJr  SSKJr  SSKJr  SSKJr  SSKrSSKrSSK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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+J,r,  \+" \," SSS5      5        SSK-J.r.  Sr/ " S S\R`                  5      r1\" S 5       " S! S"\15      5       r2 " S# S$\15      r3\" S%5       " S& S'\15      5       r4 " S( S)\25      r5 " S* S+\Rl                  5      r7g),z&Integration tests for the acl command.    )absolute_import)print_function)division)unicode_literalsN)acl)CreateOrGetGsutilLogger)ApiSelector)CommandException)StorageUrlFromString)	SkipForGS)	SkipForS3)
SkipForXML)GenerationFromURI)ObjectToURI)SetBotoConfigForTest)SetEnvironmentForTest)unittest)
acl_helper)UTF8)Retry)AclTranslation)	shim_util)add_moveMovedModulemockzunittest.mock)r   z#"entity":"allUsers","role":"READER"c                   <    \ rS rSrSrSS/rSS/rSS/rSS/rSr	S	r
g
)TestAclBase5   z1Integration test case base class for acl command.r   setgetdefaclchviewers N)__name__
__module____qualname____firstlineno____doc___set_acl_prefix_get_acl_prefix_set_defacl_prefix_ch_acl_prefix_project_team__static_attributes__r$       'platform/gsutil/gslib/tests/test_acl.pyr   r   5   s0    9EN/EN/ %(4=.-r0   r   zTests use GS ACL model.c                     ^  \ rS rSrSrU 4S j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 rS rS r\" S5      S 5       rS rS rS rS rS rS rS r S'S jr!S  r"S! r#S" r$S# r%S$ r&S% r'S&r(U =r)$ )(TestAcl@   z"Integration tests for acl command.c                   > [         [        U ]  5         U R                  5       U l        [        [        U R                  5      5      U l        [        S5      U l	        U R                  R                  U R                  5       R                  S/S9R                  U l        U R                  < SU R                  < 3U l        g )Nr   projectNumber)fields-)superr3   setUpCreateBucket
sample_urir   str
sample_urlr   loggerjson_api	GetBucketbucket_namer6   _project_numberr.   _project_test_acl)self	__class__s    r1   r:   TestAcl.setUpD   s    	'4 '')DO*3t+?@DO)%0DK  ==22''0A 3 CCP= 	(,(:(:(,(<(<>Dr0   c                     [        U R                  SS95      nU R                  SS9nU R                  U R                  X!/-   SSS9nU R
                  (       a  SnOSnU R                  XC5        g	)
9Ensures that invalid content returns a bad request error.   foocontents   badAclT   return_stderrexpected_statusFound invalid JSON/YAMLArgumentExceptionNsuriCreateObjectCreateTempFile	RunGsUtilr*   _use_gcloud_storageassertIn)rE   obj_uriinpathstderr
error_texts        r1   test_set_invalid_acl_object#TestAcl.test_set_invalid_acl_objectP   sw    4$$f$56G  ) 4F^^D00F3DD*.,-  /F ,j&jMM*%r0   c                     [        U R                  5       5      nU R                  SS9nU R                  U R                  X!/-   SSS9nU R
                  (       a  SnOSnU R                  XC5        g)	rI   rM   rK   TrN   rO   rR   rS   NrU   r;   rW   rX   r*   rY   rZ   )rE   
bucket_urir\   r]   r^   s        r1   test_set_invalid_acl_bucket#TestAcl.test_set_invalid_acl_bucket]   sr    d'')*J  ) 4F^^D00F3GG*.,-  /F ,j&jMM*%r0   c                     [        U R                  SS95      nU R                  SS9nU R                  U R                  X!/-   SSS9nU R
                  (       a  U R                  SU5        g
U R                  SU5        U R                  S	U5        g
)FEnsures XML content returns a bad request error and migration warning.rJ   rK      <ValidXml></ValidXml>TrN   rO   rR   rS   XML ACL data providedNrT   rE   r[   r\   r]   s       r1    test_set_xml_acl_json_api_object(TestAcl.test_set_xml_acl_json_api_objectj   s    4$$f$56G  *B CF^^D00F3DD*.,-  /F 
mm-v6 mm'0
mm+V4r0   c                 "   [        U R                  5       5      nU R                  SS9nU R                  U R                  X!/-   SSS9nU R
                  (       a  U R                  SU5        g	U R                  SU5        U R                  SU5        g	)
rg   rh   rK   TrN   rO   rR   rS   ri   Nrb   rE   rc   r\   r]   s       r1    test_set_xml_acl_json_api_bucket(TestAcl.test_set_xml_acl_json_api_buckety   s    d'')*J  *B CF^^D00F3GG*.,-  /F 
mm-v6 mm'0
mm+V4r0   c                    [        U R                  SS95      nU R                  U R                  U/-   SS9nU R	                  UR                  [        5      S9nU R                  U R                  SU/-   5        U R                  U R                  U/-   SS9nU R                  U R                  X1/-   5        U R                  U R                  U/-   SS9nU R                  X$5        U R                  X%5        g)z'Tests setting a valid ACL on an object.rJ   rK   Treturn_stdoutpublic-readN)
rU   rV   rX   r+   rW   encoder   r*   assertNotEqualassertEqual)rE   r[   
acl_stringr\   acl_string2acl_string3s         r1   test_set_valid_acl_object!TestAcl.test_set_valid_acl_object   s    4$$f$56G 4 4y @.2   4J  **;*;D*A BFNN4''='*BBC..!5!5	!A/3 ! 5KNN4''6*;;<..!5!5	!A/3 ! 5K 	
0Z-r0   c                 R   [        U R                  SS95      nU R                  U R                  U/-   SS9n[        R
                  " SSU5      n[        R
                  " SSU5      nU R                  UR                  [        5      S9nU R                  U R                  X1/-   5        g	)
z?Ensures that whitespace is allowed in role and entity elements.rJ   rK   Trr   z"role"z	"role" \nz"entity"z\n "entity"N)
rU   rV   rX   r+   resubrW   ru   r   r*   )rE   r[   rx   r\   s       r1   +test_set_valid_permission_whitespace_object3TestAcl.test_set_valid_permission_whitespace_object   s    4$$f$56G 4 4y @.2   4J	<<J^Z@J  **;*;D*A BFNN4''6*;;<r0   c                 F   U R                  5       (       a  [        R                  " S5      $ [        U R	                  5       5      nU R                  U R                  U/-   SS9nU R                  UR                  [        5      S9nU R                  U R                  SU/-   5        U R                  U R                  U/-   SS9nU R                  U R                  X1/-   5        U R                  U R                  U/-   SS9nU R                  X$5        U R                  X%5        g)z9Ensures that valid canned and XML ACLs work with get/set.z/Canned ACLs orphan service account permissions.Trr   rK   rt   N)!_ServiceAccountCredentialsPresentr   skiprU   r;   rX   r+   rW   ru   r   r*   rv   rw   )rE   rc   rx   r\   ry   rz   s         r1   test_set_valid_acl_bucket!TestAcl.test_set_valid_acl_bucket   s   --//]]LMMd'')*J 4 4
| C.2   4J  **;*;D*A BFNN4''=**EEF..!5!5!D/3 ! 5KNN4''6*>>?..!5!5!D/3 ! 5K 	
0Z-r0   c                    [        U R                  SS95      nU R                  U R                  SU/-   SSS9nU R                  (       a  U R                  SU5        g
U R                  SU5        U R                  S	U5        g
)z>Ensures that an invalid canned ACL returns a CommandException.rJ   rK   znot-a-canned-aclTrN   rO   AttributeErrorr
   zInvalid canned ACLN)rU   rV   rX   r*   rY   rZ   )rE   r[   r]   s      r1   test_invalid_canned_acl_object&TestAcl.test_invalid_canned_acl_object   s    4$$f$56G^^D00/9:*.,-  /F 
mm$f-
mm&/
mm(&1r0   c                   ^ ^^ T R                  5       m[        T R                  TSS95      nT R                  T R                  U/-   SS9mT R                  T R
                  S[        T5      /-   5        [        [        SSS9UUU 4S	 j5       nU" 5         T R                  TR                  [        5      S
9nT R                  T R
                  U[        T5      /-   5        [        [        SSS9UUU 4S j5       nU" 5         g)zBEnsures that valid default canned and XML ACLs works with get/set.rJ   rc   rL   Trr   zauthenticated-read   rN   triestimeout_secsc                     > [        TR                  TSS95      n TR                  TR                  U /-   SS9nTR	                  TU5        TR                  SU5        g )Ns   foo2r   Trr   allAuthenticatedUsers)rU   rV   rX   r+   rv   rZ   )obj_uri2ry   rx   rc   rE   s     r1   _Check16TestAcl.test_set_valid_def_acl_bucket.<locals>._Check1   sh    d'':18 ( : ;hNN4#7#78*#D15 # 7k
*k2
mm+[9r0   rK   c                     > [        TR                  TSS95      n TR                  TR                  U /-   SS9nTR	                  TU5        g )Ns   foo3r   Trr   )rU   rV   rX   r+   rw   )obj_uri3rz   rx   rc   rE   s     r1   _Check26TestAcl.test_set_valid_def_acl_bucket.<locals>._Check2   sY    d'':18 ( : ;hNN4#7#78*#D15 # 7k
z;/r0   N)r;   rU   rV   rX   r+   r,   r   AssertionErrorrW   ru   r   )rE   obj_uri1r   r\   r   rx   rc   s   `    @@r1   test_set_valid_def_acl_bucket%TestAcl.test_set_valid_def_acl_bucket   s   ""$J D%%f%MNH 4 4z A.2   4J 	NN	tJ/0	12
 >3: 4: I   **;*;D*A BFNN4**fd:6F-GGH >30 40 Ir0   c                 T   U R                  5       nU R                  USS9nU R                  SS9nU R                  SX2R                  /5        U R                  USSS9nUS	   US
   pe/ nXV4 HW  nU R                  U R                  U/-   SS9n	U R                  [        U R                  U	5      5        UR                  U	5        MY     U R                  U R                  SU/-   5        U R                  U R                  U/-   SS9n	U R                  [        U R                  U	5      5        U R                  U R                  U/-   SS9n	U R                  [        U R                  U	5      5        U R                  U R                  UR                  /-   SS9n	U R                  XS	   5        g)z8Tests setting an ACL on a specific version of an object.s   datar   s   defrK   cp   T	versionedr   rN   rr   rt   N)CreateVersionedBucketrV   rW   rX   uriAssertNObjectsInBucketr+   assertNotInPUBLIC_READ_JSON_ACL_TEXT_strip_json_whitespaceappendr*   rZ   rw   )
rE   rc   r   r\   lines
v0_uri_str
v1_uri_str	orig_aclsuri_strr   s
             r1   !test_acl_set_version_specific_uri)TestAcl.test_acl_set_version_specific_uri   s   ++-J


zG

DC  & 1FNND&''*+ ''
A'FE"1XuQx
 I+NN4//7);4NPc
022379s	 , 	NN4''=**EEF ..--<'+  -CMM+T-H-H-MN
..--<'+  -C.0057
 ..--	9.
NCSA,'r0   c                 2    [         R                  " SSU5      $ )Nz\s* )r~   r   )rE   	json_texts     r1   r   TestAcl._strip_json_whitespace  s    66&"i((r0   c                 f    SU< SU< SU< S3n[         R                  " U[         R                  S9$ )Nz\{.*"entity":\s*"r8   z".*"role":\s*"".*\}flagsr~   compileDOTALL)rE   roleentity_typeemail_addresstemplate_regexs        r1   _MakeScopeRegexTestAcl._MakeScopeRegex  s%    "M49N::nBII66r0   c                 v    SU< SU< SU< SU< SU< S3n[         R                  " U[         R                  S9$ )Nz\{.*"entity":\s*"project-r8   z/",\s*"projectTeam":\s*\{\s*"projectNumber":\s*"z",\s*"team":\s*"z"\s*\},\s*"role":\s*"r   r   r   )rE   r   project_teamproject_numberr   s        r1   _MakeProjectScopeRegexTestAcl._MakeProjectScopeRegex  s1     
~~|T	K 
 ::nBII66r0   c                    U R                  SSU R                  5      nU R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        U R                  U R                  SU R                  S-   [	        U R
                  5      /-   5        U R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        U R                  U R                  SU R                  [	        U R
                  5      /-   5        U R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        g NREADERuserTrr   -u:r-d)
r   USER_TEST_ADDRESSrX   r+   rU   r<   assertNotRegexr-   USER_TEST_IDassertRegexrE   
test_regexr   s      r1   testAclChangeWithUserIdTestAcl.testAclChangeWithUserId"  sI   %%h8N8NOJt33tDOO7L6MM-1  3I	.NN4&&$++t/11 2 t33tDOO7L6MM-1  3IY+NN4&&$00)++ , t33tDOO7L6MM-1  3I	.r0   c                    U R                  SSU R                  5      nU R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        U R                  U R                  SU R                  S-   [	        U R
                  5      /-   5        U R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        U R                  U R                  SU R                  [	        U R
                  5      /-   5        U R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        g )Nr   groupTrr   -gr   r   )
r   GROUP_TEST_ADDRESSrX   r+   rU   r<   r   r-   GROUP_TEST_IDr   r   s      r1   testAclChangeWithGroupId TestAcl.testAclChangeWithGroupId6  sI   %%h&*&=&=?Jt33tDOO7L6MM-1  3I	.NN4&&$,,t3)++ , t33tDOO7L6MM-1  3IY+NN4&&$11)++ , t33tDOO7L6MM-1  3I	.r0   c                    U R                  SSU R                  5      nU R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        U R                  U R                  SU R                  S-   [	        U R
                  5      /-   5        U R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        U R                  U R                  SU R                  [	        U R
                  5      /-   5        U R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        g r   	r   r   rX   r+   rU   r<   r   r-   r   r   s      r1   testAclChangeWithUserEmail"TestAcl.testAclChangeWithUserEmailK  sF   %%h8N8NOJt33tDOO7L6MM-1  3I	.NN4&&$0047)++ , t33tDOO7L6MM-1  3IY+NN4&&$00)++ , t33tDOO7L6MM-1  3I	.r0   c                    U R                  SSU R                  5      nU R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        U R                  U R                  SU R                  S-   [	        U R
                  5      /-   5        U R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        U R                  U R                  SU R                  [	        U R
                  5      /-   5        U R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        g )NOWNERr   Trr   r   :fcr   )	r   r   rX   r+   rU   r<   r   r-   r   r   s      r1   testAclChangeWithGroupEmail#TestAcl.testAclChangeWithGroupEmail_  sJ   %%gw8O8OPJt33tDOO7L6MM-1  3I	.NN	t&&	T__%	'	'( t33tDOO7L6MM-1  3IY+NN4&&$11)++ , t33tDOO7L6MM-1  3I	.r0   c                    U R                  SSU R                  5      nU R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        U R                  U R                  SU R                  S-   [	        U R
                  5      /-   5        U R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        U R                  U R                  SU R                  [	        U R
                  5      /-   5        U R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        g )Nr   domainTrr   r   r   r   )	r   DOMAIN_TESTrX   r+   rU   r<   r   r-   r   r   s      r1   testAclChangeWithDomainTestAcl.testAclChangeWithDomaint  sG   %%h$:J:JKJt33tDOO7L6MM-1  3I	.NN4&&$**t/11 2 t33tDOO7L6MM-1  3IY+NN	tdoo!67	89 t33tDOO7L6MM-1  3I	.r0   z(XML API does not support project scopes.c                    U R                  SU R                  U R                  5      nU R                  U R                  [        U R                  5      /-   SS9nU R                  X!5        U R                  U R                  SU R                  S-   [        U R                  5      /-   5        U R                  U R                  [        U R                  5      /-   SS9nU R                  X!5        g )NWRITERTrr   -p:w)r   r.   rC   rX   r+   rU   r<   r   r-   rD   r   r   s      r1   testAclChangeWithProjectOwners&TestAcl.testAclChangeWithProjectOwners  s    ,,Xt7I7I-1-A-ACJt33tDOO7L6MM-1  3I	.NN4&&$0047)++ , t33tDOO7L6MM-1  3IY+r0   c                    [         R                  " S[         R                  S9nU R                  U R                  [        U R                  5      /-   SS9nU R                  X!5        U R                  U R                  SS[        U R                  5      /-   5        U R                  U R                  [        U R                  5      /-   SS9nU R                  X!5        U R                  U R                  SS[        U R                  5      /-   5        U R                  U R                  [        U R                  5      /-   SS9nU R                  X!5        g )	Nz2\{.*"entity":\s*"allUsers".*"role":\s*"WRITER".*\}r   Trr   r   z
allusers:wr   allusers
r~   r   r   rX   r+   rU   r<   r   r-   r   r   s      r1   testAclChangeWithAllUsers!TestAcl.testAclChangeWithAllUsers  s1   =RYYPJt33tDOO7L6MM-1  3I	.NN4&& t/11 2 t33tDOO7L6MM-1  3IY+NN4&&*d4??&;<= >t33tDOO7L6MM-1  3I	.r0   c                    [         R                  " S[         R                  S9nU R                  U R                  [        U R                  5      /-   SS9nU R                  X!5        U R                  U R                  SS[        U R                  5      /-   5        U R                  U R                  [        U R                  5      /-   SS9nU R                  X!5        U R                  U R                  SS[        U R                  5      /-   5        U R                  U R                  [        U R                  5      /-   SS9nU R                  X!5        g )	Nz?\{.*"entity":\s*"allAuthenticatedUsers".*"role":\s*"READER".*\}r   Trr   r   zallauthenticatedusers:rr   allauthenticatedusersr   r   s      r1   testAclChangeWithAllAuthUsers%TestAcl.testAclChangeWithAllAuthUsers  s:   JiiJ t33tDOO7L6MM-1  3I	.NN	 DOO$	&	&' t33tDOO7L6MM-1  3IY+NN4&&1)++ , t33tDOO7L6MM-1  3I	.r0   c                    U R                  SSU R                  5      nU R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        U R                  U R                  SU R                  S-   [	        U R
                  5      /-   5        U R                  U R                  [	        U R
                  5      /-   SS9nU R                  X!5        U R                  SSU R                  5      nU R                  U R                  SU R                  S-   [	        U R
                  5      /-   SSS	9u  pEU R                  U R                  [	        U R
                  5      /-   SS9nU R                  Xc5        U R                  U R                  S
U R                  [	        U R
                  5      /-   5        U R                  U R                  [	        U R
                  5      /-   SS9nU R                  Xq5        g)zTests acl change on a bucket.r   r   Trr   r   r   r   r   )rP   rs   r   Nr   )rE   r   r   test_regex2s1s2
json_text2
json_text3s           r1   testBucketAclChangeTestAcl.testBucketAclChange  s   %%gvt7M7MNJt33tDOO7L6MM-1  3I	.NN	t%%	T__%	'	'( t33tDOO7L6MM-1  3IY+&&x9O9OPK^^	t%%,	doo		 	    FB  4 4T__8M7N N.2   4JZ-NN4&&$00)++ ,  4 4T__8M7N N.2   4J
/r0   c                 <   U R                   [        R                  :X  aT  U R                  U R                  SU R
                  S-   [        U R                  5      /-   SSS9nU R                  SU5        g
U R                  SU R                  U R                  5      nU R                  U R                  SU R
                  S-   [        U R                  5      /-   5        U R                  U R                  [        U R                  5      /-   SS9nU R                  X25        U R                  U R                  S	U R
                  [        U R                  5      /-   5        U R                  U R                  [        U R                  5      /-   SS9nU R                  XB5        g
)z-Tests project entity acl changes on a bucket.r   r   rN   T)rQ   rP   zPCommandException: XML API does not support project scopes, cannot translate ACL.r   rr   r   N)test_apir	   XMLrX   r-   rD   rU   r<   rZ   r   r.   rC   r+   r   r   )rE   r]   r   r   r   s        r1   testProjectAclChangesOnBucket%TestAcl.testProjectAclChangesOnBucket  s   }}'~~


''$. ""   f mm 68>@ ..x9K9K/3/C/CEj
nn


''doo&(() ..!5!5doo9N8O!O/3 ! 5i y-
nnT((D224??+-- . >>$"6"6#'#8"9#:04 " 6j *1r0   c                    U R                  U R                  SS9nU R                  U R                  S5        U R                  SSU R                  5      nU R                  U R                  [        U5      /-   SS9nU R                  X25        U R                  U R                  SU R                  S	-   [        U5      /-   5        U R                  U R                  [        U5      /-   SS9nU R                  X25        U R                  S
SU R                  5      nU R                  U R                  SU R                  S-   [        U5      /-   5        U R                  U R                  [        U5      /-   SS9nU R                  XT5        U R                  U R                  SU R                  [        U5      /-   5        U R                  U R                  [        U5      /-   SS9nU R                  Xd5        [        R                  " S[        R                  S9nU R                  U R                  SS[        U5      /-   5        U R                  U R                  [        U5      /-   SS9nU R                  X5        g)zTests acl change on an object.	   somethingr   rN   r   r   Trr   r   :READr   z:OWNERr   z>\{.*"entity":\s*"allAuthenticatedUsers".*"role":\s*"OWNER".*\}r   z	AllAuth:ON)rV   r<   r   r   r   rX   r+   rU   r   r-   r   r~   r   r   )	rE   objr   r   r   r   r   all_auth_regex
json_text4s	            r1   testObjectAclChangeTestAcl.testObjectAclChange  s\   


t

NC3%%h&*&=&=?Jt33tCykA-1  3I	.NN4&&$11!#Y(( ) t33tCykA-1  3IY+&&w'+'>'>@KNN4&&$11H<I    4 4S	{ B.2   4JZ-NN4&&$11I    4 4S	{ B.2   4J
0ZZIiiN 	NN4&&$T#Y)GGH 4 4S	{ B.2   4JZ0r0   c                    U R                  U R                  SS9nU R                  U R                  S5        [        R                  " S[        R
                  S9nU R                  U R                  [        U5      /-   SS9nU R                  X25        U R                  U R                  SS	[        U5      /-   5        U R                  U R                  [        U5      /-   SS9nU R                  X25        g
)z%Tests acl ch AllUsers:R on an object.r  r   rN   z2\{.*"entity":\s*"allUsers".*"role":\s*"READER".*\}r   Trr   r   
AllUsers:RN)rV   r<   r   r~   r   r   rX   r+   rU   r   r-   r   )rE   r
  all_users_regexr   s       r1   testObjectAclChangeAllUsers#TestAcl.testObjectAclChangeAllUsers0  s    


t

NC3jj=RYYPOt33tCykA-1  3I	3NN4&&$d3i)HHIt33tCykA-1  3IY0r0   c                 ^   U R                  SS9nU R                  SS[        U5      /SS9nU R                  UR	                  [
        5      S9n[        SS/5         U R                  S	SS
SS[        U5      /SS9nU R                  SU5        U R                  S	SSU[        U5      /SS9nU R                  SU5        SSS5        [        SS/5         U R                  S	SS
SS[        U5      /SS9nU R                  SU5        SSS5        g! , (       d  f       NV= f! , (       d  f       g= f)z0Tests seek-ahead iterator with ACL sub-commands.rJ   rK   r   r    Trr   )GSUtiltask_estimation_threshold1)r  task_estimation_forceTrue-mr"   r   r  )rP   z,Estimated work for this command: objects: 1
r   N)r  r  0zEstimated work)	rV   rX   rU   rW   ru   r   r   rZ   r   )rE   
object_uricurrent_aclcurrent_acl_filer]   s        r1   testSeekAheadAclTestAcl.testSeekAheadAcl@  sn   ""F"3J..%Z0@!A/3 ! 5K**K4F4Ft4L*M	KJL 
M~~dL
  f mmCVL~~/
  f mmCVL
M 
KJL 
M~~dL
  f '0
M 
M
M 
M
M 
Ms   A"D2D
D
D,c           	      B   / n[        U5       HJ  nUR                  U R                  U R                  SR	                  U5      R                  S5      S95        ML     U R                  U R                  U5        U R                  SSU R                  5      n/ nU H9  nUR                  U R                  U R                  [        U5      /-   SS95        M;     U H  nU R                  Xt5        M     U Vs/ s H  n[        U5      PM     nnU R                  SS	/U R                  -   S
U R                  S-   /-   U-   5        / nU H9  nUR                  U R                  U R                  [        U5      /-   SS95        M;     U H  nU R                  Xt5        M     gs  snf )z5Tests multi-threaded acl changing on several objects.zsomething {0}asciir   r   r   Trr   r  z-DDr   r	  N)ranger   rV   r<   formatru   r   r   r   rX   r+   rU   r   r-   r   )	rE   countobjectsir   
json_textsr
  r   uriss	            r1   testMultithreadedAclChange"TestAcl.testMultithreadedAclChange^  s   G5\nn


t%4%;%;A%>%E%Eg%N  PQ 
 	7%%h&*&=&=?JJ
..--c;'+  -.   	
)0   "))#DID)NND%=4#6#66$11G;<=?CD E J
..--c;'+  -.   	
y-   *s   4Fc                   ^ ^^ T R                  T R                  SSS9mT R                  T R                  S5        T R                  SST R                  5      mT R                  T R                  [        T5      /-   SS9nT R                  UT5        [        [        S	SS
9UU U4S j5       nU" 5         [        [        S	SS
9UU U4S j5       nU" 5         g)z2Tests recursively changing ACLs on nested objects.zfoo/barr  rc   object_namerL   rN   r   r   Trr   r   r   c            	         > TR                  TR                  SSTR                  S-   [        T5      S S /-   5        TR                  TR                  [        T5      /-   SS9n TR                  U T5        g )Nz-Rr   r	  Trr   )rX   r-   r   rU   r+   r   )r   r
  rE   r   s    r1   _AddAcl/TestAcl.testRecursiveChangeAcl.<locals>._AddAcl  s|    
nn


t..89Sb> ..!5!5c!C/3 ! 5i
y*-r0   c                     > TR                   R                  5       n TR                  TR                  SU [	        T5      /-   5        TR                  TR
                  [	        T5      /-   SS9nTR                  UT5        g )Nr   Trr   )r   upperrX   r-   rU   r+   r   )delete_grantr   r
  rE   r   s     r1   
_DeleteAcl2TestAcl.testRecursiveChangeAcl.<locals>._DeleteAcl  st     ,,224l
nnT((D,S	+JJK..!5!5c!C/3 ! 5i
)Z0r0   N)rV   r<   r   r   r   rX   r+   rU   r   r   r   )rE   r   r1  r6  r
  r   s   `   @@r1   testRecursiveChangeAclTestAcl.testRecursiveChangeAcl~  s    


t(1%1  3C 	3%%h&*&=&=?Jt33tCykA-1  3I	:.
>3. 4. I
>31 41 Lr0   c                    U R                  5       nU R                  S5      nU R                  UUSS9nU R                  UUS[        U5      S9  U R	                  USSS9nUS	   US
   peU R                  SSU R                  5      nU R                  U R                  U/-   SS9nU R                  X5        U R                  U R                  SU R                  S-   U/-   5        U R                  U R                  U/-   SS9nU R                  X5        U R                  U R                  U/-   SS9nU R                  X5        g)z0Tests changing ACLs on multiple object versions.r
  s	   One thingr-  s   Another thing)rc   r.  rL   gs_idempotent_generationr   Tr   r   rN   r   r   rr   r   r	  N)r   MakeTempNamerV   urigenr   r   r   rX   r+   r   r-   r   )	rE   bucketr.  obj1_urir   obj_v1obj_v2r   r   s	            r1   testMultiVersionSupportTestAcl.testMultiVersionSupport  sq   '')F##E*K  F-8*6 ! 8H 	"-//5h/?  A
 ''T'BE1XuQxF%%h&*&=&=?Jt33vh>-1  3I	.NN4&&$11G;VDE Ft33vh>-1  3IY+t33vh>-1  3I	.r0   c                 &   U R                  U R                  SS[        U R                  5      /-   SSSS9u  pU R                  (       a  U R                  SU5        OU R                  SU5        U R                  SU5        U R                  SU5        g )	Nr   zinvalid_$$@hello.com:RTrN   )rs   rP   rQ   	HTTPErrorBadRequestExceptionRetrying)rX   r-   rU   r<   rY   rZ   r   )rE   stdoutr]   s      r1   testBadRequestAclChangeTestAcl.testBadRequestAclChange  s    ^^	'	doo		 	   $ NF 
mmK(
mm)62Z(Z(r0   c                     U R                  SS9nSnU R                  5          U R                  U R                  [	        U5      /-   SSS9nU R                  X25        S S S 5        g ! , (       d  f       g = f)NrJ   rK   zAnonymous \S+ do(es)? not haveTrN   rO   )rV   SetAnonymousBotoCredsrX   r+   rU   r   )rE   r  expected_error_regexr]   s       r1   testAclGetWithoutFullControl$TestAcl.testAclGetWithoutFullControl  sq    ""F"3J<		#	#	%~~d22d:6F5GG,0./  1f v4	 
&	%	%s   :A%%
A3c                 Z   U R                  U R                  SSS9nU R                  SU5        U R                  U R                  SSS9nU R                  SU5        U R                  U R                  SSS9nU R                  SU5        U R                  S/SSS9nU R                  SU5        g)zATests calling ACL commands with insufficient number of arguments.TrN   rO   zcommand requires at leastr   N)rX   r+   rZ   r*   r-   )rE   r]   s     r1   testTooFewArgumentsFails TestAcl.testTooFewArgumentsFails  s     ^^D00*.,-  /F 	MM-v6 ^^D00*.,-  /F 	MM-v6 ^^D//*.,-  /F 	MM-v6 ^^UG4^KFMM-v6r0   c                 B   U R                  5       n[        U R                  USSS95      nU R                  U R                  U/-   SS9nU R                  S/U R
                  -   SSUS	-   U/-   S
S9  U R                  U R                  U/-   SS9nU R                  X45        g)z*Tests -f option to continue after failure.foorJ   r-  Trr   r   -frt   foo2rN   )rQ   N)r;   rU   rV   rX   r+   r*   rv   )rE   rc   r[   rx   ry   s        r1   
testMinusFTestAcl.testMinusF  s    ""$JZ&+#) 	 	+,G  4 4y @.2   4JNND6D000-6)97CD#$  & ..!5!5	!A/3 ! 5K
0r0   )rC   rD   r?   r<   r>   )
   )*r%   r&   r'   r(   r)   r:   r_   rd   rk   ro   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r*  r8  rB  rI  rN  rQ  rW  r/   __classcell__)rF   s   @r1   r3   r3   @   s    *
>&&55. 	=.&2'R%(N)7
7/(/*/(/*/( 89, :,/(/.!0F2@)1V1 1<.@"H/B)5701 1r0   r3   c                   $    \ rS rSrSrS rS rSrg)TestS3CompatibleAcli  z3ACL integration tests that work for s3 and gs URLs.c                 L   U R                  5       nU R                  USS9nU R                  US5        U R                  U R                  [        U5      /-   SS9nU R                  UR                  [        5      S9nU R                  U R                  U[        U5      /-   5        g )NrJ   r   rN   Trr   rK   )
r;   rV   r   rX   r+   rU   rW   ru   r   r*   )rE   rc   r[   rH  set_contentss        r1   testAclObjectGetSet'TestS3CompatibleAcl.testAclObjectGetSet  s    ""$J:GG
A.^^D00DM?B*.  0F&&d0C&DLNN4''<g*GGHr0   c                    U R                  5       nU R                  U R                  [        U5      /-   SS9nU R	                  UR                  [        5      S9nU R                  U R                  U[        U5      /-   5        g )NTrr   rK   )r;   rX   r+   rU   rW   ru   r   r*   )rE   rc   rH  r^  s       r1   testAclBucketGetSet'TestS3CompatibleAcl.testAclBucketGetSet  sx    ""$J^^D00D4D3EE*.  0F&&d0C&DLNN4''<j9I*JJKr0   r$   N)r%   r&   r'   r(   r)   r_  rb  r/   r$   r0   r1   r\  r\    s    ;ILr0   r\  z7S3 ACLs accept XML and should not cause an XML warning.c                   $    \ rS rSrSrS rS rSrg)TestS3OnlyAcli  z1ACL integration tests that work only for s3 URLs.c                     [        U R                  SS95      nU R                  SS9nU R                  U R                  X!/-   SSS9nU R                  SU5        U R                  SU5        g	)
:Ensures XML content does not return an XML warning for S3.rJ   rK   rh   TrN   rO   rF  ri   N)rU   rV   rW   rX   r*   rZ   r   rj   s       r1   test_set_xml_aclTestS3OnlyAcl.test_set_xml_acl  sy    4$$f$56G  *B CF^^D00F3DD*.,-  /F 	MM'0,f5r0   c                     [        U R                  5       5      nU R                  SS9nU R                  U R                  X!/-   SSS9nU R                  SU5        U R                  SU5        g)	rg  rh   rK   TrN   rO   rF  ri   N)rU   r;   rW   rX   r*   rZ   r   rn   s       r1   test_set_xml_acl_bucket%TestS3OnlyAcl.test_set_xml_acl_bucket(  st    d'')*J  *B CF^^D00F3GG*.,-  /F 	MM'0,f5r0   r$   N)r%   r&   r'   r(   r)   rh  rk  r/   r$   r0   r1   re  re    s    966r0   re  c                   ,    \ rS rSrS/rS/rS/rS/rSrg)TestAclOldAliasi3  setaclgetacl	setdefaclchaclr$   N)	r%   r&   r'   r(   r*   r+   r,   r-   r/   r$   r0   r1   rn  rn  3  s    J/J/#}9.r0   rn  c                   
   \ rS rSr\R
                  R                  \R                  S\R                  " 5       S9S 5       r
\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S	 5       r\R
                  R                  \R                  S\R                  " 5       S9S
 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       r\R
                  R                  \R                  S\R                  " 5       S9S 5       rSr g)TestAclShimi:  
RunCommand)newc           	      n   [        SS/5         [        SSS.5         U R                  SSS/S	S
9nSR                  UR                  S   5      nU R                  SR                  [        R                  " S5      5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr  use_gcloud_storager  r  hidden_shim_modedry_runr  fake_dir(CLOUDSDK_CORE_PASS_CREDENTIALS_TO_GSUTILCLOUDSDK_ROOT_DIRr   r    gs://bucket/objectTreturn_log_handler
infozfGcloud Storage Command: {} storage objects describe --format=multi(acl:format=json) gs://bucket/object	r   r   ru  joinmessagesrZ   r$  r   _get_gcloud_binary_pathrE   mock_log_handler
info_liness      r1   #test_shim_translates_acl_get_object/TestAclShim.test_shim_translates_acl_get_object<  s    	GHJ 
K 6<)" 	  ??55:N2O>B + DYY/88@A
 -.4f$<<ZH/J 		"	
K 
K	 	
K 
K#   B&A'BB&
B#	B&&
B4c           	      n   [        SS/5         [        SSS.5         U R                  SSS/S	S
9nSR                  UR                  S   5      nU R                  SR                  [        R                  " S5      5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   r    gs://bucketTr  r  r  z_Gcloud Storage Command: {} storage buckets describe --format=multi(acl:format=json) gs://bucketr  r  s      r1   #test_shim_translates_acl_get_bucket/TestAclShim.test_shim_translates_acl_get_bucketM  s    	GHJ 
K 6<)" 	  ??55-2H>B + DYY/88@A
 &'-v$<<ZH(J 		"	
K 
K	 	
K 
Kr  c           	         U R                  5       n[        SS/5         [        SSS.5         U R                  SSUS/S	S
9nSR	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   r   r  Tr  r  r  z?Gcloud Storage Command: {} storage objects update --acl-file={}
rW   r   r   ru  r  r  rZ   r$  r   r  rE   r\   r  r  s       r1   #test_shim_translates_acl_set_object/TestAclShim.test_shim_translates_acl_set_object^  s      "F	GHJ 
K 6<)" 	  ??E6#78# + % YY/88@A
 ()/$<<ZH!*#$.	0	
K 
K	 	
K 
K#   B8A)B'B8'
B5	1B88
Cc           	         U R                  5       n[        SS/5         [        SSS.5         U R                  SSUS/S	S
9nSR	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   r   r  Tr  r  r  zKGcloud Storage Command: {} storage buckets update --acl-file={} gs://bucketr  r  s       r1   #test_shim_translates_acl_set_bucket/TestAclShim.test_shim_translates_acl_set_bucketp  s      "F	GHJ 
K 6<)" 	  ??5,16=+I>B + D YY/88@A
 45;V$<<ZH!6#$.	0	
K 
K	 	
K 
Kr  c           	      n   [        SS/5         [        SSS.5         U R                  S/ SQSS	9nS
R                  UR                  S   5      nU R                  SR                  [        R                  " S5      5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   )r   privater  Tr  r  r  z]Gcloud Storage Command: {} storage objects update --predefined-acl=private gs://bucket/objectr  r  s      r1   .test_shim_translates_predefined_acl_set_object:TestAclShim.test_shim_translates_predefined_acl_set_object  s    	GHJ 
K 6<)" 	  ??;# + % YY/88@A
 FFLf$<<ZHGJ 	"	
K 
K	 	
K 
Kr  c           	      n   [        SS/5         [        SSS.5         U R                  S/ SQSS	9nS
R                  UR                  S   5      nU R                  SR                  [        R                  " S5      5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   )r   r  r  Tr  r  r  zVGcloud Storage Command: {} storage buckets update --predefined-acl=private gs://bucketr  r  s      r1   .test_shim_translates_predefined_acl_set_bucket:TestAclShim.test_shim_translates_predefined_acl_set_bucket  s    	GHJ 
K 6<)" 	  ??5+L>B + D YY/88@A
 ?@F$<<ZHAJ 	"	
K 
K	 	
K 
Kr  c           	      n   [        SS/5         [        SSS.5         U R                  S/ SQSS	9nS
R                  UR                  S   5      nU R                  SR                  [        R                  " S5      5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   )r   rt   r  Tr  r  r  zYGcloud Storage Command: {} storage buckets update --predefined-acl=publicRead gs://bucketr  r  s      r1   /test_shim_translates_xml_predefined_acl_for_set;TestAclShim.test_shim_translates_xml_predefined_acl_for_set  s    	GHJ 
K 6<)" 	  ??8# + % YY/88@A
 BCI6$<<ZHDJ 	"	
K 
K	 	
K 
Kr  c                    U R                  5       n[        SS/5         [        SSS.5         U R                  SSSUS	S
S/SS9nSR	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   r   rU  r  gs://bucket1gs://bucket2Tr  r  r  zyGcloud Storage Command: {} storage buckets update --acl-file={} --continue-on-error gs://bucket gs://bucket1 gs://bucket2r  r  s       r1   2test_shim_translates_acl_set_multiple_buckets_urls>TestAclShim.test_shim_translates_acl_set_multiple_buckets_urls  s      "F	GHJ 
K 6<)" 	  ??543
 ?C + D YY/88@A
 @AG$<<ZH!B#$.		0	
K 
K	 	
K 
K#   B;A,B*B;*
B8	4B;;
C	c                    U R                  5       n[        SS/5         [        SSS.5         U R                  SSSUS	S
S/SS9nSR	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   r   rU  r  zgs://bucket/object1zgs://bucket/object2Tr  r  r  zGcloud Storage Command: {} storage objects update --acl-file={} --continue-on-error gs://bucket/object gs://bucket/object1 gs://bucket/object2r  r  s       r1   2test_shim_translates_acl_set_multiple_objects_urls>TestAclShim.test_shim_translates_acl_set_multiple_objects_urls  s      "F	GHJ 
K 6<)" 	  ??54!57L!3
 ?C	 + D
 YY/88@A
 BCI6$<<ZH!D#$.		0	
K 
K	 	
K 
Kr  c                    U R                  5       n[        SS/5         [        SSS.5         U R                  SSSS	US
SS/SS9nSR	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   r   z-rz-ar  gs://bucket1/or  Tr  r  r  zGcloud Storage Command: {} storage objects update --acl-file={} --recursive --all-versions gs://bucket gs://bucket1/o gs://bucket2r  r  s       r1   Itest_shim_translates_acl_set_multiple_buckets_urls_recursive_all_versionsUTestAclShim.test_shim_translates_acl_set_multiple_buckets_urls_recursive_all_versions  s       "F	GHJ 
K 6<)" 	  ??54v}6F3
 ?C	 + D
 YY/88@A
 67=v$<<ZH!8#$.		0	
K 
K	 	
K 
Ks#   B<A-B+B<+
B9	5B<<
C
c                 *   [        SS/5         [        SSS.5         U R                  [        S5         U R	                  S/ SQ5        S S S 5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g = f)	Nrx  rz  r  r}  r~  /Cannot operate on a mix of buckets and objects.r   )r   zacl-filer  gs://bucket1/objectr   r   assertRaisesRegexr
   ru  rE   s    r1   Atest_shim_translates_acl_set_mix_buckets_and_objects_raises_errorMTestAclShim.test_shim_translates_acl_set_mix_buckets_and_objects_raises_error  s    	GHJ 
K 6<)" 	 ##=? //NP?		
K 
K? ?		 	
K 
K9   BA3A"	A3B"
A0,A33
B	=B
Bc           	         U R                  5       n[        SS/5         [        SSS.5         U R                  S/ SQSS	9nS
R	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   )r"   r   user@example.com:Rr  r  Tr  r  r  zGcloud Storage Command: {} storage buckets update --add-acl-grant entity=user-user@example.com,role=READER gs://bucket1 gs://bucket2r  r  s       r1   &test_shim_changes_bucket_acls_for_user2TestAclShim.test_shim_changes_bucket_acls_for_user  s      "F	GHJ 
K 6<)" 	  ??N# + % YY/88@A
*+1622:>,$	&	
K 
K	 	
K 
K#   B7A(B&B7&
B4	0B77
Cc           	         U R                  5       n[        SS/5         [        SSS.5         U R                  S/ SQSS	9nS
R	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   )r"   r   r  r  zgs://bucket2/oTr  r  r  zGcloud Storage Command: {} storage objects update --add-acl-grant entity=user-user@example.com,role=READER gs://bucket1/o gs://bucket2/or  r  s       r1   &test_shim_changes_object_acls_for_user2TestAclShim.test_shim_changes_object_acls_for_user  s      "F	GHJ 
K 6<)" 	  ??5 3
 ?C + D YY/88@A
./5v22:>0$	&	
K 
K	 	
K 
Kr  c                 *   [        SS/5         [        SSS.5         U R                  [        S5         U R	                  S/ SQ5        S S S 5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g = f)	Nrx  rz  r  r}  r~  r  r   )r"   r  r  r  r  s    r1   5test_shim_raises_error_for_mix_of_objects_and_bucketsATestAclShim.test_shim_raises_error_for_mix_of_objects_and_buckets,  s    	GHJ 
K 6<)" 	 ##=? //%!M
N?		
K 
K? ?		 	
K 
Kr  c           	         U R                  5       n[        SS/5         [        SSS.5         U R                  S/ SQSS	9nS
R	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   )r"   r   zgroup@example.com:Wr  Tr  r  r  z{Gcloud Storage Command: {} storage objects update --add-acl-grant entity=group-group@example.com,role=WRITER gs://bucket1/or  r  s       r1    test_shim_changes_acls_for_group,TestAclShim.test_shim_changes_acls_for_group9  s      "F	GHJ 
K 6<)" 	  ??H# + % YY/88@A
 &22:>!$	&	
K 
K	 	
K 
Kr  c           	         U R                  5       n[        SS/5         [        SSS.5         U R                  S/ SQSS	9nS
R	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   )r"   r   zexample.com:Or  Tr  r  r  zuGcloud Storage Command: {} storage objects update --add-acl-grant entity=domain-example.com,role=OWNER gs://bucket1/or  r  s       r1   !test_shim_changes_acls_for_domain-TestAclShim.test_shim_changes_acls_for_domainM  s      "F	GHJ 
K 6<)" 	  ??B# + % YY/88@A
 )*0&$<<ZH!+#$.		0	
K 
K	 	
K 
Kr  c           	         U R                  5       n[        SS/5         [        SSS.5         U R                  S/ SQSS	9nS
R	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   )r"   r   zowners-example:Or  Tr  r  r  zyGcloud Storage Command: {} storage objects update --add-acl-grant entity=project-owners-example,role=OWNER gs://bucket1/or  r  s       r1   "test_shim_changes_acls_for_project.TestAclShim.test_shim_changes_acls_for_project`  s      "F	GHJ 
K 6<)" 	  ??E# + % YY/88@A
 &22:>!$	&	
K 
K	 	
K 
Kr  c           
         U R                  5       n[        SS/5         [        SSS.5         S Ho  nU R                  SSS	US
-   S/SS9nSR	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        Mq     S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  allallUsersAllUsersr   r"   r   :Or  Tr  r  r  zkGcloud Storage Command: {} storage objects update --add-acl-grant entity=allUsers,role=OWNER gs://bucket1/or  rE   r\   
identifierr  r  s        r1   $test_shim_changes_acls_for_all_users0TestAclShim.test_shim_changes_acls_for_all_userst  s      "F	GHJ 
K 6<)" 	
 :J!__dD*t"35EF!% - '
 yy!1!:!:6!BC*
-- +,2F&>>zJ#-%&0	2 :	
K 
K	 	
K 
K#   CA6B4#C4
C	>C
Cc           
         U R                  5       n[        SS/5         [        SSS.5         S Ho  nU R                  SSS	US
-   S/SS9nSR	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        Mq     S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  allauthr   AllAuthenticatedUsersr   r"   r   r  r  Tr  r  r  zxGcloud Storage Command: {} storage objects update --add-acl-grant entity=allAuthenticatedUsers,role=OWNER gs://bucket1/or  r  s        r1   2test_shim_changes_acls_for_all_authenticated_users>TestAclShim.test_shim_changes_acls_for_all_authenticated_users  s      "F	GHJ 
K 6<)" 	

J "__dD*t"35EF!% - '
 yy!1!:!:6!BC*
--!"(&44Z@#&(
	
K 
K	 	
K 
Kr  c           	         U R                  5       n[        SS/5         [        SSS.5         U R                  S/ SQSS	9nS
R	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r   )r"   r   zuser@example.comr   zuser1@example.comr  Tr  r  r  zGcloud Storage Command: {} storage objects update --remove-acl-grant user@example.com --remove-acl-grant user1@example.com gs://bucket1/or  r  s       r1   test_shim_deletes_acls"TestAclShim.test_shim_deletes_acls  s      "F	GHJ 
K 6<)" 	
  ??5 3
 ?C	 + D
 YY/88@A
 ) +1&$<<ZH!+#$.	0	
K 
K	 	
K 
Kr  c           
         U R                  5       n[        SS/5         [        SSS.5         S Hl  nU R                  SSS	US
/SS9nSR	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        Mn     S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r  r   r"   r   r  Tr  r  r  z\Gcloud Storage Command: {} storage objects update --remove-acl-grant AllUsers gs://bucket1/or  r  s        r1   $test_shim_removes_acls_for_all_users0TestAclShim.test_shim_removes_acls_for_all_users  s      "F	GHJ 
K 6<)" 	
 :J!__dD*.>?!% - '
 yy!1!:!:6!BC*
-- +,2F&>>zJ#-%&0	2 :	
K 
K	 	
K 
K#   CA3B1 C1
B?	;C
Cc           
         U R                  5       n[        SS/5         [        SSS.5         S Hl  nU R                  SSS	US
/SS9nSR	                  UR
                  S   5      nU R                  SR                  [        R                  " S5      U5      U5        Mn     S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nrx  rz  r  r}  r~  r  r   r"   r   r  Tr  r  r  ziGcloud Storage Command: {} storage objects update --remove-acl-grant AllAuthenticatedUsers gs://bucket1/or  r  s        r1   2test_shim_removes_acls_for_all_authenticated_users>TestAclShim.test_shim_removes_acls_for_all_authenticated_users  s      "F	GHJ 
K 6<)" 	

J "__dD*.>?!% - '
 yy!1!:!:6!BC*
-- +,2F&>>zJ#-%&0	2
	
K 
K	 	
K 
Kr  r$   N)!r%   r&   r'   r(   r   patchobjectr   
AclCommandMockr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r/   r$   r0   r1   rt  rt  :  s   ::S^^\tyy{C" D"  ::S^^\tyy{C" D"  ::S^^\tyy{C0 D0" ::S^^\tyy{C0 D0" ::S^^\tyy{C" D"  ::S^^\tyy{C" D"  ::S^^\tyy{C" D"  ::S^^\tyy{C0 D0& ::S^^\tyy{C0 D0( ::S^^\tyy{C0 D0* ::S^^\tyy{CP DP ::S^^\tyy{C& D&( ::S^^\tyy{C& D&( ::S^^\tyy{C
O D
O ::S^^\tyy{C& D&& ::S^^\tyy{C0 D0$ ::S^^\tyy{C& D&& ::S^^\tyy{C2 D2( ::S^^\tyy{C( D(. ::S^^\tyy{C0 D0, ::S^^\tyy{C2 D2( ::S^^\tyy{C2 D2r0   rt  )8r)   
__future__r   r   r   r   osr~   gslib.commandsr   gslib.commandr   gslib.cs_api_mapr	   gslib.exceptionr
   gslib.storage_urlr   gslib.tests.testcaseteststestcase)gslib.tests.testcase.integration_testcaser   r   r   gslib.tests.utilr   r=  r   rU   r   r   r   gslib.utilsr   gslib.utils.constantsr   gslib.utils.retry_utilr   gslib.utils.translation_helperr   r   sixr   r   	six.movesr   r   GsUtilIntegrationTestCaser   r3   r\  re  rn  ShimUnitTestBasert  r$   r0   r1   <module>r     s    - & %  ' 	 	  1 ( , 2 ' ' ? ? @ 8 0 1 2 % " & ( 9 ! % VV_	5 6 A (44  $%@1k @1 &@1FL+ L* DE6K 6 F62g h2(++ h2r0   