
    '2                     T   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
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  \
R:                  (       a  \r " S S\R@                  5      r! " S S\RD                  5      r#g)&Integration tests for setmeta command.    )absolute_import)print_function)division)unicode_literalsN)mock)setmeta)ApiSelector)	SkipForS3)ObjectToURI)SetBotoConfigForTest)SetEnvironmentForTest)unittest)Retry)	shim_utilc                       \ rS rSrSrS rS r\" S5      S 5       r\" S5      S 5       r	S r
S	 rS
 rS rS rS r\" S5      S 5       r\" S5      S 5       rS rS rS rS rS rS rS rSrg)TestSetMeta+   r   c           	         ^ ^^ [        T R                  SS95      mT R                  5       nSmT R                  SST R                  -  SST-  SUT/5        [        [        SS	S
9UUU 4S j5       nU" 5         g)z.Tests copying file to an object with metadata.   foocontents	image/gif-hx-%s-meta-xyz:abcContent-Type:%scp      triestimeout_secsc                  z   > TR                  SST/SS9n TR                  U ST-  5        TR                  U S5        g )Nls-LTreturn_stdoutContent-Type:\s+%s
xyz:\s+abc)	RunGsUtilassertRegex)stdoutctobjuriselfs    +platform/gsutil/gslib/tests/test_setmeta.py_Check12TestSetMeta.test_initial_metadata.<locals>._Check19   sB    ~~tT62$~Gf
v4r9:
v}-    NsuriCreateObjectCreateTempFiler*   provider_custom_metar   AssertionError)r/   inpathr1   r-   r.   s   `  @@r0   test_initial_metadata!TestSetMeta.test_initial_metadata.   s    $##V#45F  "F	BNNd777Bff  >3. 4.
 Ir3   c           	      *  ^ ^ [        T R                  SS95      mT R                  5       nT R                  SST R                  -  SSSUT/5        T R                  SSSSS	T R                  -  T/5        [        [        S
SS9UU 4S j5       nU" 5         g)z'Tests overwriting an object's metadata.r   r   r   r   zContent-Type:image/gifr   r	   Content-Type:text/htmlzx-%s-meta-xyzr   r   r    c                  t   > TR                  SST/SS9n TR                  U S5        TR                  SU 5        g )Nr$   r%   Tr&   zContent-Type:\s+text/htmlxyz)r*   r+   assertNotInr,   r.   r/   s    r0   r1   4TestSetMeta.test_overwrite_existing.<locals>._Check1O   s=    ~~tT62$~Gf
v;<
uf%r3   Nr4   )r/   r:   r1   r.   s   `  @r0   test_overwrite_existing#TestSetMeta.test_overwrite_existingA   s    $##V#45F  "FNNd777 $ 
 	NN414$333V 
 >3& 4&
 Ir3   z*Preconditions not supported for s3 objectsc                    U R                  SS9nUR                  nSnU R                  SS[        U5      S-   -  SSSU R                  -  SS	U-  [        U5      /SS
S9nU R                  (       a  U R                  SU5        OU R                  SU5        U R                  SSU-  SSSU R                  -  SS	U-  [        U5      /5        U R                  SS[        U5      /S
S9nU R                  USU-  5        U R                  US5        g)z6Tests setting metadata with a generation precondition.r   r   r   r   zx-goog-if-generation-match:%dr   r	   r   r   Texpected_statusreturn_stderrpre-conditionPreconditionzx-goog-generation-match:%sr$   r%   r&   r(   r)   N)	r6   
generationr*   longr8   r5   _use_gcloud_storageassertInr+   )r/   
object_urirL   r-   stderrr,   s         r0   test_generation_precondition(TestSetMeta.test_generation_preconditionW   s1    ""F"3J&&J	B^^'	j	A		 )4d777BZ -.*.  	0F 
mmOV,
mmNF+NN$z19dd777BZ  ^^T4j)9:$^OFV2R78V]+r3   c                    U R                  SS9nSnU R                  SSSSSU R                  -  SSU-  [        U5      /S	S
S9nU R                  (       a  U R                  SU5        OU R                  SU5        U R                  SSSSSU R                  -  SSU-  [        U5      /5        U R                  SS[        U5      /S
S9nU R                  USU-  5        U R                  US5        g)z:Tests setting metadata with a metageneration precondition.r   r   r   r   z x-goog-if-metageneration-match:5r	   r   r   r   TrG   rJ   rK   zx-goog-metageneration-match:1r$   r%   r&   r(   r)   N)r6   r*   r8   r5   rN   rO   r+   )r/   rP   r-   rQ   r,   s        r0    test_metageneration_precondition,TestSetMeta.test_metageneration_preconditionw   s    ""F"3J	B^^0)Td777BZ	 -.*.  0F 
mmOV,
mmNF+NN-y$d777BZ	  ^^T4j)9:$^OFV2R78V]+r3   c                 N    U R                  / SQSSS9nU R                  SU5        g )N)r	   r   r>   r   zContent-Typegs://foo/barr   TrG   $Each header must appear at most oncer*   rO   r/   rQ   s     r0   test_duplicate_header_removal)TestSetMeta.test_duplicate_header_removal   3    ^^  -.*.  0F 	MM8&Ar3   c                 N    U R                  / SQSSS9nU R                  SU5        g )N)r	   r   r>   r   zContent-Type:foobarrX   r   TrG   rY   rZ   r[   s     r0   test_duplicate_header!TestSetMeta.test_duplicate_header   r^   r3   c           
          U R                  SS9n[        SS/5         U R                  SSSS[        U5      /S	S
9nU R	                  SU5        S S S 5        g ! , (       d  f       g = f)Nr   r   )GSUtiltask_estimation_threshold1)rc   task_estimation_forceTruez-mr	   r   content-type:footypeT)rI   z,Estimated work for this command: objects: 1
)r6   r   r*   r5   rO   )r/   rP   rQ   s      r0   test_setmeta_seek_ahead#TestSetMeta.test_setmeta_seek_ahead   s{    ""F"3J	KJL 
M~~D"8
  f mmCVL
