
    1                         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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5       " S S\R0                  5      5       r " S S\5      rg)#Integration tests for cors command.    )absolute_import)print_function)division)unicode_literalsN)parseString)	SkipForS3)ObjectToURI)UTF8)Retry)CorsTranslationz-CORS command is only supported for gs:// URLsc                     ^  \ rS rSrSrSS/rSS/rSrSrSr	\
" S	5      R                  S
S9rSr\R                  " \5      rSrSr\R                  " \5      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"U =r#$ )TestCors"   r   corssetgetz[]z[ {} ]a  [{"origin": ["http://origin1.example.com", "http://origin2.example.com"], "responseHeader": ["foo", "bar"], "badmethod": ["GET", "PUT", "POST"], "maxAgeSeconds": 3600},{"origin": ["http://origin3.example.com"], "responseHeader": ["foo2", "bar2"], "method": ["GET", "DELETE"]}])a[  <CorsConfig><Cors><Origins><Origin>http://origin1.example.com</Origin><Origin>http://origin2.example.com</Origin></Origins><Methods><Method>GET</Method><Method>PUT</Method><Method>POST</Method></Methods><ResponseHeaders><ResponseHeader>foo</ResponseHeader><ResponseHeader>bar</ResponseHeader></ResponseHeaders><MaxAgeSec>3600</MaxAgeSec></Cors><Cors><Origins><Origin>http://origin3.example.com</Origin></Origins><Methods><Method>GET</Method><Method>DELETE</Method></Methods><ResponseHeaders><ResponseHeader>foo2</ResponseHeader><ResponseHeader>bar2</ResponseHeader></ResponseHeaders></Cors></CorsConfig>z    )indenta  [{"origin": ["http://origin1.example.com", "http://origin2.example.com"], "responseHeader": ["foo", "bar"], "method": ["GET", "PUT", "POST"], "maxAgeSeconds": 3600},{"origin": ["http://origin3.example.com"], "responseHeader": ["foo2", "bar2"], "method": ["GET", "DELETE"]}]
z{"origin": ["http://origin.example.com", "http://origin2.example.com"], "responseHeader": ["foo", "bar"], "method": ["GET", "PUT", "POST"], "maxAgeSeconds": 3600}z[{"origin": ["http://origin1.example.com", "http://origin2.example.com"], "responseHeader": ["foo", "bar"], "method": ["GET", "PUT", "POST"]}]
c                 8   > [         [        U ]  5         SU l        g )Nzhas no CORS configuration)superr   setUpno_cors)self	__class__s    (platform/gsutil/gslib/tests/test_cors.pyr   TestCors.setUpX   s    	(D!.DL    c                 @   U R                   n[        R                  " U5      n[        R                  " U5      n[        R                  " U5      n[        R
                  " U5      nU R                  [        R                  " U5      [        R                  " U5      5        g)z+Tests cors translation for various formats.N)	cors_docr   JsonCorsToMessageEntriesBotoCorsFromMessageBotoCorsToMessageMessageEntriesToJsonassertEqualjsonloads)r   	json_textentries_list	boto_corsconverted_entries_listconverted_json_texts         r   test_cors_translationTestCors.test_cors_translation\   ss    I";;IFL33LAI,>>yI)>> TZZ	*DJJ7J,KLr   c                     U R                  5       nU R                  U R                  [        U5      /-   SS9nU R	                  U R
                  U5        g )NTreturn_stdout)CreateBucket	RunGsUtil_get_cmd_prefixsuriassertInr   )r   
bucket_uristdouts      r   test_default_corsTestCors.test_default_corsf   sM    ""$J^^D00D4D3EE*.  0FMM$,,'r   c                 T   U R                  5       nU R                  U R                  R                  [        5      S9nU R                  U R                  U[        U5      /-   5        U R                  U R                  [        U5      /-   SS9nU R                  U R                  U5        g NcontentsTr/   )r1   CreateTempFile
empty_doc1encoder   r2   _set_cmd_prefixr4   r3   r5   r   r   r6   fpathr7   s       r   test_set_empty_cors1TestCors.test_set_empty_cors1l       ""$J)?)?)EFENN4''5$z2B*CCD^^D00D4D3EE*.  0FMM$,,'r   c                 T   U R                  5       nU R                  U R                  R                  [        5      S9nU R                  U R                  U[        U5      /-   5        U R                  U R                  [        U5      /-   SS9nU R                  U R                  U5        g r;   )r1   r>   
empty_doc2r@   r   r2   rA   r4   r3   r5   r   rB   s       r   test_set_empty_cors2TestCors.test_set_empty_cors2t   rF   r   c                 |   U R                  5       nU R                  U R                  R                  [        5      S9nU R                  U R                  U[        U5      /-   5        U R                  U R                  [        U5      /-   SS9nU R                  [        R                  " U5      U R                  5        g r;   )r1   r>   r   r@   r   r2   rA   r4   r3   r$   r%   r&   cors_json_objrB   s       r   test_non_null_corsTestCors.test_non_null_cors|   s    ""$J)=)=d)CDENN4''5$z2B*CCD^^D00D4D3EE*.  0FTZZ'););<r   c                     U R                  5       nU R                  U R                  R                  [        5      S9nU R                  U R                  U[        U5      /-   SSS9nU R                  SU5        g )Nr<      Texpected_statusreturn_stderrXML CORS data provided)	r1   r>   xml_cors_docr@   r   r2   rA   r4   r5   r   r6   rC   stderrs       r   test_bad_cors_xmlTestCors.test_bad_cors_xml   sx    ""$J):):)A)A$)GHE^^D00"D$456,-*.  0F 	MM*F3r   c                 :   U R                  5       nU R                  U R                  R                  [        5      S9nU R                  U R                  U[        U5      /-   SSS9nU R                  (       a  U R                  SU5        g U R                  SU5        g )Nr<   rP   TrQ   zFound invalid JSON/YAMLrT   )r1   r>   cors_badr@   r   r2   rA   r4   _use_gcloud_storager5   assertNotInrV   s       r   test_bad_corsTestCors.test_bad_cors   s    ""$J)=)=d)CDE^^D00"D$456,-*.  0F
 
mm-v6
/8r   c                 :   U R                  5       nU R                  U R                  R                  [        5      S9nU R                  U R                  U[        U5      /-   SSS9nU R                  (       a  U R                  SU5        g U R                  SU5        g )Nr<   rP   TrQ   z%'str' object has no attribute 'items'zshould be formatted as a list)
r1   r>   cors_doc_not_nested_in_listr@   r   r2   rA   r4   r\   r5   rV   s       r   &test_cors_doc_not_wrapped_in_json_list/TestCors.test_cors_doc_not_wrapped_in_json_list   s    ""$J1188>   @E^^D00"D$456,-*.  0F 
mm;VD
mm3V<r   c                    U R                  5       nU R                  5       nU R                  X R                  S9nU R	                  U R
                  U[        U5      /-   5        U R	                  U R                  [        U5      /-   SS9nU R                  [        R                  " U5      U R                  5        U R                  X R                  S9nU R	                  U R
                  U[        U5      /-   5        U R	                  U R                  [        U5      /-   SS9nU R                  U R                  U5        g)z$Tests setting CORS then removing it.tmpdirr=   Tr/   N)r1   CreateTempDirr>   r   r2   rA   r4   r3   r$   r%   r&   rL   r?   r5   r   r   r6   rf   rC   r7   s        r   test_set_cors_and_reset TestCors.test_set_cors_and_reset   s   ""$J!FvFENN4''5$z2B*CCD^^D00D4D3EE*.  0FTZZ'););<vHENN4''5$z2B*CCD^^D00D4D3EE*.  0FMM$,,'r   c                    U R                  5       nU R                  5       nU R                  X R                  S9nU R	                  U R
                  U[        U5      /-   5        U R	                  U R                  [        U5      /-   SS9nU R                  [        R                  " U5      U R                  5        U R                  X R                  S9nU R	                  U R
                  U[        U5      /-   5        U R	                  U R                  [        U5      /-   SS9nU R                  U R                  U5        g)z;Tests setting CORS without maxAgeSeconds, then removing it.re   Tr/   N)r1   rg   r>   	cors_doc2r2   rA   r4   r3   r$   r%   r&   cors_json_obj2r?   r5   r   rh   s        r   test_set_partial_cors_and_reset(TestCors.test_set_partial_cors_and_reset   s   ""$J!FvGENN4''5$z2B*CCD^^D00D4D3EE*.  0FTZZ')<)<=vHENN4''5$z2B*CCD^^D00D4D3EE*.  0FMM$,,'r   c                 8   U R                  5       nU R                  5       nU R                  U R                  S9nU R                  U R                  U[        U5      [        U5      /-   5        U R                  U R                  [        U5      /-   SS9nU R                  [        R                  " U5      U R                  5        U R                  U R                  [        U5      /-   SS9nU R                  [        R                  " U5      U R                  5        g)z,Tests setting different CORS configurations.r<   Tr/   N)r1   r>   r   r2   rA   r4   r3   r$   r%   r&   rL   )r   bucket1_uribucket2_urirC   r7   s        r   test_set_multi_non_null_cors%TestCors.test_set_multi_non_null_cors   s    ##%K##%K7ENN	[!4#45	67 ^^D00D4E3FF*.  0FTZZ'););<^^D00D4E3FF*.  0FTZZ'););<r   c                   ^ ^	^
^^ T R                  5       nT R                  SUS9nT R                  SUS9nT R                  US9nT R                  US9n[        R                  " [        U5      [        U5      /5      nT R                  UR                  SU-  5      5        SU-  mT R                  T R                  R                  [        5      S9mT R                  (       a&  [        S[        U5      -  S[        U5      -  /5      m
O%[        S[        U5      -  S[        U5      -  /5      m
[        5       m	[        [        S	S
S9U	U
UU U4S j5       nU" 5         T R!                  T R"                  [        U5      /-   SS9nT R%                  [&        R(                  " U5      T R*                  5        T R!                  T R"                  [        U5      /-   SS9nT R%                  [&        R(                  " U5      T R*                  5        g)z.Tests setting CORS on a wildcarded bucket URI.bucket)prefix)bucket_namez(gs://%sgsutil-test-test-set-wildcard-nonz%s*r<   zUpdating %szSetting CORS on %s/...   rP   )triestimeout_secsc                    > TR                  TR                  TT/-   SS9n U R                  5       nU H(  nSU;   d  SU;   d  SU;   a  M  TR                  U5        M*     T HZ  nTR                  (       a  TR                  X 5        M'  TR                  UT5        TR                  U R                  S5      S5        M\     g)	z7Ensures expect set lines are present in command output.T)rS   z You are using a deprecated aliaszgsutil help corsz2Please use "cors" with the appropriate sub-commandzSetting CORS   N)r2   rA   
splitlinesaddr\   r5   r$   count)rW   outlineslineactualexpectedrC   r   wildcards      r   _Check19TestCors.test_set_wildcard_non_null_cors.<locals>._Check1   s     ~~d22eX5FF,0  2f""$h$.$6$&@DH


4  $##
--
%
--f
%


6<<7
; r   Tr/   N)MakeRandomTestStringMakeTempNamer1   	posixpathcommonprefixr4   
assertTrue
startswithr>   r   r@   r   r\   r   r   AssertionErrorr2   r3   r$   r%   r&   rL   )r   random_prefixbucket1_namebucket2_namerq   rr   common_prefixr   r7   r   r   rC   r   s   `        @@@@r   test_set_wildcard_non_null_cors(TestCors.test_set_wildcard_non_null_cors   s   --/M$$Xm$DL$$Xm$DL###=K###=K
 **	k	D-.0MOO  !K!."/ 	01 }$H)=)=d)CDE 
${+
+
${+
+ 	h
 
"T+%6
6
"T+%6
6 	h UF
>3< < 4<( I^^D00D4E3FF*.  0FTZZ'););<^^D00D4E3FF*.  0FTZZ'););<r   c                     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)z2Ensures CORS commands fail with too few arguments.TrP   )rS   rR   zcommand requires at leastr   N)r2   r3   r5   rA   )r   rW   s     r   testTooFewArgumentsFails!TestCors.testTooFewArgumentsFails  s     ^^D00*.,-  /F 	MM-v6 ^^D00*.,-  /F 	MM-v6 ^^VHD!^LFMM-v6r   )r   )$__name__
__module____qualname____firstlineno____doc__rA   r3   r?   rH   r[   r   toprettyxmlrU   r   r%   r&   rL   ra   rl   rm   r   r,   r8   rD   rI   rM   rX   r^   rb   ri   rn   rs   r   r   __static_attributes____classcell__)r   s   @r   r   r   "   s    +UO/UO/**K   *kk8  L  **X&- O  ::i(./M(((=49=( ( ===~7 7r   r   c                        \ rS rSrS/rS/rSrg)TestCorsOldAliasi(  setcorsgetcors N)r   r   r   r   rA   r3   r   r   r   r   r   r   (  s    K/K/r   r   )r   
__future__r   r   r   r   r%   r   xml.dom.minidomr   gslib.tests.testcaseteststestcase)gslib.tests.testcase.integration_testcaser	   gslib.tests.utilr
   r4   gslib.utils.constantsr   gslib.utils.retry_utilr   gslib.utils.translation_helperr   GsUtilIntegrationTestCaser   r   r   r   r   <module>r      sk    * & %  '   ' ' ' ? 0 & ( : :;B7x11 B7 <B7J x  r   