
                            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Jr  SSK	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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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SKJ!r!  \S 5       r" " S S\RF                  5      r$ " S S\RF                  5      r% " S S\RL                  5      r' " S S\RP                  5      r) " S  S!\RL                  5      r* " S" S#\RL                  5      r+ " S$ S%\RL                  5      r, " S& S'\RL                  5      r- " S( S)\RL                  5      r. " S* S+\R^                  5      r0g),zTests for shim_util.py.    )absolute_import)print_function)division)unicode_literalsN)contextmanager)mock)config)command)command_argument)	exception)rsync)version)test)ApiSelector)testcase)	boto_util)	constants)	shim_util)system_util)utilc              #     ^ #    SU 4S jjn[         R                  R                  [        SSS9 n[         R                  R                  [        SSS9 n[         R                  R                  [        SSS9 nXl        Xl        T R                  5       Ul        Sv   SSS5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g= f7f)	a  "Mock boto config replacing any exiting config.

The util.SetBotoConfigForTest has a use_existing_config flag that can be
set to False, but it does not work if the config has been already loaded,
which is the case for all unit tests that do not use RunCommand method.

Args:
  boto_config_dict. A dict with key=<boto section name> and value=<a dict
    of boto field name and the value for that field>.
Nc                 F   > TR                  U 0 5      R                  X5      $ N)get)sectionkeydefault_valueboto_config_dicts      -platform/gsutil/gslib/tests/test_shim_util.py_config_get_side_effect2_mock_boto_config.<locals>._config_get_side_effect;   s!    ,00DD    r   Tautospecgetboolitemsr   )r   patchobjectr	   side_effectr&   return_value)r   r    mock_getmock_getbool
mock_itemss   `    r   _mock_boto_configr.   .   s     E zz6(			69t		<::VWt<
6#: "2"8"8":
	 = 
= 76<< 
=	< 76sL   ,C)$C$C7&B6C%C-	C)6
C C
C	C
C&"C)c                      \ rS rSrSr\R                  R                  SS\R                  SSS9r
\R                  " SS	/\R                  " S
S9\R                  " SS9\R                  " S\R                  R                  S9\R                  " S\R                  R                   S9\R                  " SSS.S9SS.S9r\R                  R%                  S/ SSS0 S9rS rSrg)FakeCommandWithGcloudStorageMapG   (Implementation of a fake gsutil command.	fake_shim   zdeilrz:T)min_argsmax_argssupported_sub_argsfile_url_okobjectsfake-xgcloud_flag--zipz--ludicrous-list)r=   repeat_typez--delightful-dict--e-on--e-off)onoffN)-r-z-l-d-e-fgcloud_commandflag_mapcommand_help&Fake one line summary for the command.zHelp text for fake command.	help_namehelp_name_aliases	help_typehelp_one_line_summary	help_textsubcommand_help_textc                     [        S5        g )N&FakeCommandWithGcloudStorageMap called)printselfs    r   
RunCommand*FakeCommandWithGcloudStorageMap.RunCommandn   s    	
23r"    )__name__
__module____qualname____firstlineno____doc__r
   CommandCreateCommandSpecr   NO_MAXcommand_specr   GcloudStorageMapGcloudStorageFlagRepeatFlagTypeLISTDICTgcloud_storage_mapHelpSpec	help_specr[   __static_attributes__r]   r"   r   r0   r0   G   s   022;<=<E<L<LFO?C	 3 E,
 !11( ))d;))g>))0'66;;= ))1'66;;= )) "7 
 '	. oo&&D- ' )4r"   r0   c                      \ rS rSrSr\R                  R                  SS\R                  SS\
R                  R                  5       /\
R                  R                  S5      /S.S9r\R                   " \R                   " S	S
/\R"                  " SS9\R"                  " SS9S.S9\R                   " S	S/0 S9S.0 S9r\R                  R'                  S/ SSS0 S9rSrg)-FakeCommandWithSubCommandWithGcloudStorageMapr   r2   fake_with_subr4   zay:T)setr   )r5   r6   r7   r8   argparse_argumentsbucketsupdater;   r<   --yyy)-a-yrJ   describerM   rN   z-Help text for fake command with sub commands.rO   r]   N)r^   r_   r`   ra   rb   r
   rc   rd   r   re   r   CommandArgument%MakeZeroOrMoreCloudBucketURLsArgumentMakeNCloudBucketURLsArgumentrf   r   rg   rh   rl   rm   rn   ro   r]   r"   r   rq   rq   r   s   022 ..335
 ..KKAN 3 	, !11

