
    p[i8                        d Z ddlZddlZddlZddlZddlZddlmZ ddl	Z	ddl
Zddl
mZ ddlZddlZddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ 	 ddlZdZej8                  j;                  ed      Z ej>                  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,d Z-d Z.d Z/d  Z0d! Z1d" Z2d# Z3d$ Z4d% Z5d& Z6d' Z7d( Z8d) Z9d* Z:d+ Z;d, Z<d- Z=d. Z>d/ Z?d0e@fd1ZAd0e@fd2ZBd0e@fd3ZCd4 ZDd5 ZEd6 ZFd7 ZGd8 ZHd9 ZId: ZJd; ZKd< ZLd= ZMd> ZNd? ZOd@ ZPdA ZQdB ZRdC ZSdD ZTdE ZUdF ZVdG ZWdH ZXdI ZYdJ ZZdK Z[dL Z\ej8                  j                  dM        Z]ej8                  j                  dN        Z^dO Z_ej8                  j                  dP        Z`ej8                  j                  dQ        Zaej8                  j                  dR        Zbej8                  j                  dS        Zcej8                  j                  dT        Zdej8                  j                  dU        Zeej8                  j                  dV        Zfej8                  j                  dW        Zgej8                  j                  dX        Zheej8                  j                  dY               Ziy# e$ r dZ ej6                         ZY dw xY w)Zz Tests for client initialization.    N)mock)credentials   )_api_client)	_base_url)_replay_api_client)Client)typesFTz(aiohttp is not installed, skipping test.)reason)autousec               #   *   K   d  dt         _        y w)NF)
api_clienthas_aiohttp     m/mnt/data/GridWatch/venv/lib/python3.12/site-packages/google/genai/tests/client/test_client_initialization.pyreset_has_aiohttpr   2   s      *s   c                 T   d}| j                  d|       | j                  dd       t               }|j                  j                  j
                  rJ |j                  j                  j                  |k(  sJ t        |j                  j                  t        j                        sJ y )Ngemini_api_keyGEMINI_API_KEYGOOGLE_API_KEYFraising
setenvdelenvr	   modelsr   vertexaiapi_key
isinstancer   BaseApiClientmonkeypatchr   clients      r    test_ml_dev_from_gemini_env_onlyr%   8       '%w/%u58&]]&&///	/		"	"	*	*g	55	5	FMM--z/G/G	HH	Hr   c                 R   d}| j                  d|       | j                  dd       t               }|j                  j                  j                  rJ |j                  j                  j
                  |k(  sJ t        |j                  j                  t        j                        sJ y )Nr   r   r    )	r   r	   r   r   r   r   r    r   r!   r"   s      r   1test_ml_dev_from_gemini_env_with_google_env_emptyr)   D   s    '%w/%r*8&]]&&///	/		"	"	*	*g	55	5	FMM--z/G/G	HH	Hr   c                 T   d}| j                  d|       | j                  dd       t               }|j                  j                  j
                  rJ |j                  j                  j                  |k(  sJ t        |j                  j                  t        j                        sJ y )Ngoogle_api_keyr   r   Fr   r   r"   s      r    test_ml_dev_from_google_env_onlyr,   P   r&   r   c                    |j                  t        j                  d       d}d}| j                  d|       | j                  d|       t	               }|j
                  j                  j                  rJ |j
                  j                  j                  |k(  sJ t        |j
                  j                  t        j                        sJ d|j                  v sJ y )Ngoogle_genai._api_clientloggerr+   r   r   r   EBoth GOOGLE_API_KEY and GEMINI_API_KEY are set. Using GOOGLE_API_KEY.	set_levelloggingDEBUGr   r	   r   r   r   r   r    r   r!   textr#   caplogr+   r   r$   s        r   test_ml_dev_both_env_key_setr9   \   s    7==)CD#.#.%~6%~68&]]&&///	/		"	"	*	*n	<<	<	FMM--z/G/G	HH	HM	r   c                     |j                  t        j                  d       d}| j                  d|       t	               }|j
                  j                  j                  dk(  sJ y )Nr.   r/   zgemini_api_key
