
                            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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Z ddlm Z  ddlm!Z! ed        Z" G d dejF                        Z$ G d dejF                        Z% G d dejL                        Z' G d dejP                        Z) G d  d!ejL                        Z* G d" d#ejL                        Z+ G d$ d%ejL                        Z, G d& d'ejL                        Z- G d( d)ejL                        Z. G d* d+ej^                        Z0y),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              #      K   d fd	}t         j                  j                  t        dd      5 }t         j                  j                  t        dd      5 }t         j                  j                  t        dd      5 }||_        ||_         j                         |_        d ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY ww)	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                 H    j                  | i       j                  ||      S N)get)sectionkeydefault_valueboto_config_dicts      -platform/gsutil/gslib/tests/test_shim_util.py_config_get_side_effectz2_mock_boto_config.<locals>._config_get_side_effect;   s#    ,00m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>(B?&C.C6	C#?CCC	CC C#c                      e Zd ZdZej
                  j                  ddej                  dd      Z	 e
j                  ddg e
j                  d	
       e
j                  d
       e
j                  de
j                  j                         e
j                  de
j                  j                         e
j                  ddd
      dd      Zej
                  j#                  dg dddi       Zd Zy)FakeCommandWithGcloudStorageMap(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                     t        d       y )N&FakeCommandWithGcloudStorageMap called)printselfs    r   
RunCommandz*FakeCommandWithGcloudStorageMap.RunCommandn   s    	
23r!   )__name__
__module____qualname____doc__r
   CommandCreateCommandSpecr   NO_MAXcommand_specr   GcloudStorageMapGcloudStorageFlagRepeatFlagTypeLISTDICTgcloud_storage_mapHelpSpec	help_specrY    r!   r   r/   r/   G   s   022;<=<E<L<LFO?C	 3 E,
 2y11( *i))d;)i))g>)i))0'66;;= *i))1'66;;= *i)) "7 
 '	. oo&&D- ' )4r!   r/   c                      e Zd ZdZej
                  j                  ddej                  dde	j                  j                         ge	j                  j                  d      gd      Z ej                   ej                  dd	g ej                   d
       ej                   d      d       ej                  ddgi       di       Zej
                  j%                  dg dddi       Zy)-FakeCommandWithSubCommandWithGcloudStorageMapr0   fake_with_subr2   zay:T)setr   )r3   r4   r5   r6   argparse_argumentsbucketsupdater9   r:   --yyy)-a-yrH   describerK   rL   z-Help text for fake command with sub commands.rM   N)rZ   r[   r\   r]   r
   r^   r_   r   r`   r   CommandArgument%MakeZeroOrMoreCloudBucketURLsArgumentMakeNCloudBucketURLsArgumentra   r   rb   rc   rg   rh   ri   rj   r!   r   rl   rl   r   s   022 ..335
 ..KKAN 3 	, 2y11
$)
$
$'23	33E3	33H %)
$
$Y
4K.02B <>? oo&&D? ' )r!   rl   c                        e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )TestGetGCloudStorageArgsz,Test Command.get_gcloud_storage_args method.c                     t         |           t        t        j                  g di dt        j                  t        j                  t        j                  t        j
                               | _        y )NrC   opt1rB   arg1arg2r2   command_runnerargsheadersdebugtrace_tokenparallel_operationsbucket_storage_uri_classgsutil_api_class_map_factorysupersetUpr/   r   ANY	MagicMock_fake_commandrX   	__class__s    r   r   zTestGetGCloudStorageArgs.setUp   sH    	GMO8xx1HH HH!%%)^^%57Dr!   c                 `    | j                   j                         }| j                  |g d       y )Nr7   r8   r<   r}   r9   r~   r   )r   get_gcloud_storage_argsassertEqualrX   gcloud_argss     r   5test_get_gcloud_storage_args_parses_command_and_flagszNTestGetGCloudStorageArgs.test_get_gcloud_storage_args_parses_command_and_flags   s*    $$<<>K[OQr!   c           	          | j                   j                  t        j                  ddgt        j                  d      t        j                  d      d            }| j                  |g d       y )	Nr7   custom-fakers   r:   -b)rC   rB   rH   )r7   r   rs   r}   r   r~   r   )r   r   r   rb   rc   r   r   s     r   6test_get_gcloud_storage_args_parses_custom_command_mapzOTestGetGCloudStorageArgs.test_get_gcloud_storage_args_parses_custom_command_map   sf    $$<<""%}511dC11dC	K 	FHr!   c                     ddg| j                   _        | j                   j                         }| j                  |g d       y )Nr7   r8   r   )r   rI   r   r   r   s     r   :test_get_gcloud_storage_args_parses_command_in_list_formatzSTestGetGCloudStorageArgs.test_get_gcloud_storage_args_parses_command_in_list_format   s=    )2F(;D%$$<<>K[OQr!   c                 &   t        t        j                  g di t        j                  t        j                  t        j                  t        j                  t        j                               }|j	                         }| j                  |g d       y )Nrn   rt   r}   rs   r~   r   r   )rp   rq   rr   r}   r9   r~   r   )rl   r   r   r   r   r   )rX   fake_with_subcommandr   s      r   /test_get_gcloud_storage_args_parses_subcommandszHTestGetGCloudStorageArgs.test_get_gcloud_storage_args_parses_subcommands   se    Hxx8hhHH HH!%%)^^%57 '>>@KDFr!   c                 &   t        t        j                  g di t        j                  t        j                  t        j                  t        j                  t        j                               }|j	                         }| j                  |g d       y )N)positional_argrG   rB   opt2rG   r   )r7   r8   r   r9   r   r/   r   r   r   r   r   rX   fake_commandr   s      r   1test_get_gcloud_storage_args_with_flags_to_ignorezJTestGetGCloudStorageArgs.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                 &   t        t        j                  g di t        j                  t        j                  t        j                  t        j                  t        j                               }|j	                         }| j                  |g d       y )N)r   rC   r}   rB   r   r   )r7   r8   r   r<   r}   r9   r   r   r   s      r   =test_get_gcloud_storage_args_with_positional_arg_at_beginningzVTestGetGCloudStorageArgs.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                 &   t        t        j                  g di t        j                  t        j                  t        j                  t        j                  t        j                               }|j	                         }| j                  |g d       y )N)rC   r}   r   rB   r   r   )r7   r8   r<   r}   r   r9   r   r   r   s      r   :test_get_gcloud_storage_args_with_positional_arg_in_middlezSTestGetGCloudStorageArgs.test_get_gcloud_storage_args_with_positional_arg_in_middle   r   r!   c                 &   t        t        j                  g di t        j                  t        j                  t        j                  t        j                  t        j                               }|j	                         }| j                  |g d       y )N)rD   flag_value1rD   flag_value2r   r   )r7   r8   r   z(--ludicrous-list=flag_value1,flag_value2r   r   s      r   2test_get_gcloud_storage_args_with_repeat_flag_listzKTestGetGCloudStorageArgs.test_get_gcloud_storage_args_with_repeat_flag_list   sd    2xxIhhHH HH!%%)^^%57L 668K[ # r!   c                 &   t        t        j                  g di t        j                  t        j                  t        j                  t        j                  t        j                               }|j	                         }| j                  |g d       y )N)rE   zflag_key1:flag_value1rE   zflag_key2:flag_value2r   r   )r7   r8   r   z=--delightful-dict=flag_key1=flag_value1,flag_key2=flag_value2r   r   s      r   2test_get_gcloud_storage_args_with_repeat_flag_dictzKTestGetGCloudStorageArgs.test_get_gcloud_storage_args_with_repeat_flag_dict  sh    2xx
 hhHH HH!%%)^^%57L 668K[ # r!   c                 H   t        t        j                  g di t        j                  t        j                  t        j                  t        j                  t        j                               }|j	                         }| j                  |g d       t        t        j                  g di t        j                  t        j                  t        j                  t        j                  t        j                               }|j	                         }| j                  |g d       y )N)rF   r@   r   r   )r7   r8   r>   r   )r   rF   rA   )r7   r8   r   r?   r   r   s      r   :test_get_gcloud_storage_args_with_value_translated_to_flagzSTestGetGCloudStorageArgs.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                 T   t        t        j                  g di t        j                  t        j                  t        j                  t        j                  t        j                               }| j	                  t
        d      5  |j                         }d d d        y # 1 sw Y   y xY w)N)rF   	incorrectr   r   z5Flag value not in translation map for "-e": incorrect)r/   r   r   r   assertRaisesRegex
