
    5.                     x   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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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Z!dZ"dZ#dZ$d Z% ed       G d dejL                               Z' ed       G d dejL                               Z(y)$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                 J    | rdj                  |      S dj                  |      S )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                        e Zd ZdZ edez   dz   ez   dz   dz   ez   dz   ez   dz   dz         j                  d      Z
 fd	Zd
 Zd Zd Zd Z xZS )TestLabelS3zDS3-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                     t         t        |           | j                  | j                  j                  t                    | _        y Ncontents)superr   setUpCreateTempFile
_label_xmlencoder   	xml_fpathself	__class__s    r   r%   zTestLabelS3.setUp=   s4    	+t"$(($//2H2H2N(ODNr   c                 n    t         j                  r| j                  ||       y | j                  ||       y )N)sixPY2assertItemsEqualassertCountEqual)r+   item1item2s      r   DoAssertItemsMatchzTestLabelS3.DoAssertItemsMatchA   s+    
ww
E5) E5)r   c           
         i }t               }t        j                  |d       }	 t        j                  j                  ||       |D ]"  }|D ]  }|j                  ||j                  <    $ |S # t        j                  $ rC}t        d|j                         d|j                         d|j                               d }~ww xY w)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   _LabelDictFromXmlStringz#TestLabelS3._LabelDictFromXmlStringH   s    JI9d+AK	gg'1%
 !#!ii
377  !  ** K,,.!//"3Q5F5F5HJK KKs    A- -C >B>>Cc                 |     j                          j                  dd j                  t              gd      }t	         j
                  t                    } j
                  r j                  ||       n  j                  |j                         |       t        t        dd       fd       } |        y )	NlabelsetTreturn_stderr      triestimeout_secsc                      j                  ddt              gd      } j                  j                  |       j                  j                               y NrI   getTreturn_stdout	RunGsUtilsurir4   rG   r'   stdoutr   r+   s    r   _Check1z*TestLabelS3.testSetAndGet.<locals>._Check1e   U    ~~wtJ/?@,0  2f
d::6B"::4??KMr   )CreateBucketrX   r)   rY   r   _use_gcloud_storageassertInassertEqualstripr   AssertionError)r+   stderrexpected_outputr\   r   s   `   @r   testSetAndGetzTestLabelS3.testSetAndGetW   s    ""$J^^WeT^^!*-/*.  0F 00H0H04Z0@BO
mmOV,
v||~7 >3M 4M Ir   c                      j                          j                  dddt        dt        dt        dt
        t              g       t        t        dd       fd       } |         j                  ddd	t        dd
d	dt              g	       t        t
        ddit        t        dd       fd       } |        y )NrI   ch-l:rM   rN   rO   c                      j                  ddt              gd      } j                  j                  |       j                  j                               y rS   rW   rZ   s    r   r\   z#TestLabelS3.testCh.<locals>._Check1y   r]   r   -dznew_key:new_valueznonexistent-keynew_key	new_valuec                      j                  ddt              gd      } j                  j                  |              y rS   )rX   rY   r4   rG   )r[   r   expected_dictr+   s    r   _Check2z#TestLabelS3.testCh.<locals>._Check2   sE    ~~wtJ/?@,0  2f