r   r   )r3   r4   r5   r   r	   r   r   r   r#   r8   r   r$   s       r   test_api_key_with_new_liner<   n   sV    7==)CD '%w/8&		"	"	*	*.>	>>	>r   c                      d} t        |       }|j                  j                  j                  rJ |j                  j                  j                  | k(  sJ y )Nr+   r   )r	   r   r   r   r   )r   r$   s     r   test_ml_dev_from_constructorr?   x   sH    ''"&]]&&///	/		"	"	*	*g	55	5r   c                     ddddidd} dddd	id
d}t        d|       }|j                  j                  j                  rJ |j                  j                  j	                         d   dk(  sJ |j                  j                  j	                         d   dk(  sJ |j                  j                  j	                         d   d   dk(  sJ |j                  j                  j	                         d   dk(  sJ t        ddd|      }|j                  j                  j                  sJ |j                  j                  j	                         d   dk(  sJ |j                  j                  j	                         d   dk(  sJ |j                  j                  j	                         d   d   d	k(  sJ |j                  j                  j	                         d   d
k(  sJ y )Nv1main!https://placeholder-fake-url.com/X-Custom-Headercustom_value_mldevi'  )api_versionbase_urlheaderstimeoutv1Bhttps://{self.location}-aiplatform.googleapis.com/{{api_version}}/custom_value_vertexaii*  r+   r   http_optionsrF   rE   rG   rH   Tfake_project_idfake-locationr   projectlocationrM   r	   r   r   r   get_read_only_http_optionsmldev_http_optionsvertexai_http_optionsmldev_clientvertexai_clients       r   "test_constructor_with_http_optionsrZ      sI   5#%9:	 
N#%<= -?,   ,,555	5%%@@B:N	,-- %%@@B
 
 %%@@B9M
 
 %%@@B9M	 (	/ 
			+	+	4	44	4((CCE
 
NNN ((CCE
 
 ((CCE
 
!!! ((CCEiP	r   c                  <   ddddid} ddddid}	 t        d| 	      }	 t        ddd|      }y # t        $ r+}t        |t              sJ d
t	        |      v sJ Y d }~@d }~ww xY w# t        $ r+}t        |t              sJ dt	        |      v sJ Y d }~y d }~ww xY w)NrI   rB   rC   custom_value)invalid_version_keyrF   rG   rJ   )rE   rF   invalid_header_keyr+   rL   r]   TrN   rO   rP   r^   )r	   	Exceptionr    
ValueErrorstr)rV   rW   _es       r   .test_constructor_with_invalid_http_options_keyrd      s    !5#^4 
N.?+'6HIA	*! *		A 
 +a$$$ CF***+ 
 *a$$$3q6)))*s+   0 A' 	A$!AA$'	B0!BBc                     t        j                  ddddi      } t        j                  ddddi      }t        d|       }|j                  j                  j
                  rJ |j                  j                  j                         d	   | j                  k(  sJ |j                  j                  j                         d
   | j                  k(  sJ |j                  j                  j                         d   d   | j                  d   k(  sJ t        ddd|      }|j                  j                  j
                  sJ |j                  j                  j                         d	   |j                  k(  sJ |j                  j                  j                         d
   |j                  k(  sJ |j                  j                  j                         d   d   |j                  d   k(  sJ y )NrI   rB   rC   r\   )rE   rF   rG   rJ   r+   rL   rF   rE   rG   TrN   rO   rP   )
r
   HttpOptionsr	   r   r   r   rT   rF   rE   rG   rU   s       r   3test_constructor_with_http_options_as_pydantic_typerg      s   ((2 .1
  ++
N .1 -?,   ,,555	5%%@@B:N		$	$%% %%@@B
 
	'	'(( %%@@B9M
 
	#	#$5	677 (	/ 
			+	+	4	44	4((CCE
 
	'	'(( ((CCE
 
	*	*++ ((CCE
 
	&	&'8	9::r   c                 d   d}d}| j                  dd       | j                  d|       | j                  d|       t               }|j                  j                  j                  sJ |j                  j                  j
                  |k(  sJ |j                  j                  j                  |k(  sJ y )NrN   rO   GOOGLE_GENAI_USE_VERTEXAI1GOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATIONr   r	   r   r   r   rQ   rR   r#   
project_idrR   r$   s       r   test_vertexai_from_env_1rp   1  s     *(0#6+Z8,h78&		"	"	+	++	+		"	"	*	*j	88	8		"	"	+	+x	77	7r   c                 d   d}d}| j                  dd       | j                  d|       | j                  d|       t               }|j                  j                  j                  sJ |j                  j                  j
                  |k(  sJ |j                  j                  j                  |k(  sJ y )NrN   rO   ri   truerk   rl   rm   rn   s       r   test_vertexai_from_env_truers   ?  s     *(0&9+Z8,h78&		"	"	+	++	+		"	"	*	*j	88	8		"	"	+	+x	77	7r   c                  `   d} d}t        d| |      }|j                  j                  j                  sJ |j                  j                  j                  | k(  sJ |j                  j                  j
                  |k(  sJ t        |j                  j                  t        j                        sJ y )NrN   rO   Tr   rQ   rR   )	r	   r   r   r   rQ   rR   r    r   r!   )ro   rR   r$   s      r   test_vertexai_from_constructorrv   M  s     *(& 
	"	"	+	++	+		"	"	*	*j	88	8		"	"	+	+x	77	7	FMM--z/G/G	HH	Hr   c                 R   t        j                  t              5  | j                  dd       | j                  dd       | j                  dd       | j                  dd       d
d}| j	                  t
        j                  d|       t        d	       d d d        y # 1 sw Y   y xY w)Nrk   r(   rl   r   r   c                      yN)NNr   scopess    r   mock_auth_defaultzBtest_invalid_vertexai_constructor_empty.<locals>.mock_auth_defaultd  s    r   defaultTr   N)pytestraisesr`   r   setattrgoogleauthr	   )r#   r|   s     r   'test_invalid_vertexai_constructor_emptyr   ]  s    }}Z  
-r2.3',', Y0AB
D
 
 
s   A:BB&c                 @   | j                  dd       | j                  dd       | j                  dd       | j                  dd       dd}| j                  t        j                  d|       t	        dd	d
i      }|j
                  j                  j                  J y )Nrk   r(   rl   r   r   c                      yry   r   rz   s    r   r|   zLtest_vertexai_constructor_empty_base_url_override.<locals>.mock_auth_defaultq  s    r   r}   TrF   zhttps://override.com/r   rM   r   )r   r   r   r   r	   r   r   rR   )r#   r|   r$   s      r   1test_vertexai_constructor_empty_base_url_overrider   k  s    +R0,b1%r*%r* fkk9.?@ 4z;R.ST&		"	"	+	+	33	3r   c                     t        j                  t              5  | j                  dd       | j                  dd       t	                d d d        y # 1 sw Y   y xY w)Nr   r(   r   )r   r   r`   r   r	   )r#   s    r   $test_invalid_mldev_constructor_emptyr   {  sJ    }}Z  ',',
H  s   /AAc                      d} d}d}	 t        d| ||       y # t        $ r}t        |t              sJ Y d }~y d }~ww xY w)NrN   rO   fake-api_keyT)r   rQ   rR   r   r	   r_   r    r`   ro   rR   r   rc   s       r   "test_invalid_vertexai_constructor1r     sL     *('%
	 
 %a$$$%s    	=8=c                      t        j                         } d}t        j                  t              5  t        d| |       d d d        y # 1 sw Y   y xY w)Nr   T)r   r   r   )r   AnonymousCredentialsr   r   r`   r	   )credsr   s     r   "test_invalid_vertexai_constructor2r     sG    

*
*
,%'}}Z  
  s   AAc                     | j                         5 }|j                  dd       d}t        d|      }|j                  j                  j
                  dk(  sJ 	 d d d        y # 1 sw Y   y xY w)Nrl   Fr   rN   Tr   rQ   global)contextr   r	   r   r   rR   )r#   mro   r$   s       r   (test_vertexai_default_location_to_globalr     se     :HH$eH4"JT:6F==$$--999	: : :s   AA##A,c                 v   t        j                         }d}| j                         5 }|j                  dd       |j	                  dd       t        d||      }|j                  j                  j                  d	k(  sJ |j                  j                  j                  |k(  sJ 	 d d d        y # 1 sw Y   y xY w)
NrN   rl   Fr   r   r(   T)r   r   rQ   r   )
r   r   r   r   r   r	   r   r   rR   rQ   )r#   r   ro   r   r$   s        r   9test_vertexai_default_location_to_global_with_credentialsr     s    

*
*
,% * ;HH$eH4HHr"TujIF==$$--999==$$,,
:::; ; ;s   A>B//B8c                    d}d}| j                         5 }|j                  dd       |j                  dd       |j                  d|       t        d|	      }|j                  j
                  j                  d
k(  sJ |j                  j
                  j                  |k(  sJ |j                  j
                  j                  rJ 	 d d d        y # 1 sw Y   y xY w)Nexplicit_project_idenv_api_keyrl   Fr   rk   r   Tr   r   	r   r   r   r	   r   r   rR   rQ   r   r#   ro   r   r   r$   s        r   Mtest_vertexai_default_location_to_global_with_explicit_project_and_env_apikeyr     s     %*' 1HH$eH4HH#UH3HHw'T:6F==$$--999==$$,,
:::}}((000001 1 1s   B2CCc                 P   d}| j                         5 }|j                  dd       |j                  d|       t        dddi	      }|j                  j
                  j                  d
k(  sJ |j                  j
                  j                  |k(  sJ 	 d d d        y # 1 sw Y   y xY w)Nenv_project_idrl   Fr   rk   TrF   zhttps://fake-url.googleapis.comr   r   r   r   r   r	   r   r   rR   rQ   r#   ro   r   r$   s       r   ?test_vertexai_default_location_to_global_with_vertexai_base_urlr     s      * 	;HH$eH4HH#Z0 "CDF
 ==$$--999==$$,,
:::	; 	; 	;s   A?BB%c                 D   d}| j                         5 }|j                  dd       |j                  d|       t        dddi	      }|j                  j
                  j                  rJ |j                  j
                  j                  rJ 	 d d d        y # 1 sw Y   y xY w)
Nr   rl   Fr   rk   TrF   zhttps://fake-url.comr   r   r   s       r   @test_vertexai_default_location_to_global_with_arbitrary_base_urlr     s      * 	1HH$eH4HH#Z0 "89F
 }}((1111}}((00000	1 	1 	1s   A9BBc                    d}d}| j                         5 }|j                  dd       |j                  d|       |j                  d|       t        d	      }|j                  j
                  j                  d
k(  sJ |j                  j
                  j                  |k(  sJ |j                  j
                  j                  rJ 	 d d d        y # 1 sw Y   y xY w)Nr   r   rl   Fr   rk   r   Tr~   r   r   r   s        r   Htest_vertexai_default_location_to_global_with_env_project_and_env_apikeyr     s      *' 1HH$eH4HH#Z0HHw'T"F==$$--999==$$,,
:::}}((000001 1 1s   B0CCc                 .   d}d}| j                         5 }|j                  dd       t        d||      }|j                  j                  j
                  |k(  sJ |j                  j                  j                  |k(  sJ 	 d d d        y # 1 sw Y   y xY w)NrN   zus-central1rl   Fr   Tru   )r   r   r	   r   r   rR   rQ   r#   ro   rR   r   r$   s        r   >test_vertexai_no_default_location_when_location_explicitly_setr     s     *( ;HH$eH4T:IF==$$--999==$$,,
:::	; ; ;s   A,BBc                 L   d}d}| j                         5 }|j                  d|       |j                  d|       t        d      }|j                  j                  j
                  |k(  sJ |j                  j                  j                  |k(  sJ 	 d d d        y # 1 sw Y   y xY w)NrN   zus-west1rl   rk   Tr~   )r   r   r	   r   r   rR   rQ   r   s        r   7test_vertexai_no_default_location_when_env_location_setr     s     *( ;HH$h/HH#Z0T"F==$$--999==$$,,
:::; ; ;s   A;BB#c                    d}| j                         5 }|j                  dd       |j                  dd       |j                  dd       t        d|	      }|j                  j
                  j                  rJ |j                  j
                  j                  rJ |j                  j
                  j                  |k(  sJ 	 d d d        y # 1 sw Y   y xY w)
Nvertexai_api_keyrl   Fr   rk   r   r(   Tr   r   r   )r#   r   r   r$   s       r   2test_vertexai_no_default_location_with_apikey_onlyr     s    ' 8HH$eH4HH#UH3HHr"T73F}}((1111}}((0000==$$,,7778 8 8s   B/CCc                 j   t        j                         }| j                  dd       | j                  dd       | j                  dd       t        d|      }|j                  j
                  j                  sJ |j                  j
                  j                  sJ |j                  j
                  j                  sJ |j                  j
                  j                  rJ |j                  j
                  j                  |u sJ t        |j                  j
                  t        j                        sJ y )	Nrk   rN   rl   rO   r   r   T)r   r   )r   r   r   r	   r   r   r   rQ   rR   r   _credentialsr    r   r!   )r#   r   r$   s      r   "test_vertexai_explicit_credentialsr   !  s    

