
    '2                     J   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlZddlm	Z	 ddl
Z
ddlmZ dd	lmZ ddlmc mZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ e
j:                  reZ G d dej@                        Z! G d dejD                        Z#y)&Integration tests for setmeta command.    )absolute_import)print_function)division)unicode_literalsN)mock)setmeta)ApiSelector)	SkipForS3)ObjectToURI)SetBotoConfigForTest)SetEnvironmentForTest)unittest)Retry)	shim_utilc                       e Zd ZdZd Zd Z ed      d        Z ed      d        Zd Z	d Z
d	 Zd
 Zd Zd Z ed      d        Z ed      d        Zd Zd Zd Zd Zd Zd Zd Zy)TestSetMetar   c           	           t         j                  d             j                         }d j                  dd j                  z  ddz  d|g       t        t        dd	
       fd       } |        y)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                      j                  ddgd      } j                  | dz         j                  | d       y )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_Check1z2TestSetMeta.test_initial_metadata.<locals>._Check19   sB    ~~tT62$~Gf
v4r9:
v}-    NsuriCreateObjectCreateTempFiler)   provider_custom_metar   AssertionError)r.   inpathr0   r,   r-   s   `  @@r/   test_initial_metadataz!TestSetMeta.test_initial_metadata.   s    $##V#45F  "F	BNNd777Bff  >3. 4.
 Ir1   c           	      4    t         j                  d             j                         } j                  dd j                  z  ddd|g        j                  ddddd	 j                  z  g       t        t        d
d       fd       } |        y)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                  z    j                  ddgd      } j                  | d       j                  d|        y )Nr#   r$   Tr%   zContent-Type:\s+text/htmlxyz)r)   r*   assertNotInr+   r-   r.   s    r/   r0   z4TestSetMeta.test_overwrite_existing.<locals>._Check1O   s=    ~~tT62$~Gf
v;<
uf%r1   Nr2   )r.   r8   r0   r-   s   `  @r/   test_overwrite_existingz#TestSetMeta.test_overwrite_existingA   s    $##V#45F  "FNNd777 $ 
 	NN414$333V 
 >3& 4&
 Ir1   z*Preconditions not supported for s3 objectsc                 $   | j                  d      }|j                  }d}| j                  ddt        |      dz   z  ddd| j                  z  dd	|z  t        |      gdd
      }| j                  r| j                  d|       n| j                  d|       | j                  dd|z  ddd| j                  z  dd	|z  t        |      g       | j                  ddt        |      gd
      }| j                  |d|z         | j                  |d       y)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)	r4   
generationr)   longr6   r3   _use_gcloud_storageassertInr*   )r.   
object_urirG   r,   stderrr+   s         r/   test_generation_preconditionz(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]+r1   c                    | j                  d      }d}| j                  ddddd| j                  z  dd|z  t        |      gd	d
      }| j                  r| j                  d|       n| j                  d|       | j                  ddddd| j                  z  dd|z  t        |      g       | j                  ddt        |      gd
      }| j                  |d|z         | j                  |d       y)z:Tests setting metadata with a metageneration precondition.r   r   r   r   z x-goog-if-metageneration-match:5r	   r   r   r   TrB   rE   rF   zx-goog-metageneration-match:1r#   r$   r%   r'   r(   N)r4   r)   r6   r3   rI   rJ   r*   )r.   rK   r,   rL   r+   s        r/    test_metageneration_preconditionz,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]+r1   c                 T    | j                  g ddd      }| j                  d|       y )N)r	   r   r;   r   zContent-Typegs://foo/barr   TrB   $Each header must appear at most oncer)   rJ   r.   rL   s     r/   test_duplicate_header_removalz)TestSetMeta.test_duplicate_header_removal   3    ^^  -.*.  0F 	MM8&Ar1   c                 T    | j                  g ddd      }| j                  d|       y )N)r	   r   r;   r   zContent-Type:foobarrQ   r   TrB   rR   rS   rT   s     r/   test_duplicate_headerz!TestSetMeta.test_duplicate_header   rV   r1   c           
          | j                  d      }t        ddg      5  | j                  ddddt        |      gd	
      }| j	                  d|       d d d        y # 1 sw Y   y xY w)Nr   r   )GSUtiltask_estimation_threshold1)rZ   task_estimation_forceTruez-mr	   r   content-type:footypeT)rD   z,Estimated work for this command: objects: 1
)r4   r   r)   r3   rJ   )r.   rK   rL   s      r/   test_setmeta_seek_aheadz#TestSetMeta.test_setmeta_seek_ahead   s{    ""F"3J	KJL 
M~~D"8
  f mmCVL
