
    07                     P   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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5       " S S\R>                  5      5       r  " S S\RB                  5      r"g)(Integration tests for lifecycle command.    )absolute_import)print_function)division)unicode_literalsN)mock)parseString)ApiSelector)	SkipForS3)ObjectToURI)SetBotoConfigForTest)SetEnvironmentForTest)unittest)Retry)LifecycleTranslation)	shim_utilz2Lifecycle command is only supported for gs:// URLsc                      \ rS rSrSrSr\" S5      R                  SS9rSr	Sr
\R                  " \
5      rS	\
R                  5       -   S
-   rSrSr\R                  " \5      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!g)TestSetLifecycle(   r   z{}z}<LifecycleConfiguration><Rule><Action><Delete/></Action><Condition><Age>365</Age></Condition></Rule></LifecycleConfiguration>z    )indentzC{"rule": [{"action": {"type": "Add"}, "condition": {"age": 365}}]}
z{"rule": [{"action": {"type": "Delete"}, "condition": {"age": 365}}, {"action": {"type": "SetStorageClass", "storageClass": "NEARLINE"}, "condition": {"matchesStorageClass": ["STANDARD"], "age": 366}}]}
z{"lifecycle": z}
zF{"rule": [{"action": {"type": "Delete"}, "condition": {"age": 365}}]}
zY{"rule": [{"action": {"type": "Delete"}, "condition": {"createdBefore": "2014-10-01"}}]}
zk{"rule": [{"action": {"type": "Delete"}, "condition": {"age": 0, "isLive": false, "numNewerVersions": 0}}]}zhas no lifecycle configuration.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)z0Tests lifecycle translation for various formats.N)	*lifecycle_doc_without_storage_class_fieldsr   JsonLifecycleToMessageBotoLifecycleFromMessageBotoLifecycleToMessageJsonLifecycleFromMessageassertEqualjsonloads)self	json_textentries_listboto_lifecycleconverted_entries_listconverted_json_texts         -platform/gsutil/gslib/tests/test_lifecycle.pytest_lifecycle_translation+TestSetLifecycle.test_lifecycle_translationP   sz     ??I'>>yIL)BB<PN1HH.GG TZZ	*DJJ7J,KL    c                     U R                  5       nU R                  SS[        U5      /SS9nU R                  U R                  U5        g )N	lifecyclegetTreturn_stdout)CreateBucket	RunGsUtilsuriassertInno_lifecycle_config)r    
bucket_uristdouts      r&   test_default_lifecycle'TestSetLifecycle.test_default_lifecycle^   sI    ""$J^^	eT*-.d  DFMM$**F3r)   c                     U R                  5       nU R                  U R                  R                  S5      S9nU R	                  SSU[        U5      /5        U R	                  SS[        U5      /SS9nU R                  U R                  U5        g Nasciicontentsr+   setr,   Tr-   )r/   CreateTempFile
empty_doc1encoder0   r1   r2   r3   r    r4   fpathr5   s       r&   test_set_empty_lifecycle1*TestSetLifecycle.test_set_empty_lifecycle1d   s    ""$J)?)?)HIENNKtJ/?@A^^	eT*-.d  DFMM$**F3r)   c                 H   U R                  5       nU R                  U R                  R                  S5      S9nU R	                  SSU[        U5      /5        U R	                  SS[        U5      /SS9nU R                  [        R                  " U5      U R                  5        g r9   
r/   r>   lifecycle_docr@   r0   r1   r   r   r   lifecycle_json_objrA   s       r&   test_valid_lifecycle%TestSetLifecycle.test_valid_lifecyclel   s    ""$J););)B)B7)KLENNKtJ/?@A^^	eT*-.d  DFTZZ')@)@Ar)   c                 H   U R                  5       nU R                  U R                  R                  S5      S9nU R	                  SSU[        U5      /5        U R	                  SS[        U5      /SS9nU R                  [        R                  " U5      U R                  5        g r9   )
r/   r>   lifecycle_doc_bucket_styler@   r0   r1   r   r   r   rH   rA   s       r&   !test_valid_lifecycle_bucket_style2TestSetLifecycle.test_valid_lifecycle_bucket_stylet   s    ""$J0077@   BENNKtJ/?@A^^	eT*-.d  DFTZZ')@)@Ar)   c                 H   U R                  5       nU R                  U R                  R                  S5      S9nU R	                  SSU[        U5      /5        U R	                  SS[        U5      /SS9nU R                  [        R                  " U5      U R                  5        g r9   )
r/   r>   lifecycle_created_before_docr@   r0   r1   r   r   r   !lifecycle_created_before_json_objrA   s       r&   test_created_before_lifecycle.TestSetLifecycle.test_created_before_lifecycle}   s    ""$J2299'B   DENNKtJ/?@A^^	eT*-.d  DFTZZ')O)OPr)   c                     U R                  5       nU R                  U R                  R                  S5      S9nU R	                  SSU[        U5      /SSS9nU R                  SU5        g 	Nr:   r;   r+   r=      T)expected_statusreturn_stderrzXML lifecycle data provided)r/   r>   bad_docr@   r0   r1   assertNotInr    r4   rB   stderrs       r&   test_bad_lifecycle#TestSetLifecycle.test_bad_lifecycle   so    ""$J)<)<W)EFE^^	eUD$45  F 	2F;r)   c                     U R                  5       nU R                  U R                  R                  S5      S9nU R	                  SSU[        U5      /SSS9nU R                  SU5        g rU   )r/   r>   xml_docr@   r0   r1   r2   r[   s       r&   test_bad_xml_lifecycle'TestSetLifecycle.test_bad_xml_lifecycle   sm    ""$J)<)<W)EFE^^	eUD$45  F 	MM/8r)   c                 T   U R                  5       nU R                  U R                  R                  S5      S9nU R	                  SSU[        U5      /5        U R	                  SS[        U5      /SS9nU R                  US5        U R                  US	5        U R                  US
5        g )Nr:   r;   r+   r=   r,   Tr-   z
"age":\s+0z"isLive":\s+falsez"numNewerVersions":\s+0)r/   r>   %lifecycle_with_falsy_condition_valuesr@   r0   r1   assertRegexrA   s       r&   1test_translation_for_falsy_values_works_correctlyBTestSetLifecycle.test_translation_for_falsy_values_works_correctly   s    ""$J;;BB7K   ME 	NNKtJ/?@A^^	eT*-.d  DF
 	V]+V12V78r)   c                 h   U R                  5       nU R                  5       nU R                  UU R                  R	                  S5      S9nU R                  SSU[        U5      /5        U R                  SS[        U5      /SS9nU R                  [        R                  " U5      U R                  5        U R                  UU R                  R	                  S5      S9nU R                  SSU[        U5      /5        U R                  SS[        U5      /SS9nU R                  U R                  U5        g)	z6Tests setting and turning off lifecycle configuration.r:   )tmpdirr<   r+   r=   r,   Tr-   N)r/   CreateTempDirr>   rG   r@   r0   r1   r   r   r   rH   r?   r2   r3   )r    r4   ri   rB   r5   s        r&   test_set_lifecycle_and_reset-TestSetLifecycle.test_set_lifecycle_and_reset   s%   ""$J!Fv)-););)B)B7)K   MENNKtJ/?@A^^	eT*-.d  DFTZZ')@)@Av)-)?)?)H   JENNKtJ/?@A^^	eT*-.d  DFMM$**F3r)   c           	         U R                  5       nU R                  5       nU R                  U R                  R                  S5      S9nU R	                  SSU[        U5      [        U5      /5        U R	                  SS[        U5      /SS9nU R                  [        R                  " U5      U R                  5        U R	                  SS[        U5      /SS9nU R                  [        R                  " U5      U R                  5        g)	z:Tests setting lifecycle configuration on multiple buckets.r:   r;   r+   r=   r,   Tr-   NrF   )r    bucket1_uribucket2_urirB   r5   s        r&    test_set_lifecycle_multi_buckets1TestSetLifecycle.test_set_lifecycle_multi_buckets   s    ##%K##%K););)B)B7)KLENN	eU	k		k		 ^^	eT+./t  EFTZZ')@)@A^^	eT+./t  EFTZZ')@)@Ar)   c                   ^ ^^^	^
^ T R                   [        R                  :X  a  [        R                  " S5      $ T R                  5       nT R                  SUS9nT R                  SUS9nT R                  US9mT R                  US9m	[        R                  " [        T5      [        T	5      /5      nT R                  UR                  SU-  5      5        SU-  mT R                  T R                  R                  S5      S9m
[!        5       m[#        [$        S	S
S9UUU	U
U U4S j5       nU" 5         T R'                  SS[        T5      /SS9nT R)                  [*        R,                  " U5      T R.                  5        T R'                  SS[        T	5      /SS9nT R)                  [*        R,                  " U5      T R.                  5        g)z5Tests setting lifecycle with a wildcarded bucket URI.zjXML wildcard behavior can cause test to flake if a bucket in the same project is deleted during execution.bucket)prefix)bucket_namez/gs://%sgsutil-test-test-set-lifecycle-wildcard-z%s*r:   r;      rV   )triestimeout_secsc                    > TR                  SSTT/SS9n TR                  U R                  5       5        TR                  (       a?  TR	                  S[        T5      -  U 5        TR	                  S[        T5      -  U 5        SnO9[        S[        T5      -  S[        T5      -  /5      nTR                  UT5        SnTR                  U R                  U5      S	5        g )
Nr+   r=   T)rX   zUpdating %s/...Updatingz)Setting lifecycle configuration on %s/...zSetting lifecycle configuration   )	r0   update
splitlines_use_gcloud_storager2   r1   r=   r   count)	r\   status_messageexpected_linesactual_linesrn   ro   rB   r    wildcards	      r&   _Check1=TestSetLifecycle.test_set_lifecycle_wildcard.<locals>._Check1   s    ~~{E5(C,0  2f&++-.		!	! 	'${*;;VD'${*;;VD#7${:KK7${:KK
  	6:
v||N3Q7r)   r+   r,   Tr-   N)test_apir
   XMLr   skipMakeRandomTestStringMakeTempNamer/   	posixpathcommonprefixr1   
assertTrue
startswithr>   rG   r@   r=   r   AssertionErrorr0   r   r   r   rH   )r    random_prefixbucket1_namebucket2_namecommon_prefixr   r5   r   rn   ro   rB   r   s   `      @@@@@r&   test_set_lifecycle_wildcard,TestSetLifecycle.test_set_lifecycle_wildcard   s   }}' ]] / 0 0 --/M$$Xm$DL$$Xm$DL###=K###=K
 **	k	D-.0MOO  =M	OP }$H););)B)B7)KLE5L
>38 8 48& I^^	eT+./t  EFTZZ')@)@A^^	eT+./t  EFTZZ')@)@Ar)    N)"__name__
__module____qualname____firstlineno____doc__r?   r	   toprettyxmlr`   rY   rG   r   r   rH   rstriprL   r   rP   rQ   rd   r3   r'   r6   rC   rI   rM   rR   r]   ra   rf   rk   rp   r   __static_attributes__r   r)   r&   r   r   (   s    0*)* +6+V+*D	 
 M 
M 
 zz-0 0=3G3G3I I %!&
 P --  '+jj1M&N#= ( :M44BBQ<994$B ;Br)   r   c                   j    \ rS rSrSrS r\R                  " S\R                  " 5       S9S 5       r	Sr
g)	TestLifecycleUnitTestsWithShimi  z*Unit tests for gsutil lifecycle with shim.c           
         U R                  5       n[        SS/5         [        SSS.5         U R                  SS[	        U5      /SS	9nS
R                  UR                  S   5      nU R                  SR                  [        R                  " S5      [	        U5      5      U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)NGSUtiluse_gcloud_storageTruer   hidden_shim_modedry_runr   fake_dir(CLOUDSDK_CORE_PASS_CREDENTIALS_TO_GSUTILCLOUDSDK_ROOT_DIRr+   r,   Targsreturn_log_handler
infozGcloud Storage Command: {} storage buckets describe --format=gsutiljson[key=lifecycle_config,empty=' has no lifecycle configuration.',empty_prefix_key=storage_url] {})r/   r   r   
RunCommandr1   joinmessagesr2   formatr   _get_gcloud_binary_path)r    r4   mock_log_handler
info_liness       r&   ,test_shim_translates_lifecycle_get_correctlyKTestLifecycleUnitTestsWithShim.test_shim_translates_lifecycle_get_correctly
  s    ""$J	GHJ 
K 6<)" 	  ??;/4/3J/?1- ?C + D YY/88@A
 F9<<ZH!%j!134>	@	
K 
K	 	
K 
Ks#   C	A:B8'C	8
C	C		
Cz=gslib.commands.lifecycle.LifecycleCommand._SetLifecycleConfig)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)Nr   r   r   r   r   r+   )r=   zfake-lifecycle-config.jsonzgs://fake-bucket1zgs://fake-bucket2Tr   r   r   zGcloud Storage Command: {} storage buckets update --lifecycle-file=fake-lifecycle-config.json gs://fake-bucket1 gs://fake-bucket2)	r   r   r   r   r   r2   r   r   r   )r    r   r   s      r&   ,test_shim_translates_lifecycle_set_correctlyKTestLifecycleUnitTestsWithShim.test_shim_translates_lifecycle_set_correctly   s     
GHJ 
K 6<)" 	  ??;1- ?C + D YY/88@A
 >?Ev$<<ZH@J 		"	
K 
K	 	
K 
Ks#   B&A'BB&
B#	B&&
B4r   N)r   r   r   r   r   r   r   patchMockr   r   r   r)   r&   r   r     s4    2@, ::M))+""r)   r   )#r   
__future__r   r   r   r   r   osr   r   r   xml.dom.minidomr	   gslib.cs_api_mapr
   gslib.tests.testcaseteststestcase)gslib.tests.testcase.integration_testcaser   gslib.tests.utilr   r1   r   r   gslib.utils.retry_utilr   gslib.utils.translation_helperr   gslib.utilsr   GsUtilIntegrationTestCaser   ShimUnitTestBaser   r   r)   r&   <module>r      s    / & %  '  	   ' ( ' ' ? 0 1 2 % ( ? ! ?@[Bx99 [B A[B|/"X%>%> /"r)   