*
*
,%+->?,o>%}5&
 
	"	"	+	++	+		"	"	*	**	*		"	"	+	++	+]]&&...	.		"	"	/	/5	88	8	FMM--z/G/G	HH	Hr   c                    d}d}| j                  dd       | j                  dd       | j                  dd       t        d	||
      }|j                  j                  j                  sJ |j                  j                  j
                  |k(  sJ |j                  j                  j                  |k(  sJ |j                  j                  j                  rJ t        |j                  j                  t        j                        sJ y )Nconstructor_project_idzconstructor-locationrk   r   rl   env_locationr   r(   Tru   r   r	   r   r   r   rQ   rR   r   r    r   r!   rn   s       r   &test_vertexai_explicit_arg_precedence1r   4  s    '*#(+-=>,n=%r*& 
	"	"	+	++	+		"	"	*	*j	88	8		"	"	+	+x	77	7]]&&...	.	FMM--z/G/G	HH	Hr   c                    d}| j                  dd       | j                  dd       | j                  dd       t        d|      }|j                  j                  j                  sJ |j                  j                  j
                  rJ |j                  j                  j                  rJ |j                  j                  j                  |k(  sJ t        |j                  j                  t        j                        sJ y )	Nconstructor_apikeyrk   r(   rl   r   r   Tr   r   r"   s      r   &test_vertexai_explicit_arg_precedence2r   I  s     '+R0,b1%}5&
 
	"	"	+	++	+]]&&...	.]]&&///	/		"	"	*	*g	55	5	FMM--z/G/G	HH	Hr   c                  ~    d} d}d}	 t        | ||       y # t        $ r}t        |t              sJ Y d }~y d }~ww xY w)NrN   rO   r   )rQ   rR   r   r   r   s       r   test_invalid_mldev_constructorr   \  sI     *('%

 
 %a$$$%s    	<7<c                    |j                  t        j                  d       d}| j                  dd       | j                  dd       t	        |      }|j
                  j                  j                  rJ |j
                  j                  j                  |k(  sJ t        |j
                  j                  t        j                        sJ d	|j                  v sJ y )
Nr.   r/   constructor_api_keyr   google_env_api_keyr   gemini_env_api_keyr>   r1   r2   r;   s       r   "test_mldev_explicit_arg_precedencer   j  s    7==)CD!'%';<%';<'"&]]&&///	/		"	"	*	*g	55	5	FMM--z/G/G	HH	HM	r   
use_vertexc                    d}| j                  d|       | j                  dd       |rdnd}| j                  dd|z          | j                  d	d
       t               }|j                  j                  j                  rJ |j                  j                  j
                  |k(  sJ t        |j                  j                  t        j                        sJ y )Nr+   r   GOOGLE_GENAI_CLIENT_MODEreplayvertexmldevGOOGLE_GENAI_REPLAY_IDtest_replay_id.GOOGLE_GENAI_REPLAYS_DIRECTORYtest_replay_data)	r   r	   r   r   r   r   r    replay_api_clientReplayApiClient)r#   r   r   api_typer$   s        r   "test_replay_client_ml_dev_from_envr   |  s    '%w//:#X(-/@8/KL57IJ8&]]&&///	/		"	"	*	*g	55	5	mm!2!B!B
  
r   c                 B   d}d}| j                  dd       | j                  d|       | j                  d|       | j                  dd       |rd	nd
}| j                  dd|z          | j                  dd       t               }|j                  j                  j                  sJ |j                  j                  j
                  |k(  sJ |j                  j                  j                  |k(  sJ t        |j                  j                  t        j                        sJ y )NrN   rO   ri   rj   rk   rl   r   r   r   r   r   r   r   r   )
r   r	   r   r   r   rQ   rR   r    r   r   )r#   r   ro   rR   r   r$   s         r   $test_replay_client_vertexai_from_envr     s    *(0#6+Z8,h7/:#X(-/@8/KL57IJ8&		"	"	+	++	+		"	"	*	*j	88	8		"	"	+	+x	77	7	mm!2!B!B
  