$
$'2!33E!33H 
$
$Y
4K.02B <>? oo&&D? ' )r"   rq   c                      ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rSrU =r$ )TestGetGCloudStorageArgs   z,Test Command.get_gcloud_storage_args method.c                    > [         TU ]  5         [        [        R                  / SQ0 S[        R                  [        R                  [        R                  [        R
                  " 5       S9U l        g )NrE   opt1rD   arg1arg2r4   command_runnerargsheadersdebugtrace_tokenparallel_operationsbucket_storage_uri_classgsutil_api_class_map_factorysupersetUpr0   r   ANY	MagicMock_fake_commandrZ   	__class__s    r   r   TestGetGCloudStorageArgs.setUp   sH    	GMO8xx1HH HH!%%)^^%57Dr"   c                 `    U R                   R                  5       nU R                  U/ SQ5        g )Nr9   r:   r>   r   r;   r   r   )r   get_gcloud_storage_argsassertEqualrZ   gcloud_argss     r   5test_get_gcloud_storage_args_parses_command_and_flagsNTestGetGCloudStorageArgs.test_get_gcloud_storage_args_parses_command_and_flags   s*    $$<<>K[OQr"   c           
          U R                   R                  [        R                  " SS/[        R                  " SS9[        R                  " SS9S.S95      nU R                  U/ SQ5        g )	Nr9   custom-fakery   r<   -b)rE   rD   rJ   )r9   r   ry   r   r   r   r   )r   r   r   rg   rh   r   r   s     r   6test_get_gcloud_storage_args_parses_custom_command_mapOTestGetGCloudStorageArgs.test_get_gcloud_storage_args_parses_custom_command_map   sf    $$<<""%}511dC11dC	K 	FHr"   c                     SS/U R                   l        U R                   R                  5       nU R                  U/ SQ5        g )Nr9   r:   r   )r   rK   r   r   r   s     r   :test_get_gcloud_storage_args_parses_command_in_list_formatSTestGetGCloudStorageArgs.test_get_gcloud_storage_args_parses_command_in_list_format   s=    )2F(;D%$$<<>K[OQr"   c                 "   [        [        R                  / SQ0 [        R                  [        R                  [        R                  [        R                  [        R                  " 5       S9nUR	                  5       nU R                  U/ SQ5        g )Nrt   rz   r   ry   r   r   r   )rv   rw   rx   r   r;   r   r   )rq   r   r   r   r   r   )rZ   fake_with_subcommandr   s      r   /test_get_gcloud_storage_args_parses_subcommandsHTestGetGCloudStorageArgs.test_get_gcloud_storage_args_parses_subcommands   se    Hxx8hhHH HH!%%)^^%57 '>>@KDFr"   c                 "   [        [        R                  / SQ0 [        R                  [        R                  [        R                  [        R                  [        R                  " 5       S9nUR	                  5       nU R                  U/ SQ5        g )N)positional_argrI   rD   opt2rI   r   )r9   r:   r   r;   r   r0   r   r   r   r   r   rZ   fake_commandr   s      r   1test_get_gcloud_storage_args_with_flags_to_ignoreJTestGetGCloudStorageArgs.test_get_gcloud_storage_args_with_flags_to_ignore   sc    2xx9hhHH HH!%%)^^%57L 668K[HJr"   c                 "   [        [        R                  / SQ0 [        R                  [        R                  [        R                  [        R                  [        R                  " 5       S9nUR	                  5       nU R                  U/ SQ5        g )N)r   rE   r   rD   r   r   )r9   r:   r   r>   r   r;   r   r   r   s      r   =test_get_gcloud_storage_args_with_positional_arg_at_beginningVTestGetGCloudStorageArgs.test_get_gcloud_storage_args_with_positional_arg_at_beginning   d    2xx;hhHH HH!%%)^^%57L 668KLNr"   c                 "   [        [        R                  / SQ0 [        R                  [        R                  [        R                  [        R                  [        R                  " 5       S9nUR	                  5       nU R                  U/ SQ5        g )N)rE   r   r   rD   r   r   )r9   r:   r>   r   r   r;   r   r   r   s      r   :test_get_gcloud_storage_args_with_positional_arg_in_middleSTestGetGCloudStorageArgs.test_get_gcloud_storage_args_with_positional_arg_in_middle   r   r"   c                 "   [        [        R                  / SQ0 [        R                  [        R                  [        R                  [        R                  [        R                  " 5       S9nUR	                  5       nU R                  U/ SQ5        g )N)rF   flag_value1rF   flag_value2r   r   )r9   r:   r   z(--ludicrous-list=flag_value1,flag_value2r   r   s      r   2test_get_gcloud_storage_args_with_repeat_flag_listKTestGetGCloudStorageArgs.test_get_gcloud_storage_args_with_repeat_flag_list   sd    2xxIhhHH HH!%%)^^%57L 668K[ # r"   c                 "   [        [        R                  / SQ0 [        R                  [        R                  [        R                  [        R                  [        R                  " 5       S9nUR	                  5       nU R                  U/ SQ5        g )N)rG   zflag_key1:flag_value1rG   zflag_key2:flag_value2r   r   )r9   r:   r   z=--delightful-dict=flag_key1=flag_value1,flag_key2=flag_value2r   r   s      r   2test_get_gcloud_storage_args_with_repeat_flag_dictKTestGetGCloudStorageArgs.test_get_gcloud_storage_args_with_repeat_flag_dict  sh    2xx
 hhHH HH!%%)^^%57L 668K[ # r"   c                 @   [        [        R                  / SQ0 [        R                  [        R                  [        R                  [        R                  [        R                  " 5       S9nUR	                  5       nU R                  U/ SQ5        [        [        R                  / SQ0 [        R                  [        R                  [        R                  [        R                  [        R                  " 5       S9nUR	                  5       nU R                  U/ SQ5        g )N)rH   rB   r   r   )r9   r:   r@   r   )r   rH   rC   )r9   r:   r   rA   r   r   s      r   :test_get_gcloud_storage_args_with_value_translated_to_flagSTestGetGCloudStorageArgs.test_get_gcloud_storage_args_with_value_translated_to_flag  s    2xx+hhHH HH!%%)^^%57L 668K[DF2xx

 hhHH HH!%%)^^%57L 668K[EGr"   c                 Z   [        [        R                  / SQ0 [        R                  [        R                  [        R                  [        R                  [        R                  " 5       S9nU R	                  [
        S5         UR                  5       nS S S 5        g ! , (       d  f       g = f)N)rH   	incorrectr   r   z5Flag value not in translation map for "-e": incorrect)r0   r   r   r   assertRaisesRegex
ValueErrorr   r   s      r   6test_raises_error_for_invalid_value_translated_to_flagOTestGetGCloudStorageArgs.test_raises_error_for_invalid_value_translated_to_flag=  sw    2xx2hhHH HH!%%)^^%57L 
		K
M 88:k
M 
M 
Ms   B
B*c                     S U R                   l        U R                  [        R                  S5         U R                   R                  5         S S S 5        g ! , (       d  f       g = f)NzeCommand "fake_shim" cannot be translated to gcloud storage because the translation mapping is missing)r   rl   r   r   GcloudStorageTranslationErrorr   rY   s    r   2test_raises_error_if_gcloud_storage_map_is_missingKTestGetGCloudStorageArgs.test_raises_error_if_gcloud_storage_map_is_missingK  sP    ,0D)			//	6
7 002	
7 
7 
7s   A
A$c                     [         R                  " S0 S9U R                  l        U R	                  [
        S5         U R                  R                  5         S S S 5        g ! , (       d  f       g = f)Nzsome fake command as a stringrJ   z/Incorrect mapping found for "fake_shim" command)r   rg   r   rl   r   r   r   rY   s    r   8test_raises_error_if_gcloud_command_is_of_incorrect_typeQTestGetGCloudStorageArgs.test_raises_error_if_gcloud_command_is_of_incorrect_typeS  s[    ,5,F,F6-ED)			E
G
002
G 
G 
Gs   A
A-c                 "   [         R                  " S/S[         R                  " S5      0S9U R                  l        U R                  [        R                  S5         U R                  R                  5         S S S 5        g ! , (       d  f       g = f)Nr:   rE   ry   rJ   z:Command option "-r" cannot be translated to gcloud storage)	r   rg   rh   r   rl   r   r   r   r   rY   s    r   6test_raises_error_if_command_option_mapping_is_missingOTestGetGCloudStorageArgs.test_raises_error_if_command_option_mapping_is_missingZ  sy    ,5,F,Fx)--d3
-D) 
		//D
F 002
F 
F 
Fs   B  
Bc                    [        [        R                  / SQ0 [        R                  [        R                  [        R                  [        R                  [        R                  " 5       S9n[        R
                  " 0 0 S9Ul        U R                  [        R                  S5         UR                  5         S S S 5        g ! , (       d  f       g = f)Nr   r   rJ   zjCommand "fake_with_sub" cannot be translated to gcloud storage because the translation mapping is missing.)rq   r   r   r   r   rg   rl   r   r   r   r   rZ   r   s     r   3test_raises_error_if_sub_command_mapping_is_missingLTestGetGCloudStorageArgs.test_raises_error_if_sub_command_mapping_is_missingf  s    Hxx8hhHH HH!%%)^^%57 /8.H.H/+ 
		//	7
8 224	
8 
8 
8s   &C  
Cc                    [        [        R                  / SQ0 [        R                  [        R                  [        R                  [        R                  [        R                  " 5       S9nSS0UR                  l        U R                  [        S5         UR                  5         S S S 5        g ! , (       d  f       g = f)Nr   r   abzmFlags mapping should not be present at the top-level command if a sub-command is used. Command: fake_with_sub)	rq   r   r   r   rl   rL   r   r   r   r   s     r   >test_raises_error_if_flags_mapping_at_top_level_for_subcommandWTestGetGCloudStorageArgs.test_raises_error_if_flags_mapping_at_top_level_for_subcommandy  s    Hxx8hhHH HH!%%)^^%57 9<Sz++4				<
= 224	
= 
= 
=s   B//
B=r   )r^   r_   r`   ra   rb   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ro   __classcell__r   s   @r   r   r      sh    4
7Q
HQFJNN &G<;33
35&5 5r"   r   c                   @  ^  \ rS rSrSrU 4S jrS rS rS rS r	S r
S	 rS
 rS rS r\R                   R#                  \SSS9S 5       rS rS rS rS rS rS rS rS rS rS rS rS r\R                   R#                  \ SSS9S  5       r!S! r"S" r#S# r$S$r%U =r&$ )%'TestTranslateToGcloudStorageIfRequestedi  z=Test Command.translate_to_gcloud_storage_if_requested method.c                    > [         TU ]  5         [        [        R                  / SQ0 SS S[        R                  [        R
                  " 5       S9U l        g Nr   r   Tr   r   r   s    r   r   -TestTranslateToGcloudStorageIfRequested.setUp  @    	GMO8xx1 !%%)^^%57Dr"   c           	         [         R                  R                  [        SSS9   U R	                  [
        R                  " S5      [        R                  R                  SSS5      5        S S S 5        g ! , (       d  f       g = f)N
IS_WINDOWSFnew	fake_rootbingcloud
r   r'   r(   r   r   r   _get_gcloud_binary_pathospathjoinrY   s    r   +test_gets_gcloud_binary_path_on_non_windowsSTestTranslateToGcloudStorageIfRequested.test_gets_gcloud_binary_path_on_non_windows  sX    			;%		@
y88Eww||KAC 
A	@	@   AA33
Bc           	         [         R                  R                  [        SSS9   U R	                  [
        R                  " S5      [        R                  R                  SSS5      5        S S S 5        g ! , (       d  f       g = f)Nr   Tr   r   r   z
gcloud.cmdr   rY   s    r   'test_gets_gcloud_binary_path_on_windowsOTestTranslateToGcloudStorageIfRequested.test_gets_gcloud_binary_path_on_windows  sX    			;$		?
y88Eww||KEG 
@	?	?r   c                 t   [         R                  " S/5         [        R                  R	                  U R
                  SSS9 nU R                  U R
                  R                  5       5        U R                  UR                  5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)zShould not attempt translation.)GSUtiluse_gcloud_storageFalser   Tr#   N)	r   SetBotoConfigForTestr   r'   r(   r   assertFalse(translate_to_gcloud_storage_if_requestedcalled)rZ   mock_get_gcloud_storage_argss     r   0test_returns_false_with_use_gcloud_storage_neverXTestTranslateToGcloudStorageIfRequested.test_returns_false_with_use_gcloud_storage_never  s    		"	"$M#N	O::T//6&*  ,/KGGI	K5<<=, 
P	O, , 
P	Os$   *B)ABB)
B&	"B))
B7c                    [        SSSS.05         [        R                  " SSS.5         U R                  U R                  R                  5       5        [        R                  " S5      nU R                  U R                  R                  USS	S
SSSS/5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)/Should return True and perform the translation.r   alwaysno_fallbackr   hidden_shim_modeTruefake_dir(CLOUDSDK_CORE_PASS_CREDENTIALS_TO_GSUTILCLOUDSDK_ROOT_DIRr9   r:   r>   r   r;   r   r   N)
r.   r   SetEnvironmentForTest
assertTruer   r  r   r   r   "_translated_gcloud_storage_command)rZ   expected_gcloud_paths     r   /test_returns_true_with_valid_gcloud_storage_mapWTestTranslateToGcloudStorageIfRequested.test_returns_true_with_valid_gcloud_storage_map  s    	"* -
 
 %%6<)' 	 	GGI	K  )@@L++NN19fg#T66		
 
	 	
 
s#   B;A.B*B;*
B8	4B;;
C	c                    [         R                  " S5      n[        SSSS.05         [        R                  " SSUS.5         U R                  U R                  R                  5       5        U R                  U R                  R                  US	S
SSSSS/5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)r  r  r   r	  r
  r  r  N)r  r  GCLOUD_BINARY_PATHr9   r:   r>   r   r;   r   r   )
r   r   r.   r   r  r  r   r  r   r  )rZ   gcloud_paths     r   <test_with_cloudsdk_root_dir_unset_and_gcloud_binary_path_setdTestTranslateToGcloudStorageIfRequested.test_with_cloudsdk_root_dir_unset_and_gcloud_binary_path_set  s    33J?K	"* -
 
 %%6<# +' 	
 	GGI	K 	++NN()VWf!66		
 
	 	
 