ValueErrorr   r   s      r   6test_raises_error_for_invalid_value_translated_to_flagzOTestGetGCloudStorageArgs.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                     d | j                   _        | j                  t        j                  d      5  | j                   j                          d d d        y # 1 sw Y   y xY w)NzeCommand "fake_shim" cannot be translated to gcloud storage because the translation mapping is missing)r   rg   r   r   GcloudStorageTranslationErrorr   rW   s    r   2test_raises_error_if_gcloud_storage_map_is_missingzKTestGetGCloudStorageArgs.test_raises_error_if_gcloud_storage_map_is_missingK  sP    ,0D)			//	6
7 002	
7 
7 
7s   AAc                     t        j                  di       | j                  _        | j	                  t
        d      5  | j                  j                          d d d        y # 1 sw Y   y xY w)Nzsome fake command as a stringrH   z/Incorrect mapping found for "fake_shim" command)r   rb   r   rg   r   r   r   rW   s    r   8test_raises_error_if_gcloud_command_is_of_incorrect_typezQTestGetGCloudStorageArgs.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                    t        j                  dgdt        j                  d      i      | j                  _        | j                  t        j                  d      5  | j                  j                          d d d        y # 1 sw Y   y xY w)Nr8   rC   rs   rH   z:Command option "-r" cannot be translated to gcloud storage)	r   rb   rc   r   rg   r   r   r   r   rW   s    r   6test_raises_error_if_command_option_mapping_is_missingzOTestGetGCloudStorageArgs.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                    t        t        j                  g di t        j                  t        j                  t        j                  t        j                  t        j                               }t	        j
                  i i       |_        | j                  t        j                  d      5  |j                          d d d        y # 1 sw Y   y xY w)Nr   r   rH   zjCommand "fake_with_sub" cannot be translated to gcloud storage because the translation mapping is missing.)rl   r   r   r   r   rb   rg   r   r   r   r   rX   r   s     r   3test_raises_error_if_sub_command_mapping_is_missingzLTestGetGCloudStorageArgs.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                 z   t        t        j                  g di t        j                  t        j                  t        j                  t        j                  t        j                               }ddi|j                  _        | j                  t        d      5  |j                          d d d        y # 1 sw Y   y xY w)Nr   r   abzmFlags mapping should not be present at the top-level command if a sub-command is used. Command: fake_with_sub)	rl   r   r   r   rg   rJ   r   r   r   r   s     r   >test_raises_error_if_flags_mapping_at_top_level_for_subcommandzWTestGetGCloudStorageArgs.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   B11B:)rZ   r[   r\   r]   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   s   @r   rz   rz      sc    4