r   c                 \   d}| j                  d|       | j                  dd       t               }t        |j                  j                  t
        j                        sJ | j                  dd       t               }t        |j                  j                  t        j                        sJ y )Nr+   r   r   r   r(   )	r   r	   r    r   r   r   r   r   r!   )r#   r   r   client1client2s        r    test_change_client_mode_from_envr     s    '%w//:H'	nn  "3"C"C
  
 /4H'	GNN..
0H0H	II	Ir   c                 (   d}| j                  dd       | j                  dd       t        |d      }|j                  j                  j                  sJ |j                  j                  j
                  rJ |j                  j                  j                  rJ |j                  j                  j                  |k(  sJ d|j                  j                  j                  v sJ t        |j                  j                  t        j                        sJ y )Nr   rl   r(   rk   T)r   r   
aiplatform)r   r	   r   r   r   rQ   rR   r   _http_optionsrF   r    r   r!   r"   s      r   %test_vertexai_apikey_from_constructorr     s    ' ,b1+R0'D1&		"	"	+	++	+]]&&...	.]]&&///	/		"	"	*	*g	55	5	++99BB	BB	B	FMM--z/G/G	HH	Hr   c                 p   d}| j                  d|       | j                  dd       | j                  dd       | j                  dd       t        d	
      }|j                  j                  j
                  sJ |j                  j                  j                  |k(  sJ |j                  j                  j                  rJ |j                  j                  j                  rJ d|j                  j                  j                  v sJ t        |j                  j                  t        j                        sJ y )Nr   r   r   Fr   rl   r(   rk   Tr~   r   r   r   r	   r   r   r   r   rQ   rR   r   rF   r    r   r!   r"   s      r   1test_vertexai_apikey_from_env_google_api_key_onlyr        '%w/%u5 ,b1+R04 &		"	"	+	++	+		"	"	*	*g	55	5]]&&...	.]]&&///	/	++99BB	BB	B	FMM--z/G/G	HH	Hr   c                 p   d}| j                  d|       | j                  dd       | j                  dd       | j                  dd       t        d	
      }|j                  j                  j
                  sJ |j                  j                  j                  |k(  sJ |j                  j                  j                  rJ |j                  j                  j                  rJ d|j                  j                  j                  v sJ t        |j                  j                  t        j                        sJ y )Nr   r   r   Fr   rl   r(   rk   Tr~   r   r   r"   s      r   1test_vertexai_apikey_from_env_gemini_api_key_onlyr     r   r   c                 n   d}| j                  d|       | j                  dd       | j                  dd       | j                  dd       t        d      }|j                  j                  j                  sJ |j                  j                  j
                  |k(  sJ |j                  j                  j                  rJ |j                  j                  j                  rJ d	|j                  j                  j                  v sJ t        |j                  j                  t        j                        sJ y )
Nr   r   r   r(   rl   rk   Tr~   r   r   r	   r   r   r   r   rQ   rR   r   rF   r    r   r!   r"   s      r   Ftest_vertexai_apikey_from_env_gemini_api_key_with_google_api_key_emptyr     s    '%w/%r* ,b1+R04 &		"	"	+	++	+		"	"	*	*g	55	5]]&&...	.]]&&///	/	++99BB	BB	B	FMM--z/G/G	HH	Hr   c                    |j                  t        j                  d       d}d}| j                  d|       | j                  d|       | j                  dd       | j                  d	d       t	        d
      }|j
                  j                  j                  sJ |j
                  j                  j                  |k(  sJ |j
                  j                  j                  rJ |j
                  j                  j                  rJ d|j                  j                  j                  v sJ t        |j
                  j                  t        j                        sJ d|j                   v sJ y )Nr.   r/   r+   r   r   r   rl   r(   rk   Tr~   r   r1   )r3   r4   r5   r   r	   r   r   r   r   rQ   rR   r   rF   r    r   r!   r6   r7   s        r   +test_vertexai_apikey_from_env_both_api_keysr     s6   7==)CD#.%.%~6%~6 ,b1+R04 &		"	"	+	++	+		"	"	*	*n	<<	<]]&&...	.]]&&///	/	++99BB	BB	B	FMM--z/G/G	HH	HM	r   c                      d} d}d}t        j                  t              5  t        | ||d       d d d        y # 1 sw Y   y xY w)Nr   rN   rO   T)r   rQ   rR   r   )r   r   r`   r	   )r   ro   rR   s      r   )test_vertexai_apikey_invalid_constructor1r      sF    ' *(}}Z  
	  s	   9Ac                 T   d}d}d}| j                  d|       | j                  d|       | j                  dd       t        d|	      }|j                  j                  j                  sJ |j                  j                  j
                  |k(  sJ |j                  j                  j                  rJ |j                  j                  j                  rJ d
|j                  j                  j                  v sJ t        |j                  j                  t        j                        sJ y )Nr   rN   rO   rk   rl   r   r(   Tr   r   r   r#   r   ro   rR   r$   s        r   test_vertexai_apikey_combo1r   /  s    ' *(+Z8,h7%r* 41&		"	"	+	++	+		"	"	*	*g	55	5]]&&...	.]]&&///	/	++99BB	BB	B	FMM--z/G/G	HH	Hr   c                 \   d}d}d}| j                  dd       | j                  dd       | j                  d|       t        d||	      }|j                  j                  j                  sJ |j                  j                  j
                  rJ |j                  j                  j                  |k(  sJ |j                  j                  j                  |k(  sJ d
|j                  j                  j                  v sJ t        |j                  j                  t        j                        sJ y )Nr   rN   rO   rk   r(   rl   r   Tru   r   r   r   s        r   test_vertexai_apikey_combo2r   C  s   ' *(+R0,b1%w/ 4hG&		"	"	+	++	+]]&&...	.		"	"	*	*j	88	8		"	"	+	+x	77	7	++99BB	BB	B	FMM--z/G/G	HH	Hr   c                 X   d}d}d}| j                  d|       | j                  d|       | j                  d|       t        d      }|j                  j                  j                  sJ |j                  j                  j
                  rJ |j                  j                  j                  |k(  sJ |j                  j                  j                  |k(  sJ d	|j                  j                  j                  v sJ t        |j                  j                  t        j                        sJ y )
NrN   rO   r   rk   rl   r   Tr~   r   r   )r#   ro   rR   r   r$   s        r   test_vertexai_apikey_combo3r   W  s     *('+Z8,h7%w/ 4 &		"	"	+	++	+]]&&...	.		"	"	*	*j	88	8		"	"	+	+x	77	7	++99BB	BB	B	FMM--z/G/G	HH	Hr   c                    d}d}| j                  d|       | j                  d|       t        d|      }|j                  j                  j                  sJ |j                  j                  j
                  |k(  sJ |j                  j                  j                  |k(  sJ |j                  j                  j                  j                  dk(  sJ t        |j                  j                  t        j                        sJ y )NrN   r   rk   rl   T)r   rR   z"https://aiplatform.googleapis.com/)r   r	   r   r   r   rQ   rR   r   rF   r    r   r!   rn   s       r   test_vertexai_global_endpointr   k  s     *(+Z8,h74(3&		"	"	+	++	+		"	"	*	*j	88	8		"	"	+	+x	77	7		"	"	0	0	9	9*
  
 
FMM--z/G/G	HH	Hr   c                     |j                  t        j                  d       d}d}d}| j                  d|       | j                  d|       t	        d|	      }d
|j
                  v sJ d|j
                  v sJ y )Nr.   r/   rN   rO   r   rk   rl   Tr   INFOz8The user provided Vertex AI API key will take precedence)r3   r4   r5   r   r	   r6   )r#   r8   ro   rR   r   rb   s         r   #test_client_logs_to_logger_instancer   }  s}    7==)CD *('+Z8,h7dG,!	6;;		@FKKOOr   c                     t         j                  j                  t        j                               \  } }| d   sJ t        | d   t        j                        sJ 	 dd l}t         j                  j                  t        j                               }|d   sJ t        |d   t        j                        sJ y # t        $ r) |d   sJ t        |d   t        j                        sJ Y y w xY w)Nverifyr   ssl)r   r!   _ensure_httpx_ssl_ctxr
   rf   r    r   