M 
M 
Ms   4AA&c           	          | j                         }| j                  |d      }| j                  |d      }| j                  ddddt        |      g       ||fD ]2  }| j                  dt        |      gd	      }| j	                  d
|       4 y )Nr   )
bucket_urir   r	   z-Rr   r_   statTr%   footype)CreateBucketr4   r)   r3   rJ   )r.   rb   object1_uriobject2_uriobj_urir+   s         r/   test_recursion_worksz TestSetMeta.test_recursion_works   s    ""$J##zF#KK##zF#KKNN	D$ 6	j		  -~~vtG}5T~Jf
mmIv& .r1   c           	          | j                  d      }| j                  |d       | j                  ddd| j                  z  t	        |d      g       y)zCEnsure that custom metadata works in the multi-thread/process case.   )test_objectsr	   r   zx-%s-meta-abc:123z**N)re   AssertNObjectsInBucketr)   r6   r3   )r.   rb   s     r/   test_metadata_parallelismz%TestSetMeta.test_metadata_parallelism   sU     """2J
A.NN4d777Z r1   c                     d| j                   z  }| j                  dd|d| j                  z  gdd      }| j                  d|       y )	Nu   x-%s-meta-soufflé:5r	   r   z%s://foo/barr   TrB   zInvalid non-ASCII header)r6   r)   default_providerrJ   r.   unicode_headerrL   s      r/   $test_invalid_non_ascii_custom_headerz0TestSetMeta.test_invalid_non_ascii_custom_header   sX    +d.G.GGN^^4... -.*.  0F 	MM,f5r1   z:Only ASCII characters are supported for x-amz-meta headersc                       j                  d      d j                  z  } j                  dd|t              g       t	        t
        dd       fd	       } |        y
)z7Tests setting custom metadata with a non-ASCII content.r   r   u   x-%s-meta-dessert:soufflér	   r   r   r   r   c                      j                  ddt              gd      } j                  t        j                  d|              y )Nr#   r$   Tr%   u   dessert:\s+soufflé)r)   r3   
assertTrueresearchr?   s    r/   r0   z?TestSetMeta.test_valid_non_ascii_custom_header.<locals>._Check1   s8    ~~tT4<8~Mf
oobii 6?@r1   N)r4   r6   r)   r3   r   r7   )r.   rr   r0   r-   s   `  @r/   "test_valid_non_ascii_custom_headerz.TestSetMeta.test_valid_non_ascii_custom_header   se     /F1D4M4MMNNNIt^T&\BC
>3A 4A Ir1   z$XML header keys are case-insensitivec                 B   | j                   t        j                  k(  rt        j                  d      S | j                  d      }| j                  ddd| j                  z  t        |      g       | j                  dt        |      gd	      }| j                  |d
       y)z6Tests setting custom metadata with an uppercase value.z%XML header keys are case-insensitive.r   r   r	   r   zx-%s-meta-CaSe:SeNsItIvErc   Tr%   zCaSe:\s+SeNsItIvEN)
test_apir
   XMLr   skipr4   r)   r6   r3   r*   )r.   r-   r+   s      r/   test_uppercase_headerz!TestSetMeta.test_uppercase_header   s     }}']]BCC/FNN4"T%>%>>V 
 ^^VT&\2$^GFV12r1   c                 `      j                  d       fd} fd} |         |        y)zTests removing a headerr   r   c                      j                  dddt              g       j                  dt              gd      } j                  | d       y )Nr	   r   zcontent-disposition:brrc   Tr%   zContent-Dispositionr)   r3   r*   r?   s    r/   r0   z/TestSetMeta.test_remove_header.<locals>._Check1   sI    
nni'?fNO~~vtF|4D~If
v56r1   c                      j                  dddt              g       j                  dt              gd      } j                  | d       y )Nr	   r   zcontent-dispositionrc   Tr%   z(?!Content-Disposition)r   r?   s    r/   _Check2z/TestSetMeta.test_remove_header.<locals>._Check2   sI    
nni'<d6lKL~~vtF|4D~If
v9:r1   N)r4   )r.   r0   r   r-   s   `  @r/   test_remove_headerzTestSetMeta.test_remove_header   s,    /F7
;
 IIr1   c                 T    | j                  g ddd      }| j                  d|       y )N)r	   r   zContent-Length:5rQ   r   TrB   zInvalid or disallowed headerrS   rT   s     r/   test_disallowed_headerz"TestSetMeta.test_disallowed_header   s/    ^^=  F 	MM0&9r1   c                     | j                         }| j                  ddd| j                  z  t        |      gdd      }| j                  r| j                  d|       y | j                  d|       y )	Nr	   r   zx-%s-meta-foo:5r   TrB   ERRORzmust name an object)re   r)   r6   r3   rI   rJ   r.   rb   rL   s      r/   test_setmeta_bucketzTestSetMeta.test_setmeta_bucket  ss    ""$J^^4D555Z
 -.*.  0F 
mmGV$
mm)62r1   c                     | j                  d      }| j                  ddd| j                  z  t        |      g       | j                  dt        |      gd      }| j	                  |d	       y )
Nr   r   r	   r   zx-%s-meta-foo:bar:bazrc   Tr%   zfoo:\s+bar:baz)r4   r)   r6   r3   r*   )r.   rh   r+   s      r/   0test_setmeta_valid_with_multiple_colons_in_valuez<TestSetMeta.test_setmeta_valid_with_multiple_colons_in_value  sn    0GNN4$";";;W 
 ^^VT']34^HFV./r1   c                 r    | j                  ddd| j                  z  dgdd      }| j                  d|       y )	Nr	   r   zx-%s-acl:public-readrQ   r   TrB   z+gsutil setmeta no longer allows canned ACLs)r)   r6   rJ   rT   s     r/   test_setmeta_with_canned_aclz(TestSetMeta.test_setmeta_with_canned_acl  sH    ^^4!:!::N -.*.  0F 	MM?Hr1   c                 \    d}| j                  dd|dgdd      }| j                  d|       y )	Nu   Content-Type:dessert/soufflér	   r   rQ   r   TrB   zInvalid non-ASCII valuerS   rq   s      r/   #test_invalid_non_ascii_header_valuez/TestSetMeta.test_invalid_non_ascii_header_value%  s<    4N^^YnnM,-*.  0F 	MM+V4r1   c                     | j                         }| j                  dt        |      gdd      }| j                  d|       y )Nr	   r   TrB   z|gsutil setmeta requires one or more headers to be provided with the -h flag. See "gsutil help setmeta" for more information.)re   r)   r3   rJ   r   s      r/   1test_setmeta_raises_error_if_not_provided_headersz=TestSetMeta.test_setmeta_raises_error_if_not_provided_headers,  sM    ""$J^^YZ(89,-*.  0F 	MM	DEKMr1   N)__name__
__module____qualname____doc__r9   r@   r   rM   rO   rU   rX   r`   ri   rn   rs   ry   r~   r   r   r   r   r   r   r    r1   r/   r   r   +   s    .&, 9:, ;,> 9:, ;,6BBM
'	6 IJ K 343 53":30I5Mr1   r   c                       e Zd Zej                  j                  ej                  d ej                               d        Z	y)TestSetMetaShim
RunCommand)newc           	      ^   t        ddg      5  t        ddd      5  | j                  dg dd	      }d
j                  |j                  d         }| j                  dj                  t        j                  d            |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)N)rZ   use_gcloud_storager^   )rZ   hidden_shim_modedry_runr^   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messagesrJ   formatr   _get_gcloud_binary_path)r.   mock_log_handler
info_liness      r/   0test_shim_translates_setmeta_set_and_clear_flagsz@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##B,N)
r   r   r   r   patchobjectr	   SetMetaCommandMockr   r   r1   r/   r   r   6  s;    ::W++\ytyy{KM LMr1   r   )$r   
__future__r   r   r   r   osrw   r   r   sixgslib.commandsr	   gslib.cs_api_mapr
   gslib.tests.testcaseteststestcase)gslib.tests.testcase.integration_testcaser   gslib.tests.utilr   r3   r   r   gslib.utils.retry_utilr   gslib.utilsr   PY3intrH   GsUtilIntegrationTestCaser   ShimUnitTestBaser   r   r1   r/   <module>r      sz    - & %  ' 	 	  
 " ( ' ' ? 0 1 2 % ( !77	$HM(44 HMVMh// Mr1   