7Q
HQFJNN &G<;33
35&5r!   rz   c                   B    e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zej                  j!                  edd      d        Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zej                  j!                  edd      d        Z d  Z!d! Z"d" Z# xZ$S )#'TestTranslateToGcloudStorageIfRequestedz=Test Command.translate_to_gcloud_storage_if_requested method.c                     t         |           t        t        j                  g di dd dt        j                  t        j
                               | _        y Nr|   r   Tr   r   r   s    r   r   z-TestTranslateToGcloudStorageIfRequested.setUp  @    	GMO8xx1 !%%)^^%57Dr!   c           	         t         j                  j                  t        dd      5  | j	                  t        j                  d      t        j                  j                  ddd             d d d        y # 1 sw Y   y xY w)N
IS_WINDOWSFnew	fake_rootbingcloud
r   r&   r'   r   r   r   _get_gcloud_binary_pathospathjoinrW   s    r   +test_gets_gcloud_binary_path_on_non_windowszSTestTranslateToGcloudStorageIfRequested.test_gets_gcloud_binary_path_on_non_windows  sX    			;%		@
y88Eww||KAC 
A	@	@   AA55A>c           	         t         j                  j                  t        dd      5  | j	                  t        j                  d      t        j                  j                  ddd             d d d        y # 1 sw Y   y xY w)Nr   Tr   r   r   z
gcloud.cmdr   rW   s    r   'test_gets_gcloud_binary_path_on_windowszOTestTranslateToGcloudStorageIfRequested.test_gets_gcloud_binary_path_on_windows  sX    			;$		?
y88Eww||KEG 
@	?	?r   c                 d   t        j                  dg      5  t        j                  j	                  | j
                  dd      5 }| j                  | j
                  j                                | j                  |j                         ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)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)rX   mock_get_gcloud_storage_argss     r   0test_returns_false_with_use_gcloud_storage_neverzXTestTranslateToGcloudStorageIfRequested.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&&B/c                    t        ddddi      5  t        j                  ddd      5  | j                  | j                  j                                t        j                  d      }| j                  | j                  j                  |dd	d
ddddg       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)/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_DIRr7   r8   r<   r}   r9   r~   r   N)
r-   r   SetEnvironmentForTest
assertTruer   r   r   r   r   "_translated_gcloud_storage_command)rX   expected_gcloud_paths     r   /test_returns_true_with_valid_gcloud_storage_mapzWTestTranslateToGcloudStorageIfRequested.test_returns_true_with_valid_gcloud_storage_map  s    	"* -
 
 %%6<)' 	 	GGI	K  )@@L++NN19fg#T66		
 
	 	
 
s#   B4A-B(B4(B1	-B44B=c                    t        j                  d      }t        ddddi      5  t        j                  dd|d      5  | j                  | j                  j                                | j                  | j                  j                  |d	d
dddddg       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)r   r   r   r   r   r   r   N)r   r   GCLOUD_BINARY_PATHr7   r8   r<   r}   r9   r~   r   )
r   r   r-   r   r   r   r   r   r   r   )rX   gcloud_paths     r   <test_with_cloudsdk_root_dir_unset_and_gcloud_binary_path_setzdTestTranslateToGcloudStorageIfRequested.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$   B5 AB)B5)B2	.B55B>c                     t        j                  dg      5  | j                  | j                  j	                                d d d        y # 1 sw Y   y xY w)N)r   r   invalid)r   r   r   r   r   rW   s    r   6test_returns_false_if_invalid_use_gcloud_storage_valuez^TestTranslateToGcloudStorageIfRequested.test_returns_false_if_invalid_use_gcloud_storage_value  sI    		"	"$O $% 
&




E
E
GI
& 
& 
&s   *A

Ac                     t        j                  dg      5  | j                  t        j                  d      5  | j
                  j                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)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   rW   s    r   3test_raises_error_if_invalid_hidden_shim_mode_valuez[TestTranslateToGcloudStorageIfRequested.test_raises_error_if_invalid_hidden_shim_mode_value  sg    		"	"$M#N	O!!

$
$*+
 	CCE+ 
P	O+ + 
P	Os"   !A0A$A0$A-	)A00A9c                 R   t        j                  ddg      5  t        j                  dd i      5  | j                  t        j
                  d      5  | j                  j                          d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)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   rW   s    r   .test_raises_error_if_cloudsdk_root_dir_is_nonezVTestTranslateToGcloudStorageIfRequested.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4BB
BB	BB&c                    dj                  t        j                  t        j                  d                  }t        j                  ddg      5  t        j                  dd d      5  | j                  t        j                  |      5  | j                  j                          d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)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   )rX   error_regexs     r   :test_raises_error_if_pass_credentials_to_gsutil_is_missingzbTestTranslateToGcloudStorageIfRequested.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		B=$C	,C=CC		C	CCUsingGsHmacTr)   c                    t        j                  ddg      5  t        j                  ddd      5  t        j                  j                  dt        j                  g      | j                  _	        | j                  t        j                  d      5  | j                  j                          d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)	Nr  r  r   r   r	  r1   )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
   r^   r_   r   JSONr   ra   r   r   r  r   )rX   _s     r   6test_raises_error_if_using_gs_hmac_without_xml_supportz^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4CC
