
    5.                     x   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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r!Sr"Sr#Sr$S r%\" S5       " S S\RL                  5      5       r'\" S5       " S S\RL                  5      5       r(g)$Integration tests for label command.    )absolute_import)print_function)division)unicode_literalsN)parseString)_exceptions)handler)Tags)CommandException)	SkipForGS)	SkipForS3)ObjectToURI)Retry)UTF8key_onekey_two	value_one	value_twoc                 T    U (       a  SR                  U5      $ SR                  U5      $ )NzUpdating {}z%Setting label configuration on {}/...)format)using_gcloud_storage
bucket_uris     )platform/gsutil/gslib/tests/test_label.py_get_label_setting_outputr   .   s)    /-396*3EF
166*3EF    z#Tests use S3-style XML passthrough.c                      ^  \ rS rSrSr\" S\-   S-   \-   S-   S-   \-   S-   \	-   S-   S-   5      R                  SS	9rU 4S
 jrS rS rS rS rSrU =r$ )TestLabelS33   zDS3-specific tests. Most other test cases are covered in TestLabelGS.z<Tagging><TagSet><Tag><Key>z</Key><Value>z</Value></Tag>z
<Tag><Key>z</TagSet></Tagging>z    )indentc                    > [         [        U ]  5         U R                  U R                  R                  [        5      S9U l        g Ncontents)superr   setUpCreateTempFile
_label_xmlencoder   	xml_fpathself	__class__s    r   r&   TestLabelS3.setUp=   s4    	+t"$(($//2H2H2N(ODNr   c                 t    [         R                  (       a  U R                  X5        g U R                  X5        g )N)sixPY2assertItemsEqualassertCountEqual)r,   item1item2s      r   DoAssertItemsMatchTestLabelS3.DoAssertItemsMatchA   s'    
ww
E) E)r   c           
         0 n[        5       n[        R                  " US 5      n [        R                  R                  X5        U H$  nU H  nUR                  X'R                  '   M     M&     U$ ! [        R                   aF  n[        SUR                  5       < SUR                  5       < SUR                  5       < 35      eS nAff = f)Nz,Requested labels/tagging config is invalid: z	 at line z	, column )r   r
   
XmlHandlerxmlsaxr   SaxExceptionsSAXParseExceptionr   
getMessagegetLineNumbergetColumnNumbervaluekey)r,   xml_str
label_dict	tags_listhetagset_listtags           r   _LabelDictFromXmlString#TestLabelS3._LabelDictFromXmlStringH   s    JI9d+AK	gg'%
 !#!ii
77  !  ** K,,.!//"3Q5F5F5HJK KKs   A0 0C
ACC
c                 z  ^ ^ T R                  5       mT R                  SST R                  [        T5      /SS9n[	        T R
                  [        T5      5      nT R
                  (       a  T R                  X!5        O T R                  UR                  5       U5        [        [        SSS9UU 4S j5       nU" 5         g )	NlabelsetTreturn_stderr      triestimeout_secsc                     > TR                  SS[        T5      /SS9n TR                  TR                  U 5      TR                  TR                  5      5        g NrM   getTreturn_stdout	RunGsUtilsurir6   rJ   r(   stdoutr   r,   s    r   _Check1*TestLabelS3.testSetAndGet.<locals>._Check1e   U    ~~wtJ/?@,0  2f
d::6B"::4??KMr   )CreateBucketr\   r*   r]   r   _use_gcloud_storageassertInassertEqualstripr   AssertionError)r,   stderrexpected_outputr`   r   s   `   @r   testSetAndGetTestLabelS3.testSetAndGetW   s    ""$J^^WeT^^!*-/*.  0F 00H0H04Z0@BO
mmO,
v||~7 >3M 4M Ir   c                   ^ ^^ T R                  5       mT R                  SSS[        < S[        < 3S[        < S[
        < 3[        T5      /5        [        [        SSS9UU 4S j5       nU" 5         T R                  SSS	[        SS
S	S[        T5      /	5        [        [
        SS0m[        [        SSS9UUU 4S j5       nU" 5         g )NrM   ch-l:rQ   rR   rS   c                     > TR                  SS[        T5      /SS9n TR                  TR                  U 5      TR                  TR                  5      5        g rW   r[   r^   s    r   r`   #TestLabelS3.testCh.<locals>._Check1y   rb   r   -dznew_key:new_valueznonexistent-keynew_key	new_valuec                     > TR                  SS[        T5      /SS9n TR                  TR                  U 5      T5        g rW   )r\   r]   r6   rJ   )r_   r   expected_dictr,   s    r   _Check2#TestLabelS3.testCh.<locals>._Check2   sE    ~~wtJ/?@,0  2f
d::6B+-r   )	rc   r\   KEY1VALUE1KEY2VALUE2r]   r   rh   )r,   r`   rx   r   rw   s   `  @@r   testChTestLabelS3.testChn   s    ""$JNNt $ Z	  >3M 4M I 	NNtT4)<dZ 
 69k:M
>3- 4- Ir   )r*   )__name__
__module____qualname____firstlineno____doc__r   rz   r{   r|   r}   toprettyxmlr(   r&   r6   rJ   rk   r~   __static_attributes____classcell__r-   s   @r   r   r   3   s    L=D*+-346FG'(*./1@ACIJ ,, 1	1 2 3>+V+2L	 P*.$ $r   r   zTests use GS-style c                   b   ^  \ rS rSrSr\\\\0r	U 4S jr
S rS rS rS rS rS	 rS
 rSrU =r$ )TestLabelGS   r   c                    > [         [        U ]  5         U R                  [        R
                  " U R                  5      R                  [        5      S9U l	        g r"   )
r%   r   r&   r'   jsondumps_label_dictr)   r   
json_fpathr+   s    r   r&   TestLabelGS.setUp   sD    	+t"$))D,,-44T: * <DOr   c                    U R                  5       nU R                  SSU R                  [        U5      /SS9n[	        U R
                  [        U5      5      nU R
                  (       a  U R                  X25        O U R                  UR                  5       U5        U R                  SS[        U5      /SS9nU R                  [        R                  " U5      U R                  5        g )NrM   rN   TrO   rX   rY   )rc   r\   r   r]   r   rd   re   rf   rg   assertDictEqualr   loadsr   )r,   r   ri   rj   r_   s        r   testSetAndGetOnOneBucket$TestLabelGS.testSetAndGetOnOneBucket   s    ""$J ^^WeT__!*-/*.  0F 00H0H04Z0@BO
mmO,
v||~7^^WeT*-=>*.  0FF+T-=-=>r   c           	         U R                  5       nU R                  5       nU R                  SSU R                  [        U5      [        U5      /SS9n[	        UR                  5       5      n[	        [        U R                  [        U5      5      [        U R                  [        U5      5      /5      nU R                  (       a.  U R                  [        U Vs/ s H  ofU;   PM	     sn5      5        g U R                  XE5        g s  snf )NrM   rN   TrO   )rc   r\   r   r]   rN   
splitlinesr   rd   
assertTrueallassertSetEqual)r,   r   bucket2_uriri   actualexpectedxs          r   %testSetOnMultipleBucketsInSameCommand1TestLabelGS.testSetOnMultipleBucketsInSameCommand   s    ""$J##%K ^^	%	j		k		 	  F
 ""$%F!$":":D<LM!$":":D<MN H 
ooc91;9:;
&+ :s   Dc                    U R                  5       nU R                  SSU R                  [        U5      /5        SnSnSnSnX$X5[        S0nU R                  [        R                  " U5      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5        g )NrM   rN   	new_key_1	new_key_2new_value_1new_value_2#different_value_for_an_existing_keyasciir#   rX   TrY   )rc   r\   r   r]   rz   r'   r   r   r)   r   r   )	r,   r   r   r   r   r   new_jsonnew_json_fpathr_   s	            r   testSetOverwritesOldLabelConfig+TestLabelGS.testSetOverwritesOldLabelConfig   s    ""$JNNGUDOOT*5EFGIIKK3H
 ((H%,,W5 ) 7NNNGUND4DEF^^WeT*-=>*.  0FF+X6r   c                    U R                  5       nS[        < S[        < 3S[        < S[        < 3/nU R                  SS/U-   [        U5      /-   SS9n[        U R                  [        U5      5      nU R                  (       a  U R                  XC5        O U R                  UR                  5       U5        U R                  SS[        U5      /SS9nU R                  [        R                  " U5      U R                  5        S	nS
nU R                  SSSU< SU< 3S[        [        U5      /5        U R                  SS[        U5      /SS9n[        R                  " U5      n[        [        Xg0n	U R                  X5        g )Nro   rp   rM   rn   TrO   rX   rY   znew-keyz	new-valuers   )rc   rz   r{   r|   r}   r\   r]   r   rd   re   rf   rg   r   r   r   r   )
r,   r   
ch_subargsri   rj   r_   rt   ru   r   r   s
             r   testInitialAndSubsequentCh&TestLabelGS.testInitialAndSubsequentCh   sl   ""$Jv& J ^^WdOj8D<L;MM*.  0F/0H0H04Z0@BO
mmO,
v||~7 ^^WeT*-=>*.  0FF+T-=-=> GINNtI&dZ 
 ^^WeT*-=>*.  0FZZFfg1H*r   c           	         [        U R                  5       5      [        U R                  5       5      /nS[        < S[        < 3S[        < S[
        < 3/nU R                  SS/U-   U-   SS9n[        UR                  5       5      n[        U Vs/ s H  n[        U R                  U5      PM     sn5      nU R                  (       a.  U R                  [        U Vs/ s H  owU;   PM	     sn5      5        OU R                  XF5        U HF  nU R                  SSU/SS9nU R                  [        R                   " U5      U R"                  5        MH     g s  snf s  snf )	Nro   rp   rM   rn   TrO   rX   rY   )r]   rc   rz   r{   r|   r}   r\   rN   r   r   rd   r   r   r   r   r   r   r   )	r,   bucket_surisr   ri   r   bucket_surir   r   r_   s	            r   #testChAppliesChangesToAllBucketArgs/TestLabelGS.testChAppliesChangesToAllBucketArgs   s9   **,-tD4E4E4G/HILv& J ^^WdOj8<G*.  0F""$%F''K 	"$":":KH' H 
ooc91;9:;
&+ $~~w{;4~Pf
4::f-t/?/?@ $
 :s    EEc           	          U R                  5       nU R                  SSSS[        U5      /5        U R                  SS[        U5      /SS9nU R                  S[        U5      -  U5        g )	NrM   rn   rs   z	dummy-keyrX   TrY   z%s/ has no label configuration.)rc   r\   r]   re   )r,   r   r_   s      r   &testChMinusDWorksWithoutExistingLabels2TestLabelGS.testChMinusDWorksWithoutExistingLabels  sl    ""$JNNGT4d:6FGH^^WeT*-=>*.  0FMM3d:6FFr   c                     S/SS// SQSS/SS// SQ4nU H&  nU R                  USSS	9nU R                  S
U5        M(     U R                  / SQSSS	9nU R                  SU5        g)z3Ensures label commands fail with too few arguments.rM   rN   )rM   rN   filenamerX   rn   )rM   rn   ro   zkey:valTrR   )rP   expected_statuszcommand requires at least)rM   rn   z(gs://some-nonexistent-foobar-bucket-namez(Please specify at least one label changeN)r\   re   )r,   invocations_missing_argsarg_listri   s       r   testTooFewArgumentsFails$TestLabelGS.testTooFewArgumentsFails"  s     
		%$	%	$(
 * -~~hdA~Nf
mm/8 -
 ^^C  F 	MM<fEr   )r   )r   r   r   r   r   rz   r{   r|   r}   r   r&   r   r   r   r   r   r   r   r   r   r   s   @r   r   r      sE    ,vtV,+<
?$,*7(#+JA4F Fr   r   ))r   
__future__r   r   r   r   r   r:   xml.dom.minidomr   xml.saxr	   r<   r0   botor
   boto.s3.taggingr   gslib.exceptionr   gslib.tests.testcaseteststestcase)gslib.tests.testcase.integration_testcaser   r   gslib.tests.utilr   r]   gslib.utils.retry_utilr   gslib.utils.constantsr   rz   r|   r{   r}   r   GsUtilIntegrationTestCaser   r    r   r   <module>r      s    + & %  '  
 ' 0 
     , ' ' ? ? 0 ( &		F
 01^(44 ^ 2^B  !bF(44 bF "bFr   