
    R                        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
mZ ddl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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!c 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	m0Z0m1Z1  e0 e1ddd             ddl
m2Z2 dZ3 G d  d!e4      Z5 G d" d#e4      Z6 G d$ d%e4      Z7 G d& d'e      Z8 G d( d)e4      Z9 G d* d+e      Z: G d, d-e"jv                  jx                        Z= G d. d/e"j|                        Z?y)0z<Unit and integration tests for gsutil command_runner module.    )absolute_import)print_function)division)unicode_literalsN)input)command_runner)Command)CommandArgument)CommandRunner)HandleArgCoding)HandleHeaderCoding)CommandException)CloudObjectCompleter)CloudOrLocalObjectCompleter)LocalObjectCompleter)LocalObjectOrCannedACLCompleter)NoOpCompleter)ARGCOMPLETE_AVAILABLE)SetBotoConfigForTest)unittest)system_util)GSUTIL_PUB_TARBALL)InsistAscii)SECONDS_PER_DAY)add_moveMovedModulemockzunittest.mock)r   zgs_host is set to non-default value; trying to fetch gsutil version metadata from the wrong host would fail repeatedly, taking a long time for retry backoffs before finally failing the test.c                       e Zd ZdZy)FakeArgparseArgumentz"Fake for argparse parser argument.N)__name__
__module____qualname____doc__     2platform/gsutil/gslib/tests/test_command_runner.pyr   r   A   s    *r%   r   c                   $    e Zd ZdZddZd Zd Zy)FakeArgparseParserzFake for argparse parser.c                 .    g | _         d | _        || _        y N)	arguments
subparsersname)selfr-   s     r&   __init__zFakeArgparseParser.__init__I   s    DNDODIr%   c                 P    t               }| j                  j                  |       |S r*   )r   r+   append)r.   unused_argsunused_kwargsarguments       r&   add_argumentzFakeArgparseParser.add_argumentN   s!    #%HNN(#Or%   c                 8    t               | _        | j                  S r*   )FakeArgparseSubparsersr,   r.   s    r&   add_subparsersz!FakeArgparseParser.add_subparsersS   s    ,.DO??r%   NDefault)r    r!   r"   r#   r/   r5   r9   r$   r%   r&   r(   r(   F   s    !

r%   r(   c                       e Zd ZdZd ZddZy)r7   zContainer for nested parsers.c                     g | _         y r*   )parsersr8   s    r&   r/   zFakeArgparseSubparsers.__init__[   s	    DLr%   c                 T    t        |      }| j                  j                  |       |S )N)r-   )r(   r>   r1   )r.   r-   r3   parsers       r&   
add_parserz!FakeArgparseSubparsers.add_parser^   s#    T*FLLMr%   Nr:   )r    r!   r"   r#   r/   rA   r$   r%   r&   r7   r7   X   s    %r%   r7   c                       e Zd ZdZ ej
                  d edd      g      Z ej                  dg dddi 	      Z	d
 Z
y)FakeCommandWithInvalidCompleterz1Command with an invalid completer on an argument.fake1argBAD)	completerargparse_argumentscommand_helpfake command for tests	help_namehelp_name_aliases	help_typehelp_one_line_summary	help_textsubcommand_help_textc                      y r*   r$   r8   s    r&   r/   z(FakeCommandWithInvalidCompleter.__init__q       r%   N)r    r!   r"   r#   r	   CreateCommandSpecr
   command_specHelpSpec	help_specr/   r$   r%   r&   rC   rC   d   sQ    9***?5E#J"KM, g13)75M)A468)	r%   rC   c            	       d    e Zd ZdZdZdZ ej                  d ee ed       ed      gii      Z	y)FakeCommandWithNestedArgumentseventset   arg1arg2rH   N)
