
    w)                        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	Z	ddl
Z
ddl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 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$ ejJ                  jM                  ejJ                  jO                  e(            Z)ejJ                  jU                  e)dd      Z+ G d dejX                        Z- G d dej\                        Z/y)zTests for the update command.    )absolute_import)print_function)division)unicode_literalsN)_UUID_FILE_PATH)ObjectToURI)unittest)system_util)CERTIFICATE_VALIDATION_ENABLED)UTF8)DisallowUpdateIfDataInGsutilDir)GsutilPubTarball)add_moveMovedModulemockzunittest.mock)r   z..c                   B    e Zd ZdZ ej
                  ed      d        Zy)
UpdateTestzUpdate command test suite.z3Test requires https certificate validation enabled.c           	         t        j                         r)| j                  dgddd      }| j                  d|       yt        j
                  r(| j                  dgdd      }| j                  d	|       y| j                         }| j                         }t        j                  j                  |d
      }t        j                  j                  |d
      }t        j                  j                  d
d
      }t        j                  dddd      }t        j                  t        ||       t        j                  |       t        j                  t              D ]  }d|vsd|vs|j!                  d      r|j!                  d      r1t        j                  j                  t        |      }	t        j                  j                  ||      }
t        j                  j#                  |	      rt        j                  |	|
|       t        j$                  |	|
        d}t        j                  j                  |d      }| j'                  t        j                  j)                  |             t+        |d      5 }|j-                  |       ddd       t        j                  j                  |d      }t        j                  j.                  }	 d t        j                  _        t1        j*                  |d      }|j3                  |d       |j5                          |t        j                  _        t6        j8                  rt6        j8                  gng }t;        j<                  |g dz   |t:        j>                  t:        j>                        }|jA                         \  }}|jB                  j5                          |jD                  j5                          | jG                  |jH                  d       | j                  d|       t;        j<                  |g dz   |t:        j>                  t:        j>                        }|jA                         \  }}|jB                  j5                          |jD                  j5                          | jG                  |jH                  d       | j                  d|       t;        j<                  |d
dtK        |      gz   |t:        j>                  t:        j>                        }|jA                         \  }}|jB                  j5                          |jD                  j5                          | jG                  |jH                  d       | j                  d |       t+        t        j                  j                  |d!      d      5 }|j-                  d"       ddd       t;        j<                  |d
dd#tK        |      gz   |t:        j>                  t:        j>                  t:        j>                  $      }|jA                         \  }}|jB                  j5                          |jD                  j5                          t        jL                  t        j                  j                  |d!             | jG                  |jH                  d       t        jN                  jQ                  tR              }||v r|jU                  |d%      }nd&|v r|jU                  d&d%      }| j                  d'|       t        j                  j)                  tV              xs  tX        jZ                  j]                  d(d)       }|rd*nd+}t;        j<                  ||dd#tK        |      gz   |t:        j>                  t:        j>                  t:        j>                  $      }|jA                  |,      \  }}|jB                  j5                          |jD                  j5                          | jG                  |jH                  d-d.|jH                  |j_                  tR              fz  /       t        j                  j                  |d
d      }t+        |d0      5 }| jG                  |ja                         |       ddd       |rt        jL                  tV               yy# 1 sw Y   xY w# |t        j                  _        w xY w# 1 sw Y   xY w# 1 sw Y   ZxY w)1z@Tests that the update command works or raises proper exceptions.updatenT   )stdinreturn_stderrexpected_statusz(update command is disabled for Cloud SDKN)r   r   zInvalid commandgsutilz.git*z*.pycz*.pyo__pycache__)ignore.git.pycz.pyoz17.25VERSIONwzgsutil.test.tar.gzc                     | S )N )fnames    *platform/gsutil/gslib/tests/test_update.py<lambda>z(UpdateTest.test_update.<locals>.<lambda>   s    u    zw:gzz./gsutil)arcname)r   r   zgs://pub)cwdstdoutstderrs%   update command only works with tar.gz)r   r   zgs://pub/Jdjh38)(;.tar.gzs   NotFoundExceptions   command does not supportzuserdata.txtzimportant data
z-f)r)   r*   r+   r          
sD   The update command cannot run with user data in the gsutil directoryGSUtildisable_analytics_prompts   n
y
s   y
)inputr   z:Non-zero return code (%d) from gsutil update. stderr = 
%s)msgr)1r
   InvokedViaCloudSdk	RunGsUtilassertIngslibIS_PACKAGE_INSTALLCreateTempDirospathjoinshutilignore_patternscopytree
