
    (                     t   d Z ddlmZ ddlZddl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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 ddlmZmZ  e eddd             ddlmZ  G d dej@                        Z! G d dejD                        Z# G d dejH                        Z%y)zTests for rpo command.    )absolute_importN)
RpoCommand)CommandException)
GcsJsonApi)StorageUrlFromString)	SkipForGS)SkipForJSON)
SkipForXML)ObjectToURI)SetBotoConfigForTest)SetEnvironmentForTest)	shim_util)add_moveMovedModulemockzunittest.mock)r   c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)TestRpoUnitc                     | j                  d      }| j                  d      }| j                  ddt        |      t        |      gd      }t        j                  d      }| j                  ||       y )	Nrpofoobucket_namerpobarrpogetTreturn_stdoutz6      gs://rpofoo: None
      gs://rpobar: None
      )CreateBucket
RunCommandsuritextwrapdedentassertEqual)selfbucket_uri1bucket_uri2stdoutexpected_strings        'platform/gsutil/gslib/tests/test_rpo.py&test_get_for_multiple_bucket_calls_apiz2TestRpoUnit.test_get_for_multiple_bucket_calls_api+   s|    ###9K###9K__	[!4#45  F oo '
 O 	_f-    c                 4   | j                  d       | j                  d       | j                  dddgd      }d	j                  t        |j	                         j                  d	                  }t        j                  d
      }| j                  ||       y )Nboo1r   boo2r   r   	gs://boo*Tr   
z+      gs://boo1: None
      gs://boo2: None)	r   r   joinsortedstripsplitr    r!   r"   )r#   r&   actualr'   s       r(   test_get_with_wildcardz"TestRpoUnit.test_get_with_wildcard8   s    &)&)__UUK$8_MFYYvflln22489:Foo ' O 	V_-r*   c                     | j                  t        d      5  | j                  dddg       d d d        y # 1 sw Y   y xY w)NzNo URLs matchedr   r   zgs://invalid*assertRaisesRegexr   r   r#   s    r(   $test_get_with_wrong_url_raises_errorz0TestRpoUnit.test_get_with_wrong_url_raises_errorB   s4    			 02C	D
ooee_56 
E	D	D   5>c                     | j                  t        d      5  | j                  dg d       d d d        y # 1 sw Y   y xY w)NDInvalid value for rpo set. Should be one of \(ASYNC_TURBO\|DEFAULT\)r   )setrandomr.   r7   r9   s    r(   1test_set_called_with_incorrect_value_raises_errorz=TestRpoUnit.test_set_called_with_incorrect_value_raises_errorF   s7    			O
 ooe;<	
 
 
r;   c                     | j                  t        d      5  | j                  dg d       d d d        y # 1 sw Y   y xY w)Nr=   r   )r>   async_turbor.   r7   r9   s    r(   2test_set_called_with_lower_case_value_raises_errorz>TestRpoUnit.test_set_called_with_lower_case_value_raises_errorM   s7    			O
 ooe@A	
 
 