s$   B<AB+B<+
B9	5B<<
C
c                     [         R                  " S/5         U R                  U R                  R	                  5       5        S S S 5        g ! , (       d  f       g = f)N)r   r   invalid)r   r   r  r   r  rY   s    r   6test_returns_false_if_invalid_use_gcloud_storage_value^TestTranslateToGcloudStorageIfRequested.test_returns_false_if_invalid_use_gcloud_storage_value  sI    		"	"$O $% 
&




E
E
GI
& 
& 
&s   *A
Ac                    [         R                  " S/5         U R                  [        R                  S5         U R
                  R                  5         S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)N)r   r  r  zCommandException: Invalid option specified for GSUtil:use_gcloud_storage config setting. Should be one of: no_fallback | dry_run | none)r   r   r   r   CommandExceptionr   r  rY   s    r   3test_raises_error_if_invalid_hidden_shim_mode_value[TestTranslateToGcloudStorageIfRequested.test_raises_error_if_invalid_hidden_shim_mode_value  sg    		"	"$M#N	O!!

$
$*+
 	CCE+ 
P	O+ + 
P	Os"   !A6A%A6%
A3	/A66
Bc                 t   [         R                  " SS/5         [         R                  " SS 05         U R                  [        R
                  S5         U R                  R                  5         S S S 5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g = f)Nr   r   r  r   r  r
  r  a  CommandException: Requested to use "gcloud storage" but the gcloud binary path cannot be found. This might happen if you attempt to use gsutil that was not installed via Cloud SDK. You can manually set the `CLOUDSDK_ROOT_DIR` environment variable to point to the google-cloud-sdk installation directory to resolve the issue. Alternatively, you can set `use_gcloud_storage=False` to disable running the command using gcloud storage.)r   r   r  r   r   r"  r   r  rY   s    r   .test_raises_error_if_cloudsdk_root_dir_is_noneVTestTranslateToGcloudStorageIfRequested.test_raises_error_if_cloudsdk_root_dir_is_none  s    		"	"$L%4$5 
6 %%
t' 	 ##&&%	& 


E
E
G	&	
6 
6	& 	&	 	
6 
6s:   B)!BB.B6B)
BB
B&	"B))
B7c                    SR                  [        R                  " [        R                  " S5      5      5      n[
        R                  " SS/5         [
        R                  " SS S.5         U R                  [        R                  U5         U R                  R                  5         S S S 5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g = f)NzCommandException: Requested to use "gcloud storage" but gsutil is not using the same credentials as gcloud. You can make gsutil use the same credentials by running:\n{} config set pass_credentials_to_gsutil Truer  r&  r'  r  r  )formatreescaper   r   r   r   r  r   r   r"  r   r  )rZ   error_regexs     r   :test_raises_error_if_pass_credentials_to_gsutil_is_missingbTestTranslateToGcloudStorageIfRequested.test_raises_error_if_pass_credentials_to_gsutil_is_missing  s    	9 ;A&IIi77
CD;F  
	"	"$L%4$5 
6 %%)6:' 	 ##I$>$>L



E
E
G M		
6 
6 ML		 	
6 
6s<   C#,!CC(C0C#
CC
C 	C##
C1UsingGsHmacTr*   c                    [         R                  " SS/5         [         R                  " SSS.5         [        R                  R                  S[        R                  /S9U R                  l	        U R                  [        R                  S5         U R                  R                  5         S S S 5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g = f)	Nr&  r'  r  r  r+  r3   )gs_api_supportzCommandException: Requested to use "gcloud storage" with Cloud Storage XML API HMAC credentials but the "fake_shim" command can only be used with the Cloud Storage JSON API.)r   r   r  r
   rc   rd   r   JSONr   rf   r   r   r"  r  )rZ   _s     r   6test_raises_error_if_using_gs_hmac_without_xml_support^TestTranslateToGcloudStorageIfRequested.test_raises_error_if_using_gs_hmac_without_xml_support  s    		"	"$L%4$5 
6 %%)6<' 	 +2//*K*K)9)9(: +L +<'##&&=>
 


E
E
G>	
6 
6> >	 	
6 
6s;   C&ACC+C3C&
CC
C#	C&&
C4c                    S U R                   l        [        R                  " SS/5         [        R                  " SSS.5         U R                  [        R                  S5         U R                   R                  5         S S S 5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g = f)Nr&  r'  r  r  r  zxCommandException: Command "fake_shim" cannot be translated to gcloud storage because the translation mapping is missing.)	r   rl   r   r   r  r   r   r"  r  rY   s    r   /test_raises_error_if_gcloud_storage_map_missingWTestTranslateToGcloudStorageIfRequested.test_raises_error_if_gcloud_storage_map_missing!  s    ,0D)		"	"$L%4$5 
6 %%6<)' 	 ##&&JK 


E
E
G	K		
6 
6K K		 	
6 
6s;   B;!B*%B B*B;
B'#B**
B8	4B;;
C	c           	      \   [         R                  " SS/5         [         R                  " SSS.5         U R                  SSS/S	S	S
9u  pU R	                  SUR
                  S   5        U R	                  SU5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)zShould not raise error.r&  )r   r  Nr  r  r  r3   z-ir   Tr   return_stdoutreturn_log_handlerzCannot translate gsutil command to gcloud storage. Going to run gsutil command. Error: Command option "-i" cannot be translated to gcloud storageerrorrW   N)r   r   r  r[   assertInmessagesrZ   stdoutmock_log_handlers      r   :test_use_gcloud_storage_true_with_hidden_shim_mode_not_setbTestTranslateToGcloudStorageIfRequested.test_use_gcloud_storage_true_with_hidden_shim_mode_not_set0  s    		"	"$L$H$J 
K%%6<)' 	 $(??;9=vAEFJ $3 $L  	6 %%g.		0
 	>G	
