
    1                         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
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  ed       G d dej0                               Z G d de      Zy)#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                       e Zd ZdZddgZddgZdZdZdZ e	d      j                  d	
      ZdZ ej                  e      ZdZdZ ej                  e      Z fdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z  xZ!S )TestCorsr   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    t         t        |           d| _        y )Nzhas no CORS configuration)superr   setUpno_cors)self	__class__s    (platform/gsutil/gslib/tests/test_cors.pyr   zTestCors.setUpX   s    	(D!.DL    c                 4   | j                   }t        j                  |      }t        j                  |      }t        j                  |      }t        j
                  |      }| j                  t        j                  |      t        j                  |             y)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_translationzTestCors.test_cors_translation\   ss    I";;IFL33LAI,>>yI)>> TZZ	*DJJ7J,KLr   c                     | j                         }| j                  | j                  t        |      gz   d      }| j	                  | j
                  |       y )NTreturn_stdout)CreateBucket	RunGsUtil_get_cmd_prefixsuriassertInr   )r   
bucket_uristdouts      r   test_default_corszTestCors.test_default_corsf   sM    ""$J^^D00D4D3EE*.  0FMM$,,'r   c                 `   | j                         }| j                  | j                  j                  t                    }| j                  | j                  |t        |      gz          | j                  | j                  t        |      gz   d      }| j                  | j                  |       y NcontentsTr,   )r.   CreateTempFile
empty_doc1encoder   r/   _set_cmd_prefixr1   r0   r2   r   r   r3   fpathr4   s       r   test_set_empty_cors1zTestCors.test_set_empty_cors1l       ""$J)?)?)EFENN4''5$z2B*CCD^^D00D4D3EE*.  0FMM$,,'r   c                 `   | j                         }| j                  | j                  j                  t                    }| j                  | j                  |t        |      gz          | j                  | j                  t        |      gz   d      }| j                  | j                  |       y r7   )r.   r:   
empty_doc2r<   r   r/   r=   r1   r0   r2   r   r>   s       r   test_set_empty_cors2zTestCors.test_set_empty_cors2t   rA   r   c                    | j                         }| j                  | j                  j                  t                    }| j                  | j                  |t        |      gz          | j                  | j                  t        |      gz   d      }| j                  t        j                  |      | j                         y r7   )r.   r:   r   r<   r   r/   r=   r1   r0   r"   r#   r$   cors_json_objr>   s       r   test_non_null_corsz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                     | j                         }| j                  | j                  j                  t                    }| j                  | j                  |t        |      gz   dd      }| j                  d|       y )Nr8      Texpected_statusreturn_stderrXML CORS data provided)	r.   r:   xml_cors_docr<   r   r/   r=   r1   r2   r   r3   r?   stderrs       r   test_bad_cors_xmlzTestCors.test_bad_cors_xml   sx    ""$J):):)A)A$)GHE^^D00"D$456,-*.  0F 	MM*F3r   c                 <   | j                         }| j                  | j                  j                  t                    }| j                  | j                  |t        |      gz   dd      }| j                  r| j                  d|       y | j                  d|       y )Nr8   rI   TrJ   zFound invalid JSON/YAMLrM   )r.   r:   cors_badr<   r   r/   r=   r1   _use_gcloud_storager2   assertNotInrO   s       r   test_bad_corszTestCors.test_bad_cors   s    ""$J)=)=d)CDE^^D00"D$456,-*.  0F
 