r;   c                     | j                  t        d      5  | j                  dg d       d d d        y # 1 sw Y   y xY w)Nz.Invalid subcommand "blah", use get|set insteadr   )blahDEFAULTr.   r7   r9   s    r(   $test_invalid_subcommand_raises_errorz0TestRpoUnit.test_invalid_subcommand_raises_errorT   s9    			J
L
ooe=>
L 
L 
Lr;   N)	__name__
__module____qualname__r)   r5   r:   r@   rC   rG    r*   r(   r   r   )   s!    ..7=B?r*   r   c                       e Zd Zd Zd Zy)TestRpoUnitWithShimc           	         d}t        ddg      5  t        d|d      5  | j                  d       | j                  dd	d
gd      }dj	                  |j
                  d         }| j                  dj                  t        j                  d      d      |       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nfake_dirGSUtiluse_gcloud_storageTruerQ   hidden_shim_modedry_runrS   (CLOUDSDK_CORE_PASS_CREDENTIALS_TO_GSUTILCLOUDSDK_ROOT_DIRzfake-bucket-get-rpo-1r   r   r   zgs://fake-bucket-get-rpo-1Targsreturn_log_handlerr/   infozGcloud Storage Command: {} storage buckets list --format=value[separator=": "](format("gs://{}", name),rpo.yesno(no="None")) --rawz{}
r   r   r   r   r0   messagesassertInformatr   _get_gcloud_binary_pathr#   fake_cloudsdk_dirmock_log_handler
info_liness       r(   9test_shim_translates_recovery_point_objective_get_commandzMTestRpoUnitWithShim.test_shim_translates_recovery_point_objective_get_command\   s    "	GHJ 
K 6<0" 	 	&=>??56# + %
 YY/88@A
 vi??
K#%&0	2	
K 
K	 	
K 
Ks#   B8A<B,B8,B5	1B88Cc           	         d}t        ddg      5  t        d|d      5  | j                  d       | 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)NrO   rP   rT   rS   rW   zfake-bucket-set-rpor   r   )r>   rF   zgs://fake-bucket-set-rpoTrZ   r/   r]   zTGcloud Storage Command: {} storage buckets update --recovery-point-objective DEFAULTr^   rc   s       r(   9test_shim_translates_recovery_point_objective_set_commandzMTestRpoUnitWithShim.test_shim_translates_recovery_point_objective_set_commandr   s    "	GHJ 
K 6<0" 	 	&;<???# + %
 YY/88@A
BCI622:>D@AK	M	
K 
K	 	
K 
Ks#   B7A;B+B7+B4	0B77C N)rH   rI   rJ   rg   ri   rK   r*   r(   rM   rM   Z   s    2,Mr*   rM   c                      e Zd ZdZd Z ed      d        Z ed      d        Z ed      d        Z ed      d        Z	 ed      d        Z
 ed	      d
        Z ed	      d        Z ed      d        Z ed      d        Zy)
TestRpoE2Ez"Integration tests for rpo command.c                 p    	 | j                  |dd       y# t        $ r | j                  |dd       Y yw xY w)z.Checks if the rpo get command returns default.r   rF   NoneN)VerifyCommandGetAssertionErrorr#   
bucket_uris     r(   #_verify_get_returns_default_or_nonez.TestRpoE2E._verify_get_returns_default_or_none   s:    7
Jy9 7
Jv67s    55zRPO only runs on GCS JSON API.c                 J    | j                  d      }| j                  |       y )Nnam4location)r   rr   rp   s     r(   /test_get_returns_default_for_dual_region_bucketz:TestRpoE2E.test_get_returns_default_for_dual_region_bucket   s#    ""F"3J,,Z8r*   c                 N    | j                  d      }| j                  |dd       y )Nus-central1ru   r   rm   )r   rn   rp   s     r(   )test_get_returns_none_for_regional_bucketz4TestRpoE2E.test_get_returns_none_for_regional_bucket   s'    ""M":J*eV4r*   c                     | j                  d      }| j                  |       | j                  dddt        |      g       | j	                  |dd       y )Nrt   ru   r   r>   ASYNC_TURBO)r   rr   	RunGsUtilr   rn   rp   s     r(   test_set_and_get_async_turboz'TestRpoE2E.test_set_and_get_async_turbo   sO    ""F"3J,,Z8NNE5-j1ABC*e];r*   c                     | j                  d      }| j                  dddt        |      g       | j                  |dd       | j                  dddt        |      g       | j	                  |       y )Nrt   ru   r   r>   r|   rF   )r   r}   r   rn   rr   rp   s     r(   test_set_defaultzTestRpoE2E.test_set_default   si    ""F"3JNNE5-j1ABC*e];NNE5)T*-=>?,,Z8r*   c                     | j                  d      }| j                  dddt        |      gdd      }| j                  d	|       y )
Nry   ru   r   r>   r|      T)expected_statusreturn_stderrz.ASYNC_TURBO cannot be enabled on REGION bucket)r   r}   r   r`   r#   rq   stderrs      r(   /test_set_async_turbo_fails_for_regional_bucketsz:TestRpoE2E.test_set_async_turbo_fails_for_regional_buckets   sR    ""M":J^^UE=!*-/,-*.  0F 	MMBFKr*   zTesting XML only behavior.c                     g d}t        |      5  d}| j                  ddd|gdd      }| j                  d	|       d d d        y # 1 sw Y   y xY w)
N)Credentialsgs_oauth2_refresh_tokenN)r   gs_service_client_idN)r   gs_service_key_fileN)r   gs_service_key_file_passwordN)r   gs_access_key_iddummykey)r   gs_secret_access_keydummysecretgs://any-bucket-namer   r>   defaultTr   r   r   3command can only be with the Cloud Storage JSON APIr   r}   r`   r#   boto_config_hmac_auth_onlyrq   r   s       r(   test_xml_fails_for_setz!TestRpoE2E.test_xml_fails_for_set   s^    	" 
8	9)j~~ueY
C,0./  1f mmI 
:	9	9s   -AAc                     g d}t        |      5  d}| j                  dd|gdd      }| j                  d|       d d d        y # 1 sw Y   y xY w)	Nr   r   r   r   Tr   r   r   r   r   s       r(   test_xml_fails_for_getz!TestRpoE2E.test_xml_fails_for_get   s\    	" 
8	9)j~~ueZ8,0./  1f mmI 
:	9	9s   ,AAzTesting S3 only behavior.c                     | j                         }| j                  dddt        |      gdd      }| j                  r| j	                  d|       y | j	                  d|       y )	Nr   r>   rF   Tr   r   z<Features disallowed for S3: Setting Recovery Point Objective(command can only be used for GCS buckets)r   r}   r   _use_gcloud_storager`   r   s      r(   test_s3_fails_for_setz TestRpoE2E.test_s3_fails_for_set   sh    ""$J^^	y$z"23  F
 
mm
H
 mm>Gr*   c                     | j                         }| j                  rdnd}| j                  ddt        |      gdd|      \  }}| j                  r| j	                  d|       y | j	                  d|       y )	Nr   r   r   r   T)r   r   r   zgs://None: Noner   )r   r   r}   r   r`   )r#   rq   r   r&   r   s        r(   test_s3_fails_for_getz TestRpoE2E.test_s3_fails_for_get   sw    ""$J33aO^^	tJ'('	 $ )NFF
 
mm%v.
mm>Gr*   N)rH   rI   rJ   __doc__rr   r
   rw   rz   r~   r   r   r	   r   r   r   r   r   rK   r*   r(   rk   rk      s    *7 ./9 09 ./5 05 ./< 0< ./9 09 ./L 0L +, -( +, -( ()H *H ()H *Hr*   rk   )&r   
__future__r   osr    gslib.commands.rpor   gslib.exceptionr   gslib.gcs_json_apir   gslib.storage_urlr   gslib.tests.testcaseteststestcase)gslib.tests.testcase.integration_testcaser   r	   r
   gslib.tests.utilr   r   r   r   gslib.utilsr   sixr   r   	six.movesr   GsUtilUnitTestCaser   ShimUnitTestBaserM   GsUtilIntegrationTestCaserk   rK   r*   r(   <module>r      s     & 	  ) , ) 2 ' ' ? A @ 0 1 2 ! % VV_	5 6 .?(-- .?b*M(33 *MZxH33 xHr*   