K 
K	 	
K 
Ks#   BAB;B
B	B
B+c           	         [        SSSS.05         [        R                  " SS05         U R                  SS/S	S	S
9u  pU R	                  SR                  [        R                  " S5      5      UR                  S   5        U R	                  SR                  [        R                  " S5      5      U5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)z/Should print the gcloud command and run gsutil.r   r  dry_runr  r  r  r3   r   Tr>  z,Gcloud Storage Command: {} objects fake arg1inforW   N)	r.   r   r  r[   rB  r,  r   r   rC  rD  s      r   +test_dry_run_mode_prints_translated_commandSTestTranslateToGcloudStorageIfRequested.test_dry_run_mode_prints_translated_commandE  s    	"( )
 
 %%':J&GH#'??;9?AEFJ $3 $L  	:AA11*=?%%f-	/ 	4;;11*=?@F	H I
 
 IH
 
s#   CBC7C
C	C
C'c                    [        SSSS.05         [        R                  " SSS.5         [        R                  R                  U R                  SS	S
9 nU R                  R                  5         UR                  R                  [        R                  " SR                  [        R                  " S5      5      5      [        R                  " S5      [        R                  " SSS5      [        R                  " SSS5      /S	S9  S S S 5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       N(= f! , (       d  f       g = f)Nr   r	  r
  r  r  r  r  loggerTr#   z?Gcloud Storage Command: {} objects fake --zip opt1 -x arg1 arg2)Environment variables for Gcloud Storage:%s=%sCLOUDSDK_METRICS_ENVIRONMENTgsutil_shim#CLOUDSDK_STORAGE_RUN_BY_GSUTIL_SHIM)	any_order)r.   r   r  r   r'   r(   r   r  r   assert_has_callscallr,  r   r   )rZ   mock_loggers     r   7test_non_dry_mode_logs_translated_command_to_debug_logs_TestTranslateToGcloudStorageIfRequested.test_non_dry_mode_logs_translated_command_to_debug_logsZ  s'   	"* -
 
 %%6<)' 	 ZZt118(,  .1<



E
E
G



,
,ii 88>%==jI9KL iiCDii!?Oii!FO. 8< - =	.		
 
. .		 	
 
s;   E *D/B0DD/E 
D,(D//
D=	9E  
Ec                    [         R                  R                  U R                  SSS9 nU R                  R	                  / SQSS0SS9  [         R
                  " S5      [         R
                  " S	5      [         R
                  " S
SS5      /nU R                  UR                  R                  U5        SSS5        g! , (       d  f       g= f)z2Should log the command and env vars to logger.inforO  Tr#   )r:   r   r
   fake_env_varval)rJ  z+Gcloud Storage Command: fake gcloud commandrP  rQ  N)	r   r'   r(   r   "_print_gcloud_storage_command_inforW  r   rK  
mock_calls)rZ   rX  expected_callss      r   2test_print_gcloud_storage_env_vars_in_dry_run_modeZTestTranslateToGcloudStorageIfRequested.test_print_gcloud_storage_env_vars_in_dry_run_modes  s    			4--x$( 
 
*-8
;;
'.%)@$ < P ))A
B
))?
@
))G^U
3n
 {''22NC
* 
* 
*s   B	B<<
C
c                 <   SSSS.0n[        U5         [        R                  " SSS.5         [        [        R
                  SS	/0 S
SSS[        R
                  [        R                  " 5       S9	nU R                  UR                  5       5        [        R                  " S5      nU R                  UR                  USSSS	SSSS/	5        U R                  UR                  SSSSS.5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)r  r   r	  r
  r  r  r  r  r   r      fake_trace_tokenfake_user_projectF)	r   r   r   r   r   user_projectr   r   r   r9   r:   --verbosityr   z#--billing-project=fake_user_projectz--trace-token=fake_trace_token1rS  )CLOUDSDK_STORAGE_PROCESS_COUNTCLOUDSDK_STORAGE_THREAD_COUNTrR  rT  N)r.   r   r  r0   r   r   r   r  r  r   r   r   r  assertCountEqual_translated_env_variables)rZ   boto_configr   r  s       r   #test_top_level_flags_get_translatedKTestTranslateToGcloudStorageIfRequested.test_top_level_flags_get_translated  s    	"* -
K 
;	'%%6<)' 	 788&!*, %%)XX)-)9	; 	MMOP(@@LHH )VVV7$I,K
 	
 	2225140=7=	5	/	 
(	'	 	 
(	's#   DB>C<+D<
D
	D
Dc           	      
   SU R                   R                  l        SSSS.0n[        U5         [        R
                  " SSS.5         U R                  U R                  R                  5       5        [        R                  " S5      nU R                  U R                  R                  S	SSS
.5        S S S 5        S S S 5        U R                   R                  WSSS/SSSS9  g ! , (       d  f       N7= f! , (       d  f       N@= f)N r   r	  r
  r  r  r  r  rS  )rR  rT  !CLOUDSDK_AUTH_DISABLE_CREDENTIALSr	   r   accountutf-8rE  stderrencoding)_mock_subprocess_runr*   rE  r.   r   r  r  r   r  r   r   rl  rm  assert_called_once_with)rZ   rn  r  s      r   @test_anonymous_credentials_sets_disable_credentials_env_variablehTestTranslateToGcloudStorageIfRequested.test_anonymous_credentials_sets_disable_credentials_env_variable  s    46D**1 	"* -
K 
;	'%%6<)' 	 	GGI	K  )@@L880=7=5;;		 
( 	55	x	:	 6 	 	 
(	's$   C4A*C#2C4#
C1	-C44
Dc                 x   SU R                   R                  l        SU R                   R                  l        SU R                   R                  l        [
        R                  " S5      nSSSS.0n[        U5         [        R                  " S	SS
.5         U R                  [        R                  S5         U R                  R                  5         S S S 5        S S S 5        S S S 5        U R                   R                  USSS/SSSS9  g ! , (       d  f       N?= f! , (       d  f       NH= f! , (       d  f       NQ= f)Nr"   s   fake error messager4   r  r   r	  r
  r  r  r  z\Error occurred while trying to retrieve gcloud's active account. Error: b'fake error messager	   r   rt  ru  rv  rw  )rz  r*   rE  rx  
returncoder   r   r.   r   r  r   r   r"  r   r  r{  )rZ   r  rn  s      r   >test_gcloud_config_get_account_nonzero_returncode_raises_errorfTestTranslateToGcloudStorageIfRequested.test_gcloud_config_get_account_nonzero_returncode_raises_error  s   47D**14ID**189D**5$<<ZH 	"* -
K 
;	'%%6<)' 	 ##&&+, 


E
E
G	,		 
( 	55	x	:	 6 , ,		 	 
(	's<   :D+!D5D	DD+	
DD
D(	$D++
D9c                    [         R                  " SS/5         [         R                  " SSS.5         SU R                  l        U R                  R                  5         U R                  SU R                  R                  5        U R                  SU R                  R                  5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)	Nr&  r'  r  r  r  Trj  rk  )r   r   r  r   r   r  assertNotInrm  rY   s    r   Atest_parallel_operations_true_does_not_add_process_count_env_varsiTestTranslateToGcloudStorageIfRequested.test_parallel_operations_true_does_not_add_process_count_env_vars  s    		"	"$L%4$5 
6 %%6<)' 	 26.CCE9++EE	G8++EE	G	
6 
6	 	
6 
6s#   CA8B<+C<
C
	C
Cc                    [         R                  " [        R                  SS/0 SS S[        R                  [        R                  " 5       S9n[
        R                  " SS/5         [
        R                  " SS	S
.5         UR                  " 5         U R                  SUR                  5        U R                  SUR                  5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   r   r   Fr   r&  r'  r  r  r  rj  rk  )r   RsyncCommandr   r   r   r   r   r  r  r  rm  rZ   r
   s     r   Btest_parallel_operations_false_but_parallelism_turned_on_for_rsyncjTestTranslateToGcloudStorageIfRequested.test_parallel_operations_false_but_parallelism_turned_on_for_rsync  s      '-v&6)+'(-15::>((>Bnn>NPG 
	"	"$L%4$5 
6 %%6<)' 	 	88:9 ::	<8 ::	<	
6 
6	 	
6 
6s%   %C+?A
C	C+
C(	$C++
C9c                    [         R                  " / SQ5         [         R                  " SSS.5         [        R                  " [
        R                  SS/0 SS S[
        R                  [
        R                  " 5       S	9nUR                  " 5         U R                  UR                  S
   S5        U R                  UR                  S   S5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)N)r&  r'  )r   parallel_process_countri  )r   thread_process_countri  r  r  r  r   r   r   Fr   rj  ri  rk  )r   r   r  r   r  r   r   r   r  r   rm  r  s     r   ?test_parallelism_turned_on_for_rsync_unless_boto_set_sequentialgTestTranslateToGcloudStorageIfRequested.test_parallelism_turned_on_for_rsync_unless_boto_set_sequential	  s    		"	" $M 
N
 %%6<)' 	 $$88&! %%)XX)-)9; 	88:--.NO	 	--.MN	#	
N 
N
	 	
N 
Ns#   C1BC C1 
C.	*C11
C?c                    [        SSSS.05         [        R                  " SSS.5         SU R                  l        U R                  R                  5         U R                  U R                  R                  [        R                  " S5      S	S
SSSSSSSS/5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   r	  r
  r  r  r  r     r9   r:   r>   r   r;   r   r   rh  r   z
--log-http)
r.   r   r  r   r   r  r   r  r   r   rY   s    r   %test_debug_value_4_adds_log_http_flagMTestTranslateToGcloudStorageIfRequested.test_debug_value_4_adds_log_http_flag$  s    	"* -
 
 %%6<)' 	 $% CCE++NN&>>zJ&v#]G\		
 
	 	
 
s#   B>A1B-B>-
B;	7B>>
CIMPERSONATE_SERVICE_ACCOUNTfake_service_accountr   c                 x   [        SSSS.05         [        R                  " SSS.5         U R                  R	                  5         U R                  U R                  R                  [        R                  " S5      SS	S
SSSSS/	5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)z2Should add the --impersonate-service-account flag.r   r	  r
  r  r  r  r  r9   r:   r>   r   r;   r   r   z2--impersonate-service-account=fake_service_accountN)	r.   r   r  r   r  r   r  r   r   rY   s    r   ,test_impersonate_service_account_translationTTestTranslateToGcloudStorageIfRequested.test_impersonate_service_account_translation9  s    
 
"* -
 
 %%6<)' 	 	CCEAA11*=yvvDD		
 
	 	
 
s#   B+AB	B+
B(	$B++
B9c                    [        SSSS.05         [        R                  " SSS.5         SU R                  l        U R                  R                  5         U R                  U R                  R                  [        R                  " S5      S	S
SSSSSS/	5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   r	  r
  r  r  r  r  Tr9   r:   r>   r   r;   r   r   z--no-user-output-enabled)
r.   r   r  r   
quiet_moder  r   r  r   r   rY   s    r   <test_quiet_mode_translation_adds_no_user_output_enabled_flagdTestTranslateToGcloudStorageIfRequested.test_quiet_mode_translation_adds_no_user_output_enabled_flagP  s    	"* -
 
 %%6<)' 	 )-%CCE++NN&>>zJ&v#%?		
 
	 	
 
s#   B<A/B+B<+
B9	5B<<
C
c                    [         R                  " [        R                  / 0 SS S[        R                  [        R                  " 5       S9n[
        R                  " SS/5         [        R                  R                  USSS9 nU R                  UR                  " 5       5        U R                  UR                  5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = fNr   Tr   r&  r'  r   r#   )r   VersionCommandr   r   r   r   r   r'   r(   r  r  r  rZ   r
   r  s      r   &test_returns_false_for_version_commandNTestTranslateToGcloudStorageIfRequested.test_returns_false_for_version_commandd  s    $$xx !%%)^^%57G 
	"	"$L%4$5 
6 ::W&?&*  ,/KIIKL5<<=,
6 
6, ,
6 
6$   # C!<C?C!
C	C!!
C/c                    [         R                  " [        R                  / 0 SS S[        R                  [        R                  " 5       S9n[
        R                  " SS/5         [        R                  R                  USSS9 nU R                  UR                  " 5       5        U R                  UR                  5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = fr  )r   TestCommandr   r   r   r   r   r'   r(   r  r  r  r  s      r   #test_returns_false_for_test_commandKTestTranslateToGcloudStorageIfRequested.test_returns_false_for_test_commandv  s    dhh$&')%&+/378<<@NN<LNG 
	"	"$L%4$5 
6 ::W&?&*  ,/KIIKL5<<=,
6 
6, ,
6 
6r  r   )'r^   r_   r`   ra   rb   r   r   r   r  r  r  r  r#  r(  r0  r   r'   r(   r   r8  r;  rG  rL  rY  ra  ro  r|  r  r  r  r  r  r   r  r  r  r  ro   r   r   s   @r   r   r     s    E
7C
G
>,.IFH&H$ ::YDAH BH"HH*H*=2D&P<<G<,6* ::Y2/  11((>$> >r"   r   c                     ^  \ rS rSrSrU 4S jr\R                  R                  \	SS1S9\R                  R                  \
SSS	9S
 5       5       r\R                  R                  \	SS1S9S 5       r\R                  R                  \	SS1S9S 5       r\R                  R                  \	SS1S9S 5       r\R                  R                  \	SS1S9S 5       r\R                  R                  \	SS1S9S 5       r\R                  R                  \	SS1S9S 5       r\R                  R                  \	SS1S9S 5       r\R                  R                  \	SS1S9S 5       rS r\R                  R                  \	SS1S9S 5       rSrU =r$ )TestHeaderTranslationi   Test gsutil header  translation.c                    > [         TU ]  5         [        [        R                  / SQ0 SS S[        R                  [        R
                  " 5       S9U l        g r   r   r   s    r   r   TestHeaderTranslation.setUp  r   r"   COMMANDS_SUPPORTING_ALL_HEADERSr3   r   runTr#   c                 ,   SUR                   l        [        SSSS.05         [        R                  " SSS.5         [        [        R                  S	S
/SS0SS [        R                  [        R                  [        R                  " 5       S9nU R                  UR                  5       5        U R                  UR                  [        R                  " S5      SSS	S
S/5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   r   r	  r
  r  r  r  r  r   r   Content-Typefake_valr4   r   r9   r:   z--content-type=fake_val)r*   r  r.   r   r  r0   r   r   r   r  r  r   r  r   r   )rZ   mock_subprocess_runr   s      r   2test_translated_headers_get_added_to_final_commandHTestHeaderTranslation.test_translated_headers_get_added_to_final_command  s     34$$/	"* -
 
 %%6<)' 	 788&!#Z0 $%)XX)-)9; 	MMOPHH--j99fF5K
 		
 
	 	
 
s#   DB'C4#D4
D	>D
Dc                     SSSSSSSSS	S
SSSS.U R                   l        U R                   R                  5       nU R                  U/ SQ5        g )Nfake_Cache_Controlzfake_Content-Dispositionzfake_Content-Encodingzfake_Content-Languagezfake_Content-Typezfake_Content-MD5	fake_timefake_gen_matchfake_metagen_match	sEnSeTiVefake_goog_metafake_amz_metafake_amz_custom_header)Cache-ControlContent-DispositionContent-EncodingContent-Languager  Content-MD5custom-timex-goog-if-generation-matchx-goog-if-metageneration-matchzx-goog-meta-cAsEzx-goog-meta-gfoozx-amz-meta-afooz
x-amz-afoo)"--cache-control=fake_Cache_Controlz.--content-disposition=fake_Content-Dispositionz(--content-encoding=fake_Content-Encodingz(--content-language=fake_Content-Languagez --content-type=fake_Content-Typez--content-md5=fake_Content-MD5z--custom-time=fake_time$--if-generation-match=fake_gen_match,--if-metageneration-match=fake_metagen_matchz'--update-custom-metadata=cAsE=sEnSeTiVez,--update-custom-metadata=gfoo=fake_goog_metaz+--update-custom-metadata=afoo=fake_amz_metaz6--additional-headers=x-amz-afoo=fake_amz_custom_headerr   r   _translate_headersrl  rZ   flagss     r   Ftest_translate_headers_returns_correct_flags_for_data_transfer_command\TestHeaderTranslation.test_translate_headers_returns_correct_flags_for_data_transfer_command  sf     .933+)"&6*>',*.!"D$ 113E% " r"   c                 d    U R                   R                  SS05      nU R                  US/5        g )Nr  r  r  r   r  rl  r  s     r   3test_translate_custom_headers_returns_correct_flagsITestHeaderTranslation.test_translate_custom_headers_returns_correct_flags  s7     11	./1E%"F!GHr"   c                     U R                   R                  [        R                  " SS/5      5      nU R	                  US/5        g )N)header1value1)header2value2z2--additional-headers=header1=value1,header2=value2)r   r  collectionsOrderedDictrl  r  s     r   Atest_translate_custom_headers_handles_multiple_additional_headersWTestHeaderTranslation.test_translate_custom_headers_handles_multiple_additional_headers  sH     11!68M NOQEDEGr"   c                 b    U R                   R                  SS0SS9nU R                  US/5        g )Nr  r  Tunset--clear-cache-controlr  r  s     r   2test_translate_clear_headers_returns_correct_flagsHTestHeaderTranslation.test_translate_clear_headers_returns_correct_flags  s>     11	./t 2 =E%"9!:;r"   c                 <   SS0U R                   l        [        R                  R	                  U R                   R
                  SSS9 nU R                  U R                   R                  5       S/5        UR                  S5        SSS5        g! , (       d  f       g= f)	zShould log a warning.
additionalheaderwarnTr#   &--additional-headers=additional=headerHeader additional:header cannot be translated to a gcloud storage equivalent flag. It is being treated as an arbitrary request header.N	r   r   r   r'   r(   rO  r   r  r{  rZ   mock_warnings     r   Gtest_translate_headers_for_data_transfer_command_with_additional_header]TestHeaderTranslation.test_translate_headers_for_data_transfer_command_with_additional_header       #/!9D			4--44f$( 
 
*-9
t))<<>@AC**	
* 
* 
*   =B
B$PRECONDITONS_ONLY_SUPPORTED_COMMANDSc                     SSSS.U R                   l        U R                   R                  5       nU R                  USS/5        g )Nr  r  r  )r  r  x-goog-meta-foor  r  r  r  s     r   ?test_translate_valid_headers_for_precondition_supported_commandUTestHeaderTranslation.test_translate_valid_headers_for_precondition_supported_command
  sN    
 '7*>+	"D 113E%.6" r"   c                     SSSS.U R                   l        U R                   R                  5       nU R                  USS/5        g )Nr  r  r  )zx-goog-generation-matchzx-goog-metageneration-matchr  r  r  r  r  s     r   ?test_translate_short_headers_for_precondition_supported_commandUTestHeaderTranslation.test_translate_short_headers_for_precondition_supported_command  sN    
 $4';+	"D 113E%.6" r"   c                 <   SS0U R                   l        [        R                  R	                  U R                   R
                  SSS9 nU R                  U R                   R                  5       S/5        UR                  S5        SSS5        g! , (       d  f       g= f)	z*Should be ignored and not raise any error.r  r  r  Tr#   r  r  Nr  r  s     r   Ptest_translate_headers_for_precondition_supported_command_with_additional_headerfTestHeaderTranslation.test_translate_headers_for_precondition_supported_command_with_additional_header*  r  r  c                     SSSSS.U R                   l        U R                  U R                   R                  5       S/5        g )Nr  r  r  r  )r  r  r  r  r  r   r   r   r  rY   s    r   Qtest_translate_headers_only_uses_additional_headers_for_commands_not_in_allowlistgTestHeaderTranslation.test_translate_headers_only_uses_additional_headers_for_commands_not_in_allowlist:  sH     .&6+	"D 	T''::<>?Ar"   c                     SSS.U R                   l        U R                  U R                   R                  5       S/5        g )Nr  2)r  zx-goog-api-versionr  r  rY   s    r   8test_translate_headers_ignores_x_goog_api_version_headerNTestHeaderTranslation.test_translate_headers_ignores_x_goog_api_version_headerM  sA    
 '7!"D 	T''::<<=?r"   r   )r^   r_   r`   ra   rb   r   r   r'   r(   r   
subprocessr  r  r  r  r  r  r  r  r  r  r   ro   r   r   s   @r   r  r    s*   (
7 ::Y6%  ( ::Z6 7(< ::Y6%  (#(#J ::Y6%  (I(I
 ::Y6%  (G(G ::Y6%  (<(<
 ::Y6%  (( ::Y;%  (( ::Y;%  (( ::Y;%  ((A& ::Y;%  (?(?r"   r  c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
TestGetFlagFromHeaderiY  zTest Command.get_flag_from_header function.

We only test the unset functionality because rest of the workflows have been
already tested indirectly in TestHeaderTranslation.
c                     SSSSSSS.nUR                  5        H,  u  p#[        R                  " USS	S
9nU R                  XC5        M.     g )Nr  z--clear-content-dispositionz--clear-content-encodingz--clear-content-languagez--clear-content-typez--clear-custom-time)r  r  r  r  r  r  r  Tr  r&   r   get_flag_from_headerr   rZ   headers_to_expected_flag_mapr  expected_flagresults        r   Ctest_get_flag_from_header_with_unset_true_for_data_transfer_headersYTestGetFlagFromHeader.test_get_flag_from_header_with_unset_true_for_data_transfer_headers`  sY     1<66.,$  ">!C!C!E--fjMf
v- "Fr"   c                 d    S H*  n[         R                  " USSS9nU R                  U5        M,     g)Should return None.)r  r  r  Tr  Nr   r  assertIsNone)rZ   r  r  s      r   Btest_get_flag_from_header_with_unset_true_for_precondition_headersXTestGetFlagFromHeader.test_get_flag_from_header_with_unset_true_for_precondition_headerso  s2     --fjMf
r"   c                 R    [         R                  " SSSS9nU R                  U5        g)r  r  r  Tr  Nr  rZ   r  s     r   9test_get_flag_from_header_with_unset_true_for_content_md5OTestGetFlagFromHeader.test_get_flag_from_header_with_unset_true_for_content_md5z  s*    ++M,6268F 	fr"   c                 R    [         R                  " SSSS9nU R                  U5        g)r  invalid_headerr  Tr  Nr  r  s     r   <test_get_flag_from_header_with_unset_true_for_invalid_headerRTestGetFlagFromHeader.test_get_flag_from_header_with_unset_true_for_invalid_header  s+    ++,<,6268F 	fr"   c                     SSS.nUR                  5        H,  u  p#[        R                  " USSS9nU R                  XC5        M.     g)z,Should return --remove-custom-metadata flag.z--remove-custom-metadata=foo)r  zx-amz-meta-foor  Tr  Nr  r  s        r   >test_get_flag_from_header_with_unset_true_for_metadata_headersTTestGetFlagFromHeader.test_get_flag_from_header_with_unset_true_for_metadata_headers  sM     :8$  ">!C!C!E--fjMf
v- "Fr"   r]   N)r^   r_   r`   ra   rb   r  r  r  r  r  ro   r]   r"   r   r  r  Y  s     .	 .r"   r  c                   0    \ rS rSrSrS rS rS rS rSr	g)	TestFormatFlagUtilsi  z5Test utils used for generating gcloud --format flags.c                     [         R                  R                  [        SSS9   U R	                  [
        R                  " 5       S5        S S S 5        g ! , (       d  f       g = f)Nr   Fr   ^r   r'   r(   r   r   r   get_format_flag_caretrY   s    r   *test_gets_format_flag_caret_on_non_windows>TestFormatFlagUtils.test_gets_format_flag_caret_on_non_windows  sA    			;%		@
y668#> 
A	@	@   &A
A!c                     [         R                  R                  [        SSS9   U R	                  [
        R                  " 5       S5        S S S 5        g ! , (       d  f       g = f)Nr   Tr   z^^^^r#  rY   s    r   .test_gets_format_flag_escaped_caret_on_windowsBTestFormatFlagUtils.test_gets_format_flag_escaped_caret_on_windows  sA    			;$		?
y668&A 
@	?	?r'  c                     [         R                  R                  [        SSS9   U R	                  [
        R                  " 5       S5        S S S 5        g ! , (       d  f       g = f)Nr   Fr   
r   r'   r(   r   r   r   get_format_flag_newlinerY   s    r   ,test_gets_format_flag_newline_on_non_windows@TestFormatFlagUtils.test_gets_format_flag_newline_on_non_windows  sA    			;%		@
y88:DA 
A	@	@r'  c                     [         R                  R                  [        SSS9   U R	                  [
        R                  " 5       S5        S S S 5        g ! , (       d  f       g = f)Nr   Tr   z^\^nr-  rY   s    r   0test_gets_format_flag_escaped_newline_on_windowsDTestFormatFlagUtils.test_gets_format_flag_escaped_newline_on_windows  sA    			;$		?
y88:GD 
@	?	?r'  r]   N)
r^   r_   r`   ra   rb   r%  r)  r/  r2  ro   r]   r"   r   r   r     s    =?BBEr"   r   c                     ^  \ rS rSrSrU 4S jr\R                  R                  \	SS1S9\R                  R                  \
SSS	9S
 5       5       rS rS rS rS rS r\R                  R                  \	SS1S9S 5       r\R                  R                  \	SS1S9S 5       r\R                  R                  \SSS9S 5       r\R                  R                  \SSS9S 5       rS rS rS rSrU =r$ )TestBotoTranslationi  r  c                    > [         TU ]  5         [        [        R                  / SQ0 SS S[        R                  [        R
                  " 5       S9U l        g r   r   r   s    r   r   TestBotoTranslation.setUp  r   r"   r  r3   r   r  Tr#   c                    SUR                   l        [        SSSSSS.05         [        R                  " SSS	.5         U R                  U R                  R                  5       5        [        R                  " S5      nU R                  U R                  R                  US
SSSSSSS/	5        U R                  U R                  R                  SSSS.5        SSS5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)z-Should add translated env vars as well flags.r   r   r  r
  foofake_project)r   r  content_languagedefault_project_idr  r  r9   r:   r>   r   r;   r   r   z--content-language=foorS  )CLOUDSDK_CORE_PROJECTrR  rT  N)r*   r  r.   r   r  r  r   r  r   r   r   r  rm  )rZ   r  r  s      r   &test_translated_boto_config_gets_added:TestBotoTranslation.test_translated_boto_config_gets_added  s    34$$/	"( - %"0	
 
 %%6<)' 	 	GGI	K  )@@LAA$i&$ 8D	
 	88)70=7=;		
 
	 	
 
s#   C9BC(C9(
C6	2C99
Dc                     [        SSSSS.05         U R                  R                  5       u  pU R                  U/ 5        U R                  USS05        S S S 5        g ! , (       d  f       g = f)NCredentialsfoo_host1234v2)gs_json_hostgs_json_portjson_api_version'CLOUDSDK_API_ENDPOINT_OVERRIDES_STORAGEz https://foo_host:1234/storage/v2r.   r   _translate_boto_configr   rZ   r  env_varss      r   "test_gcs_json_endpoint_translation6TestBotoTranslation.test_gcs_json_endpoint_translation  st    	&" $
 
 **AACoe
ub!

74
 
 
s   AA
A,c                     [        SSSS.05         U R                  R                  5       u  pU R                  U/ 5        U R                  USS05        S S S 5        g ! , (       d  f       g = f)NrA  rB  rD  )rE  rG  rH  zhttps://foo_host/storage/v2rI  rK  s      r   4test_gcs_json_endpoint_translation_with_missing_portHTestBotoTranslation.test_gcs_json_endpoint_translation_with_missing_port  sp    	& $
 
 **AACoe
ub!
x
3+" 	
 
 
   AA
A+c                     [        SSSS.05         U R                  R                  5       u  pU R                  U/ 5        U R                  USS05        S S S 5        g ! , (       d  f       g = f)NrA  rB  rC  )rE  rF  rH  z https://foo_host:1234/storage/v1rI  rK  s      r   ;test_gcs_json_endpoint_translation_usees_default_version_v1OTestBotoTranslation.test_gcs_json_endpoint_translation_usees_default_version_v1  sq    		&"
 	

 **AACoe
ub!

74
 
 
rR  c                     [        SSSS.05         U R                  R                  5       u  pU R                  U/ 5        U R                  USS05        S S S 5        g ! , (       d  f       g = f)NrA  s3_hostrC  )rW  s3_port CLOUDSDK_STORAGE_S3_ENDPOINT_URLzhttps://s3_host:1234rI  rK  s      r   test_s3_endpoint_translation0TestBotoTranslation.test_s3_endpoint_translation  sp    		 
 	

 **AACoe
ub!

-/E
FH
 
 
rR  c                     [        SSS005         U R                  R                  5       u  pU R                  U/ 5        U R                  USS05        S S S 5        g ! , (       d  f       g = f)NrA  rW  rY  zhttps://s3_hostrI  rK  s      r   .test_s3_endpoint_translation_with_missing_portBTestBotoTranslation.test_s3_endpoint_translation_with_missing_port  sa    	MIy+BC	D**AACoe
ub!
x:<MNP 
E	D	Ds   AA
A*ENCRYPTION_SUPPORTED_COMMANDSc                     [        SSS005         U R                  R                  5       u  pU R                  US/5        S S S 5        g ! , (       d  f       g = f)Nr   encryption_keyfake_keyz--encryption-key=fake_keyrI  rZ   r  r7  s      r   *test_encryption_key_gets_converted_to_flag>TestBotoTranslation.test_encryption_key_gets_converted_to_flag  sN     
H'7&DE	F##::<he
u:;< 
G	F	Fs   0A		
Ac                     [        S[        R                  " / SQ5      05         U R                  R	                  5       u  pU R                  US/5        S S S 5        g ! , (       d  f       g = f)Nr   ))decryption_key1key1)decryption_key12key12)decryption_key100key100z#--decryption-keys=key1,key12,key100)r.   r  r  r   rJ  r   rc  s      r   *test_decryption_key_gets_converted_to_flag>TestBotoTranslation.test_decryption_key_gets_converted_to_flag   sc     
## %  
 ##::<he
uDEF
 
 
s   0A
A+r2  Fr3  c                    [        SSSS.05         U R                  R                  5       u  p#U R                  UR                  S5        U R                  U/ 5        U R                  U0 5        S S S 5        g ! , (       d  f       g = f)NrA  r9  bar)gs_access_key_idgs_secret_access_key   )r.   r   rJ  r   
call_count)rZ   mock_using_gs_hmacr  rL  s       r   ,test_gs_hmac_auth_env_when_not_using_gs_hmac@TestBotoTranslation.test_gs_hmac_auth_env_when_not_using_gs_hmac/  s|    	 %$)
 
 **AACoe
)44a8
ub!
x$
 
 
s   AA77
Bc                    [        SSSSSS.SSS	S
SSSSSSSS.SSSSSSSS.SSSSS.S .5         U R                  R                  5       u  p#U R                  U/ 5        S U l        U R                  U0 S!S_S"S_S#S_S$S_S%S_S&S_S&S_S'S_S(S	_S)S
_S*S_S+S_S,S_S-S_S.S_S/S_S0S_SSSSSSSSSSSS1.E5        S S S 5        g ! , (       d  f       g = f)2NAWS_ACCESS_KEY_ID_valueAWS_SECRET_ACCESS_KEY_value+CLOUDSDK_STORAGE_GS_XML_ACCESS_KEY_ID_value/CLOUDSDK_STORAGE_GS_XML_SECRET_ACCESS_KEY_valueT)aws_access_key_idaws_secret_access_keyrq  rr  use_client_certificateCLOUDSDK_PROXY_ADDRESS_valueCLOUDSDK_PROXY_TYPE_valueCLOUDSDK_PROXY_PORT_valueCLOUDSDK_PROXY_USERNAME_valueCLOUDSDK_PROXY_PASSWORD_valueCLOUDSDK_PROXY_RDNS_valueHTTP_TIMEOUT_valueCA_CERTS_FILE_valueFBASE_RETRY_DELAY_valueMAX_RETRIES_value)proxy
proxy_type
proxy_port
proxy_user
proxy_pass
proxy_rdnshttp_socket_timeoutca_certificates_filehttps_validate_certificatesmax_retry_delaynum_retriesCHECK_HASHES_valueCLOUDSDK_CORE_PROJECT_valueUSAGE_REPORTING_valueUSE_MAGICFILE_value100M256K32000)check_hashesr<  disable_analytics_promptuse_magicfile#parallel_composite_upload_thresholdresumable_thresholdrsync_buffer_linesCLOUDSDK_AUTH_CLIENT_ID_valueAUTH_CLIENT_SECRET_valueCLOUDSDK_AUTH_AUTH_HOST_valueCLOUDSDK_AUTH_TOKEN_HOST_value)	client_idclient_secretprovider_authorization_uriprovider_token_uri)rA  Botor   OAuth2AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY-CLOUDSDK_CONTEXT_AWARE_USE_CLIENT_CERTIFICATE%CLOUDSDK_STORAGE_GS_XML_ACCESS_KEY_ID)CLOUDSDK_STORAGE_GS_XML_SECRET_ACCESS_KEYCLOUDSDK_PROXY_ADDRESSCLOUDSDK_PROXY_TYPECLOUDSDK_PROXY_PORTCLOUDSDK_PROXY_USERNAMECLOUDSDK_PROXY_PASSWORDCLOUDSDK_PROXY_RDNSCLOUDSDK_CORE_HTTP_TIMEOUT"CLOUDSDK_CORE_CUSTOM_CA_CERTS_FILE$CLOUDSDK_AUTH_DISABLE_SSL_VALIDATION!CLOUDSDK_STORAGE_BASE_RETRY_DELAYCLOUDSDK_STORAGE_MAX_RETRIES)CLOUDSDK_STORAGE_CHECK_HASHESr=  %CLOUDSDK_CORE_DISABLE_USAGE_REPORTINGCLOUDSDK_STORAGE_USE_MAGICFILE4CLOUDSDK_STORAGE_PARALLEL_COMPOSITE_UPLOAD_THRESHOLD$CLOUDSDK_STORAGE_RESUMABLE_THRESHOLD&CLOUDSDK_STORAGE_RSYNC_LIST_CHUNK_SIZECLOUDSDK_AUTH_CLIENT_IDCLOUDSDK_AUTH_CLIENT_SECRETCLOUDSDK_AUTH_AUTH_HOSTCLOUDSDK_AUTH_TOKEN_HOST)r.   r   rJ  r   maxDiffassertDictEqual)rZ   r7  r  rL  s       r   1test_boto_config_translation_for_supported_fieldsETestBotoTranslation.test_boto_config_translation_for_supported_fields<  s   	 *-=A
 455995#7$9+07.
 1"?(?239#)")
 97*I"B	
G) )
T **AACoe
ub!dl

 9!+9 &/	9
 >9 6?9 :C9 '09 '09 $-!9" $-%9& (1)9* (1-9. $-192 +&596 3'99: 5=9> 2*A9B -%E9H '/)'1,12q9:[)
 )
 )
s   B	C
Cc                     [        SSS005         U R                  R                  5       u  pU R                  U/ 5        U R                  U0 5        S S S 5        g ! , (       d  f       g = f)Nr   unsupported_fieldr9  rI  rK  s      r   "test_missing_mappging_gets_ignored6TestBotoTranslation.test_missing_mappging_gets_ignored  sX    	H':E&BC	D**AACoe
ub!
x$ 
E	D	D   AA
A(c                     [        SSS005         U R                  R                  5       u  pU R                  U/ 5        U R                  U0 5        SSS5        g! , (       d  f       g= f)z4Should not set CLOUDSDK_AUTH_DISABLE_SSL_VALIDATION.r   r  TNrI  rK  s      r   'test_truthy_https_validate_certificates;TestBotoTranslation.test_truthy_https_validate_certificates  sX    	H'Dd&KL	M**AACoe
ub!
x$ 
N	M	Mr  c           	         [        SSSS.05         [        R                  R                  U R                  R
                  SSS9 nU R                  R                  5       u  p#U R                  U/ 5        U R                  U0 5        U R                  UR                  [        R                  " S5      [        R                  " S	5      /5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)
Nr   foo_bin
foo_config)stet_binary_pathstet_config_pathrA  Tr#   z`The boto config field GSUtil:stet_binary_path cannot be translated to gcloud storage equivalent.z`The boto config field GSUtil:stet_config_path cannot be translated to gcloud storage equivalent.)r.   r   r'   r(   r   rO  rJ  r   rl  r_  rW  )rZ   rX  r  rL  s       r   &test_missing_required_fields_log_error:TestBotoTranslation.test_missing_required_fields_log_error  s    	 ) ,
 
 ::T//66&*  ,/:,,CCE#2&k44II B CII B C7
 	,
 
, ,
 
s$   4C.BCC.
C+	'C..
C<)r   r  )r^   r_   r`   ra   rb   r   r   r'   r(   r   r  r>  rM  rP  rT  rZ  r]  rd  rm  r   rv  r  r  r  r  ro   r   r   s   @r   r5  r5    sK   (
7 ::Y6%  ( ::Z6 7(> 	
HP ::Y4%  (=(=
 ::Y4%  (
G(
G ::YEB
% C
% ::YDAh BhT%% r"   r5  c                       \ rS rSrSr\R                  R                  \R                  SSS0S9\R                  R                  \
SSS	9S
 5       5       rSrg)TestRunGcloudStoragei  z'Test Command.run_gcloud_storage method.copyold_key	old_valuer3  r  Tr#   c                 |   [        [        R                  / SQ0 [        R                  [        R                  [        R                  [        R                  [        R                  " 5       S9n[        R
                  " SS/5         [        R                  " SSS.5         SS	0Ul        S
S/Ul        UR                  5       nUR                  S
S/SS	S.S9  UR                  5         U R                  XAR                  R                  5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr   r   r&  r'  r  r  r  new_key	new_valuer   r9  r  )r  r  )env)r0   r   r   r   r   r   r  rm  r  run_gcloud_storager{  r   r*   r  )rZ   mock_runmock_environ_copycommand_instanceactual_return_codes        r   :test_calls_subprocess_with_translated_command_and_env_varsOTestRunGcloudStorage.test_calls_subprocess_with_translated_command_and_env_vars  s     7xx1hhHH HH!%%)^^%57 
	"	"$L%4$5 
6 %%6<)' 	
 {6
2 @H>O;-@@B(((E):8C8C.+ 	) 	,
 	113+-B-B-M-MN	
6 
6	 	
6 
6s%   D-A-DD-
D*	&D--
D;r]   N)r^   r_   r`   ra   rb   r   r'   r(   r   environr  r  ro   r]   r"   r   r  r    sW    /::RZZy+6NO::Z6O 7 POr"   r  c                       \ rS rSrS rSrg)TestShimE2Ei  c                    [         R                  " SS/5         [         R                  " SS S.5         U R                  SS/SSS	9nU R	                  S
U5        S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f)Nr&  r'  r  r  z-DlsTr4   )return_stderrexpected_statusz"gcloud binary path cannot be found)r   r   r  	RunGsUtilrB  )rZ   rx  s     r   3test_runs_gcloud_storage_if_use_gcloud_storage_true?TestShimE2E.test_runs_gcloud_storage_if_use_gcloud_storage_true  s    		"	"$L%4$5 
6 %%6<#' 	 t.201   3 	:FC	
6 
6	 	
6 
6s"   A;&A*A;*
A8	4A;;
B	r]   N)r^   r_   r`   ra   r  ro   r]   r"   r   r  r    s    Dr"   r  )1rb   
__future__r   r   r   r   r  
contextlibr   r   r-  r  unittestr   botor	   gslibr
   r   r   gslib.commandsr   r   r   gslib.cs_api_mapr   gslib.testsr   gslib.utilsr   r   r   r   r   r.   rc   r0   rq   GsUtilUnitTestCaser   ShimUnitTestBaser   r  r  r   r5  r  GsUtilIntegrationTestCaser  r]   r"   r   <module>r     s,    & %  '  % 	 	     "    "  (   ! ! ! #   0(4goo (4V%GOO %Pn5x:: n5bz>h.G.G z>zN?H77 N?b7.H77 7.tE(55 E(^(55 ^B	"O866 "OJD(44 Dr"   