GSUTIL_DIRmakedirslistdirendswithisdircopyfile
assertTrueexistsopenwritenormpathtarfileaddclosesys
executable
subprocessPopenPIPEcommunicater*   r+   assertEqual
returncodesuriunlinklinesepencoder   replacer   botoconfig	get_valuedecoderead)selfr+   
tmpdir_src
tmpdir_dst
gsutil_src
gsutil_dstgsutil_relative_dstignore_callablecompcp_src_pathcp_dst_pathexpected_versionsrc_version_filefsrc_tarballrI   tarprefixp_fpos_lsanalytics_promptupdate_inputdst_version_files                            r%   test_updatezUpdateTest.test_update;   s    %%'~~xj$',0./  1f mm>G~~xja~Pf
mm%v. ##%J##%J j(3Jj(3J'',,x:,,	O OOJ
?C KK


:&


t
#}}V$}}V$ggll:t4ggll:t477==%
//+{?
K
//+{
3 ' ww||J	:OOBGGNN#345		$gg 
% '',,z+?@KwwH	" -bggLLf-c	ggj*g-	iik!bgg!$cnnRF 	"BB' * *	1A --/KQHHNNHHNNQ\\1%MM:FC 	JK' * *		1A
 --/KQHHNNHHNNQ\\1%MM&/ 	(Hd;&788		 A
 --/KQHHNNHHNNQ\\1%MM-v6 
bggll:~6	<hh!" 
=	8T4#45	6oo	A --/KQHHNNHHNN IIbggll:~67Q\\1%JJd#E~~eT*f	&~~eT*fMMO
 GGNN?; N KK11(2LNO %5=(L 	%x{#% 	%oo	A --l-3KQHHNNHHNN		JllFMM$/01  3 ww||J)D		$
qvvx!12 
%
 ii  c 
%	$  "bggP 
=	<h 
%	$s1   9bAb% b?!cb"%b<?c	cN)__name__
__module____qualname____doc__r	   
skipUnlessr   rv   r#   r'   r%   r   r   8   s.    "85LNi!Ni!r'   r   c                   ^    e Zd ZdZ ej
                  ej                   d      d        Zd Z	y)UpdateUnitTestz.Tests the functionality of commands/update.py.zhTest is runnable only if gsutil dir is accessible, and update command is not valid for package installs.c                    | j                         }t        j                  j                  |d      }t        j                  |       g }t        j
                  t              D ]T  }|j                  d      s/|j                  d      s|dk(  s|dk(  s|dk(  s|dk(  s
|dk(  s|d	k(  rD|j                  |       V |D ]  }t        j                  j                  t        j                  j                  t        |            rt        j                  }nt        j                  } |t        j                  j                  t        |      t        j                  j                  ||              t        |
       y)z1Ensure that all files/folders match the manifest.r   r   r   r   z	.settingsz.projectz.pydevprojectz.style.yapfz.yapfignore)	directoryN)r8   r9   r:   r;   r@   rA   r?   rB   
startswithappendrC   r<   r>   rD   r   )r_   r`   rb   
copy_filesfilenamerf   funcs          r%   test_repo_matches_manifestz)UpdateUnitTest.test_repo_matches_manifest   s    ##%Jj(3JKK
JJJz*


F
#x':':6'B
m
#x;'>
j
 H$?
m
#x='@! + 	rww||J5	6
277<<
D)277<<
D+IJ  $j9r'   c                     t         j                  j                  t        d      5 }d|_        | j                  dt                      d|_        | j                  dt                      ddd       y# 1 sw Y   yxY w)zDEnsure that the correct URI is returned based on the Python version.version_info   zgsutil.tar.gz   zgsutil4.tar.gzN)r   patchobjectrM   majorr5   r   )r_   r   s     r%   test_pub_tarballzUpdateUnitTest.test_pub_tarball  sY    			3	/<l
mmO%5%78l
mm$&6&89	 
0	/	/s   AA11A:N)
rw   rx   ry   rz   r	   r{   r6   r7   r   r   r#   r'   r%   r}   r}      s:    68

"
""34:	4:.:r'   r}   )0rz   
__future__r   r   r   r   os.pathr9   r<   rO   rM   rJ   rZ   r6   gslib.metricsr   gslib.tests.testcaseteststestcasegslib.tests.utilr   rU   r	   gslib.utilsr
   gslib.utils.boto_utilr   gslib.utils.constantsr   gslib.utils.update_utilr   r   sixr   r   	six.movesr   r:   abspathdirname__file__	TESTS_DIRr;   r?   GsUtilIntegrationTestCaser   GsUtilUnitTestCaser}   r#   r'   r%   <module>r      s   , $ & %  '    
    ) ' ' 0 % # @ & C 4 % VV_	5 6 GGOOBGGOOH56	WW\\)T40
n!33 n!b$:X00 $:r'   