SSLContextaiohttp_ensure_aiohttp_ssl_ctxImportError)client_argsasync_client_argsr   s      r   /test_client_ssl_context_implicit_initializationr    s    44U5F5F5HI !+  
X			K)3>>	::	:
C"00HH U###'.???	 CX&&&'13>>BBBCs   AB8 8/C*)C*c                  X   t        j                  t        j                  j	                  dt        j                               t        j                  j	                  d            } t        j                  d| id| i      }t        j                  j                  |      \  }}|d   | k(  sJ 	 dd l}t        j                  j                  |      }|d   sJ t        |d   t         j                        sJ y # t         $ r) |d   sJ t        |d   t         j                        sJ Y y w xY wNSSL_CERT_FILESSL_CERT_DIRcafilecapathr   )r   r  r   r   r   create_default_contextosenvirongetcertifiwherer
   rf   r   r!   r   r   r   r    r   r   ctxoptionsr   r  r   s        r   9test_client_ssl_context_explicit_initialization_same_argsr    s   ""ZZ^^OW]]_=ZZ^^N+	#
 S/h_' 44W= !+  
X	#	%%	%
C"00HH U###'.???	 CX&&&'13>>BBBCs   -A	C7 7/D)(D)c                      t        j                  t        j                  j	                  dt        j                               t        j                  j	                  d            } t        j                  t        j                  j	                  dt        j                               t        j                  j	                  d            }t        j                  d| id|i      }t        j                  j                  |      \  }}|d   | k(  sJ 	 dd l}t        j                  j                  |      }|d   sJ t        |d   t         j                        sJ y # t         $ r) |d   sJ t        |d   t         j                        sJ Y y w xY wr  r
  )r  	async_ctxr  r   r  r   s         r   =test_client_ssl_context_explicit_initialization_separate_argsr    sO   ""ZZ^^OW]]_=ZZ^^N+	#
 ((ZZ^^OW]]_=ZZ^^N+)
 S/h	5J' 44W= !+  
X	#	%%	%
C"00HH U###'.???	 CX&&&'13>>BBBCs   A	E /FFc                  R   t        j                  t        j                  j	                  dt        j                               t        j                  j	                  d            } t        j                  d| i      }t        j                  j                  |      \  }}|d   | k(  sJ 	 dd l}t        j                  j                  |      }|d   sJ t        |d   t         j                        sJ y # t         $ r) |d   sJ t        |d   t         j                        sJ Y y w xY w)Nr  r  r  r   )r   r   r   r
  r  s        r   9test_client_ssl_context_explicit_initialization_sync_argsr    s	   ""ZZ^^OW]]_=ZZ^^N+	#
 8S/:'44W= !+  
X	#	%%	%
C"00HH U###'.???	 CX&&&'13>>BBBC   *A	C4 4/D&%D&c                  R   t        j                  t        j                  j	                  dt        j                               t        j                  j	                  d            } t        j                  d| i      }t        j                  j                  |      \  }}|d   | k(  sJ 	 dd l}t        j                  j                  |      }|d   sJ t        |d   t         j                        sJ y # t         $ r) |d   sJ t        |d   t         j                        sJ Y y w xY w)Nr  r  r  r   r  r   r   r
  r  s        r   :test_client_ssl_context_explicit_initialization_async_argsr    s	   ""ZZ^^OW]]_=ZZ^^N+	#
 3@'44W= !+  