mm-v6
/8r   c                 <   | j                         }| j                  | j                  j                  t                    }| j                  | j                  |t        |      gz   dd      }| j                  r| j                  d|       y | j                  d|       y )Nr8   rI   TrJ   z%'str' object has no attribute 'items'zshould be formatted as a list)
r.   r:   cors_doc_not_nested_in_listr<   r   r/   r=   r1   rT   r2   rO   s       r   &test_cors_doc_not_wrapped_in_json_listz/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                    | j                         }| j                         }| j                  || j                        }| j	                  | j
                  |t        |      gz          | j	                  | j                  t        |      gz   d      }| j                  t        j                  |      | j                         | j                  || j                        }| j	                  | j
                  |t        |      gz          | j	                  | j                  t        |      gz   d      }| j                  | j                  |       y)z$Tests setting CORS then removing it.tmpdirr9   Tr,   N)r.   CreateTempDirr:   r   r/   r=   r1   r0   r"   r#   r$   rF   r;   r2   r   r   r3   r\   r?   r4   s        r   test_set_cors_and_resetz 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                    | j                         }| j                         }| j                  || j                        }| j	                  | j
                  |t        |      gz          | j	                  | j                  t        |      gz   d      }| j                  t        j                  |      | j                         | j                  || j                        }| j	                  | j
                  |t        |      gz          | j	                  | j                  t        |      gz   d      }| j                  | j                  |       y)z;Tests setting CORS without maxAgeSeconds, then removing it.r[   Tr,   N)r.   r]   r:   	cors_doc2r/   r=   r1   r0   r"   r#   r$   cors_json_obj2r;   r2   r   r^   s        r   test_set_partial_cors_and_resetz(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                 F   | j                         }| j                         }| j                  | j                        }| j                  | j                  |t        |      t        |      gz          | j                  | j                  t        |      gz   d      }| j                  t        j                  |      | j                         | j                  | j                  t        |      gz   d      }| j                  t        j                  |      | j                         y)z,Tests setting different CORS configurations.r8   Tr,   N)r.   r:   r   r/   r=   r1   r0   r"   r#   r$   rF   )r   bucket1_uribucket2_urir?   r4   s        r   test_set_multi_non_null_corsz%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                 2   	
  j                         } j                  d|      } j                  d|      } j                  |      } j                  |      }t        j                  t        |      t        |      g      } j                  |j                  d|z               d|z   j                   j                  j                  t                     j                  r&t        dt        |      z  dt        |      z  g      
n%t        dt        |      z  dt        |      z  g      
t               	t        t        d	d
      	
 fd       } |         j!                   j"                  t        |      gz   d      } j%                  t'        j(                  |       j*                          j!                   j"                  t        |      gz   d      } j%                  t'        j(                  |       j*                         y)z.Tests setting CORS on a wildcarded bucket URI.bucket)prefix)bucket_namez(gs://%sgsutil-test-test-set-wildcard-nonz%s*r8   zUpdating %szSetting CORS on %s/...   rI   )triestimeout_secsc                  f   j                  j                  gz   d      } | j                         }|D ]   }d|v sd|v sd|v rj                  |       " D ]T  }j                  rj                  ||        "j                  |       j                  | j                  d      d       V y)	z7Ensures expect set lines are present in command output.T)rL   z You are using a deprecated aliaszgsutil help corsz2Please use "cors" with the appropriate sub-commandzSetting CORS   N)r/   r=   
splitlinesaddrT   r2   r"   count)rP   outlineslineactualexpectedr?   r   wildcards      r   _Check1z9TestCors.test_set_wildcard_non_null_cors.<locals>._Check1   s     ~~d22eX5FF,0  2f""$h$.$6$&@DH


4  $##
--f
%
--f
%


6<<7
; r   Tr,   N)MakeRandomTestStringMakeTempNamer.   	posixpathcommonprefixr1   
assertTrue
startswithr:   r   r<   r   rT   r   r   AssertionErrorr/   r0   r"   r#   r$   rF   )r   random_prefixbucket1_namebucket2_namere   rf   common_prefixry   r4   rv   rw   r?   rx   s   `        @@@@r   test_set_wildcard_non_null_corsz(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                    | j                  | j                  dd      }| j                  d|       | j                  | j                  dd      }| j                  d|       | j                  dgdd      }| j                  d|       y)z2Ensures CORS commands fail with too few arguments.TrI   )rL   rK   zcommand requires at leastr   N)r/   r0   r2   r=   )r   rP   s     r   testTooFewArgumentsFailsz!TestCors.testTooFewArgumentsFails  s     ^^D00*.,-  /F 	MM-v6 ^^D00*.,-  /F 	MM-v6 ^^VHD!^LFMM-v6r   )"__name__
__module____qualname____doc__r=   r0   r;   rC   rS   r   toprettyxmlrN   r   r#   r$   rF   rX   ra   rb   r   r*   r5   r@   rD   rG   rQ   rV   rY   r_   rc   rg   r   r   __classcell__)r   s   @r   r   r   "   s    +UO/UO/**K   *kk8  L  $**X&- O  4::i(./M(((=49=( ( ===~7r   r   c                       e Zd ZdgZdgZy)TestCorsOldAliassetcorsgetcorsN)r   r   r   r=   r0    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
   r1   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   