CC	CC&c                 v   d | j                   _        t        j                  ddg      5  t        j                  ddd      5  | j                  t        j                  d      5  | j                   j                          d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr  r  r   r   r   zxCommandException: Command "fake_shim" cannot be translated to gcloud storage because the translation mapping is missing.)	r   rg   r   r   r   r   r   r  r   rW   s    r   /test_raises_error_if_gcloud_storage_map_missingzWTestTranslateToGcloudStorageIfRequested.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##B,	(B//B8c                 L   t        j                  ddg      5  t        j                  ddd      5  | j                  dddgd	d	
      \  }}| j	                  d|j
                  d          | j	                  d|       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zShould not raise error.r  )r   r   Nr   r   r   r1   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errorrU   N)r   r   r   rY   assertInmessagesrX   stdoutmock_log_handlers      r   :test_use_gcloud_storage_true_with_hidden_shim_mode_not_setzbTestTranslateToGcloudStorageIfRequested.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           	         t        ddddi      5  t        j                  ddi      5  | j                  ddgd	d	
      \  }}| j	                  dj                  t        j                  d            |j                  d          | j	                  dj                  t        j                  d            |       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z/Should print the gcloud command and run gsutil.r   r   dry_runr   r   r   r1   r~   Tr  z,Gcloud Storage Command: {} objects fake arg1inforU   N)	r-   r   r   rY   r  r
  r   r   r  r  s      r   +test_dry_run_mode_prints_translated_commandzSTestTranslateToGcloudStorageIfRequested.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	8C	C	CCc                    t        ddddi      5  t        j                  ddd      5  t        j                  j                  | j                  dd	
      5 }| j                  j                          |j                  j                  t        j                  dj                  t        j                  d                  t        j                  d      t        j                  ddd      t        j                  ddd      gd	       d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)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   )rX   mock_loggers     r   7test_non_dry_mode_logs_translated_command_to_debug_logsz_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;   D6-D*B.DD*D6D'#D**D3	/D66D?c                    t         j                  j                  | j                  dd      5 }| j                  j	                  g dddid       t        j
                  d      t        j
                  d	      t        j
                  d
dd      g}| j                  |j                  j                  |       ddd       y# 1 sw Y   yxY w)z2Should log the command and env vars to logger.infor(  Tr"   )r8   r   r
   fake_env_varval)r$  z+Gcloud Storage Command: fake gcloud commandr)  r*  N)	r   r&   r'   r   "_print_gcloud_storage_command_infor0  r   r%  
mock_calls)rX   r1  expected_callss      r   2test_print_gcloud_storage_env_vars_in_dry_run_modezZTestTranslateToGcloudStorageIfRequested.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                 (   ddddi}t        |      5  t        j                  ddd      5  t        t        j
                  dd	gi d
dddt        j
                  t	        j                         	      }| j                  |j                                t        j                  d      }| j                  |j                  |dddd	ddddg	       | j                  |j                  ddddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)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   r7   r8   --verbosityr   z#--billing-project=fake_user_projectz--trace-token=fake_trace_token1r,  )CLOUDSDK_STORAGE_PROCESS_COUNTCLOUDSDK_STORAGE_THREAD_COUNTr+  r-  N)r-   r   r   r/   r   r   r   r   r   r   r   r   r   assertCountEqual_translated_env_variables)rX   boto_configr   r   s       r   #test_top_level_flags_get_translatedzKTestTranslateToGcloudStorageIfRequested.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           	         d| j                   j                  _        ddddi}t        |      5  t	        j
                  ddd      5  | j                  | j                  j                                t        j                  d      }| j                  | j                  j                  d	ddd
       d d d        d d d        | j                   j                  dddgddd       y # 1 sw Y   5xY w# 1 sw Y   9xY w)N r   r   r   r   r   r   r   r,  )r+  r-  !CLOUDSDK_AUTH_DISABLE_CREDENTIALSr	   r   accountutf-8r   stderrencoding)_mock_subprocess_runr)   r   r-   r   r   r   r   r   r   r   rC  rD  assert_called_once_with)rX   rE  r   s      r   @test_anonymous_credentials_sets_disable_credentials_env_variablezhTestTranslateToGcloudStorageIfRequested.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$   C0A)C$0C0$C-	)C00C9c                 \   d| j                   j                  _        d| j                   j                  _        d| j                   j                  _        t        j                  d      }ddddi}t        |      5  t        j                  d	dd
      5  | j                  t        j                  d      5  | j                  j                          d d d        d d d        d d d        | j                   j                  |dddgddd       y # 1 sw Y   =xY w# 1 sw Y   AxY w# 1 sw Y   ExY w)Nr!   s   fake error messager2   r   r   r   r   r   r   r   z\Error occurred while trying to retrieve gcloud's active account. Error: b'fake error messager	   r   rJ  rK  rL  rM  )rP  r)   r   rN  
returncoder   r   r-   r   r   r   r   r  r   r   rQ  )rX   r   rE  s      r   >test_gcloud_config_get_account_nonzero_returncode_raises_errorzfTestTranslateToGcloudStorageIfRequested.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<   9D"!D3D
DD"
DDD	D""D+c                    t        j                  ddg      5  t        j                  ddd      5  d| j                  _        | j                  j                          | j                  d| j                  j                         | j                  d| j                  j                         d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)	Nr  r  r   r   r   TrA  rB  )r   r   r   r   r   r   assertNotInrD  rW   s    r   Atest_parallel_operations_true_does_not_add_process_count_env_varsziTestTranslateToGcloudStorageIfRequested.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                    t        j                  t        j                  ddgi dd dt        j                  t        j                               }t        j                  ddg      5  t        j                  dd	d
      5   |j                          | j                  d|j                         | j                  d|j                         d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr~   r   r   Fr   r  r  r   r   r   rA  rB  )r   RsyncCommandr   r   r   r   r   r   r   rW  rD  rX   r
   s     r   Btest_parallel_operations_false_but_parallelism_turned_on_for_rsynczjTestTranslateToGcloudStorageIfRequested.test_parallel_operations_false_but_parallelism_turned_on_for_rsync  s      '-v&6)+'(-15::>((>Bnn>NPG 
	"	"$L%4$5 
6 %%6<)' 	 	988:9 ::	<8 ::	<	
6 
6	 	
6 
6s%   %C%>A
CC%C"	C%%C.c                    t        j                  g d      5  t        j                  ddd      5  t        j                  t
        j                  ddgi dd dt
        j                  t        j                         	      } |j                          | j                  |j                  d
   d       | j                  |j                  d   d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)N)r  r  )r   parallel_process_countr@  )r   thread_process_countr@  r   r   r   r~   r   r   Fr   rA  r@  rB  )r   r   r   r   rZ  r   r   r   r   r   rD  r[  s     r   ?test_parallelism_turned_on_for_rsync_unless_boto_set_sequentialzgTestTranslateToGcloudStorageIfRequested.test_parallelism_turned_on_for_rsync_unless_boto_set_sequential	  s    		"	" $M 
N
 %%6<)' 	 $$88&! %%)XX)-)9; 	988:--.NO	 	--.MN	#	