r    r!   r"   subcommand_namesubcommand_subnamenum_argsr	   rU   r
   rV   r$   r%   r&   rZ   rZ   u   sN    /(***+K/>3E7Fv7N7Fv7NH5A1?-.,r%   rZ   c            
       .   e Zd ZdZ ej
                  d ej                          ej                          ej                          ej                          ej                          ej                         g      Z ej                  dg dddi       Zd Zy)	FakeCommandWithCompletersz%Command with various completer types.fake2rH   rJ   rK   rL   c                      y r*   r$   r8   s    r&   r/   z"FakeCommandWithCompleters.__init__   rT   r%   N)r    r!   r"   r#   r	   rU   r
   MakeZeroOrMoreCloudURLsArgumentMakeZeroOrMoreFileURLsArgument%MakeZeroOrMoreCloudOrFileURLsArgumentMakeFreeTextArgument%MakeZeroOrMoreCloudBucketURLsArgumentMakeFileURLOrCannedACLArgumentrV   rW   rX   r/   r$   r%   r&   rd   rd      s    -***
9/
9
9
;
8/
8
8
:
?/
?
?
A
./
.
.
0
?/
?
?
A
8/
8
8
:		, g13)75M)A468)	r%   rd   c                   B    e Zd ZdZ fdZ fdZd Z ej                  e	j                  e      d        Z ej                  e	j                  e      d        Z ej                  e	j                  e      d        Z ej                  e	j                  e      d        Z ej                  e	j                  e      d	        Z ej                  e	j                  e      d
        Z ej                  e	j                  e      d        Z ej                  e	j                  e      d        Z ej                  e	j                  e      d        Z ej                  e	j                  e      d        Z ej                  e	j                  e      d        Z ej                  e	j                  e      d        Zd Z ej                  e	j                  e      d        Zd Z ej6                  ed      d        Z ej6                  ed      d        Zd Zd Z d Z! xZ"S )TestCommandRunnerUnitTestsz<Unit tests for gsutil update check in command_runner module.c                 R    t         t                    j                          _        t
        j                  j                  t        j                  d j                        } j                  |j                         |j                          t        j                  t        j                         j#                         s4st%        dt        j                   z        dd j#                         s4t        j&                   _        fdt        _        d t        _        d _         fd	t        j.                  _        d
 _        t        j4                   _         fdt        _         j9                  d       _         j=                   j:                  dd       _        y)(Sets up the command runner mock objects.*GetLastCheckedForGsutilUpdateTimestampFilereturn_valuez#Version number (%s) is not numeric.Nc                      t              dz   S )N   )float)uvbase_versions     r&   <lambda>z2TestCommandRunnerUnitTests.setUp.<locals>.<lambda>   s    eL6IA6Mr%   c                      yNyr$   ps    r&   r{   z2TestCommandRunnerUnitTests.setUp.<locals>.<lambda>       Sr%   Tc                       j                   S r*   )running_interactivelyr8   s   r&   r{   z2TestCommandRunnerUnitTests.setUp.<locals>.<lambda>   s    **r%   r   c                       j                   S r*   )version_mod_timer8   s   r&   r{   z2TestCommandRunnerUnitTests.setUp.<locals>.<lambda>   s    1F1Fr%   pubzgsutil.tar.gzfoo)
bucket_uriobject_namecontents) superrn   setUpCreateTempFiletimestamp_file_pathr   patchobjectr   	boto_util
addCleanupstopstartsix	text_typegslibVERSION	isnumericr   LookUpGsutilVersionold_look_up_gsutil_versionr   r   r   IsRunningInteractivelyr   GetGsutilVersionModifiedTimeprevious_version_mod_timeCreateBucketpub_bucket_uriCreateObjectgsutil_tarball_uri)r.   get_timestamp_file_patcherrz   	__class__s   ` @r&   r   z TestCommandRunnerUnitTests.setUp   sf   	
$d13  $224D!%!2!2  4-- "3 "/ 	OO.334$$& ==/L$$&D$}} - . 	.!#2&l	 $$&
 '5&H&HD#)MN& )N "&D* 5 D%*%G%GD")FE& ++E2D"//4;N;N<K9> 0 @Dr%   c                 ^   t         t        |           | j                  t        _        t        t        _        | j                  t        _	        t        j                  j                  j                  t        _        | j                  j                          | j                  j!                          yz+Tears down the command runner mock objects.N)r   rn   tearDownr   r   r   r   r   r   r   utilsr   r   r   
delete_keyr   delete_bucketr.   r   s    r&   r   z#TestCommandRunnerUnitTests.tearDown   sx    	
$d46)-)H)HN& N)-)G)GE& 	66 ) 	&&(%%'r%   c                 N    t         j                  xs t        j                         S r*   )r   IS_PACKAGE_INSTALLr   InvokedViaCloudSdkr8   s    r&   _IsPackageOrCloudSDKInstallz6TestCommandRunnerUnitTests._IsPackageOrCloudSDKInstall   s    ##G{'E'E'GGr%   c                     t         j                  j                  t        d      5 }d|_        d| _        | j                  | j                  j                  d             ddd       y# 1 sw Y   yxY w)zDTests that py3 prompt is not triggered if not running interactively.version_infor]   FverN)	r   r   r   sysmajorr   assertFalser   MaybePromptForPythonUpdater.   r   s     r&   test_py3_not_interactivez3TestCommandRunnerUnitTests.test_py3_not_interactive   sU     
		3	/<l#(d 
t**EEeLM 
0	/	/s   9A''A0c                    t        dg      5  t        j                  j                  t        d      5 }d|_        | j                  | j                  j                  d             ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zATests that py3 prompt is not triggered if skipped in boto config.)GSUtilskip_python_update_promptTruer   r]   r   N)	r   r   r   r   r   r   r   r   r   r   s     r&   test_py3_skipped_in_botoz3TestCommandRunnerUnitTests.test_py3_skipped_in_boto   sr     
N   
!::S.1\,,GGNO 2
! 
!11
! 
!s"   %B2A5$B5A>	:BB
c                     t         j                  j                  t        d      5 }d|_        | j                  d| j                  j                  d             ddd       y# 1 sw Y   yxY w)z/Tests that py3 prompt is triggered on Python 2.r   r]   Tr   Nr   r   r   r   r   assertEqualr   r   r   s     r&   test_py3_prompt_on_py2z1TestCommandRunnerUnitTests.test_py3_prompt_on_py2   sS     
		3	/<l
t**EEeLN 
0	/	/   3A!!A*c                     t         j                  j                  t        d      5 }d|_        | j                  d| j                  j                  d             ddd       y# 1 sw Y   yxY w)z3Tests that py3 prompt is not triggered on Python 3.r      Fr   Nr   r   s     r&   test_py3_prompt_on_py3z1TestCommandRunnerUnitTests.test_py3_prompt_on_py3   sS     
		3	/<l
u**EEeLN 
0	/	/r   c                    t        dg      5  t        | j                  d      5 }|j                  t	        t        t        j                         dt        z  z
                     ddd       d| _        | j                  d| j                  j                  dd             ddd       y# 1 sw Y   ExY w# 1 sw Y   yxY w)z@Tests that update is not triggered if not running interactively.r   software_update_check_period1wr]   NFlsr   )r   openr   writestrinttimer   r   r   r   #MaybeCheckForAndOfferSoftwareUpdater.   fs     r&   test_not_interactivez/TestCommandRunnerUnitTests.test_not_interactive   s     
N   
!((#.!	C		a/&99:;< /#(d 





A
A$
JL
! 
!..
! 
!s#   B4A B($;B4(B1	-B44B=c                    t         j                  j                  | j                        rt        j                  | j                         | j                  t         j                  j                  | j                               t        j                         | _        | j                  d| j                  j                  dd             y)z?Tests when no timestamp file exists and VERSION file is recent.Fr   r   N)ospathexistsr   remover   r   r   r   r   r   r8   s    r&   #test_no_tracker_file_version_recentz>TestCommandRunnerUnitTests.test_no_tracker_file_version_recent  s     
ww~~d../ii(()RWW^^D$<$<=> IIKDt""FFtQOQr%   c                    t         j                  j                  | j                        rt        j                  | j                         | j                  t         j                  j                  | j                               d| _        | j                          }| j                  || j                  j                  dd             y)z<Tests when no timestamp file exists and VERSION file is old.r   r   N)r   r   r   r   r   r   r   r   r   r   r   )r.   expecteds     r&    test_no_tracker_file_version_oldz;TestCommandRunnerUnitTests.test_no_tracker_file_version_old  s     
ww~~d../ii(()RWW^^D$<$<=>D3355H??aHJr%   c                 \    | j                  d| j                  j                  dd             yz8Tests that update is not triggered for certain commands.Fupdater   N)r   r   r   r8   s    r&   test_invalid_commandsz0TestCommandRunnerUnitTests.test_invalid_commands"  s,     	??!LNr%   c                     | j                   t        _        | j                  d| j                  j	                  dd             yr   )r   r   r   r   r   r8   s    r&   ,test_fails_silently_when_version_check_failszGTestCommandRunnerUnitTests.test_fails_silently_when_version_check_fails)  s:     *.)H)HN&??!LNr%   c                     t        | j                  d      5 }|j                  d       ddd       | j                  d| j                  j                  dd             y# 1 sw Y   6xY w)z4Tests no update if timestamp file has invalid value.r   NaNNFr   r   )r   r   r   r   r   r   r   s     r&   test_invalid_file_contentsz5TestCommandRunnerUnitTests.test_invalid_file_contents2  sV     
d&&	,ggen 
-t""FFtQOQ 
-	,s   AA'c                    t        dg      5  t        | j                  d      5 }|j                  t	        t        t        j                         dt        z  z
                     ddd       | j                          }| j                  || j                  j                  dd             ddd       y# 1 sw Y   OxY w# 1 sw Y   yxY w)z/Tests update should be triggered if time is up.r   r   r]   Nr   r   )r   r   r   r   r   r   r   r   r   r   r   r   )r.   r   r   s      r&   test_update_should_triggerz5TestCommandRunnerUnitTests.test_update_should_trigger:  s     
N   
!((#.!	C		a/&99:;< /5577h





A
A$
JL
! 
!..
! 
!s$   B>A B2$AB>2B;	7B>>Cc                 r   t        dg      5  t        | j                  d      5 }|j                  t	        t        t        j                         dt        z  z
                     ddd       | j                  d| j                  j                  dd             ddd       y# 1 sw Y   >xY w# 1 sw Y   yxY w)z+Tests update not triggered if not time yet.)r   r   3r   r]   NFr   r   )r   r   r   r   r   r   r   r   r   r   r   r   s     r&   test_not_time_for_update_yetz7TestCommandRunnerUnitTests.test_not_time_for_update_yetF  s     
N   
!((#.!	C		a/&99:;< /





A
A$
JL	
! 
!..
! 
!s#   B-A B!$4B-!B*	&B--B6c                    t        dg      5  t        | j                  d      5 }|j                  t	        t        t        j                         dt        z  z
                     ddd       d t        _	        | j                  d| j                  j                  dd             ddd       y# 1 sw Y   JxY w# 1 sw Y   yxY w)	z8Tests no update triggered if user says no at the prompt.r   r   r]   Nc                      y)Nnr$   r   s    r&   r{   zHTestCommandRunnerUnitTests.test_user_says_no_to_update.<locals>.<lambda>W  s    sr%   Fr   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   s     r&   test_user_says_no_to_updatez6TestCommandRunnerUnitTests.test_user_says_no_to_updateQ  s    	N   
!((#.!	C		a/&99:;< /*n





A
A$
JL
! 
!..
! 
!s$   B9A B-$A B9-B6	2B99Cc                 ,   t        dg      5  t        | j                  d      5 }|j                  t	        t        t        j                         dt        z  z
                     ddd       | j                          }| j                  || j                  j                  dd             t        j                         j                         }	 t        j                         j                  t        j                          | j                  d| j                  j                  dd             t        j                         j                  |       	 ddd       y# 1 sw Y   xY w# t        j                         j                  |       w xY w# 1 sw Y   yxY w)zATests that update isn't triggered when loglevel is in quiet mode.r   r   r]   Nr   r   F)r   r   r   r   r   r   r   r   r   r   r   r   logging	getLoggergetEffectiveLevelsetLevelERROR)r.   r   r   prev_loglevels       r&   )test_update_check_skipped_with_quiet_modezDTestCommandRunnerUnitTests.test_update_check_skipped_with_quiet_mode\  s<    
N   
!((#.!	C		a/&99:;< / 5577h





A
A$
JL '');;=m4$$W]]3CCD!L	N 	$$]3%
! 
!..  	$$]3%
! 
!s=   F
A E$A'F
AE")#F
E	F
"%FF

Fc                 *   t         j                  j                  t               i}t        | j                  | j
                  |      }t               }	 |j                  |       y # t        $ r%}| j                  dt        |             Y d }~y d }~ww xY w)Nbucket_storage_uri_classgsutil_api_class_map_factorycommand_mapzUnknown completer)rC   rV   command_namer   mock_bucket_storage_uri!mock_gsutil_api_class_map_factoryr(   ConfigureCommandArgumentParsersRuntimeErrorassertInr   )r.   r   runnerr@   es        r&   4test_command_argument_parser_setup_invalid_completerzOTestCommandRunnerUnitTests.test_command_argument_parser_setup_invalid_completers  s     	(44AA+-K
 !%!=!=%)%K%K!F
  !F1,,V4 1
mm'Q001s   A$ $	B-BBz#Tab completion requires argcompletec                    t         j                  j                  t               i}t        | j                  | j
                  |      }t               }|j                  |       |j                  j                  d   }| j                  |j                  t         j                  j                         |j                  j                  d   }| j                  |j                  t         j                         |j                  j                  d   }| j                  |j                  t         j                         | j                  t        |j                        t         j                          y )Nr   r   )rZ   rV   r   r   r   r   r(   r   r,   r>   r   r-   r`   ra   lenr+   rb   )r.   r   r  r@   cur_subparsers        r&   <test_command_argument_parser_setup_nested_argparse_argumentszWTestCommandRunnerUnitTests.test_command_argument_parser_setup_nested_argparse_arguments  s-    	'33@@*,K !%!=!=%)%K%K!F  !F