X	#	%%	%
C"00HH U###'.???	 CX&&&'13>>BBBCr  c                     ddi} ddi}t        d|       }|j                  j                  j                  rJ |j                  j                  j	                         d   dk(  sJ t        ddd|	      }|j                  j                  j                  sJ |j                  j                  j	                         d   dk(  sJ y )
NrF   rB   rJ   r+   rL   TrN   rO   rP   rS   rU   s       r   0test_constructor_with_base_url_from_http_optionsr    s    5 
N -?,   ,,555	5%%@@B:N	,-- (	/ 
			+	+	4	44	4((CCE
 
NNNr   c                     t        j                  dd       t        d      } | j                  j                  j
                  rJ | j                  j                  j                         d   dk(  sJ t        ddd	
      }|j                  j                  j
                  sJ |j                  j                  j                         d   dk(  sJ t        j                  d d        y )Nhttps://gemini-base-url.com/https://vertex-base-url.com/
gemini_url
vertex_urlr+   r>   rF   TrN   rO   ru   rF   set_default_base_urlsr	   r   r   r   rT   )rX   rY   s     r   9test_constructor_with_base_url_from_set_default_base_urlsr(  1  s    
  //  01,  ,,555	5%%@@B:N	'(( /
 
			+	+	4	44	4((CCE
 
(((
   DTBr   c                     ddi} ddi}t        j                  dd       t        d|       }|j                  j                  j
                  rJ |j                  j                  j                         d   dk(  sJ t        d	d
d|      }|j                  j                  j
                  sJ |j                  j                  j                         d   dk(  sJ t        j                  d d        y )NrF   (https://gemini-constructor-base-url.com/(https://vertex-constructor-base-url.com/r!  r"  r#  r+   rL   TrN   rO   rP   r&  rU   s       r   Jtest_constructor_with_constructor_base_url_overrides_set_default_base_urlsr,  L  s   < <   // -?,   ,,555	5%%@@B:N	344 (	/ 
			+	+	4	44	4((CCE
 
444
   DTBr   c                    | j                  dd       | j                  dd       ddi}ddi}t        d|	      }|j                  j                  j                  rJ |j                  j                  j                         d   dk(  sJ t        d
dd|      }|j                  j                  j                  sJ |j                  j                  j                         d   dk(  sJ t        j                  d d        y )NGOOGLE_GEMINI_BASE_URL https://gemini-env-base-url.com/GOOGLE_VERTEX_BASE_URL https://vertex-env-base-url.com/rF   r*  r+  r+   rL   TrN   rO   rP   r#  )r   r	   r   r   r   rT   rF   r'  )r#   rV   rW   rX   rY   s        r   Jtest_constructor_with_constructor_base_url_overrides_environment_variablesr2  q  s'     B  B
 < < -?,   ,,555	5%%@@B:N	344 (	/ 
			+	+	4	44	4((CCE
 
444
   DTBr   c                    | j                  dd       | j                  dd       t        j                  dd       t        d	      }|j                  j
                  j                  rJ |j                  j
                  j                         d
   dk(  sJ t        ddd      }|j                  j
                  j                  sJ |j                  j
                  j                         d
   dk(  sJ t        j                  d d        y )Nr.  r/  r0  r1  r!  r"  r#  r+   r>   rF   TrN   rO   ru   )r   rF   r'  r	   r   r   r   rT   r#   rX   rY   s      r   Ytest_constructor_with_base_url_from_set_default_base_urls_overrides_environment_variablesr5    s     B  B   //  01,  ,,555	5%%@@B:N	'(( /
 
			+	+	4	44	4((CCE
 
(((
   DTBr   c                    | j                  dd       | j                  dd       t        d      }|j                  j                  j                  rJ |j                  j                  j                         d   dk(  sJ t        dd	d
      }|j                  j                  j                  sJ |j                  j                  j                         d   dk(  sJ y )Nr.  r!  r0  r"  r+   r>   rF   TrN   rO   ru   )r   r	   r   r   r   rT   r4  s      r   9test_constructor_with_base_url_from_environment_variablesr7    s    -/MN-/MN 01,  ,,555	5%%@@B:N	'(( /
 
			+	+	4	44	4((CCE
 
(((r   c                      t        ddd      } dt        _        | j                  j	                         rJ dt        _        | j                  j	                         sJ y )NTrN   rO   ru   F)r	   r   r   r   _use_aiohttpr$   s    r   6test_async_transport_absence_allows_aiohttp_to_be_usedr;    sW    & !*,,..	.*				(	(	**	*r   c                      t        dddt        j                  i             } dt        _        | j
                  j                         rJ dt        _        | j
                  j                         sJ y )NTrN   rO   r  rP   F)r	   r
   rf   r   r   r   r9  r:  s    r   Htest_async_async_client_args_without_transport_allows_aiohttp_to_be_usedr=    se    $$r:	& !*,,..	.*				(	(	**	*r   c            
         t        dddt        j                  dt        j                         i            } dt
        _        | j                  j                         rJ dt
        _        | j                  j                         rJ y )NTrN   rO   	transportr  rP   F)	r	   r
   rf   httpxAsyncBaseTransportr   r   r   r9  r:  s    r   Dtest_async_transport_forces_httpx_regardless_of_aiohttp_availabilityrB    sy    $$(%*B*B*DE	& !*,,..	.*,,..	..r   c                     K   t        ddd      } | j                  j                          d{   }t        |t        j
                        sJ | j                  j                  |u sJ y7 ;w)z8Tests that _get_async_auth_lock returns an asyncio.Lock.TrN   rO   ru   N)r	   r   _get_async_auth_lockr    asyncioLock_async_auth_lockr$   locks     r   ,test_get_async_auth_lock_basic_functionalityrJ    sf      .& !!668	8$	D',,	''	'				,	,	44	4 
9s   ,A,A*<A,c                  P  K   t        ddd      } | j                  j                          d{   }| j                  j                          d{   }| j                  j                          d{   }||u sJ ||u sJ t        |t        j
                        sJ y7 q7 Q7 1w)z8Tests that multiple calls return the same lock instance.TrN   rO   ru   N)r	   r   rD  r    rE  rF  )r$   lock1lock2lock3s       r   .test_get_async_auth_lock_returns_same_instancerO    s      .& ""779
9%""779
9%""779
9%	%	%	E7<<	((	( :
9
9s3   ,B&B !B&B"!B&2B$3.B&"B&$B&c                    | j                  dd       t        j                  t        j                        d_        d_        d_        t        j                  df      }| j                  t        j                  d	|       fd
}t        j                  |      }|_        t        j                  di d      }t        j                  |      }| j                  t        j                  d|       t!        ddd      }d|j"                  _        t&        j(                  j+                  d      5 }t-        d      D cg c]3  }|j/                  |j0                  j2                  dt5        |            5 }	}t&        j(                  j7                  |	      D ]!  }
|
j9                         j:                  dk(  r!J  	 ddd       |j=                          |j?                          |j@                  dk(  sJ d_        t&        j(                  j+                  d      5 }t-        d      D cg c]3  }|j/                  |j0                  j2                  dt5        |            5 }	}t&        j(                  j7                  |	      D ]!  }
|
j9                         j:                  dk(  r!J  	 ddd       |j=                          |j=                          |j@                  dk(  sJ yc c}w # 1 sw Y   -xY wc c}w # 1 sw Y   RxY w)z1Tests that synchronous API calls are thread-safe.r   Fr   specinitial-tokenNtest-projectreturn_valuer}   c                 "    d_         d_        y Nrefreshed-tokenFtokenexpiredrequest
mock_credss    r   refresh_side_effectzCtest_threaded_generate_content_locking.<locals>.refresh_side_effect/      (JJr   side_effect   z@{"candidates": [{"content": {"parts": [{"text": "response"}]}}]})status_coderG   r6   r^  TrN   rO   ru   r   )max_workers
   z
gemini-pro)modelcontentsresponse   )!r   r   Mockr   Credentialsr[  r\  quota_project_idr   r   r   refreshr@  Responser   SyncHttpxClientr	   r   r   
concurrentfuturesThreadPoolExecutorrangesubmitr   generate_contentra   as_completedresultr6   assert_called_onceassert_not_called
call_count)r#   r|   r`  mock_refreshmock_httpx_responsemock_requestr$   executorirs  futurer_  s              @r   &test_threaded_generate_content_lockingr  !  s   /?yyk556*$** $* iij.-IJfkk9.?@ ':;,#* M
 (;<,j00)\J.& %)&! ,,,; 0x
 r	  	MM**,Q 	 	
G  $$11': 0]]_!!Z///00 &&(  "		 	 B	&&	& *,,,; 0x
 r	  	MM**,Q 	 	
G  $$11': 0]]_!!Z///00 &&(!!#		 	 B	&&	&70 0"0 0sJ   7K.8K)=AK.?K.#L 18K;)AL +L )K..K8;L  L	c                   K   t        j                  t        j                        d_        d_        d_        t        j                  df      }| j                  t        j                  d|       fd}t        j                  |	      }|_
        t        d