N 
N
	 	
N 
Ns#   C+BCC+C(	$C++C4c                    t        ddddi      5  t        j                  ddd      5  d| j                  _        | j                  j                          | j                  | j                  j                  t        j                  d      d	d
ddddddddg       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r   r   r   r   r   r      r7   r8   r<   r}   r9   r~   r   r?  r   z
--log-http)
r-   r   r   r   r   r   r   r   r   r   rW   s    r   %test_debug_value_4_adds_log_http_flagzMTestTranslateToGcloudStorageIfRequested.test_debug_value_4_adds_log_http_flag$  s    	"* -
 
 %%6<)' 	 $% CCE++NN&>>zJ&v#]G\		
 
	 	
 
s#   B7A0B+B7+B4	0B77C IMPERSONATE_SERVICE_ACCOUNTfake_service_accountr   c                 `   t        ddddi      5  t        j                  ddd      5  | j                  j	                          | j                  | j                  j                  t        j                  d      dd	d
dddddg	       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z2Should add the --impersonate-service-account flag.r   r   r   r   r   r   r   r7   r8   r<   r}   r9   r~   r   z2--impersonate-service-account=fake_service_accountN)	r-   r   r   r   r   r   r   r   r   rW   s    r   ,test_impersonate_service_account_translationzTTestTranslateToGcloudStorageIfRequested.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$$B-c                    t        ddddi      5  t        j                  ddd      5  d| j                  _        | j                  j                          | j                  | j                  j                  t        j                  d      d	d
ddddddg	       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r   r   r   r   r   r   Tr7   r8   r<   r}   r9   r~   r   z--no-user-output-enabled)
r-   r   r   r   
quiet_moder   r   r   r   r   rW   s    r   <test_quiet_mode_translation_adds_no_user_output_enabled_flagzdTestTranslateToGcloudStorageIfRequested.test_quiet_mode_translation_adds_no_user_output_enabled_flagP  s    	"* -
 
 %%6<)' 	 )-%CCE++NN&>>zJ&v#%?		
 
	 	
 
s#   B5A.B)B5)B2	.B55B>c                    t        j                  t        j                  g i dd dt        j                  t        j                               }t        j                  ddg      5  t        j                  j                  |dd      5 }| j                   |j                                | j                  |j                         d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY wNr   Tr   r  r  r   r"   )r   VersionCommandr   r   r   r   r   r&   r'   r   r   r   rX   r
   r   s      r   &test_returns_false_for_version_commandzNTestTranslateToGcloudStorageIfRequested.test_returns_false_for_version_commandd  s    $$xx !%%)^^%57G 
	"	"$L%4$5 
6 ::W&?&*  ,/KIIIKL5<<=,
6 
6, ,
6 
6$   ##C<CCC	CC(c                    t        j                  t        j                  g i dd dt        j                  t        j                               }t        j                  ddg      5  t        j                  j                  |dd      5 }| j                   |j                                | j                  |j                         d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY wrl  )r   TestCommandr   r   r   r   r   r&   r'   r   r   r   rn  s      r   #test_returns_false_for_test_commandzKTestTranslateToGcloudStorageIfRequested.test_returns_false_for_test_commandv  s    dhh$&')%&+/378<<@NN<LNG 
	"	"$L%4$5 
6 ::W&?&*  ,/KIIIKL5<<=,
6 
6, ,
6 
6rp  )%rZ   r[   r\   r]   r   r   r   r   r   r   r   r  r  r  r   r&   r'   r   r  r  r"  r&  r2  r9  rF  rR  rU  rX  r\  r`  rc  r   rg  rj  ro  rs  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                   N    e Zd ZdZ fdZej                  j                  eddh      ej                  j                  e	dd      d	               Z
ej                  j                  eddh      d
        Zej                  j                  eddh      d        Zej                  j                  eddh      d        Zej                  j                  eddh      d        Zej                  j                  eddh      d        Zej                  j                  eddh      d        Zej                  j                  eddh      d        Zej                  j                  eddh      d        Zd Zej                  j                  eddh      d        Z xZS )TestHeaderTranslation Test gsutil header  translation.c                     t         |           t        t        j                  g di dd dt        j                  t        j
                               | _        y r   r   r   s    r   r   zTestHeaderTranslation.setUp  r   r!   COMMANDS_SUPPORTING_ALL_HEADERSr1   r   runTr"   c                    d|j                   _        t        ddddi      5  t        j                  ddd      5  t        t        j                  d	d