**62 %%--a0M]''3@@MMO ",,44Q7M]''3CCE ",,44Q7M]''3FFH 	S0013<<>r%   c                 (   t         j                  j                  t               i}t        | j                  | j
                  |      }t               }|j                  |       | j                  dt        |j                  j                               |j                  j                  d   }| j                  dt        |j                               | j                  t        t        |j                  d   j                               | j                  t         t        |j                  d   j                               | j                  t"        t        |j                  d   j                               | j                  t$        t        |j                  d   j                               | j                  t        t        |j                  d   j                               | j                  t&        t        |j                  d   j                               y )	Nr   rv   r      r]   r         )rd   rV   r   r   r   r   r(   r   r   r  r,   r>   r+   r   typerG   r   r   r   r   )r.   r   r  main_parser	subparsers        r&   -test_command_argument_parser_setup_completerszHTestCommandRunnerUnitTests.test_command_argument_parser_setup_completers  s   
 	"..;;%'K
 !%!=!=%)%K%K!F
 %&K
**;7QK22::;<&&..q1IQI//01))--a0::;=))--a0::;=0)--a0::;=]D)<)<Q)?)I)I$JK))--a0::;=4)--a0::;=r%   c                     g d}t        |       |D ]+  }| j                  t        |t        j                               - y)z/Tests that gsutil encodes valid args correctly.)r   z-pzabc:defzgs://bucketN)r   
assertTrue
isinstancer   r   )r.   argsas      r&   test_valid_arg_codingz0TestCommandRunnerUnitTests.test_valid_arg_coding  s2     2DD
oojCMM23 r%   c                     ddd}t        |       | j                  t        |d   t        j                               t        |d   d       y )Nz
text/plain   bãr)content-typex-goog-meta-foor  r  zBValue of non-custom-metadata header contained non-ASCII characters)r   r  r  r   r   r   r.   headerss     r&   test_valid_header_codingz3TestCommandRunnerUnitTests.test_valid_header_coding  sL    $!G w 	OOJw'893==IJLNr%   c                 x    ddi}| j                  t        d      5  t        |       d d d        y # 1 sw Y   y xY w)Nr  r  zInvalid non-ASCII)assertRaisesRegexr   r   r  s     r&    test_invalid_header_coding_failsz;TestCommandRunnerUnitTests.test_invalid_header_coding_fails  s3    v&G			 02F	G! 
H	G	Gs   09)#r    r!   r"   r#   r   r   r   r   skipIfutilHAS_NON_DEFAULT_GS_HOSTSKIP_BECAUSE_RETRIES_ARE_SLOWr   r   r   r   r   r   r   r   r   r   r   r   r   r   r  
skipUnlessr   r	  r  r  r  r!  __classcell__r   s   @r&   rn   rn      s   D(@T(H 8??4//1NON PN 8??4//1NOP PP 8??4//1NON PN 8??4//1NON PN 8??4//1NO	L P	L 8??4//1NOQ PQ 8??4//1NO	J P	J 8??4//1NON PN 8??4//1NON PN 8??4//1NOQ PQ 8??4//1NO	L P	L 8??4//1NOL PL	L 8??4//1NO4 P4,1$ 8,<>>>>@ 8,<>=>=@4N"r%   rn   c                   r     e Zd ZdZ fdZ fdZ ej                  ej                  e
      d        Z xZS )!TestCommandRunnerIntegrationTestszCIntegration tests for gsutil update check in command_runner module.c                 :   t         t        |           | j                  d      | _        t
        j                  j                  t        j                  d| j                        }| j                  |j                         |j                          d t        _        y)rp   0)r   rq   rr   c                      yr}   r$   r   s    r&   r{   z9TestCommandRunnerIntegrationTests.setUp.<locals>.<lambda>  r   r%   N)r   r*  r   r   r   r   r   r   r   r   r   r   r   r   )r.   r   r   s     r&   r   z'TestCommandRunnerIntegrationTests.setUp  s    	