M 
M 
Ms   1A
A%c           	         U R                  5       nU R                  USS9nU R                  USS9nU R                  SSSS[        U5      /5        X#4 H0  nU R                  S[        U5      /SS	9nU R	                  S
U5        M2     g )Nr   )
bucket_urir   r	   z-Rr   rh   statTr&   footype)CreateBucketr6   r*   r5   rO   )r/   rl   object1_uriobject2_uriobj_urir,   s         r0   test_recursion_works TestSetMeta.test_recursion_works   s    ""$J##zF#KK##zF#KKNN	D$ 6	j		  -~~vtG}5T~Jf
mmIv& .r3   c           	          U R                  SS9nU R                  US5        U R                  SSSU R                  -  [	        US5      /5        g)zCEnsure that custom metadata works in the multi-thread/process case.   )test_objectsr	   r   zx-%s-meta-abc:123z**N)ro   AssertNObjectsInBucketr*   r8   r5   )r/   rl   s     r0   test_metadata_parallelism%TestSetMeta.test_metadata_parallelism   sU     """2J
A.NN4d777Z r3   c                     SU R                   -  nU R                  SSUSU R                  -  /SSS9nU R                  SU5        g )	Nu   x-%s-meta-soufflé:5r	   r   z%s://foo/barr   TrG   zInvalid non-ASCII header)r8   r*   default_providerrO   r/   unicode_headerrQ   s      r0   $test_invalid_non_ascii_custom_header0TestSetMeta.test_invalid_non_ascii_custom_header   sX    +d.G.GGN^^4... -.*.  0F 	MM,f5r3   z:Only ASCII characters are supported for x-amz-meta headersc                    ^ ^ T R                  SS9mST R                  -  nT R                  SSU[        T5      /5        [	        [
        SSS9UU 4S	 j5       nU" 5         g
)z7Tests setting custom metadata with a non-ASCII content.r   r   u   x-%s-meta-dessert:soufflér	   r   r   r   r    c                     > TR                  SS[        T5      /SS9n TR                  [        R                  " SU 5      5        g )Nr$   r%   Tr&   u   dessert:\s+soufflé)r*   r5   
assertTrueresearchrB   s    r0   r1   ?TestSetMeta.test_valid_non_ascii_custom_header.<locals>._Check1   s8    ~~tT4<8~Mf
oobii 6?@r3   N)r6   r8   r*   r5   r   r9   )r/   r~   r1   r.   s   `  @r0   "test_valid_non_ascii_custom_header.TestSetMeta.test_valid_non_ascii_custom_header   se     /F1D4M4MMNNNIt^T&\BC
>3A 4A Ir3   z$XML header keys are case-insensitivec                 :   U R                   [        R                  :X  a  [        R                  " S5      $ U R                  SS9nU R                  SSSU R                  -  [        U5      /5        U R                  S[        U5      /SS	9nU R                  US
5        g)z6Tests setting custom metadata with an uppercase value.z%XML header keys are case-insensitive.r   r   r	   r   zx-%s-meta-CaSe:SeNsItIvErm   Tr&   zCaSe:\s+SeNsItIvEN)
test_apir
   XMLr   skipr6   r*   r8   r5   r+   )r/   r.   r,   s      r0   test_uppercase_header!TestSetMeta.test_uppercase_header   s     }}']]BCC/FNN4"T%>%>>V 
 ^^VT&\2$^GFV12r3   c                 ^   ^ ^ T R                  SS9mUU 4S jnUU 4S jnU" 5         U" 5         g)zTests removing a headerr   r   c                     > TR                  SSS[        T5      /5        TR                  S[        T5      /SS9n TR                  U S5        g )Nr	   r   zcontent-disposition:brrm   Tr&   zContent-Dispositionr*   r5   r+   rB   s    r0   r1   /TestSetMeta.test_remove_header.<locals>._Check1   sI    
nni'?fNO~~vtF|4D~If
v56r3   c                     > TR                  SSS[        T5      /5        TR                  S[        T5      /SS9n TR                  U S5        g )Nr	   r   zcontent-dispositionrm   Tr&   z(?!Content-Disposition)r   rB   s    r0   _Check2/TestSetMeta.test_remove_header.<locals>._Check2   sI    
nni'<d6lKL~~vtF|4D~If
v9:r3   N)r6   )r/   r1   r   r.   s   `  @r0   test_remove_headerTestSetMeta.test_remove_header   s,    /F7
;
 IIr3   c                 N    U R                  / SQSSS9nU R                  SU5        g )N)r	   r   zContent-Length:5rX   r   TrG   zInvalid or disallowed headerrZ   r[   s     r0   test_disallowed_header"TestSetMeta.test_disallowed_header   s/    ^^=  F 	MM0&9r3   c                     U R                  5       nU R                  SSSU R                  -  [        U5      /SSS9nU R                  (       a  U R                  SU5        g U R                  SU5        g )	Nr	   r   zx-%s-meta-foo:5r   TrG   ERRORzmust name an object)ro   r*   r8   r5   rN   rO   r/   rl   rQ   s      r0   test_setmeta_bucketTestSetMeta.test_setmeta_bucket  ss    ""$J^^4D555Z
 -.*.  0F 
mmGV$
mm)62r3   c                     U R                  SS9nU R                  SSSU R                  -  [        U5      /5        U R                  S[        U5      /SS9nU R	                  US	5        g )
Nr   r   r	   r   zx-%s-meta-foo:bar:bazrm   Tr&   zfoo:\s+bar:baz)r6   r*   r8   r5   r+   )r/   rr   r,   s      r0   0test_setmeta_valid_with_multiple_colons_in_value<TestSetMeta.test_setmeta_valid_with_multiple_colons_in_value  sn    0GNN4$";";;W 
 ^^VT']34^HFV./r3   c                 l    U R                  SSSU R                  -  S/SSS9nU R                  SU5        g )	Nr	   r   zx-%s-acl:public-readrX   r   TrG   z+gsutil setmeta no longer allows canned ACLs)r*   r8   rO   r[   s     r0   test_setmeta_with_canned_acl(TestSetMeta.test_setmeta_with_canned_acl  sH    ^^4!:!::N -.*.  0F 	MM?Hr3   c                 V    SnU R                  SSUS/SSS9nU R                  SU5        g )	Nu   Content-Type:dessert/soufflér	   r   rX   r   TrG   zInvalid non-ASCII valuerZ   r}   s      r0   #test_invalid_non_ascii_header_value/TestSetMeta.test_invalid_non_ascii_header_value%  s<    4N^^YnnM,-*.  0F 	MM+V4r3   c                     U R                  5       nU R                  S[        U5      /SSS9nU R                  SU5        g )Nr	   r   TrG   z|gsutil setmeta requires one or more headers to be provided with the -h flag. See "gsutil help setmeta" for more information.)ro   r*   r5   rO   r   s      r0   1test_setmeta_raises_error_if_not_provided_headers=TestSetMeta.test_setmeta_raises_error_if_not_provided_headers,  sM    ""$J^^YZ(89,-*.  0F 	MM	DEKMr3    N)__name__
__module____qualname____firstlineno____doc__r;   rD   r   rR   rU   r\   r`   ri   rs   ry   r   r   r   r   r   r   r   r   r   r   __static_attributes__r   r3   r0   r   r   +   s    .&, 9:, ;,> 9:, ;,6BBM
'	6 IJ K 343 53":30I5Mr3   r   c                       \ rS rSr\R
                  R                  \R                  S\R                  " 5       S9S 5       r
Srg)TestSetMetaShimi6  
RunCommand)newc           	      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)N)rc   use_gcloud_storagerg   )rc   hidden_shim_modedry_runrg   fake_dir)(CLOUDSDK_CORE_PASS_CREDENTIALS_TO_GSUTILCLOUDSDK_ROOT_DIRr	   )z-rr   zCache-Control:r   zContent-Type:fake-content-typezgs://bucket/objectT)return_log_handler
infozGcloud Storage Command: {} storage objects update --recursive --clear-cache-control --content-type=fake-content-type gs://bucket/object)	r   r   r   joinmessagesrO   formatr   _get_gcloud_binary_path)r/   mock_log_handler
info_liness      r0   0test_shim_translates_setmeta_set_and_clear_flags@TestSetMetaShim.test_shim_translates_setmeta_set_and_clear_flags8  s    	GHJ 
K 6<)" 	  ??9 7
 ?C + D YY/88@A
DEKV22:>F@AK		M	
K 
K	 	
K 
Ks#   B&A'BB&
B#	B&&
B4r   N)r   r   r   r   r   patchobjectr	   SetMetaCommandMockr   r   r   r3   r0   r   r   6  s9    ::W++\tyy{KM LMr3   r   )$r   
__future__r   r   r   r   osr   r   r   sixgslib.commandsr	   gslib.cs_api_mapr
   gslib.tests.testcaseteststestcase)gslib.tests.testcase.integration_testcaser   gslib.tests.utilr   r5   r   r   gslib.utils.retry_utilr   gslib.utilsr   PY3intrM   GsUtilIntegrationTestCaser   ShimUnitTestBaser   r   r3   r0   <module>r      sz    - & %  ' 	 	  
 " ( ' ' ? 0 1 2 % ( !77	$HM(44 HMVMh// Mr3   