gddidd t        j                  t        j                  t        j                               }| j                  |j                                | j                  |j                  t        j                  d      ddd	d
dg       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r   r   r   r   r   r   r   r~   r   Content-Typefake_valr2   r   r7   r8   z--content-type=fake_val)r)   rT  r-   r   r   r/   r   r   r   r   r   r   r   r   r   )rX   mock_subprocess_runr   s      r   2test_translated_headers_get_added_to_final_commandzHTestHeaderTranslation.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C=	9D  D	c                     ddddddddd	d
dddd| j                   _        | j                   j                         }| j                  |g d       y )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_headersrC  rX   flagss     r   Ftest_translate_headers_returns_correct_flags_for_data_transfer_commandz\TestHeaderTranslation.test_translate_headers_returns_correct_flags_for_data_transfer_command  sf     .933+)"&6*>',*.!"D$ 113E% " r!   c                 d    | j                   j                  ddi      }| j                  |dg       y )Nr  r  r  r   r  rC  r  s     r   3test_translate_custom_headers_returns_correct_flagszITestHeaderTranslation.test_translate_custom_headers_returns_correct_flags  s7     11	./1E%"F!GHr!   c                     | j                   j                  t        j                  ddg            }| j	                  |dg       y )N)header1value1)header2value2z2--additional-headers=header1=value1,header2=value2)r   r  collectionsOrderedDictrC  r  s     r   Atest_translate_custom_headers_handles_multiple_additional_headerszWTestHeaderTranslation.test_translate_custom_headers_handles_multiple_additional_headers  sH     11!68M NOQEDEGr!   c                 h    | j                   j                  ddid      }| j                  |dg       y )Nr  r  Tunset--clear-cache-controlr  r  s     r   2test_translate_clear_headers_returns_correct_flagszHTestHeaderTranslation.test_translate_clear_headers_returns_correct_flags  s>     11	./t 2 =E%"9!:;r!   c                 8   ddi| j                   _        t        j                  j	                  | j                   j
                  dd      5 }| j                  | j                   j                         dg       |j                  d       ddd       y# 1 sw Y   yxY w)	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'   r(  r   r  rQ  rX   mock_warnings     r   Gtest_translate_headers_for_data_transfer_command_with_additional_headerz]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                     dddd| j                   _        | j                   j                         }| j                  |ddg       y )Nr  r  r  )r  r  x-goog-meta-foor  r  r  r  s     r   ?test_translate_valid_headers_for_precondition_supported_commandzUTestHeaderTranslation.test_translate_valid_headers_for_precondition_supported_command
  sN    
 '7*>+	"D 113E%.6" r!   c                     dddd| j                   _        | j                   j                         }| j                  |ddg       y )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_commandzUTestHeaderTranslation.test_translate_short_headers_for_precondition_supported_command  sN    
 $4';+	"D 113E%.6" r!   c                 8   ddi| j                   _        t        j                  j	                  | j                   j
                  dd      5 }| j                  | j                   j                         dg       |j                  d       ddd       y# 1 sw Y   yxY w)	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_headerzfTestHeaderTranslation.test_translate_headers_for_precondition_supported_command_with_additional_header*  r  r  c                     ddddd| j                   _        | j                  | j                   j                         dg       y )Nr  r  r  r  )r  r  r  r  r  r   r   r   r  rW   s    r   Qtest_translate_headers_only_uses_additional_headers_for_commands_not_in_allowlistzgTestHeaderTranslation.test_translate_headers_only_uses_additional_headers_for_commands_not_in_allowlist:  sH     .&6+	"D 	T''::<>?Ar!   c                     ddd| j                   _        | j                  | j                   j                         dg       y )Nr  2)r  zx-goog-api-versionr  r  rW   s    r   8test_translate_headers_ignores_x_goog_api_version_headerzNTestHeaderTranslation.test_translate_headers_ignores_x_goog_api_version_headerM  sA    
 '7!"D 	T''::<<=?r!   )rZ   r[   r\   r]   r   r   r&   r'   r   