dd      }d|j                  _        t        j                  |j                  j!                         |j                  j!                         |j                  j!                                d{   }|g dk(  sJ |j#                          |j%                          d
_        t        j                  |j                  j!                         |j                  j!                         |j                  j!                                d{   }|g dk(  sJ |j#                          |j#                          y7 7 0w)zETests that _async_access_token uses locks to prevent race conditions.rQ  rS  FNrT  rU  r}   c                 "    d_         d_        y rX  rZ  r]  s    r   r`  z<test_async_access_token_locking.<locals>.refresh_side_effects  ra  r   rb  TrN   rO   ru   )rS  rS  rS  )rY  rY  rY  )r   rl  r   rm  r[  r\  rn  r   r   r   ro  r	   r   r   rE  gather_async_access_tokenrz  r{  )r#   r|   r`  r}  r$   tokensr_  s         @r   test_async_access_token_lockingr  e  s     yyk556*$** $* iij.-IJfkk9.?@ ':;,#*.& %)&! ,,.,,.,,. & 
F	FF	F&&(  " * ,,.,,.,,. & 
L	LL	L&&(!!#1s%   DG#GBG#0G!1/G#!G#c                    K   t        ddd      dt        ffd} t        d      D cg c]
  } | |       }}t        j                  |  d{   }|D cg c]  }|d	   	 c}t        fd
D              sJ d       |D cg c]  }|d   	 }}t        |      t        t        d            k(  sJ d       yc c}w 7 qc c}w c c}w w)zDTests that concurrent access to _get_async_auth_lock is thread-safe.TrN   rO   ru   task_idc                 n   K   j                   j                          d {   }| t        |      fS 7 wr   r   rD  id)r  rI  r$   s     r   get_lock_taskzAtest_get_async_auth_lock_concurrent_access.<locals>.get_lock_task  s2     ##88::DBtH ;   535rk  N   c              3   .   K   | ]  }|d    k(    ywr   Nr   .0lock_idlock_idss     r   	<genexpr>z=test_get_async_auth_lock_concurrent_access.<locals>.<genexpr>        !(g!   z+All tasks should get the same lock instancer   zAll tasks should complete)r	   intru  rE  r  allsortedlist)r  r  tasksresultsry  task_idsr$   r  s         @@r   *test_get_async_auth_lock_concurrent_accessr    s      .&
3  &+2Y
/=
/%
/..%((' '..FfQi.(	 ,4 
 323 

 '..FfQi.(.		T%)_	,I.II	, 0( / /s9   (CB?CCCC'"C	C0C
Cc                    K   t        ddd      } g dt        ffd}t        j                         j	                         }t        d      D cg c]  }| j                  j                          }}t        d      D cg c]
  } ||       }}t        j                  t        j                  | t        j                  |        d	{   \  }}t        j                         j	                         }	|	|z
  }
t        |      dk(  sJ d
       t        |      dk(  sJ d       t              dk(  sJ d       |D cg c]  }t        |       c}t        fdD              sJ |
dk  sJ d|
dd       y	c c}w c c}w 7 c c}w w)zNTests that _get_async_auth_lock doesn't interfere with other async operations.TrN   rO   ru   op_idc                 v   K   t        j                  d       d {    j                  |        d|  S 7 w)Ng{Gz?
operation_)rE  sleepappend)r  completed_operationss    r   mock_async_operationzTtest_get_async_auth_lock_doesnt_block_other_operations.<locals>.mock_async_operation  s9     
--
&w s   979rg     Nz&All auth lock requests should completezAll work tasks should completez$All async operations should completec              3   .   K   | ]  }|d    k(    ywr  r   r  s     r   r  zItest_get_async_auth_lock_doesnt_block_other_operations.<locals>.<genexpr>       <W#<r  皙?zOperations took too long (.3fz s), suggesting blocking occurred)r	   r  rE  get_event_looptimeru  r   rD  r  lenr  r  )r$   r  
start_timerb   
auth_tasksr  
work_tasksauth_resultswork_resultsend_time
total_timerI  r  r  s               @@r   6test_get_async_auth_lock_doesnt_block_other_operationsr    s     .&
     %%',,.*CH9Ma""779M*M16r;A$Q';*;%,^^nnj!7>>:#>&  , ##%**,(*$* 
\	b	 J"JJ	 	\	b	 B"BB	 	!	"b	(P*PP	( $004bh0(	<8<	<<	< 
c	 ":c"2 3 	) N;  1s=   AF
!E91F
 E>;F