+T8:  $22C2@D!%!2!2  4-- "3 "/ 	OO.334$$& )Nr%   c                 H    t         t        |           t        t        _        yr   )r   r*  r   r   r   r   s    r&   r   z*TestCommandRunnerIntegrationTests.tearDown  s    	
+T;= Nr%   c                     t        dgd      5  t        j                         | _        | j                  j                  dt        g       ddd       y# 1 sw Y   yxY w)zCTests that gsutil tarball version lookup works without credentials.r   F)use_existing_configr   N)r   r   r   RunNamedCommandr   r8   s    r&   'test_lookup_version_without_credentialszITestCommandRunnerIntegrationTests.test_lookup_version_without_credentials  sP     
NO27
9*88:d
))$1C0DE	
9 
9 
9s   ;AA)r    r!   r"   r#   r   r   r   r"  r#  r$  r%  r2  r'  r(  s   @r&   r*  r*    s;    K) !
 8??4//1NOF PFr%   r*  )@r#   
__future__r   r   r   r   r   r   r   r   	six.movesr   botor   r   r   gslib.commandr	   gslib.command_argumentr
   gslib.command_runnerr   r   r   gslib.exceptionr   gslib.tab_completer   r   r   r   r   gslib.tests.testcaseteststestcasegslib.tests.utilr#  r   r   r   gslib.utilsr   gslib.utils.constantsr   gslib.utils.text_utilr   gslib.utils.unit_utilr   r   r   r   r%  r   r   r(   r7   rC   rZ   rd   unit_testcaseGsUtilUnitTestCasern   GsUtilIntegrationTestCaser*  r$   r%   r&   <module>rF     s   C & %  '  	  
   
    ! 2 . 0 3 , 3 : 3 > , ' '   2 1 % # 4 - 1 % VV_	5 6 : 6 
 $	V 		g 	".V ."	 	2C"!7!7!J!J C"L
F(J(J Fr%   