subprocessr~  r  r  r  r  r  r  r  r  r  r  r   r   s   @r   ru  ru    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!   ru  c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)TestGetFlagFromHeaderzTest 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                     ddddddd}|j                         D ]/  \  }}t        j                  |dd	
      }| j                  ||       1 y )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   rX   headers_to_expected_flag_mapr  expected_flagresults        r   Ctest_get_flag_from_header_with_unset_true_for_data_transfer_headerszYTestGetFlagFromHeader.test_get_flag_from_header_with_unset_true_for_data_transfer_headers`  s]     1<66.,$  ">!C!C!E--fjMf
v}- "Fr!   c                 d    dD ]+  }t        j                  |dd      }| j                  |       - y)Should return None.)r  r  r|  Tr  Nr   r  assertIsNone)rX   r  r  s      r   Btest_get_flag_from_header_with_unset_true_for_precondition_headerszXTestGetFlagFromHeader.test_get_flag_from_header_with_unset_true_for_precondition_headerso  s2     --fjMf
r!   c                 V    t        j                  ddd      }| j                  |       y)r  r  r|  Tr  Nr  rX   r  s     r   9test_get_flag_from_header_with_unset_true_for_content_md5zOTestGetFlagFromHeader.test_get_flag_from_header_with_unset_true_for_content_md5z  s*    ++M,6268F 	fr!   c                 V    t        j                  ddd      }| j                  |       y)r  invalid_headerr|  Tr  Nr  r  s     r   <test_get_flag_from_header_with_unset_true_for_invalid_headerzRTestGetFlagFromHeader.test_get_flag_from_header_with_unset_true_for_invalid_header  s+    ++,<,6268F 	fr!   c                     ddd}|j                         D ]/  \  }}t        j                  |dd      }| j                  ||       1 y)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_headerszTTestGetFlagFromHeader.test_get_flag_from_header_with_unset_true_for_metadata_headers  sQ     :8$  ">!C!C!E--fjMf
v}- "Fr!   N)	rZ   r[   r\   r]   r  r  r  r  r  rj   r!   r   r  r  Y  s     .	 .r!   r  c                   (    e Zd ZdZd Zd Zd Zd Zy)TestFormatFlagUtilsz5Test utils used for generating gcloud --format flags.c                     t         j                  j                  t        dd      5  | j	                  t        j                         d       d d d        y # 1 sw Y   y xY w)Nr   Fr   ^r   r&   r'   r   r   r   get_format_flag_caretrW   s    r   *test_gets_format_flag_caret_on_non_windowsz>TestFormatFlagUtils.test_gets_format_flag_caret_on_non_windows  sA    			;%		@
y668#> 
A	@	@   %AAc                     t         j                  j                  t        dd      5  | j	                  t        j                         d       d d d        y # 1 sw Y   y xY w)Nr   Tr   z^^^^r  rW   s    r   .test_gets_format_flag_escaped_caret_on_windowszBTestFormatFlagUtils.test_gets_format_flag_escaped_caret_on_windows  sA    			;$		?
y668&A 
@	?	?r  c                     t         j                  j                  t        dd      5  | j	                  t        j                         d       d d d        y # 1 sw Y   y xY w)Nr   Fr   
r   r&   r'   r   r   r   get_format_flag_newlinerW   s    r   ,test_gets_format_flag_newline_on_non_windowsz@TestFormatFlagUtils.test_gets_format_flag_newline_on_non_windows  sA    			;%		@
y88:DA 
A	@	@r  c                     t         j                  j                  t        dd      5  | j	                  t        j                         d       d d d        y # 1 sw Y   y xY w)Nr   Tr   z^\^nr  rW   s    r   0test_gets_format_flag_escaped_newline_on_windowszDTestFormatFlagUtils.test_gets_format_flag_escaped_newline_on_windows  sA    			;$		?
y88:GD 
@	?	?r  N)rZ   r[   r\   r]   r  r  r  r  rj   r!   r   r  r    s    =?BBEr!   r  c                       e Zd ZdZ fdZej                  j                  eddh      ej                  j                  e	dd      d	               Z
d
 Zd Zd Zd Zd Zej                  j                  eddh      d        Zej                  j                  eddh      d        Zej                  j                  edd      d        Zej                  j                  edd      d        Zd Zd Zd Z xZS )TestBotoTranslationrv  c                     t         |           t        t        j                  g di dd dt        j                  t        j
                               | _        y r   r   r   s    r   r   zTestBotoTranslation.setUp  r   r!   rx  r1   r   ry  Tr"   c                    d|j                   _        t        ddddddi      5  t        j                  ddd	      5  | j                  | j                  j                                t        j                  d      }| j                  | j                  j                  |d
dddddddg	       | j                  | j                  j                  dddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z-Should add translated env vars as well flags.r   r   r   r   foofake_project)r   r   content_languagedefault_project_idr   r   r7   r8   r<   r}   r9   r~   r   z--content-language=foor,  )CLOUDSDK_CORE_PROJECTr+  r-  N)r)   rT  r-   r   r   r   r   r   r   r   r   r   rD  )rX   r}  r   s      r   &test_translated_boto_config_gets_addedz: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#   C2BC&C2&C/	+C22C;c                     t        dddddi      5  | j                  j                         \  }}| j                  |g        | j                  |ddi       d d d        y # 1 sw Y   y xY w)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   rX   r  env_varss      r   "test_gcs_json_endpoint_translationz6TestBotoTranslation.test_gcs_json_endpoint_translation  sv    	&" $
 
 **AACoeX
ub!

74
 
 
s   AAA(c                     t        ddddi      5  | j                  j                         \  }}| j                  |g        | j                  |ddi       d d d        y # 1 sw Y   y xY w)Nr  r  r  )r  r  r  zhttps://foo_host/storage/v2r  r   s      r   4test_gcs_json_endpoint_translation_with_missing_portzHTestBotoTranslation.test_gcs_json_endpoint_translation_with_missing_port  sr    	& $
 
 **AACoeX
ub!
x
3+" 	
 
 
   AAA'c                     t        ddddi      5  | j                  j                         \  }}| j                  |g        | j                  |ddi       d d d        y # 1 sw Y   y xY w)Nr  r  r  )r  r  r  z https://foo_host:1234/storage/v1r  r   s      r   ;test_gcs_json_endpoint_translation_usees_default_version_v1zOTestBotoTranslation.test_gcs_json_endpoint_translation_usees_default_version_v1  ss    		&"
 	

 **AACoeX
ub!

74
 
 
r  c                     t        ddddi      5  | j                  j                         \  }}| j                  |g        | j                  |ddi       d d d        y # 1 sw Y   y xY w)Nr  s3_hostr  )r	  s3_port CLOUDSDK_STORAGE_S3_ENDPOINT_URLzhttps://s3_host:1234r  r   s      r   test_s3_endpoint_translationz0TestBotoTranslation.test_s3_endpoint_translation  sr    		 
 	

 **AACoeX
ub!

-/E
FH
 
 
r  c                     t        dddii      5  | j                  j                         \  }}| j                  |g        | j                  |ddi       d d d        y # 1 sw Y   y xY w)Nr  r	  r  zhttps://s3_hostr  r   s      r   .test_s3_endpoint_translation_with_missing_portzBTestBotoTranslation.test_s3_endpoint_translation_with_missing_port  sc    	MIy+BC	D**AACoeX
ub!
x:<MNP 
E	D	Ds   AAA&ENCRYPTION_SUPPORTED_COMMANDSc                     t        dddii      5  | j                  j                         \  }}| j                  |dg       d d d        y # 1 sw Y   y xY w)Nr   encryption_keyfake_keyz--encryption-key=fake_keyr  rX   r  r  s      r   *test_encryption_key_gets_converted_to_flagz>TestBotoTranslation.test_encryption_key_gets_converted_to_flag  sP     
H'7&DE	F##::<heQ
u:;< 
G	F	Fs   1A

Ac                     t        dt        j                  g d      i      5  | j                  j	                         \  }}| j                  |dg       d d d        y # 1 sw Y   y xY w)Nr   ))decryption_key1key1)decryption_key12key12)decryption_key100key100z#--decryption-keys=key1,key12,key100)r-   r  r  r   r  r   r  s      r   *test_decryption_key_gets_converted_to_flagz>TestBotoTranslation.test_decryption_key_gets_converted_to_flag   se     
## %  
 ##::<heQ
uDEF
 
 
s   1AA&r  Fr  c                    t        ddddi      5  | j                  j                         \  }}| j                  |j                  d       | j                  |g        | j                  |i        d d d        y # 1 sw Y   y xY w)Nr  r  bar)gs_access_key_idgs_secret_access_key   )r-   r   r  r   
call_count)rX   mock_using_gs_hmacr  r  s       r   ,test_gs_hmac_auth_env_when_not_using_gs_hmacz@TestBotoTranslation.test_gs_hmac_auth_env_when_not_using_gs_hmac/  s~    	 %$)
 
 **AACoeX
)44a8
ub!
x$
 
 
s   AA88Bc                    t        ddddddddd	d
dddddddddddddddddddddd       5  | j                  j                         \  }}| j                  |g        d | _        | j                  |i d!dd"dd#dd$dd%dd&dd&dd'dd(d	d)d
d*dd+dd,dd-dd.dd/dd0ddddddddddddd1       d d d        y # 1 sw Y   y xY w)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_keyr  r   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)r  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   r  r   maxDiffassertDictEqual)rX   r  r  r  s       r   1test_boto_config_translation_for_supported_fieldszETestBotoTranslation.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CoeX
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                     t        dddii      5  | j                  j                         \  }}| j                  |g        | j                  |i        d d d        y # 1 sw Y   y xY w)Nr   unsupported_fieldr  r  r   s      r   "test_missing_mappging_gets_ignoredz6TestBotoTranslation.test_missing_mappging_gets_ignored  sZ    	H':E&BC	D**AACoeX
ub!
x$ 
E	D	D   AAA$c                     t        dddii      5  | j                  j                         \  }}| j                  |g        | j                  |i        ddd       y# 1 sw Y   yxY w)z4Should not set CLOUDSDK_AUTH_DISABLE_SSL_VALIDATION.r   r?  TNr  r   s      r   'test_truthy_https_validate_certificatesz;TestBotoTranslation.test_truthy_https_validate_certificates  sZ    	H'Dd&KL	M**AACoeX
ub!
x$ 
N	M	Mry  c           	         t        ddddi      5  t        j                  j                  | j                  j
                  dd      5 }| j                  j                         \  }}| j                  |g        | j                  |i        | j                  |j                  t        j                  d      t        j                  d	      g       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)
Nr   foo_bin
foo_config)stet_binary_pathstet_config_pathr  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   r(  r  r   rC  r7  r0  )rX   r1  r  r  s       r   &test_missing_required_fields_log_errorz:TestBotoTranslation.test_missing_required_fields_log_error  s    	 ) ,
 
 ::T//66&*  ,/:,,CCEx#2&k44II B CII B C7
 	,
 
, ,
 
s$   7C+BCC+C(	$C++C4)rZ   r[   r\   r]   r   r   r&   r'   r   r  r  r  r  r  r  r  r  r  r   r$  ru  rx  r{  r  r   r   s   @r   r  r    sF   (
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!   r  c                       e Zd ZdZej
                  j                  ej                  dddi      ej
                  j                  e	dd      d	               Z
y
)TestRunGcloudStoragez'Test Command.run_gcloud_storage method.copyold_key	old_valuer  ry  Tr"   c                 p   t        t        j                  g di t        j                  t        j                  t        j                  t        j                  t        j                               }t	        j
                  ddg      5  t	        j                  ddd      5  dd	i|_        d
dg|_        |j                         }|j                  d
dgdd	d       |j                          | j                  ||j                  j                         d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr|   r   r  r  r   r   r   new_key	new_valuer   r  r  )r  r  )env)r/   r   r   r   r   r   r   rD  r   run_gcloud_storagerQ  r   r)   rT  )rX   mock_runmock_environ_copycommand_instanceactual_return_codes        r   :test_calls_subprocess_with_translated_command_and_env_varszOTestRunGcloudStorage.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+X-B-B-M-MN	
6 
6	 	
6 
6s%   D,A1D D, D)	%D,,D5N)rZ   r[   r\   r]   r   r&   r'   r   environr  r  rj   r!   r   r  r    sW    /::RZZy+6NO::Z6O 7 POr!   r  c                       e Zd Zd Zy)TestShimE2Ec                    t        j                  ddg      5  t        j                  dd d      5  | j                  ddgdd	      }| j	                  d
|       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr  r  r   r   z-DlsTr2   )return_stderrexpected_statusz"gcloud binary path cannot be found)r   r   r   	RunGsUtilr  )rX   rN  s     r   3test_runs_gcloud_storage_if_use_gcloud_storage_truez?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"   A7)A+A7+A4	0A77B N)rZ   r[   r\   r  rj   r!   r   r  r    s    Dr!   r  )1r]   
__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-   r^   r/   rl   GsUtilUnitTestCaserz   ShimUnitTestBaser   ru  r  r  r  r  GsUtilIntegrationTestCaser  rj   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!   