FA1F
<F6F
F
c                  `  K   t        ddd      } | j                  j                  J | j                  j                  J | j                  j	                          d{   }| j                  j                  J | j                  j                  J t        |t        j                        sJ | j                  j                  }||usJ t        |t        j                        sJ | j                  j	                          d{   }||u sJ | j                  j                  |u sJ y7 7 'w)z.Tests the creation lock lifecycle and cleanup.TrN   rO   ru   N)r	   r   rG  _async_auth_lock_creation_lockrD  r    rE  rF  )r$   rL  creation_lockrM  s       r   0test_get_async_auth_lock_creation_lock_lifecycler    s(     .&
 
			,	,	44	4				:	:	BB	B ""779
9%				,	,	88	8				:	:	FF	F	E7<<	((	( $$CC-	e	##	#	M7<<	00	0 ""779
9%	%				:	:m	KK	K : :s%   AD.D*B%D.D,&D.,D.c                    K   t        ddd      d} dt        ffd}t        j                         j	                         }t        |       D cg c]
  } ||       }}t        j                  |  d{   }t        j                         j	                         |z
  }|D cg c]  }|d	   	 }}|D cg c]  }|d
   	 c}|D cg c]  }|d   	 }	}t        |      | k(  sJ t        |      t        t        |             k(  sJ t        fdD              sJ d       t        |	      }
|dk  sJ d|dd       |
dk  sJ d|
dd       yc c}w 7 c c}w c c}w c c}w w)z7Tests _get_async_auth_lock under heavy concurrent load.TrN   rO   ru   d   call_idc                    K   t        j                         j                         }j                  j	                          d {   }t        j                         j                         }| t        |      ||z
  fS 7 7wr   )rE  r  r  r   rD  r  )r  startrI  endr$   s       r   get_lock_with_timingzAtest_get_async_auth_lock_under_load.<locals>.get_lock_with_timing  sf     ""$))+E##88::D

 
 
"
'
'
)CBtHcEk)) ;s   A A=A;8A=Nr   r     c              3   .   K   | ]  }|d    k(    ywr  r   r  s     r   r  z6test_get_async_auth_lock_under_load.<locals>.<genexpr>  r  r  zAll calls should get same lockg      ?zTotal time (r  zs) suggests blockingr  zMax individual call time (zs) too high)r	   r  rE  r  r  ru  r  r  r  r  r  max)num_concurrent_callsr  r  r  r  r  r  rcall_ids
call_timesmax_call_timer$   r  s              @@r   #test_get_async_auth_lock_under_loadr    s     .& *# * %%',,.*,12F,G
Hq"
H%
H..%(('%%',,.;* $$qad$($#$qad$(%&!&*&	W-	--	-		T%(<"=>	>>	>	 ,4 
 &%& 

 j/-	c	N\*S)99MNN	cA!-!4K@A' I( %$&sI   AE(EE(6E7-E($E0E(6EE(	E#BE(E(c                    	
K   t        ddd      	t        j                  t        j                        } d| _        d| _        d| _        | 	j                  _	        d	t        f	fd
}dt        f	fd}t        d      D cg c]
  } ||       }}t        d      D cg c]
  } ||       }}t        j                  t        j                  | t        j                  |        d{   \  }}t        |      dk(  sJ t        |      dk(  sJ |D cg c]  }|d   	 c}
t        
fd
D              sJ t        d |D              sJ yc c}w c c}w 7 oc c}w w)zITests _get_async_auth_lock working correctly with actual auth operations.TrN   rO   ru   rQ  z
test-tokenFNr  c                   K   j                   j                          d {   }|4 d {    t        j                  d       d {    d|  cd d d       d {    S 7 B7 97 7 # 1 d {  7  sw Y   y xY ww)NMbP?auth_op_)r   rD  rE  r  )r  rI  r$   s     r   auth_operationzQtest_get_async_auth_lock_interleaved_with_auth_operations.<locals>.auth_operation6  s{     ##88::D    MM%   w      ;         sf   BA$
BA&BA,	A(
A,BA*B&B(A,*B,A>2A53A>:Breq_idc                 n   K   j                   j                          d {   }| t        |      fS 7 wr   r  )r  rI  r$   s     r   lock_requestzOtest_get_async_auth_lock_interleaved_with_auth_operations.<locals>.lock_request=  s2     ##88::D2d8 ;r  rg  r  c              3   .   K   | ]  }|d    k(    ywr  r   r  s     r   r  zLtest_get_async_auth_lock_interleaved_with_auth_operations.<locals>.<genexpr>O  r  r  c              3   >   K   | ]  }|j                  d         yw)r  N)
startswith)r  ry  s     r   r  zLtest_get_async_auth_lock_interleaved_with_auth_operations.<locals>.<genexpr>R  s     FvVz*Fs   )r	   r   rl  r   rm  r[  r\  rn  r   r   r  ru  rE  r  r  r  )r_  r  r  r  r  
lock_tasksr  lock_resultsry  r$   r  s            @@r   9test_get_async_auth_lock_interleaved_with_auth_operationsr  '  sQ     .&
 yyk556*!** $*$.&! #   
 ,195aq!5*5).r3AQ3*3%,^^nnj!7>>:#>&  ,
 
\	b	  	 	\	b	  	  '33FfQi3(	<8<	<<	< 
FF	FF	F! 63  4s<   A>E!EE! E/;E!*E++E!E"9E!E!c                    K   d }  |         d{   \  }|j                   j                          d{   }|u sJ t        t        j                        sJ fd} |        d{   }|dk(  sJ y7 g7 D7 w)zHTests that _get_async_auth_lock works correctly with event loop context.c                  v   K   t        ddd      } | j                  j                          d {   }| |fS 7 w)NTrN   rO   ru   )r	   r   rD  rH  s     r   create_client_and_get_lockzStest_get_async_auth_lock_with_event_loop_switch.<locals>.create_client_and_get_lockY  s@     0?F ##88::D4< ;s   ,97	9Nc                     K    4 d {    t        j                  d       d {    	 d d d       d {    y7 37 7 	# 1 d {  7  sw Y   y xY ww)Nr  success)rE  r  )rL  s   r   test_lock_functionalityzPtest_get_async_auth_lock_with_event_loop_switch.<locals>.test_lock_functionalityj  sR       MM%         sP   A>AAA AAAA AAA
AAAr  )r   rD  r    rE  rF  )r  r$   rM  r  ry  rL  s        @r   /test_get_async_auth_lock_with_event_loop_switchr  U  s      344-&% ""779
9%	%	E7<<	((	(
 )**&	9		 5 : +s1   A?A9$A?A;5A?,A=-A?;A?=A?c                    K   t        ddd      } t        j                  j                  dgfd}|t        j                  _        	 t	        d      D cg c]  }| j
                  j                          }}t        j                  |  d{   t        fd	D              sJ d   d
k  sJ dd    d       	 t        j                  _        yc c}w 7 L# t        j                  _        w xY ww)z8Tests the double-checked locking pattern implementation.TrN   rO   ru   r   c                 .    dxx   dz  cc<    |       S )Nr   r  r   )selflock_creation_countoriginal_lock_inits    r   counting_lock_initzKtest_get_async_auth_lock_double_checked_locking.<locals>.counting_lock_init}  s    ad##r   2   Nc              3   ,   K   | ]  }|d    u   ywr  r   )r  rI  lockss     r   r  zBtest_get_async_auth_lock_double_checked_locking.<locals>.<genexpr>  s     2DtuQx2s      zCreated z locks, expected ~2)	r	   rE  rF  __init__ru  r   rD  r  r  )r$   r  rb   r  r  r  r  s       @@@r   /test_get_async_auth_lock_double_checked_lockingr  s  s      .& ||,,$
 -',,/@Eb	J1V446JEJ..%((E 2E2222
 	A!#>	%a())<=># /GLL K( /GLLs<   AC;C! !C;C! C0C! C;C! !C88C;c                    K   t        ddd      } | j                  j                          d{   }| j                  j                  }t	        d      D ]D  }| j                  j                          d{   }||u sJ | j                  j                  |u rDJ  | j                  j                          d{   }| j                  j                  }||u sJ ||u sJ y7 7 m7 +w)zGTests that _get_async_auth_lock doesn't leak memory under repeated use.TrN   rO   ru   Nr  )r	   r   rD  r  ru  )r$   initial_lockinitial_creation_lockrb   rI  
final_lockfinal_creation_locks          r   *test_get_async_auth_lock_memory_efficiencyr    s      .& ))>>@@, ,,KK : a##88::D<99 	!	!	 ''<<>>***II	|	##	#	 5	55	5! A
 ; ?s:   ,C&C AC&4C"5"C& C&8C$9(C&"C&$C&c                     K   t        ddd      } dt        _        | j                  j	                          d{   }|J | j                  j	                          d{   }||u sJ y7 17 w)zJTests that _get_async_auth_lock works correctly with aiohttp session lock.TrN   rO   ru   N)r	   r   r   r   _get_aiohttp_session)r$   initial_sessionsessions      r   test_get_aiohttp_sessionr    sv     
 .&  * ,,AACC/		$$	$$$99;;'	O	##	# D;s!   7A/A+%A/A- A/-A/)j__doc__rE  concurrent.futuresrr  r4   r  r   unittestr   r  google.authr   r   r@  r   r(   r   r   r   rF   r   r   r	   r
   r   AIOHTTP_NOT_INSTALLEDr   	MagicMockmarkskipifrequires_aiohttpfixturer   r%   r)   r,   r9   r<   r?   rZ   rd   rg   rp   rs   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   boolr   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r(  r,  r2  r5  r7  r;  r=  rB  rJ  rO  r  r  r  r  r  r  r  r  r  r  r  r   r   r   <module>r     s  " '    	 
    #   ) % 7   ;;%%"L &  
 ! !
	I	I	I$?6HV!*H>B88I 4 %:
;1$;$1$1$	;
;8I&I*I&%$ "$ *Jd JI&I*I*I.6I(I(I(I$"C(C6C@C2C2DC6"CJ'CT!CH2++/$ 5 5 
) 
)A'H 4$ 4$n J J2 ( (V L L6 $A $AN *G *GZ  : / /D 6 60 
$  
$S4  DNN's   J! !J=<J=