d::6B+-r   )	r^   rX   KEY1VALUE1KEY2VALUE2rY   r   rc   )r+   r\   rq   r   rp   s   `  @@r   testChzTestLabelS3.testChn   s    ""$JNNt $ Z	  >3M 4M I 	NNtT4)<dZ 
 69k:M
>3- 4- Ir   )__name__
__module____qualname____doc__r   rr   rs   rt   ru   toprettyxmlr'   r%   r4   rG   rf   rv   __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                   X     e Zd ZdZeeeeiZ fdZ	d Z
d Zd Zd Zd Zd Zd	 Z xZS )
TestLabelGSr   c                     t         t        |           | j                  t	        j
                  | j                        j                  t                    | _	        y r!   )
r$   r   r%   r&   jsondumps_label_dictr(   r   
json_fpathr*   s    r   r%   zTestLabelGS.setUp   sD    	+t"$))D,,-44T: * <DOr   c                    | j                         }| j                  dd| j                  t        |      gd      }t	        | j
                  t        |            }| j
                  r| j                  ||       n | j                  |j                         |       | j                  ddt        |      gd      }| j                  t        j                  |      | j                         y )NrI   rJ   TrK   rT   rU   )r^   rX   r   rY   r   r_   r`   ra   rb   assertDictEqualr   loadsr   )r+   r   rd   re   r[   s        r   testSetAndGetOnOneBucketz$TestLabelGS.testSetAndGetOnOneBucket   s    ""$J ^^WeT__!*-/*.  0F 00H0H04Z0@BO
mmOV,
v||~7^^WeT*-=>*.  0FF+T-=-=>r   c           	         | j                         }| j                         }| j                  dd| j                  t        |      t        |      gd      }t	        |j                               }t	        t        | j                  t        |            t        | j                  t        |            g      }| j                  r+| j                  t        |D cg c]  }||v  c}             y | j                  ||       y c c}w )NrI   rJ   TrK   )r^   rX   r   rY   rJ   
splitlinesr   r_   
assertTrueallassertSetEqual)r+   r   bucket2_urird   actualexpectedxs          r   %testSetOnMultipleBucketsInSameCommandz1TestLabelGS.testSetOnMultipleBucketsInSameCommand   s    ""$J##%K ^^	%	j		k		 	  F
 ""$%F!$":":D<LM!$":":D<MN H 
ooc911;9:;
&(+ :s   C?c                    | j                         }| j                  dd| j                  t        |      g       d}d}d}d}||||t        di}| j                  t        j                  |      j                  d      	      }| j                  dd|t        |      g       | j                  dd
t        |      gd      }| j                  t        j                  |      |       y )NrI   rJ   	new_key_1	new_key_2new_value_1new_value_2#different_value_for_an_existing_keyasciir"   rT   TrU   )r^   rX   r   rY   rr   r&   r   r   r(   r   r   )	r+   r   r   r   r   r   new_jsonnew_json_fpathr[   s	            r   testSetOverwritesOldLabelConfigz+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                 
   | j                         }dt        dt        dt        dt        g}| j                  ddg|z   t        |      gz   d      }t        | j                  t        |            }| j                  r| j                  ||       n | j                  |j                         |       | j                  ddt        |      gd      }| j                  t        j                  |      | j                         d	}d
}| j                  ddd|d|dt        t        |      g       | j                  ddt        |      gd      }t        j                  |      }t        t        ||i}	| j                  ||	       y )Nri   rj   rI   rh   TrK   rT   rU   znew-keyz	new-valuerl   )r^   rr   rs   rt   ru   rX   rY   r   r_   r`   ra   rb   r   r   r   r   )
r+   r   
ch_subargsrd   re   r[   rm   rn   r   r   s
             r   testInitialAndSubsequentChz&TestLabelGS.testInitialAndSubsequentCh   sr   ""$Jv& J ^^WdOj8D<L;MM*.  0F/0H0H04Z0@BO
mmOV,
v||~7 ^^WeT*-=>*.  0FF+T-=-=> GINNtI&dZ 
 ^^WeT*-=>*.  0FZZFfgy1H*r   c           	         t        | j                               t        | j                               g}dt        dt        dt        dt
        g}| j                  ddg|z   |z   d      }t        |j                               }t        |D cg c]  }t        | j                  |       c}      }| j                  r+| j                  t        |D cg c]  }||v  c}             n| j                  ||       |D ]G  }| j                  dd|gd      }| j                  t        j                   |      | j"                         I y c c}w c c}w )	Nri   rj   rI   rh   TrK   rT   rU   )rY   r^   rr   rs   rt   ru   rX   rJ   r   r   r_   r   r   r   r   r   r   r   )	r+   bucket_surisr   rd   r   bucket_surir   r   r[   s	            r   #testChAppliesChangesToAllBucketArgsz/TestLabelGS.testChAppliesChangesToAllBucketArgs   s=   **,-tD4E4E4G/HILv& J ^^WdOj8<G*.  0F""$%F''K 	"$":":KH' H 
ooc911;9:;
&(+ $~~w{;4~Pf
4::f-t/?/?@ $
 :s   E
Ec           	          | j                         }| j                  ddddt        |      g       | j                  ddt        |      gd      }| j                  dt        |      z  |       y )	NrI   rh   rl   z	dummy-keyrT   TrU   z%s/ has no label configuration.)r^   rX   rY   r`   )r+   r   r[   s      r   &testChMinusDWorksWithoutExistingLabelsz2TestLabelGS.testChMinusDWorksWithoutExistingLabels  sl    ""$JNNGT4d:6FGH^^WeT*-=>*.  0FMM3d:6FFr   c                     dgddgg dddgddgg df}|D ](  }| j                  |dd	      }| j                  d
|       * | j                  g ddd	      }| j                  d|       y)z3Ensures label commands fail with too few arguments.rI   rJ   )rI   rJ   filenamerT   rh   )rI   rh   ri   zkey:valTrN   )rL   expected_statuszcommand requires at least)rI   rh   z(gs://some-nonexistent-foobar-bucket-namez(Please specify at least one label changeN)rX   r`   )r+   invocations_missing_argsarg_listrd   s       r   testTooFewArgumentsFailsz$TestLabelGS.testTooFewArgumentsFails"  s     
		%$	%	$(
 * -~~hdA~Nf
mm/8 -
 ^^C  F 	MM<fEr   )rw   rx   ry   rz   rr   rs   rt   ru   r   r%   r   r   r   r   r   r   r   r|   r}   s   @r   r   r      s?    ,vtV,+<
?$,*7(#+JA4Fr   r   ))rz   
__future__r   r   r   r   r   r7   xml.dom.minidomr   xml.saxr	   r9   r.   botor
   boto.s3.taggingr   gslib.exceptionr   gslib.tests.testcaseteststestcase)gslib.tests.testcase.integration_testcaser   r   gslib.tests.utilr   rY   gslib.utils.retry_utilr   gslib.utils.constantsr   rr   rt   rs   ru   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   