o
    Ûñh¦h ã                   @   s¸  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlmZ zd dlZW n eyG   dZY nw d dlZd dlZd dlmZmZ d dlmZ d dlmZ zd dlmZ d dlmZmZmZmZm Z m!Z!m"Z"m#Z# W n eyŸ   dZe$e$ZZe$e$ZZe$e$Z Z!e$e$Z"Z#Y nw ej%jZ&dd	„ Z'd
d„ Z(dd„ Z)dd„ Z*dd„ Z+dd„ Z,dd„ Z-G dd„ deƒZ.G dd„ deƒZ/G dd„ deƒZ0G dd„ de0ƒZ1G dd„ deƒZ2G d d!„ d!eƒZ3G d"d#„ d#eƒZ4G d$d%„ d%eƒZ5G d&d'„ d'eƒZ6G d(d)„ d)eƒZ7G d*d+„ d+eƒZ8G d,d-„ d-eƒZ9G d.d/„ d/eƒZ:G d0d1„ d1eƒZ;G d2d3„ d3eƒZ<G d4d5„ d5eƒZ=G d6d7„ d7eƒZ>G d8d9„ d9eƒZ?d:d;„ Z@G d<d=„ d=e#ƒZAG d>d?„ d?e"ƒZBG d@dA„ dAe!ƒZCG dBdC„ dCe ƒZDG dDdE„ dEeƒZEG dFdG„ dGe!ƒZFG dHdI„ dIe ƒZGG dJdK„ dKeƒZHG dLdM„ dMe ƒZIG dNdO„ dOe!ƒZJG dPdQ„ dQeƒZKG dRdS„ dSeƒZLG dTdU„ dUe!ƒZMG dVdW„ dWe#ƒZNG dXdY„ dYe"ƒZOG dZd[„ d[e!ƒZPG d\d]„ d]e#ƒZQG d^d_„ d_e#ƒZRG d`da„ dae"ƒZSG dbdc„ dce!ƒZTG ddde„ dee ƒZUG dfdg„ dgeƒZVdhdi„ ZWdjdk„ ZXdldm„ ZYdndo„ ZZdpdq„ Z[ej%jej%j\drds„ ƒƒZ]dtdu„ Z^dvdw„ Z_dxdy„ Z`ej%jadzd{„ ƒZbd|d}„ Zcd~d„ Zdd€d„ Zed‚dƒ„ Zfd„d…„ ZgG d†d‡„ d‡eƒZhdˆd‰„ ZidŠd‹„ ZjdŒd„ Zkej%jlejmdŽkddd‘d’„ ƒZnej%j\d“d”„ ƒZod•d–„ Zpd—d˜„ Zqd™dš„ Zrd›dœ„ Zsddž„ Zte;dŸd id¡Zue=dŸd id¡Zvej%j\d¢d£„ ƒZwej%jlejmdŽkd¤dd¥d¦„ ƒZxd§d¨„ Zyd©dª„ Zzd«d¬„ Z{eCƒ Z|e?ƒ Z}d­d®„ Z~d¯d°„ Zd±d²„ Z€d³d´„ Zdµd¶„ Z‚d·d¸„ Zƒd¹dº„ Z„ej%j\ej%j…d»d¼„ ƒƒZ†ej%j…d½d¾„ ƒZ‡ej%j…d¿dÀ„ ƒZˆej%j…dÁdÂ„ ƒZ‰dÃdÄ„ ZŠdÅdÆ„ Z‹dÇdÈ„ ZŒdÉdÊ„ Zej%jdËdÌ„ ƒZŽej%j\dÍdÎ„ ƒZej%jej%j\dÏdÐ„ ƒƒZdÑdÒ„ Z‘dÓdÔ„ Z’dÕdÖ„ Z“d×dØ„ Z”dÙdÚ„ Z•dÛdÜ„ Z–dÝdÞ„ Z—dßdà„ Z˜ej%j…dádâ„ ƒZ™dãdä„ Zšdådæ„ Z›dçdè„ Zœdédê„ Zdëdì„ Zždídî„ ZŸej%j…dïdð„ ƒZ G dñdò„ dòeƒZ¡ej%jdódô„ ƒZ¢dõdö„ Z£ej%j¤ej%j\d÷dø„ ƒƒZ¥ej%j¤ej%j\dùdú„ ƒƒZ¦G dûdü„ düe0ƒZ§dýdþ„ Z¨ej%j\dÿd „ ƒZ©dd„ ZªG dd„ deƒZ«dd„ Z¬dd„ Z­d	d
„ Z®dS (  é    N)Údatetime)ÚIpcReadOptionsÚtobytes)Úfind_free_port)Úutil)Úflight)ÚFlightClientÚFlightServerBaseÚServerAuthHandlerÚClientAuthHandlerÚServerMiddlewareÚServerMiddlewareFactoryÚClientMiddlewareÚClientMiddlewareFactoryc                  C   s   dd l } d S )Nr   )Úpyarrow.flight)Úpyarrow© r   úM/var/www/vscode/kcb/lib/python3.10/site-packages/pyarrow/tests/test_flight.pyÚtest_import?   s   r   c                   C   s(   t j d¡s
tdƒ‚t t jd ¡d S )z-Get the path to the test resources directory.ÚARROW_TEST_DATAzITest resources not found; set ARROW_TEST_DATA to <repo root>/testing/datar   )ÚosÚenvironÚgetÚRuntimeErrorÚpathlibÚPathr   r   r   r   Úresource_rootD   s   r   c              	   C   st   t ƒ }|sdS z||   d¡}| ¡ W  d  ƒ W S 1 sw   Y  W dS  ty9   td ||  t ¡ ¡ƒ‚w )z)Get the contents of a test resource file.NÚrbzNTest resource {} not found; did you initialize the test resource submodule?
{})r   ÚopenÚreadÚFileNotFoundErrorr   ÚformatÚ	tracebackÚ
format_exc)ÚpathÚrootÚfr   r   r   Úread_flight_resourceL   s   (ÿÿþÿr'   c                   C   s6   t dƒtjt dƒt dƒdtjt dƒt dƒdgdœS )z'Get the paths to test TLS certificates.zroot-ca.pemz	cert0.pemz	cert0.key)ÚcertÚkeyz	cert1.pemz	cert1.key)Ú	root_certÚcertificates)r'   r   ÚCertKeyPairr   r   r   r   Úexample_tls_certs[   s   þþûþr-   c                  C   s"   t  g d¢¡g} t jj| dgdS )N©iöÿÿÿéûÿÿÿr   é   é
   Ú	some_ints©Únames)ÚpaÚarrayÚTableÚfrom_arrays)Údatar   r   r   Úsimple_ints_tablel   s   ÿr:   c                  C   sT   t jg d¢t  ¡ d} t  t j g d¢| ¡t j ddg| ¡g¡g}t jj|dgdS )N)ÚfooÚbazÚquux©Útype)é   r   Né   r@   Ú
some_dictsr3   )r5   r6   Úutf8Úchunked_arrayÚDictionaryArrayr8   r7   )Údict_valuesr9   r   r   r   Úsimple_dicts_tables   s   þÿrG   c                   C   s,   t jjt  g d¢¡t  g d¢¡gddgdS )N)r;   Úbarr<   Úqux©r@   rA   é   é   ÚaÚbr3   )r5   r7   r8   r6   r   r   r   r   Úmultiple_column_table~   s
   ÿþrO   c                       s6   e Zd ZdZdZd
‡ fdd„	Zdd„ Zdd	„ Z‡  ZS )ÚConstantFlightServerz»A Flight server that always returns the same data.

    See ARROW-4796: this server implementation will segfault if Flight
    does not properly hold a reference to the Table object.
    s   the expected criteriaNc                    s,   t ƒ j|fi |¤Ž tttdœ| _|| _d S )N)ó   intsó   dictsó   multi)ÚsuperÚ__init__r:   rG   rO   Útable_factoriesÚoptions)ÚselfÚlocationrW   Úkwargs©Ú	__class__r   r   rU      s   ý
zConstantFlightServer.__init__c                 c   s2    || j krt t g ¡tj d¡g ¡V  d S d S )Nú/foo)ÚCRITERIAr   Ú
FlightInfor5   ÚschemaÚFlightDescriptorÚfor_path©rX   ÚcontextÚcriteriar   r   r   Úlist_flights—   s   €


ýÿz!ConstantFlightServer.list_flightsc                 C   s   | j |j ƒ }tj|| jdS )N©rW   )rV   Úticketr   ÚRecordBatchStreamrW   )rX   rd   rh   Útabler   r   r   Údo_getŸ   s   zConstantFlightServer.do_get©NN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r^   rU   rf   rk   Ú__classcell__r   r   r[   r   rP   „   s    
rP   c                       s>   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zed	d
„ ƒZ‡  Z	S )ÚMetadataFlightServerz4A Flight server that numbers incoming/outgoing data.Nc                    ó   t ƒ jdi |¤Ž || _d S ©Nr   ©rT   rU   rW   ©rX   rW   rZ   r[   r   r   rU   ©   ó   
zMetadataFlightServer.__init__c                 C   s<   t  g d¢¡g}t jj|dgd}tj|j|  |¡| jdS )Nr.   rM   r3   rg   )	r5   r6   r7   r8   r   ÚGeneratorStreamr`   Únumber_batchesrW   )rX   rd   rh   r9   rj   r   r   r   rk   ­   s   ÿýzMetadataFlightServer.do_getc           
   	   C   sŠ   d}g d¢}|D ]:\}}|  tj t || g¡gdg¡¡s J ‚|d us&J ‚t d| ¡ ¡\}	||	ks5J ‚| t 	d|¡¡ |d7 }qd S )Nr   r.   rM   ú<ir@   )
Úequalsr5   ÚRecordBatchr8   r6   ÚstructÚunpackÚ
to_pybytesÚwriteÚpack)
rX   rd   Ú
descriptorÚreaderÚwriterÚcounterÚexpected_dataÚbatchÚbufÚclient_counterr   r   r   Údo_put·   s   

þ
÷zMetadataFlightServer.do_putc                 c   s2    t |  ¡ ƒD ]\}}t d|¡}||fV  qd S )Nrz   )Ú	enumerateÚ
to_batchesr}   r   )rj   Úidxr‡   rˆ   r   r   r   ry   Å   s
   €þz#MetadataFlightServer.number_batches©N)
rm   rn   ro   rp   rU   rk   rŠ   Ústaticmethodry   rq   r   r   r[   r   rr   ¦   s    
rr   c                       s:   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z‡  ZS )ÚEchoFlightServerz4A Flight server that returns the last data uploaded.Nc                    s$   t ƒ j|fi |¤Ž d | _|| _d S rŽ   )rT   rU   Úlast_messageÚexpected_schema)rX   rY   r’   rZ   r[   r   r   rU   Ï   s   
zEchoFlightServer.__init__c                 C   s   t  | j¡S rŽ   )r   ri   r‘   ©rX   rd   rh   r   r   r   rk   Ô   s   zEchoFlightServer.do_getc                 C   s$   | j r| j |jksJ ‚| ¡ | _d S rŽ   )r’   r`   Úread_allr‘   ©rX   rd   r‚   rƒ   r„   r   r   r   rŠ   ×   s   zEchoFlightServer.do_putc                 C   s   |D ]}qd S rŽ   r   )rX   rd   r‚   rƒ   r„   Úchunkr   r   r   Údo_exchangeÜ   s   ÿzEchoFlightServer.do_exchangerl   )	rm   rn   ro   rp   rU   rk   rŠ   r—   rq   r   r   r[   r   r   Ì   s    r   c                   @   ó(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚEchoStreamFlightServerz6An echo server that streams individual record batches.c                 C   s   t  | jj| jjdd¡S )Né   ©Úmax_chunksize)r   rx   r‘   r`   rŒ   r“   r   r   r   rk   ä   s   þzEchoStreamFlightServer.do_getc                 C   s   g S rŽ   r   ©rX   rd   r   r   r   Úlist_actionsé   ó   z#EchoStreamFlightServer.list_actionsc                 C   s$   |j dkr| ¡ | ¡  d¡gS t‚)Núwho-am-iúutf-8)r?   Úpeer_identityÚpeerÚencodeÚNotImplementedError©rX   rd   Úactionr   r   r   Ú	do_actionì   s   
z EchoStreamFlightServer.do_actionN)rm   rn   ro   rp   rk   rž   r¨   r   r   r   r   r™   á   s
    r™   c                   @   ó    e Zd ZdZdd„ Zdd„ ZdS )ÚGetInfoFlightServerz)A Flight server that tests GetFlightInfo.c                 C   s^   t  t dt ¡ fg¡|t  ddg¡t  dt j dd¡gt d¡ 	t 
d¡¡d¡gd	d
dd¡S )NrM   ó    úgrpc://testÚ	localhosté  ú2023-04-05T12:34:56.789012345Únszendpoint app metadatar@   é*   Tzinfo app metadata)r   r_   r5   r`   Úint32ÚFlightEndpointÚLocationÚfor_grpc_tcpÚscalarÚcastÚ	timestamp©rX   rd   r‚   r   r   r   Úget_flight_infoõ   s    üþ	ñz#GetInfoFlightServer.get_flight_infoc                 C   s   |   ||¡}t |j¡S rŽ   )rº   r   ÚSchemaResultr`   )rX   rd   r‚   Úinfor   r   r   Ú
get_schema  s   zGetInfoFlightServer.get_schemaN)rm   rn   ro   rp   rº   r½   r   r   r   r   rª   ò   s    rª   c                   @   ó$   e Zd ZdZedd„ ƒZdd„ ZdS )ÚListActionsFlightServerú'A Flight server that tests ListActions.c                 C   s   ddt  dd¡gS )N)úaction-1Údescription)zaction-2Ú zaction-3zmore detail©r   Ú
ActionType)Úclsr   r   r   Úexpected_actions  s   
ýz(ListActionsFlightServer.expected_actionsc                 c   s    |   ¡ E d H  d S rŽ   )rÇ   r   r   r   r   rž     s   €z$ListActionsFlightServer.list_actionsN)rm   rn   ro   rp   ÚclassmethodrÇ   rž   r   r   r   r   r¿     s
    
r¿   c                   @   ó   e Zd ZdZdd„ ZdS )ÚListActionsErrorFlightServerrÀ   c                 c   s    dV  dV  d S )N)rÁ   rÃ   r;   r   r   r   r   r   rž     s   €
z)ListActionsErrorFlightServer.list_actionsN)rm   rn   ro   rp   rž   r   r   r   r   rÊ     ó    rÊ   c                       s2   e Zd ZdZd	‡ fdd„	Zdd„ Zdd„ Z‡  ZS )
ÚCheckTicketFlightServerzDA Flight server that compares the given ticket to an expected value.Nc                    s   t ƒ j|fi |¤Ž || _d S rŽ   )rT   rU   Úexpected_ticket)rX   rÍ   rY   rZ   r[   r   r   rU   '  s   
z CheckTicketFlightServer.__init__c                 C   sD   | j |jksJ ‚tjg d¢t ¡ dg}tjj|dgd}t |¡S )Nr.   r>   rM   r3   )	rÍ   rh   r5   r6   r²   r7   r8   r   ri   )rX   rd   rh   Údata1rj   r   r   r   rk   +  s   
zCheckTicketFlightServer.do_getc                 C   s   |  ¡ | _d S rŽ   )r”   r‘   )rX   rd   r‚   rƒ   r   r   r   rŠ   1  ó   zCheckTicketFlightServer.do_putrŽ   )rm   rn   ro   rp   rU   rk   rŠ   rq   r   r   r[   r   rÌ   $  s
    rÌ   c                   @   ó,   e Zd ZdZe de ¡ fg¡Zdd„ ZdS )ÚInvalidStreamFlightServerzEA Flight server that tries to return messages with differing schemas.rM   c                 C   s†   t jg d¢t  ¡ dg}t jg d¢t  ¡ dg}|j|jks J ‚t jj|dgd}t jj|dgd}|j| jks:J ‚t 	| j||g¡S )Nr.   r>   )g      $Àg      Àg        ç      @g      $@rM   r3   )
r5   r6   r²   Úfloat64r?   r7   r8   r`   r   rx   )rX   rd   rh   rÎ   Údata2Útable1Útable2r   r   r   rk   :  s   z InvalidStreamFlightServer.do_getN©rm   rn   ro   rp   r5   r`   r²   rk   r   r   r   r   rÑ   5  ó    rÑ   c                   @   rÐ   )ÚNeverSendsDataFlightServerz0A Flight server that never actually yields data.rM   c                 C   s\   |j dkr!| j ¡ | j ¡ tjjtdƒg| jdg}t | j|¡S t | jt	 
| j ¡ ¡¡S )Nó
   yield_datar0   ©r`   )rh   r`   Úempty_tabler5   r|   r8   Úranger   rx   Ú	itertoolsÚrepeat)rX   rd   rh   r9   r   r   r   rk   J  s   
ýÿz!NeverSendsDataFlightServer.do_getNr×   r   r   r   r   rÙ   E  rØ   rÙ   c                   @   s,   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdS )	ÚSlowFlightServerz;A Flight server that delays its responses to test timeouts.c                 C   s    t  t dt ¡ fg¡|  ¡ ¡S )NrM   )r   rx   r5   r`   r²   Úslow_streamr“   r   r   r   rk   [  s   ÿzSlowFlightServer.do_getc                 C   s   t  d¡ g S ©Nç      à?)ÚtimeÚsleepr¦   r   r   r   r¨   _  s   
zSlowFlightServer.do_actionc                  c   sP    t jg d¢t  ¡ dg} t jj| dgdV  t d¡ t jj| dgdV  d S )Nr.   r>   rM   r3   r1   )r5   r6   r²   r7   r8   rä   rå   )rÎ   r   r   r   rá   c  s
   €
zSlowFlightServer.slow_streamN)rm   rn   ro   rp   rk   r¨   r   rá   r   r   r   r   rà   X  s    rà   c                   @   s4   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
S )ÚErrorFlightServerz9A Flight server that uses all the Flight-specific errors.c                	   C   s"   t jt jt jt jt jttjt	dœS )N)ÚinternalÚtimedoutÚcancelÚunauthenticatedÚunauthorizedÚnotimplementedÚinvalidr)   )
r   ÚFlightInternalErrorÚFlightTimedOutErrorÚFlightCancelledErrorÚFlightUnauthenticatedErrorÚFlightUnauthorizedErrorr¥   r5   ÚArrowInvalidÚKeyErrorr   r   r   r   Úerror_casesp  s   øzErrorFlightServer.error_casesc                 C   s>   t  ¡ }|j|v r||j dƒ‚|jdkrd}t d|¡‚t‚)Nr;   Úprotobufó   this is an error message)ræ   rõ   r?   r   rò   r¥   )rX   rd   r§   rõ   Úerr_msgr   r   r   r¨   }  s   

zErrorFlightServer.do_actionc                 c   s*    t  t g ¡t j d¡g ¡V  t  d¡‚)Nr]   r;   )r   r_   r5   r`   ra   rb   rî   rc   r   r   r   rf   †  s   €
ý
zErrorFlightServer.list_flightsc                 C   s‚   |j dkr
t d¡‚|j dkrt d¡‚|j dkrt d¡‚|j dkr(t d¡‚|j dkr2t d¡‚|j dkr?d}t d|¡‚d S )	Ns   internalr;   s   timedouts   cancels   unauthenticateds   unauthorizeds   protobufr÷   )Úcommandr   rî   rï   rð   rñ   rò   )rX   rd   r‚   rƒ   r„   rø   r   r   r   rŠ   Ž  s   










þzErrorFlightServer.do_putN)	rm   rn   ro   rp   r   rõ   r¨   rf   rŠ   r   r   r   r   ræ   m  s    
	ræ   c                       sJ   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	‡  Z
S )ÚExchangeFlightServerz A server for testing DoExchange.Nc                    rs   rt   ru   rv   r[   r   r   rU   ¡  rw   zExchangeFlightServer.__init__c                 C   sŠ   |j tjjkrt d¡‚|jdkr|  |||¡S |jdkr$|  |||¡S |jdkr0|  	|||¡S |jdkr<|  
|||¡S t d |j¡¡‚)Nz!Must provide a command descriptoró   echoó   getó   putó	   transformzUnknown command: {})Údescriptor_typer   ÚDescriptorTypeÚCMDr5   ró   rù   Úexchange_echoÚexchange_do_getÚexchange_do_putÚexchange_transformr!   r•   r   r   r   r—   ¥  s   





ÿz ExchangeFlightServer.do_exchangec                 C   s:   t jjt  tddƒ¡gdgd}| |j¡ | |¡ dS )úEmulate DoGet with DoExchange.r   é (  rM   r3   N)r5   r7   r8   r6   rÝ   Úbeginr`   Úwrite_table)rX   rd   rƒ   r„   r9   r   r   r   r  ´  s   ÿþz$ExchangeFlightServer.exchange_do_getc                 C   s>   d}|D ]}|j st d¡‚|d7 }q| t|ƒ d¡¡ dS )úEmulate DoPut with DoExchange.r   zAll chunks must have data.r@   r¡   N)r9   r5   ró   Úwrite_metadataÚstrr¤   )rX   rd   rƒ   r„   Únum_batchesr–   r   r   r   r  ¼  s   

z$ExchangeFlightServer.exchange_do_putc                 C   s€   d}|D ]9}|s|j r|j|j j| jd d}|jr&|j r&| |j |j¡ q|jr0| |j¡ q|j r:| |j ¡ qJ dƒ‚dS )zRun a simple echo server.Frg   TzShould not happenN)r9   r  r`   rW   Úapp_metadataÚwrite_with_metadatar  Úwrite_batch)rX   rd   rƒ   r„   Ústartedr–   r   r   r   r  Å  s   
õz"ExchangeFlightServer.exchange_echoc                 C   s¤   |j D ]}tj |j¡st dt|ƒ ¡‚q| ¡ }dg|j }|D ]}t	|ƒD ]\}}	||  |	 
¡ 7  < q(q"tjjt |¡gdgd}
| |
j ¡ | |
¡ dS )zSum rows in an uploaded table.zInvalid field: r   Úsumr3   N)r`   r5   ÚtypesÚ
is_integerr?   ró   Úreprr”   Únum_rowsr‹   Úas_pyr7   r8   r6   r  r	  )rX   rd   rƒ   r„   Úfieldrj   ÚsumsÚcolumnÚrowÚvalueÚresultr   r   r   r  Õ  s   
ÿÿz'ExchangeFlightServer.exchange_transformrŽ   )rm   rn   ro   rp   rU   r—   r  r  r  r  rq   r   r   r[   r   rú   ž  s    	rú   c                       ó0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚHttpBasicServerAuthHandlerú7An example implementation of HTTP basic authentication.c                    ó   t ƒ  ¡  || _d S rŽ   ©rT   rU   Úcreds©rX   r#  r[   r   r   rU   ç  ó   

z#HttpBasicServerAuthHandler.__init__c                 C   sZ   |  ¡ }tj |¡}|j| jvrt d¡‚| j|j |jkr#t d¡‚| t	|jƒ¡ d S )Núunknown userzwrong password)
r   r   Ú	BasicAuthÚdeserializeÚusernamer#  rñ   Úpasswordr€   r   )rX   ÚoutgoingÚincomingrˆ   Úauthr   r   r   Úauthenticateë  s   

z'HttpBasicServerAuthHandler.authenticatec                 C   s&   |st  d¡‚|| jvrt  d¡‚|S )Nztoken not providedr&  )r   rñ   r#  ©rX   Útokenr   r   r   Úis_validô  s
   


z#HttpBasicServerAuthHandler.is_valid©rm   rn   ro   rp   rU   r.  r1  rq   r   r   r[   r   r  ä  ó
    	r  c                       r  )ÚHttpBasicClientAuthHandlerr   c                    s"   t ƒ  ¡  t ||¡| _d | _d S rŽ   )rT   rU   r   r'  Ú
basic_authr0  ©rX   r)  r*  r[   r   r   rU   ÿ  s   

z#HttpBasicClientAuthHandler.__init__c                 C   s"   | j  ¡ }| |¡ | ¡ | _d S rŽ   )r5  Ú	serializer€   r   r0  )rX   r+  r,  r-  r   r   r   r.    s   

z'HttpBasicClientAuthHandler.authenticatec                 C   ó   | j S rŽ   ©r0  ©rX   r   r   r   Ú	get_token	  ó   z$HttpBasicClientAuthHandler.get_token©rm   rn   ro   rp   rU   r.  r;  rq   r   r   r[   r   r4  ü  s
    r4  c                       r  )ÚTokenServerAuthHandlerú:An example implementation of authentication via handshake.c                    r!  rŽ   r"  r$  r[   r   r   rU     r%  zTokenServerAuthHandler.__init__c                 C   sJ   |  ¡ }|  ¡ }|| jv r | j| |kr | t d| ¡¡ d S t d¡‚)Nó   secret:zinvalid username/password)r   r#  r€   Úbase64Ú	b64encoder   rñ   )rX   r+  r,  r)  r*  r   r   r   r.    s   ÿz#TokenServerAuthHandler.authenticatec                 C   s*   t  |¡}| d¡st d¡‚|dd … S )Nr@  zinvalid tokené   )rA  Ú	b64decodeÚ
startswithr   rñ   r/  r   r   r   r1    s   


zTokenServerAuthHandler.is_validr2  r   r   r[   r   r>    r3  r>  c                       r  )ÚTokenClientAuthHandlerr?  c                    s    t ƒ  ¡  || _|| _d| _d S )Nr«   )rT   rU   r)  r*  r0  r6  r[   r   r   rU   '  s   

zTokenClientAuthHandler.__init__c                 C   s&   |  | j¡ |  | j¡ | ¡ | _d S rŽ   )r€   r)  r*  r   r0  ©rX   r+  r,  r   r   r   r.  -  s   z#TokenClientAuthHandler.authenticatec                 C   r8  rŽ   r9  r:  r   r   r   r;  2  r<  z TokenClientAuthHandler.get_tokenr=  r   r   r[   r   rF  $  s
    rF  c                   @   r©   )ÚNoopAuthHandlerzA no-op auth handler.c                 C   ó   dS )zDo nothing.Nr   rG  r   r   r   r.  9  s    zNoopAuthHandler.authenticatec                 C   rI  )zV
        Returning an empty string.
        Returning None causes Type error.
        rÃ   r   r/  r   r   r   r1  <  s   zNoopAuthHandler.is_validN)rm   rn   ro   rp   r.  r1  r   r   r   r   rH  6  ó    rH  c                 C   s,   | D ]}|  ¡ |  ¡ kr|  |¡  S qdS )zcLookup the value of given key in the given headers.
       The key lookup is case-insensitive.
    N)Úlowerr   )ÚheadersÚ
lookup_keyr)   r   r   r   Úcase_insensitive_header_lookupD  s
   ÿÿrN  c                   @   r˜   )	Ú!ClientHeaderAuthMiddlewareFactoryz@ClientMiddlewareFactory that creates ClientAuthHeaderMiddleware.c                 C   ó
   g | _ d S rŽ   ©Úcall_credentialr:  r   r   r   rU   P  ó   
z*ClientHeaderAuthMiddlewareFactory.__init__c                 C   ó   t | ƒS rŽ   )ÚClientHeaderAuthMiddleware©rX   r¼   r   r   r   Ú
start_callS  ó   z,ClientHeaderAuthMiddlewareFactory.start_callc                 C   ó
   || _ d S rŽ   rQ  )rX   rR  r   r   r   Úset_call_credentialV  rS  z5ClientHeaderAuthMiddlewareFactory.set_call_credentialN)rm   rn   ro   rp   rU   rW  rZ  r   r   r   r   rO  M  s
    rO  c                   @   r©   )rU  aÅ  
    ClientMiddleware that extracts the authorization header
    from the server.

    This is an example of a ClientMiddleware that can extract
    the bearer token authorization header from a HTTP header
    authentication enabled server.

    Parameters
    ----------
    factory : ClientHeaderAuthMiddlewareFactory
        This factory is used to set call credentials if an
        authorization header is found in the headers from the server.
    c                 C   rY  rŽ   ©Úfactory©rX   r\  r   r   r   rU   j  rS  z#ClientHeaderAuthMiddleware.__init__c                 C   s(   t |dƒ}| j d|d  d¡g¡ d S )NÚAuthorizationó   authorizationr   r¡   )rN  r\  rZ  r¤   )rX   rL  Úauth_headerr   r   r   Úreceived_headersm  s
   

þz+ClientHeaderAuthMiddleware.received_headersN)rm   rn   ro   rp   rU   ra  r   r   r   r   rU  Z  s    rU  c                   @   rÉ   )Ú!HeaderAuthServerMiddlewareFactoryz)Validates incoming username and password.c           	      C   s°   t |dƒ}|d  d¡}d}d}|d dkr<t |d ¡}| d¡ d	¡}|d d
kr1|d dks6t |¡‚d}t|ƒS |d dkrS|d }|dksOt |¡‚t|ƒS t |¡‚)Nr^  r   ú rÃ   zInvalid credentialsÚBasicr@   r¡   ú:Útestr*  Ú	token1234ÚBearer)rN  ÚsplitrA  rD  Údecoder   rñ   ÚHeaderAuthServerMiddleware)	rX   r¼   rL  r`  Úvaluesr0  Úerror_messageÚdecodedÚpairr   r   r   rW  w  s(   þ
ù

þz,HeaderAuthServerMiddlewareFactory.start_callN©rm   rn   ro   rp   rW  r   r   r   r   rb  t  rË   rb  c                   @   r©   )rk  zBA ServerMiddleware that transports incoming username and password.c                 C   rY  rŽ   r9  r/  r   r   r   rU   “  rS  z#HeaderAuthServerMiddleware.__init__c                 C   s   dd| j  iS )NÚauthorizationzBearer r9  r:  r   r   r   Úsending_headers–  rÏ   z*HeaderAuthServerMiddleware.sending_headersN©rm   rn   ro   rp   rU   rr  r   r   r   r   rk    rJ  rk  c                   @   rÉ   )ÚHeaderAuthFlightServerz<A Flight server that tests with basic token authentication. c                 C   s@   |  d¡}|rt| ¡ dƒ}| d¡}|d  d¡gS t d¡‚)Nr-  r^  rc  r@   r¡   zNo token auth middleware found.)Úget_middlewarerN  rr  ri  r¤   r   rñ   )rX   rd   r§   Ú
middlewarer`  rl  r   r   r   r¨     s   
ÿ
ÿz HeaderAuthFlightServer.do_actionN©rm   rn   ro   rp   r¨   r   r   r   r   rt  š  rË   rt  c                   @   rÉ   )Ú'ArbitraryHeadersServerMiddlewareFactoryz<A ServerMiddlewareFactory that transports arbitrary headers.c                 C   ó   t |ƒS rŽ   )Ú ArbitraryHeadersServerMiddleware©rX   r¼   rL  r   r   r   rW  «  rX  z2ArbitraryHeadersServerMiddlewareFactory.start_callNrp  r   r   r   r   rx  ¨  rË   rx  c                   @   r©   )rz  z5A ServerMiddleware that transports arbitrary headers.c                 C   rY  rŽ   ©r,  )rX   r,  r   r   r   rU   ²  rS  z)ArbitraryHeadersServerMiddleware.__init__c                 C   r8  rŽ   r|  r:  r   r   r   rr  µ  r<  z0ArbitraryHeadersServerMiddleware.sending_headersNrs  r   r   r   r   rz  ¯  rJ  rz  c                   @   rÉ   )ÚArbitraryHeadersFlightServerz6A Flight server that tests multiple arbitrary headers.c           	      C   sX   |  d¡}|r'| ¡ }t|dƒ}t|dƒ}|d  d¡}|d  d¡}||gS t d¡‚)Núarbitrary-headersztest-header-1ztest-header-2r   r¡   zNo headers middleware found)ru  rr  rN  r¤   r   ÚFlightServerError)	rX   rd   r§   rv  rL  Úheader_1Úheader_2Úvalue1Úvalue2r   r   r   r¨   ¼  s   
þþ
z&ArbitraryHeadersFlightServer.do_actionNrw  r   r   r   r   r}  ¹  rË   r}  c                   @   rÉ   )ÚHeaderServerMiddlewarez/Expose a per-call value to the RPC method body.c                 C   rY  rŽ   )Úspecial_value)rX   r…  r   r   r   rU   Ñ  rS  zHeaderServerMiddleware.__init__N)rm   rn   ro   rp   rU   r   r   r   r   r„  Î  rË   r„  c                   @   rÉ   )ÚHeaderServerMiddlewareFactoryz:Expose a per-call hard-coded value to the RPC method body.c                 C   s   t dƒS )Nzright value)r„  r{  r   r   r   rW  Ø  rX  z(HeaderServerMiddlewareFactory.start_callNrp  r   r   r   r   r†  Õ  rË   r†  c                   @   rÉ   )ÚHeaderFlightServerz(Echo back the per-call hard-coded value.c                 C   s    |  d¡}|r|j ¡ gS dgS )Nrf  r«   )ru  r…  r¤   )rX   rd   r§   rv  r   r   r   r¨   ß  s   
zHeaderFlightServer.do_actionNrw  r   r   r   r   r‡  Ü  rË   r‡  c                   @   rÉ   )ÚMultiHeaderFlightServerú8Test sending/receiving multiple (binary-valued) headers.c                 C   s    |  d¡}t|jƒ d¡}|gS )Nrf  r¡   )ru  r  Úclient_headersr¤   )rX   rd   r§   rv  rL  r   r   r   r¨   é  s   
z!MultiHeaderFlightServer.do_actionNrw  r   r   r   r   rˆ  æ  rË   rˆ  c                   @   rÉ   )Ú$SelectiveAuthServerMiddlewareFactoryz1Deny access to certain methods based on a header.c                 C   sL   |j tjjkr	d S | d¡}|st d¡‚|d }|dkr"t d¡‚t|ƒS )Núx-auth-tokenzNo tokenr   r*  zInvalid token)Úmethodr   ÚFlightMethodÚLIST_ACTIONSr   rñ   r„  )rX   r¼   rL  r0  r   r   r   rW  ò  s   


z/SelectiveAuthServerMiddlewareFactory.start_callNrp  r   r   r   r   r‹  ï  rË   r‹  c                   @   ó   e Zd Zdd„ ZdS )Ú$SelectiveAuthClientMiddlewareFactoryc                 C   s   t ƒ S rŽ   )ÚSelectiveAuthClientMiddlewarerV  r   r   r   rW    r<  z/SelectiveAuthClientMiddlewareFactory.start_callN)rm   rn   ro   rW  r   r   r   r   r‘    ó    r‘  c                   @   r  )r’  c                 C   s   ddiS )NrŒ  r*  r   r:  r   r   r   rr    s   ÿz-SelectiveAuthClientMiddleware.sending_headersN)rm   rn   ro   rr  r   r   r   r   r’    r“  r’  c                       ó(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )Ú RecordingServerMiddlewareFactoryú Record what methods were called.c                    ó   t ƒ  ¡  g | _d S rŽ   ©rT   rU   Úmethodsr:  r[   r   r   rU     r%  z)RecordingServerMiddlewareFactory.__init__c                 C   ó   | j  |j¡ d S rŽ   ©r™  Úappendr  r{  r   r   r   rW    ó   z+RecordingServerMiddlewareFactory.start_call©rm   rn   ro   rp   rU   rW  rq   r   r   r[   r   r•    ó    r•  c                       r”  )Ú RecordingClientMiddlewareFactoryr–  c                    r—  rŽ   r˜  r:  r[   r   r   rU     r%  z)RecordingClientMiddlewareFactory.__init__c                 C   rš  rŽ   r›  rV  r   r   r   rW  !  r  z+RecordingClientMiddlewareFactory.start_callrž  r   r   r[   r   r     rŸ  r   c                   @   r©   )Ú"MultiHeaderClientMiddlewareFactoryr‰  c                 C   s
   i | _ d S rŽ   )Úlast_headersr:  r   r   r   rU   )  s   
z+MultiHeaderClientMiddlewareFactory.__init__c                 C   rT  rŽ   )ÚMultiHeaderClientMiddlewarerV  r   r   r   rW  .  rX  z-MultiHeaderClientMiddlewareFactory.start_callN)rm   rn   ro   rp   rU   rW  r   r   r   r   r¡  &  ó    r¡  c                   @   sB   e Zd ZdZddgddgdgdgdœZdd	„ Zd
d„ Zdd„ ZdS )r£  r‰  r;   rH   ó    ó   r<   )zx-textzx-binary-binzx-MIXED-cases   x-other-MIXED-casec                 C   rY  rŽ   r[  r]  r   r   r   rU   =  rS  z$MultiHeaderClientMiddleware.__init__c                 C   r8  rŽ   )ÚEXPECTEDr:  r   r   r   rr  @  r<  z+MultiHeaderClientMiddleware.sending_headersc                 C   s   | j j |¡ d S rŽ   )r\  r¢  Úupdate)rX   rL  r   r   r   ra  C  s   z,MultiHeaderClientMiddleware.received_headersN)rm   rn   ro   rp   r§  rU   rr  ra  r   r   r   r   r£  2  s    ûr£  c                   @   rÉ   )Ú"MultiHeaderServerMiddlewareFactoryr‰  c                 C   ry  rŽ   )ÚMultiHeaderServerMiddlewarer{  r   r   r   rW  L  rX  z-MultiHeaderServerMiddlewareFactory.start_callNrp  r   r   r   r   r©  I  rË   r©  c                   @   r©   )rª  r‰  c                 C   rY  rŽ   )rŠ  )rX   rŠ  r   r   r   rU   S  rS  z$MultiHeaderServerMiddleware.__init__c                 C   s   t jS rŽ   )r£  r§  r:  r   r   r   rr  V  r<  z+MultiHeaderServerMiddleware.sending_headersNrs  r   r   r   r   rª  P  rJ  rª  c                       r  )ÚLargeMetadataFlightServerz Regression test for ARROW-13253.c                    s    t ƒ j|i |¤Ž dd | _d S )Nó    ì       )rT   rU   Ú	_metadata)rX   ÚargsrZ   r[   r   r   rU   ]  s   z"LargeMetadataFlightServer.__init__c                 C   s6   t  dt  ¡ fg¡}t |t jdgg|d| jfg¡S )NrM   r@   rÛ   )r5   r`   Úint64r   rx   Úrecord_batchr®  )rX   rd   rh   r`   r   r   r   rk   a  s   ÿz LargeMetadataFlightServer.do_getc                 C   s   |  | j¡ d S rŽ   )r  r®  r•   r   r   r   r—   g  s   z%LargeMetadataFlightServer.do_exchange)rm   rn   ro   rp   rU   rk   r—   rq   r   r   r[   r   r«  Z  s
    r«  c                  C   sà  d} d}d}d}d}d}d}d}d	}d
}	t t dd¡ƒ| ks J ‚t t dd¡ƒ|ks,J ‚t t dd¡ƒ|ks8J ‚t tj d¡ƒ|ksDJ ‚t dg t 	d¡ 
t d¡¡d¡}
t |
ƒ|ks]J ‚t t g ¡tj ¡ g dddd¡}t |ƒ|ksvJ ‚t t d¡ƒ|ksJ ‚t t d¡ƒ|ksŒJ ‚t t t g ¡¡ƒ|ksšJ ‚t t t dg¡¡ƒdks©J ‚t t d¡ƒ|	ks´J ‚t t¡ t dd ¡ W d   ƒ n1 sÊw   Y  t t¡ t tƒ g ¡ W d   ƒ n1 sæw   Y  t t¡ t dddtƒ g¡ W d   ƒ n	1 sw   Y  t t¡ tjdg dd W d   ƒ n	1 s$w   Y  t t¡ tjdg tdd d!dd"d#ƒd W d   ƒ n	1 sIw   Y  t t¡ tjdg tƒ d$ W d   ƒ d S 1 siw   Y  d S )%Nz1<pyarrow.flight.Action type='foo' body=(0 bytes)>z)ActionType(type='foo', description='bar')z?<pyarrow.flight.BasicAuth username=b'user' password=(redacted)>z,<pyarrow.flight.FlightDescriptor cmd=b'foo'>z©<pyarrow.flight.FlightEndpoint ticket=<pyarrow.flight.Ticket ticket=b'foo'> locations=[] expiration_time=2023-04-05 12:34:56+00:00 app_metadata=b'endpoint app metadata'>z³<pyarrow.flight.FlightInfo schema= descriptor=<pyarrow.flight.FlightDescriptor path=[]> endpoints=[] total_records=1 total_bytes=42 ordered=True app_metadata=b'test app metadata'>z6<pyarrow.flight.Location b'grpc+tcp://localhost:1234'>z&<pyarrow.flight.Result body=(3 bytes)>z'<pyarrow.flight.SchemaResult schema=()>z%<pyarrow.flight.Ticket ticket=b'foo'>r;   r«   rH   ÚuserÚpassó   fooú2023-04-05T12:34:56Úsó   endpoint app metadatar@   r±   Tó   test app metadataúgrpc+tcp://localhost:1234)Úintr°  z1<pyarrow.flight.SchemaResult schema=(int: int64)>r¬   s   grpc://testz2023-04-05T01:02:03)Úexpiration_timeiç  rL   r0   rA   rK   ©r  )r  r   ÚActionrÅ   r'  ra   Úfor_commandr³   r5   r¶   r·   r¸   r_   r`   rb   r´   ÚResultr»   ÚTicketÚpytestÚraisesÚ	TypeErrorÚobjectr   )Úaction_reprÚaction_type_reprÚbasic_auth_reprÚdescriptor_reprÚendpoint_reprÚ	info_reprÚlocation_reprÚresult_reprÚschema_result_reprÚticket_reprÚendpointr¼   r   r   r   Ú	test_reprk  sd   ÿ	þþÿÿÿÿÿ ÿ$ÿrÐ  c                  C   sø   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„ dd„ dd„ dd„ dd„ dd„ g} | D ]6}|ƒ \}}|ƒ \}}||ksUJ ‚||ks[J ‚||ksaJ ‚||ksgJ ‚||ksmJ ‚||kssJ ‚||ksyJ ‚qCd S )Nc                   S   ó   t  dd¡t  dd¡fS )Nr;   r«   rH   ©r   r½  r   r   r   r   Ú<lambda>©  ó    ztest_eq.<locals>.<lambda>c                   S   ó   t  dd¡t  dd¡fS )Nr;   r«   ó   barrÒ  r   r   r   r   rÓ  ª  rÔ  c                   S   rÕ  )Nr;   rH   r<   rÄ   r   r   r   r   rÓ  «  ó   
 
ÿc                   S   rÑ  )Nr²  r³  Úuser2©r   r'  r   r   r   r   rÓ  ­  r×  c                   S   rÕ  )Nr²  r³  Úpass2rÙ  r   r   r   r   rÓ  ¯  r×  c                   S   s   t j d¡t j d¡fS )Nr;   )r   ra   r¾  rb   r   r   r   r   rÓ  ±  r×  c                   S   s   t  dg ¡t  dg ¡fS ©Nr´  rÖ  ©r   r³   r   r   r   r   rÓ  ³  r×  c                   S   s(   t  dt  d¡g¡t  dt  d¡g¡fS )Nr´  r¹  úgrpc+tls://localhost:1234)r   r³   r´   r   r   r   r   rÓ  µ  s   ÿÿýc                
   S   s@   t  dg t d¡ t d¡¡¡t  dg t d¡ t d¡¡¡fS )Nr´  rµ  r¶  z2023-04-05T12:34:56.789Úms)r   r³   r5   r¶   r·   r¸   r   r   r   r   rÓ  »  s   ÿþýc                   S   s    t jdg ddt jdg ddfS )Nr´  r«   r¼  ó   metarÜ  r   r   r   r   rÓ  Á  s    ÿc                   S   s>   t  t g ¡t j ¡ g ¡t  t dt ¡ fg¡t j ¡ g ¡fS ©NÚints)r   r_   r5   r`   ra   rb   r°  r   r   r   r   rÓ  Ã  s   
þ
þüc                   S   s6   t  t g ¡t j ¡ g ¡t  t g ¡t j d¡g ¡fS ©Nr´  )r   r_   r5   r`   ra   rb   r¾  r   r   r   r   rÓ  Ê  s   
þþüc                	   S   sH   t  t g ¡t j ¡ t  dg ¡g¡t  t g ¡t j ¡ t  dg ¡g¡fS rÛ  )r   r_   r5   r`   ra   rb   r³   r   r   r   r   rÓ  Ñ  s   ýýûc                   S   ó<   t jt g ¡t j ¡ g ddt jt g ¡t j ¡ g ddfS )Néÿÿÿÿ)Útotal_recordsr@   ©r   r_   r5   r`   ra   rb   r   r   r   r   rÓ  Ú  ó   þþüc                   S   rã  )Nrä  )Útotal_bytesr±   ræ  r   r   r   r   rÓ  á  rç  c                   S   rã  )NF)ÚorderedTræ  r   r   r   r   rÓ  è  rç  c                   S   rã  )Nr«   r¼  rß  ræ  r   r   r   r   rÓ  ï  rç  c                   S   ó   t  d¡t  d¡fS )Nr¹  rÝ  )r   r´   r   r   r   r   rÓ  ö  s    ÿc                   S   rê  rÛ  )r   r¿  r   r   r   r   rÓ  ø  ó    c                   S   s*   t  t g ¡¡t  t dt ¡ fg¡¡fS rà  )r   r»   r5   r`   r°  r   r   r   r   rÓ  ù  s    ÿc                   S   rê  )Nr«   r´  )r   rÀ  r   r   r   r   rÓ  û  rë  r   )ÚitemsÚgenÚlhs1Úrhs1Úlhs2Úrhs2r   r   r   Útest_eq§  sB   	­V

÷rò  c                  C   s²   t  t g ¡t j ¡ g ¡} t jt g ¡t j ¡ g ddd}t jt g ¡t j ¡ g d d d}| jdks4J ‚|jdks;J ‚|jdksBJ ‚| jdksIJ ‚|jdksPJ ‚|jdksWJ ‚d S )Nrä  )rå  rè  )r   r_   r5   r`   ra   rb   rå  rè  )Úfi1Úfi2Úfi3r   r   r   Útest_flight_info_defaults
  s   þþrö  c               	   C   sT   d ddt ƒ fg} | D ]}t|ƒ}t|tƒsJ ‚W d   ƒ n1 s"w   Y  q
d S )Núgrpc://localhost:0r­   )r   r	   Ú
isinstance)Ú	locationsrY   Úserverr   r   r   Ú$test_flight_server_location_argument  s   ý
ÿ€ÿrû  c                	   C   sN   t  t¡ tƒ  tƒ ‚1 sw   Y  W d   ƒ d S 1 s w   Y  d S rŽ   )rÁ  rÂ  Ú
ValueErrorr	   r   r   r   r   Ú#test_server_exit_reraises_exception'  s
   ÿ"ÿrý  c                     sŠ   dt ƒ f‰ d } ‡ fdd„}tˆ ƒ*}tj|dd}| ¡  t ¡ }|jdd t ¡ | }|dks3J ‚W d   ƒ d S 1 s>w   Y  d S )	Nr­   c                      s   t  d¡ tˆ ƒat ¡  d S râ   )rä   rå   r	   rú  Úserver   ©rY   r   r   rþ  3  s   
z-test_client_wait_for_available.<locals>.serveT©ÚtargetÚdaemonr0   ©Útimeoutrã   )r   r   Ú	threadingÚThreadÚstarträ   Úwait_for_available)rú  rþ  ÚclientÚthreadr  Úelapsedr   rÿ  r   Útest_client_wait_for_available-  s   

"ùr  c               	   C   s    t ƒ C} t d| jf¡"}t| ¡ ƒg ksJ ‚| t j¡}tt|ƒƒdks'J ‚W d  ƒ n1 s1w   Y  W d  ƒ dS W d  ƒ dS 1 sIw   Y  dS )zTry a simple list_flights call.r­   r@   N)rP   r   ÚconnectÚportÚlistrf   r^   Úlen)rú  r	  Úflightsr   r   r   Útest_flight_list_flightsC  s   ÿPür  c               
   C   sÈ   t ƒ W} t d| jf¡6}t| ¡ ƒg ksJ ‚| ¡  | ¡  t t	j
¡ t| ¡ ƒ W d   ƒ n1 s6w   Y  W d   ƒ n1 sEw   Y  W d   ƒ d S W d   ƒ d S 1 s]w   Y  d S )Nr­   )rP   r   r  r  r  rf   ÚcloserÁ  rÂ  r5   ró   ©rú  r	  r   r   r   Útest_flight_client_closeL  s   ÿÿ€Pûr  c               
   C   sè  t ƒ } tƒ 1}t d|jf¡}| t d¡¡ ¡ }| | ¡s!J ‚W d  ƒ n1 s+w   Y  W d  ƒ n1 s:w   Y  t	j
jt	j
jjd}t|dD}t d|jf¡,}| t d¡¡ ¡ }| | ¡siJ ‚| t d¡¡ ¡  ¡ }| | ¡s|J ‚W d  ƒ n1 s†w   Y  W d  ƒ n1 s•w   Y  tjtjddH tdd*}t d|jf¡}| t d¡¡ ¡ }W d  ƒ n1 sÆw   Y  W d  ƒ n1 sÕw   Y  W d  ƒ dS W d  ƒ dS 1 síw   Y  dS )	úTry a simple do_get call.r­   rQ   N©Úmetadata_versionrg   z+expected IpcWriteOptions, got <class 'int'>©Úmatchr±   )r:   rP   r   r  r  rk   rÀ  r”   r{   r5   ÚipcÚIpcWriteOptionsÚMetadataVersionÚV4Ú	to_readerrÁ  rÂ  r  )rj   rú  r	  r9   rW   r   r   r   Útest_flight_do_get_intsV  sL   ÿý€ ÿÿù€ 	ÿÿþ€ þ"þr   c               	   C   s¤   t ƒ } tƒ B}t d|jf¡!}| t d¡¡ ¡ }t|d ƒ|  	d¡ 
¡ ks)J ‚W d  ƒ n1 s3w   Y  W d  ƒ dS W d  ƒ dS 1 sKw   Y  dS )r  r­   rQ   r2   r   N)r:   rP   r   r  r  rk   rÀ  Úread_pandasr  r  Ú	to_pylist©rj   rú  r	  r9   r   r   r   Útest_do_get_ints_pandasq  s   ÿ Pýr$  c               	   C   s”   t ƒ } tƒ :}t d|jf¡}| t d¡¡ ¡ }| | ¡s!J ‚W d   ƒ n1 s+w   Y  W d   ƒ d S W d   ƒ d S 1 sCw   Y  d S )Nr­   rR   )	rG   rP   r   r  r  rk   rÀ  r”   r{   r#  r   r   r   Útest_flight_do_get_dicts|  s   ÿPýr%  c               	   C   s¼   t jg d¢t  ¡ dg} t jj| dgd}tdd:}t d|jf¡}| 	t 
d¡¡ ¡ }| |¡s5J ‚W d  ƒ n1 s?w   Y  W d  ƒ dS W d  ƒ dS 1 sWw   Y  dS )	z+Make sure Tickets get passed to the server.r.   r>   rM   r3   s
   the-ticket)rÍ   r­   N)r5   r6   r²   r7   r8   rÌ   r   r  r  rk   rÀ  r”   r{   )rÎ   rj   rú  r	  r9   r   r   r   Útest_flight_do_get_ticket…  s   ÿPýr&  c                  C   sl  t ƒ ©} td| jfƒ}| tj d¡¡}|jdksJ ‚|jdks"J ‚|j	s'J ‚|j
dks.J ‚|jt dt ¡ fg¡ks=J ‚t|jƒdksFJ ‚t|jd jƒdksRJ ‚|jd jd	u s\J ‚|jd j
dksfJ ‚|jd jd t d
¡ksuJ ‚|jd jt d¡ t dd¡¡ks‰J ‚|jd j
dks“J ‚|jd jd tj dd¡ks¤J ‚W d	  ƒ d	S 1 s¯w   Y  d	S )z8Make sure FlightEndpoint accepts string and object URIs.r­   r«   r@   r±   s   info app metadatarM   rA   r   Nr¬   z#2023-04-05T12:34:56.789012345+00:00r°   ÚUTCr·  r®   )rª   r   r  rº   r   ra   r¾  rå  rè  ré  r  r`   r5   r²   r  Ú	endpointsrù  r»  r´   r¶   r·   r¸   rµ   ©rú  r	  r¼   r   r   r   Útest_flight_get_info  s,   

þ
ÿ"ïr*  c               	   C   sš   t ƒ @} td| jfƒ }| tj d¡¡}|jt dt 	¡ fg¡ks$J ‚W d  ƒ n1 s.w   Y  W d  ƒ dS W d  ƒ dS 1 sFw   Y  dS )z+Make sure GetSchema returns correct schema.r­   r«   rM   N)
rª   r   r  r½   r   ra   r¾  r`   r5   r²   r)  r   r   r   Útest_flight_get_schema¦  s   ÿ Pýr+  c               
   C   s  t ƒ =} td| jfƒ&}tjtjdd t| ¡ ƒ W d  ƒ n1 s%w   Y  W d  ƒ n1 s4w   Y  W d  ƒ n1 sCw   Y  t	ƒ 4} td| jfƒ}t| ¡ ƒt	 
¡ ks`J ‚W d  ƒ n1 sjw   Y  W d  ƒ dS W d  ƒ dS 1 s‚w   Y  dS )z6Make sure the return type of ListActions is validated.r­   z3Results of list_actions must be ActionType or tupler  N)rÊ   r   r  rÁ  rÂ  r   r  r  rž   r¿   rÇ   r  r   r   r   Útest_list_actions®  s,   ÿþû€þ€ 	ÿ

ÿPþr,  c                   @   r¾   )ÚConvenienceServerzT
    Server for testing various implementation conveniences (auto-boxing, etc.)
    c                 C   s   g d¢S )N)r´  rÖ  s   bazr   r:  r   r   r   Úsimple_action_resultsÅ  s   z'ConvenienceServer.simple_action_resultsc                    sd   |j dkr| jS |j dkr|jgS |j dkrdgS |j dkr"t ¡ ‚|j dkr0‡ fdd„}|ƒ S d S )	Núsimple-actionÚechoú
bad-actionr;   úarrow-exceptionÚforeverc                   3   s     ˆ   ¡ sdV  ˆ   ¡ rd S d S râ  )Úis_cancelledr   ©rd   r   r   rí  Ó  s   €ÿz(ConvenienceServer.do_action.<locals>.gen)r?   r.  Úbodyr5   ÚArrowMemoryError)rX   rd   r§   rí  r   r5  r   r¨   É  s   




üzConvenienceServer.do_actionN)rm   rn   ro   rp   Úpropertyr.  r¨   r   r   r   r   r-  À  s
    
r-  c               	   C   s¶   t ƒ N} td| jfƒ.}dd„ | d¡D ƒ}|| jksJ ‚d}dd„ | d|f¡D ƒ}||gks2J ‚W d   ƒ n1 s<w   Y  W d   ƒ d S W d   ƒ d S 1 sTw   Y  d S )Nr­   c                 S   ó   g | ]}|j ‘qS r   ©r6  ©Ú.0Úxr   r   r   Ú
<listcomp>Þ  ó    z5test_do_action_result_convenience.<locals>.<listcomp>r/  s   the-bodyc                 S   r9  r   r:  r;  r   r   r   r>  ã  r?  r0  )r-  r   r  r¨   r.  )rú  r	  Úresultsr6  r   r   r   Ú!test_do_action_result_convenienceÙ  s   ÿPörA  c               
   C   sæ   t ƒ f} td| jfƒF}tjtjdd t| d¡ƒ W d   ƒ n1 s&w   Y  tjtjdd t| d¡ƒ W d   ƒ n1 sEw   Y  W d   ƒ n1 sTw   Y  W d   ƒ d S W d   ƒ d S 1 slw   Y  d S )Nr­   za bytes-like object is requiredr  r1  r7  r2  )	r-  r   r  rÁ  rÂ  r   r  r  r¨   r  r   r   r   Útest_nicer_server_exceptionsç  s    ÿÿþÿþ€P÷rB  c                  C   s0   t dƒ} z| jdksJ ‚W |  ¡  dS |  ¡  w )zMake sure port() works.r÷  r   N)rª   r  Úshutdown)rú  r   r   r   Útest_get_portö  s   rD  Úntz'Unix sockets can't be tested on Windows)Úreasonc               
   C   s"  t  ¡ ƒ} |  ¡  tj | j¡}t|dZ t|ƒF}| 	t 
d¡¡}tƒ }|j |j¡s/J ‚| ¡ }| |¡s:J ‚| 	t 
d¡¡}tƒ }|j |j¡sNJ ‚| ¡ }| |¡sYJ ‚W d  ƒ n1 scw   Y  W d  ƒ n1 srw   Y  W d  ƒ dS W d  ƒ dS 1 sŠw   Y  dS )z3Try a simple do_get call over a Unix domain socket.rÿ  rQ   rR   N)ÚtempfileÚNamedTemporaryFiler  r   r´   Úfor_grpc_unixÚnamerP   r   rk   rÀ  r:   r`   r{   r”   rG   )ÚsockrY   r	  rƒ   rj   r9   r   r   r   Útest_flight_domain_socketÿ  s.   
ÿó€ ý"ýrL  c               	   C   sà   t jjt  tddƒ¡gdgd} t| jdP}td|jfƒ0}| 	t
j d¡| j¡\}}| | d¡ | ¡  | t
 d¡¡ ¡ }| | ¡sGJ ‚W d	  ƒ n1 sQw   Y  W d	  ƒ d	S W d	  ƒ d	S 1 siw   Y  d	S )
zTry sending/receiving a large message via Flight.

    See ARROW-4421: by default, gRPC won't allow us to send messages >
    4MiB in size.
    r   i    rM   r3   )r’   r­   rf  r«   N)r5   r7   r8   r6   rÝ   r   r`   r   r  rŠ   r   ra   rb   r	  r  rk   rÀ  r”   r{   ©r9   rú  r	  r„   Ú_r  r   r   r   Útest_flight_large_message  s"   ÿþÿÿPørO  c               	   C   sØ   t jjt  tddƒ¡gdgd} tƒ O}td|jfƒ/}| t	j
 d¡| j¡\}}| | ¡ | ¡  | t	 d¡¡ ¡ }| | ¡sCJ ‚W d  ƒ n1 sMw   Y  W d  ƒ dS W d  ƒ dS 1 sew   Y  dS )	z?Try downloading a flight of RecordBatches in a GeneratorStream.r   r  rM   r3   r­   rf  r«   N)r5   r7   r8   r6   rÝ   r™   r   r  rŠ   r   ra   rb   r`   r	  r  rk   rÀ  r”   r{   rM  r   r   r   Útest_flight_generator_stream,  s"   ÿþÿÿ
PùrP  c               
   C   sª   t ƒ H} td| jfƒ(}t tj¡ | t 	d¡¡ 
¡  W d  ƒ n1 s'w   Y  W d  ƒ n1 s6w   Y  W d  ƒ dS W d  ƒ dS 1 sNw   Y  dS )z+Try streaming data with mismatched schemas.r­   r«   N)rÑ   r   r  rÁ  rÂ  r5   ÚArrowExceptionrk   r   rÀ  r”   r  r   r   r   Ú$test_flight_invalid_generator_stream<  s   ÿÿ€PþrR  c               
   C   sÀ   t ƒ S} td| jfƒ3}t dd¡}tjdd}t tj¡ t	|j
||dƒ W d  ƒ n1 s2w   Y  W d  ƒ n1 sAw   Y  W d  ƒ dS W d  ƒ dS 1 sYw   Y  dS )z)Make sure timeouts fire on slow requests.r­   rÃ   r«   gš™™™™™É?r  rg   N)rà   r   r  r   r½  ÚFlightCallOptionsrÁ  rÂ  rï   r  r¨   )rú  r	  r§   rW   r   r   r   Útest_timeout_firesD  s   ÿÿ€PúrT  c               	   C   sŽ   t ƒ :} td| jfƒ}tjdd}|jt d¡|d ¡  W d  ƒ n1 s(w   Y  W d  ƒ dS W d  ƒ dS 1 s@w   Y  dS )z0Make sure timeouts do not fire on fast requests.r­   rÒ   r  rQ   rg   N)rP   r   r  r   rS  rk   rÀ  r”   )rú  r	  rW   r   r   r   Útest_timeout_passesR  s   ÿPýrU  c               	   C   sþ   t jjt  g d¢¡gdgd} tƒ c}td|jfƒC}tjt	dgdd}|j
t d¡|d	 ¡ }| 
t d¡¡ ¡ }|jd
ksBJ ‚|jdksIJ ‚|| ksOJ ‚|tƒ ksVJ ‚W d  ƒ n1 s`w   Y  W d  ƒ dS W d  ƒ dS 1 sxw   Y  dS )z"Make sure ReadOptions can be used.rJ   rN   r3   r­   r@   )Úincluded_fields)Úread_optionsrS   rg   rA   N)r5   r7   r8   r6   rP   r   r  r   rS  r   rk   rÀ  r”   Únum_columnsrO   )Úexpectedrú  r	  rW   Ú	response1Ú	response2r   r   r   Útest_read_optionsZ  s*   ÿ
ÿÿÿÿPõr\  ó   tests   p4ssw0rd)r#  c               
   C   s¸   t tdM} td| jfƒ-}t dd¡}tjtjdd t	| 
|¡ƒ W d  ƒ n1 s.w   Y  W d  ƒ n1 s=w   Y  W d  ƒ dS W d  ƒ dS 1 sUw   Y  dS )z,Test that auth fails when not authenticated.©Úauth_handlerr­   r    r«   z.*unauthenticated.*r  N)r™   Úbasic_auth_handlerr   r  r   r½  rÁ  rÂ  rñ   r  r¨   ©rú  r	  r§   r   r   r   Útest_http_basic_unautht  s   ÿÿþ€Pýrb  z,ARROW-10013: gRPC on Windows corrupts peer()c               	   C   sÈ   t tdU} td| jfƒ5}t dd¡}| tddƒ¡ | |¡}t	|ƒ}|j
 ¡ dks.J ‚t	|ƒ}|j
 ¡ dks;J ‚W d  ƒ n1 sEw   Y  W d  ƒ dS W d  ƒ dS 1 s]w   Y  dS )	z:Test a Python implementation of HTTP basic authentication.r^  r­   r    r«   rf  Úp4ssw0rdr]  N)r™   r`  r   r  r   r½  r.  r4  r¨   Únextr6  r   )rú  r	  r§   r@  ÚidentityÚpeer_addressr   r   r   Útest_http_basic_auth  s   ÿ
Pørg  c               
   C   sÈ   t tdU} td| jfƒ5}t dd¡}tjtjdd | 	t
ddƒ¡ t| |¡ƒ W d	  ƒ n1 s6w   Y  W d	  ƒ n1 sEw   Y  W d	  ƒ d	S W d	  ƒ d	S 1 s]w   Y  d	S )
z-Test that auth fails with the wrong password.r^  r­   r    r«   z.*wrong password.*r  rf  ÚwrongN)r™   r`  r   r  r   r½  rÁ  rÂ  rñ   r.  r4  rd  r¨   ra  r   r   r   Ú%test_http_basic_auth_invalid_passwordŽ  s   ÿÿý€Pýri  c               	   C   sª   t tdF} td| jfƒ&}t dd¡}| tddƒ¡ t| 	|¡ƒ}|j
 ¡ dks,J ‚W d  ƒ n1 s6w   Y  W d  ƒ dS W d  ƒ dS 1 sNw   Y  dS )	ú-Test an auth mechanism that uses a handshake.r^  r­   r    r«   rf  rc  r]  N)r™   Útoken_auth_handlerr   r  r   r½  r.  rF  rd  r¨   r6  r   )rú  r	  r§   re  r   r   r   Útest_token_auth™  s   ÿPûrl  c               
   C   sª   t tdF} td| jfƒ&}t tj¡ | t	ddƒ¡ W d  ƒ n1 s'w   Y  W d  ƒ n1 s6w   Y  W d  ƒ dS W d  ƒ dS 1 sNw   Y  dS )rj  r^  r­   rf  rh  N)
r™   rk  r   r  rÁ  rÂ  r   rñ   r.  rF  r  r   r   r   Útest_token_auth_invalid£  s   ÿÿ€Pþrm  c               	   C   s¢   t tdtƒ id>} td| jfƒ}| dd¡}|d dks J ‚|d d	ks(J ‚W d
  ƒ n1 s2w   Y  W d
  ƒ d
S W d
  ƒ d
S 1 sJw   Y  d
S )zATest authenticate_basic_token with bearer token and auth headers.r-  ©r_  rv  r­   r]  ó   passwordr   r_  r@   ó   Bearer token1234N)rt  Úno_op_auth_handlerrb  r   r  Úauthenticate_basic_token)rú  r	  Ú
token_pairr   r   r   Útest_authenticate_basic_token¯  s   ÿýPúrt  c               
   C   s®   t tdtƒ idD} td| jfƒ$}t tj¡ | 	dd¡ W d  ƒ n1 s)w   Y  W d  ƒ n1 s8w   Y  W d  ƒ dS W d  ƒ dS 1 sPw   Y  dS )z7Test authenticate_basic_token with an invalid password.r-  rn  r­   r]  s   badpasswordN)
rt  rq  rb  r   r  rÁ  rÂ  r   rñ   rr  r  r   r   r   Ú.test_authenticate_basic_token_invalid_passwordº  s   ÿýÿ€Püru  c               	   C   sà   t tdtƒ id]} td| jfƒ=}| dd¡}|d dks J ‚|d d	ks(J ‚tj|gd
}t|j	t 
dd¡|dƒ}|d j ¡ dksGJ ‚W d  ƒ n1 sQw   Y  W d  ƒ dS W d  ƒ dS 1 siw   Y  dS )z@Test authenticate_basic_token and doAction after authentication.r-  rn  r­   r]  ro  r   r_  r@   rp  ©rL  útest-actionr«   ©r§   rW   ó	   token1234N)rt  rq  rb  r   r  rr  r   rS  r  r¨   r½  r6  r   ©rú  r	  rs  rW   r  r   r   r   Ú(test_authenticate_basic_token_and_actionÄ  s    ÿýÿPör{  c                  C   s"  t tdtƒ id~} tƒ }td| jf|gd}t d¡}tj	dd| fgd}t
|jt d	d
¡|dƒ}|d j ¡ dks?J ‚|jd dksHJ ‚|jd dksQJ ‚t
|jt d	d
¡|dƒ}|d j ¡ dksiJ ‚|jd dksrJ ‚|jd dks{J ‚| ¡  W d  ƒ dS 1 sŠw   Y  dS )zšTest authenticate_basic_token with client middleware
       to intercept authorization header returned by the
       HTTP header auth enabled server.
    r-  rn  r­   ©rv  s   test:passwordr_  s   Basic rv  rw  r«   rx  r   ry  r@   rp  N)rt  rq  rb  rO  r   r  rA  rB  r   rS  r  r¨   r½  r6  r   rR  r  )rú  Úclient_auth_middlewarer	  Úencoded_credentialsrW   r  Úresult2r   r   r   Ú4test_authenticate_basic_token_with_client_middlewareÓ  s>   ÿþ

ÿÿÿÿÿ
"èr€  c               	   C   sþ   t ttƒ tƒ dœdj} td| jfƒJ}| dd¡}|d dks"J ‚|d d	ks*J ‚tj|d
dgd}t	|j
t dd¡|dƒ}|d j ¡ dksKJ ‚|d j ¡ dksVJ ‚W d  ƒ n1 s`w   Y  W d  ƒ dS W d  ƒ dS 1 sxw   Y  dS )z:Test passing multiple arbitrary headers to the middleware.)r-  r~  rn  r­   r]  ro  r   r_  r@   rp  )s   test-header-1ó   value1)s   test-header-2ó   value2rv  rw  r«   rg   r  r‚  N)r}  rq  rb  rx  r   r  rr  r   rS  r  r¨   r½  r6  r   rz  r   r   r   Ú-test_arbitrary_headers_in_flight_call_optionsó  s4   þþúý
ÿÿPîrƒ  c                   C   sx   t jtjdd t d¡ W d  ƒ n1 sw   Y  t jtjdd tdƒ W d  ƒ dS 1 s5w   Y  dS )zTest constructing invalid URIs.z.*Cannot parse URI:.*r  ú%N)rÁ  rÂ  r5   ró   r   r  rP   r   r   r   r   Útest_location_invalid
  s   ÿ
"ÿr…  c                   C   s,   t  d¡jdks
J ‚t  d¡jdksJ ‚dS )z,Test creating locations for unknown schemes.zs3://foos   s3://foozhttps://example.com/bar.parquets   https://example.com/bar.parquetN)r   r´   Úurir   r   r   r   Útest_location_unknown_scheme  s   
ÿr‡  c               
   C   s¼   t ƒ } t| d dJ}tdt|jƒ ƒ(}t tj¡ | 	t 
d¡¡ ¡  W d  ƒ n1 s0w   Y  W d  ƒ n1 s?w   Y  W d  ƒ dS W d  ƒ dS 1 sWw   Y  dS )z>Make sure clients cannot connect when cert verification fails.r+   ©Útls_certificateszgrpc+tls://localhost:rQ   N)r-   rP   r   r  r  rÁ  rÂ  r   ÚFlightUnavailableErrorrk   rÀ  r”   ©Úcertsr¶  r	  r   r   r   Útest_tls_fails  s   ÿÿ€Pür  c               	   C   s¨   t ƒ } tƒ }t|d d=}td|jf|d d}| t d¡¡ ¡ }| 	| ¡s+J ‚W d  ƒ n1 s5w   Y  W d  ƒ dS W d  ƒ dS 1 sMw   Y  dS )z"Try a simple do_get call over TLS.r+   rˆ  r­   r*   )Útls_root_certsrQ   N)
r:   r-   rP   r   r  rk   r   rÀ  r”   r{   ©rj   rŒ  r¶  r	  r9   r   r   r   Útest_tls_do_get*  s   
ÿÿPür  c               	   C   sž   t ƒ } tƒ }t|d d8}ztd|jfdd}W n ty'   t d¡ Y nw | t	 
d¡¡ ¡ }| | ¡s9J ‚| ¡  W d  ƒ dS 1 sHw   Y  dS )	zDTry a simple do_get call over TLS with server verification disabled.r+   rˆ  r­   T©Údisable_server_verificationz4disable_server_verification feature is not availablerQ   N)r:   r-   rP   r   r  r¥   rÁ  Úskiprk   r   rÀ  r”   r{   r  r  r   r   r   Ú$test_tls_disable_server_verification7  s   

ÿÿ
"ør”  c               
   C   sÀ   t ƒ } t| d dL}tjd|jf| d dd&}t tj¡ | t 	d¡¡ W d  ƒ n1 s2w   Y  W d  ƒ n1 sAw   Y  W d  ƒ dS W d  ƒ dS 1 sYw   Y  dS )	z5Check that incorrectly overriding the hostname fails.r+   rˆ  r­   r*   Úfakehostname)rŽ  Úoverride_hostnamerQ   N)
r-   rP   r   r  r  rÁ  rÂ  rŠ  rk   rÀ  r‹  r   r   r   Útest_tls_override_hostnameH  s   þÿÿ€Pür—  c            
   	   C   sü   t  g d¢¡g} t jj| dgd}g }tƒ ^}td|jfƒ>}| t 	d¡¡}d}|D ]\}}| 
|¡ t d| ¡ ¡\}	||	ksCJ ‚|d7 }q+t j |¡} |  |¡sUJ ‚W d	  ƒ n1 s_w   Y  W d	  ƒ d	S W d	  ƒ d	S 1 sww   Y  d	S )
z'Try a simple do_get call with metadata.r.   rM   r3   r­   r«   r   rz   r@   N)r5   r6   r7   r8   rr   r   r  rk   r   rÀ  rœ  r}   r~   r   Úfrom_batchesr{   )
r9   rj   Úbatchesrú  r	  rƒ   r   r‡   ÚmetadataÚ
server_idxr   r   r   Útest_flight_do_get_metadataU  s$   ÿÿ

Pörœ  c            	   
   C   s~  g } g }t ƒ U}td|jfƒ>}| t d¡¡}d}	 z | ¡ \}}|  |¡ t 	d| 
¡ ¡\}||ks6J ‚|d7 }W n	 tyD   Y nw qW d  ƒ n1 sPw   Y  W d  ƒ n1 s_w   Y  t ƒ H}td|jfƒ1}| t d¡¡}d}|D ]\}}| |¡ t 	d| 
¡ ¡\}||ks”J ‚|d7 }q|W d  ƒ n1 s£w   Y  W d  ƒ n1 s²w   Y  | |ks½J ‚dS )z0Verify the iterator interface works as expected.r­   r«   r   Trz   r@   N)rr   r   r  rk   r   rÀ  Ú
read_chunkrœ  r}   r~   r   ÚStopIteration)	Úbatches1Úbatches2rú  r	  rƒ   r   r‡   rš  r›  r   r   r   Ú1test_flight_metadata_record_batch_reader_iteratorj  sN   ÿ
ÿùô€ ÿ

üü€ 
r¡  c               	   C   sÆ   t jjt  g d¢¡gdgd} t jjt jjjd}t|d;}t	d|j
fƒ}| t d¡¡}| ¡ }| | ¡s:J ‚W d  ƒ n1 sDw   Y  W d  ƒ dS W d  ƒ dS 1 s\w   Y  dS )	z2Try a simple do_get call with V4 metadata version.r.   rM   r3   r  rg   r­   r«   N)r5   r7   r8   r6   r  r  r  r  rr   r   r  rk   r   rÀ  r”   r{   )rj   rW   rú  r	  rƒ   r9   r   r   r   Útest_flight_do_get_metadata_v4Š  s   ÿÿÿPür¢  c               
   C   s.  t  g d¢¡g} t jj| dgd}tƒ y}td|jfƒY}| tj	 
d¡|j¡\}}|: t|jddƒD ])\}}t d|¡}| ||¡ | ¡ }	|	d	usOJ ‚t d|	 ¡ ¡\}
||
ks^J ‚q5W d	  ƒ n1 siw   Y  W d	  ƒ n1 sxw   Y  W d	  ƒ d	S W d	  ƒ d	S 1 sw   Y  d	S )
z'Try a simple do_put call with metadata.r.   rM   r3   r­   rÃ   r@   r›   rz   N)r5   r6   r7   r8   rr   r   r  rŠ   r   ra   rb   r`   r‹   rŒ   r}   r   r  r   r~   r   )r9   rj   rú  r	  r„   Úmetadata_readerr   r‡   rš  rˆ   r›  r   r   r   Útest_flight_do_put_metadata—  s.   ÿÿ
þúÿ€Pûr¤  c            
      C   sv  t jjt  tjdt ¡ d¡gdgd} tƒ š}td|j	fddx}| 
tj d¡| j¡\}}|B tjtjd	d
}| | ¡ W d  ƒ n1 sJw   Y  |jjdksWJ ‚|  dd¡|  d¡g}|D ]}| |¡ qdW d  ƒ n1 svw   Y  t j | g¡}| t d¡¡ ¡ }	||	ks’J ‚W d  ƒ n1 sœw   Y  W d  ƒ dS W d  ƒ dS 1 s´w   Y  dS )z+Try a simple do_put call with a size limit.i   )ÚdtyperM   r3   r­   i   )Úwrite_size_limit_bytesrÃ   zexceeded soft limitr  Nr   i€  r«   )r5   r|   r8   r6   ÚnpÚonesr°  r   r   r  rŠ   r   ra   rb   r`   rÁ  rÂ  ÚFlightWriteSizeExceededErrorr  r  ÚlimitÚslicer7   r˜  rk   rÀ  r”   )
Úlarge_batchrú  r	  r„   r£  ÚexcinfoÚsmaller_batchesr‡   rY  Úactualr   r   r   Útest_flight_do_put_limit­  sD   ÿþ
ÿÿ
þÿþ
þÿ÷Pír°  c               
   C   sº   t ƒ P} td| jfƒ0}| t d¡¡}| ¡  tjtj	dd | 
¡  W d  ƒ n1 s/w   Y  W d  ƒ n1 s>w   Y  W d  ƒ dS W d  ƒ dS 1 sVw   Y  dS )z4Test canceling a DoGet operation on the client side.r­   rQ   z(?i).*cancel.*r  N)rP   r   r  rk   r   rÀ  ré   rÁ  rÂ  rð   r  )rú  r	  rƒ   r   r   r   Útest_cancel_do_getÊ  s   ÿÿ
þ€Pür±  c               
      s  t ƒ } td| jfƒa}| t d¡¡‰t ¡ ‰t ¡ ‰t ¡ ‰t ¡ ‰ ‡ ‡‡‡‡fdd„}tj	|dd}| 
¡  ˆjdd ˆ ¡  ˆ ¡  |jd	d ˆ ˆ  ¡ sVJ ‚W d
  ƒ n1 s`w   Y  W d
  ƒ n1 sow   Y  W d
  ƒ d
S W d
  ƒ d
S 1 s‡w   Y  d
S )z5Test canceling a DoGet operation from another thread.r­   rQ   c                      sr   ˆ  ¡  ˆ ¡  ˆjdd zˆ  ¡  W d S  tjy8   ˆ ˆ  ¡  W d   ƒ Y d S 1 s0w   Y  Y d S w )Nr0   r  )r  ÚsetÚwaitr   rð   r   ©Úraised_proper_exceptionÚread_first_messagerƒ   Úresult_lockÚstream_canceledr   r   Ú
block_readã  s   
&ÿÿz/test_cancel_do_get_threaded.<locals>.block_readTr   r0   r  r@   N)rà   r   r  rk   r   rÀ  r  ÚEventÚLockr  r  r³  ré   r²  ÚjoinÚis_set)rú  r	  r¹  r
  r   r´  r   Útest_cancel_do_get_threadedÖ  s*   ÿ
ÿ€Pær¾  c               	   C   s   t ƒ ;} td| jfƒ}| t dd¡¡}t|ƒjdksJ ‚~W d   ƒ n1 s)w   Y  W d   ƒ d S W d   ƒ d S 1 sAw   Y  d S )Nr­   r3  r«   r´  )r-  r   r  r¨   r   r½  rd  r6  )rú  r	  r@  r   r   r   Útest_streaming_do_actionø  s   ÿPûr¿  c            	      C   s6  t  dd¡} | t j |  ¡ ¡ksJ ‚t  d¡}|t j | ¡ ¡ks#J ‚t  d¡}|t j | ¡ ¡ks4J ‚t  dd¡}|t j | ¡ ¡ksFJ ‚t  t 	dt 
¡ fg¡¡}|t j | ¡ ¡ks_J ‚t j d¡}|t j | ¡ ¡ksqJ ‚t j dd	d
¡}|t j | ¡ ¡ks…J ‚t  t 	dt 
¡ fg¡|t  ddg¡t  dt j dd¡gt d¡ t d¡¡d¡gdddd¡}t j | ¡ ¡}|j	|j	ksÄJ ‚|j|jksÌJ ‚|j|jksÔJ ‚|j|jksÜJ ‚|j|jksäJ ‚|j|jksìJ ‚|j|jksôJ ‚t  |dt j dd¡gt d¡ t d¡¡d¡}|t j | ¡ ¡ksJ ‚dS )z(Make sure serializable types round-trip.Úaction1s   action1-bodyr;   s   result1Ú	username1Ú	password1rM   rf  rN   z
test.arrowr«   r¬   r­   r®   r¯   r°   r·  r@   r±   Tr¸  rµ  r¶  N)r   r½  r(  r7  rÀ  r¿  r'  r»   r5   r`   r²   ra   r¾  rb   r_   r³   r´   rµ   r¶   r·   r¸   r‚   rè  rå  ré  r  r(  )	r§   rh   r  r5  Úschema_resultÚdescr¼   Úinfo2rÏ  r   r   r   Útest_roundtrip_types  s^   


ÿüþ	ñürÆ  c                  C   sø  t ƒ ï} td| jfƒÏ}t  ¡  ¡ D ]&\}}tj|dd t| t	 
|d¡¡ƒ W d  ƒ n1 s3w   Y  qtjt	jdd t| ¡ ƒ W d  ƒ n1 sRw   Y  t g d¢¡g}tjj|dgd}t	jt	jt	jt	jt	jd	œ}| ¡ D ]Y\}}tj|dd | t	j |¡|j¡\}	}
|	 |¡ |	 ¡  W d  ƒ n1 s¥w   Y  tj|dd | t	j |¡|j¡\}	}
|	 ¡  W d  ƒ n1 sÍw   Y  qyW d  ƒ n1 sÝw   Y  W d  ƒ dS W d  ƒ dS 1 sõw   Y  dS )
z:Ensure that Flight errors propagate from server to client.r­   z.*foo.*r  r«   Nr.   rM   r3   )rç   rè   ré   rê   rë   )ræ   r   r  rõ   rì  rÁ  rÂ  r  r¨   r   r½  rî   rf   r5   r6   r7   r8   rï   rð   rñ   rò   rŠ   ra   r¾  r`   r	  r  )rú  r	  ÚargÚexc_typer9   rj   Ú
exceptionsrù   Ú	exceptionr„   rƒ   r   r   r   Útest_roundtrip_errors<  sN   ÿÿ€ÿû
þ

û
þ
ü€÷PìrË  c               
      sL  t  g d¢¡g} t jj| dgd}tƒ ˆ}td|jfƒh}| tj	 
d¡|j¡\}‰dg‰ ‡ ‡fdd„}tj|d	}| ¡  |jd
d}|% t|ƒD ]\}}	t d|¡}
| |	|
¡ qK| ¡  | ¡  W d  ƒ n1 snw   Y  ˆ d t|ƒks}J ‚W d  ƒ n1 s‡w   Y  W d  ƒ dS W d  ƒ dS 1 sŸw   Y  dS )z7Ensure that separate threads can read/write on a DoPut.r.   rM   r3   r­   rÃ   r   c                      s0   ˆ  ¡ d urˆ d  d7  < ˆ  ¡ d usd S d S )Nr   r@   )r   r   ©Úcountr£  r   r   Ú_reader_threadt  s   ÿz:test_do_put_independent_read_write.<locals>._reader_thread©r  r@   r›   rz   N)r5   r6   r7   r8   rr   r   r  rŠ   r   ra   rb   r`   r  r  r  rŒ   r‹   r}   r   r  Údone_writingr¼  r  )r9   rj   rú  r	  r„   rÎ  r
  r™  r   r‡   rš  r   rÌ  r   Ú"test_do_put_independent_read_writeb  s2   ÿÿ
þ
ù
PærÑ  c               	   C   s´   t dtƒ idH} td| jfƒ(}t| t dd¡¡ƒ}t|ƒdks$J ‚|d j	 
¡ }d|ks1J ‚W d	  ƒ n1 s;w   Y  W d	  ƒ d	S W d	  ƒ d	S 1 sSw   Y  d	S )
z@Ensure that server middleware run on the same thread as the RPC.rf  r|  r­   r]  r«   r@   r   s   right valueN)r‡  r†  r   r  r  r¨   r   r½  r  r6  r   )rú  r	  r@  r  r   r   r   Ú"test_server_middleware_same_thread‰  s   ÿýPùrÒ  c               
   C   s,  t dtƒ id„} td| jfƒd}t tj¡ t| 	¡ ƒ W d  ƒ n1 s(w   Y  t t
j¡ t| t
 dd¡¡ƒ W d  ƒ n1 sIw   Y  td| jftƒ gd}t| t
 dd¡¡ƒ}d|j ¡ ksmJ ‚W d  ƒ n1 sww   Y  W d  ƒ dS W d  ƒ dS 1 sw   Y  dS )z-Test rejecting an RPC with server middleware.rf  r|  r­   Nr«   ro  )r‡  r‹  r   r  rÁ  rÂ  r5   ÚArrowNotImplementedErrorr  rž   r   rñ   r¨   r½  r‘  rd  r6  r   )rú  r	  Úresponser   r   r   Útest_middleware_reject•  s(   ÿýÿÿþPïrÕ  c               
   C   sÄ  t ƒ } tƒ }td| idI}td|jf|gd$}tj d¡}t 	t
¡ t| ¡ ƒ W d  ƒ n1 s7w   Y  t 	t
¡ | |¡ W d  ƒ n1 sQw   Y  t 	t
¡ | |¡ W d  ƒ n1 skw   Y  t 	t
¡ | t d¡¡ W d  ƒ n1 sˆw   Y  t 	t
¡ | |t g ¡¡\}}| ¡  W d  ƒ n1 s¬w   Y  t 	t
¡ t| t dd¡¡ƒ W d  ƒ n1 sÌw   Y  t 	t
¡ t| ¡ ƒ W d  ƒ n1 sçw   Y  t 	t
¡ | |¡\}}| ¡  W d  ƒ n	1 sw   Y  tjjtjjtjjtjjtjjtjjtjj tjj!g}| j"|ks/J ‚|j"|ks7J ‚W d  ƒ n1 sBw   Y  W d  ƒ dS W d  ƒ dS 1 s[w   Y  dS )z/Test that middleware records methods correctly.rf  r|  r­   r«   N)#r•  r   r	   r   r  r   ra   r¾  rÁ  rÂ  r¥   r  rf   rº   r½   rk   rÀ  rŠ   r5   r`   r  r¨   r½  rž   r—   rŽ  ÚLIST_FLIGHTSÚGET_FLIGHT_INFOÚ
GET_SCHEMAÚDO_GETÚDO_PUTÚ	DO_ACTIONr  ÚDO_EXCHANGEr™  )Úserver_middlewareÚclient_middlewarerú  r	  r‚   r„   rN  rY  r   r   r   Útest_middleware_mapping«  s`   þÿÿÿÿÿ
þÿÿ
þø
TÛrß  c                  C   sÌ   t ƒ Y} td| jfƒ9}zt| t dd¡¡ƒ J ‚ tjy< } z|jd us)J ‚|j}|dks2J ‚W Y d }~nd }~ww W d   ƒ n1 sGw   Y  W d   ƒ d S W d   ƒ d S 1 s_w   Y  d S )Nr­   rö   r«   Fr÷   )	ræ   r   r  r  r¨   r   r½  rò   Ú
extra_info)rú  r	  ÚeÚeir   r   r   Útest_extra_info×  s   ÿ€ýPørã  c               	   C   sÎ   t ƒ } tƒ }t| d d gd| d dI}td|jf| d | d d j| d d jd}| t 	d¡¡ 
¡ }| |¡s>J ‚W d	  ƒ n1 sHw   Y  W d	  ƒ d	S W d	  ƒ d	S 1 s`w   Y  d	S )
z!Test mutual TLS (mTLS) with gRPC.r+   r   Tr*   )r‰  Úverify_clientÚroot_certificatesr­   )rŽ  Ú
cert_chainÚprivate_keyrQ   N)r-   r:   rP   r   r  r(   r)   rk   r   rÀ  r”   r{   )rŒ  rj   r¶  r	  r9   r   r   r   Ú	test_mtlsã  s&   ýüüPörè  c               
   C   sÜ   t jjt  tddƒ¡gdgd} tƒ Q}td|jfƒ1}tj	 
d¡}| |¡\}}| | ¡ }W d  ƒ n1 s:w   Y  | |ksEJ ‚W d  ƒ n1 sOw   Y  W d  ƒ dS W d  ƒ dS 1 sgw   Y  dS )r  r   r  rM   r3   r­   rü   N)r5   r7   r8   r6   rÝ   rú   r   r  r   ra   r¾  r—   r”   )rY  rú  r	  r‚   r„   rƒ   rj   r   r   r   Útest_doexchange_getö  s    ÿþÿ
ÿPúré  c            
   
   C   s2  t jjt  tddƒ¡gdgd} | jdd}tƒ v}td|jfƒV}t	j
 d¡}| |¡\}}|7 | | j¡ |D ]}| |¡ q:| ¡  | ¡ }|jd	u sQJ ‚tt|ƒƒ d
¡}	|j|	ksaJ ‚W d	  ƒ n1 skw   Y  W d	  ƒ n1 szw   Y  W d	  ƒ d	S W d	  ƒ d	S 1 s’w   Y  d	S )r
  r   r  rM   r3   é   r›   r­   rý   Nr¡   )r5   r7   r8   r6   rÝ   rŒ   rú   r   r  r   ra   r¾  r—   r  r`   r  rÐ  r  r9   r  r  r¤   r  )
r9   r™  rú  r	  r‚   r„   rƒ   r‡   r–   Úexpected_bufr   r   r   Útest_doexchange_put  s0   ÿþÿø€Pürì  c               
   C   sÂ  t jjt  tddƒ¡gdgd} | jdd}tƒ ¾}td|jfƒž}t	j
 d¡}| |¡\}}| td	ƒD ] }t|ƒ d
¡}| |¡ | ¡ }	|	jdu sOJ ‚|	j|ksVJ ‚q6| | j¡ |D ]!}
| |
¡ |j| jksnJ ‚| ¡ }	|	j|
ksyJ ‚|	jdu s€J ‚q_t|ƒD ]#\}}
t|ƒ d
¡}| |
|¡ | ¡ }	|	j|
ks¡J ‚|	j|ks¨J ‚q…W d  ƒ n1 s³w   Y  W d  ƒ n1 sÂw   Y  W d  ƒ dS W d  ƒ dS 1 sÚw   Y  dS )zTry a DoExchange echo server.r   r  rM   r3   rê  r›   r­   rû   r1   r¡   N)r5   r7   r8   r6   rÝ   rŒ   rú   r   r  r   ra   r¾  r—   r  r¤   r  r  r9   r  r  r`   r  r‹   r  )r9   r™  rú  r	  r‚   r„   rƒ   Úirˆ   r–   r‡   r   r   r   Útest_doexchange_echo  sH   ÿþÿ

ûí€Pürî  c            
   
   C   sD  t jjt  tddƒ¡gdgd} | jdd}t jjt jjj	d}t
|ds}td	|jfƒS}tj d
¡}| |¡\}}|4 |j| j|d |D ]!}| |¡ |j| jksWJ ‚| ¡ }	|	j|ksbJ ‚|	jdu siJ ‚qHW d  ƒ n1 stw   Y  W d  ƒ n1 sƒw   Y  W d  ƒ dS W d  ƒ dS 1 s›w   Y  dS )z;Try a DoExchange echo server using the V4 metadata version.r   r  rM   r3   rê  r›   r  rg   r­   rû   N)r5   r7   r8   r6   rÝ   rŒ   r  r  r  r  rú   r   r  r   ra   r¾  r—   r  r`   r  r  r9   r  )
r9   r™  rW   rú  r	  r‚   r„   rƒ   r‡   r–   r   r   r   Útest_doexchange_echo_v4A  s6   ÿþÿÿ
ûý€Pürï  c               
   C   s:  t jjt  tddƒ¡t  tddƒ¡t  tddƒ¡gg d¢d} t jjt  td	d
d	ƒ¡gdgd}tƒ `}td|jfƒ@}tj	 
d¡}| |¡\}}| | | j¡ | | ¡ | ¡  | ¡ }W d  ƒ n1 siw   Y  ||kstJ ‚W d  ƒ n1 s~w   Y  W d  ƒ dS W d  ƒ dS 1 s–w   Y  dS )z!Transform a table with a service.r   rš   r@   i  rA   i  )rM   rN   Úcr3   rK   i  r  r­   rþ   N)r5   r7   r8   r6   rÝ   rú   r   r  r   ra   r¾  r—   r  r`   r	  rÐ  r”   )r9   rY  rú  r	  r‚   r„   rƒ   rj   r   r   r   Útest_doexchange_transformY  s4   ýüÿþÿ

üP÷rñ  c               	   C   s  t dtƒ idq} tƒ }td| jf|gdK}t| t dd¡¡ƒ}|j	 
¡  d¡}t |¡}tj ¡ D ]%\}}| ¡ }t|tƒrF| d¡}| |¡|ksOJ ‚|j |¡|ksYJ ‚q4W d  ƒ n1 sdw   Y  W d  ƒ dS W d  ƒ dS 1 s|w   Y  dS )r‰  rf  r|  r­   r«   r¡   ÚasciiN)rˆ  r©  r¡  r   r  rd  r¨   r   r½  r6  r   rj  ÚastÚliteral_evalr£  r§  rì  rK  rø  Úbytesr   r¢  )rú  rL  r	  rÔ  Úraw_headersrŠ  Úheaderrl  r   r   r   Útest_middleware_multi_headerp  s0   ÿþ


ûøü"ürø  c               	   C   s  t ƒ } t| d dp}dg}tjd|jf| d |d}t tj¡ | t 	d¡¡ W d  ƒ n1 s4w   Y  | 
¡  d	g}tjd|jf| d |d}t tjtjf¡ | t 	d¡¡ W d  ƒ n1 siw   Y  | 
¡  W d  ƒ dS 1 s}w   Y  dS )
z$Test setting generic client options.r+   rˆ  )zgrpc.ssl_target_name_overrider•  r­   r*   )rŽ  Úgeneric_optionsrQ   N)zgrpc.max_receive_message_lengthé    )r-   rP   r   r  r  rÁ  rÂ  rŠ  rk   rÀ  r  r5   ró   rð   )rŒ  r¶  rW   r	  r   r   r   Útest_generic_options†  s*   þÿþÿ
"ðrû  c                   @   r©   )ÚCancelFlightServerzA server for testing StopToken.c                 C   s,   t  g ¡}t jjg |d}t |t |¡¡S )NrÛ   )r5   r`   r|   r8   r   rx   rÞ   rß   )rX   rd   rh   r`   r   r   r   r   rk   ¡  s   
zCancelFlightServer.do_getc                 C   sP   t  g ¡}t jjg |d}| |¡ | ¡ s&| |¡ t d¡ | ¡ rd S d S )NrÛ   rã   )	r5   r`   r|   r8   r  r4  r  rä   rå   )rX   rd   r‚   rƒ   r„   r`   r   r   r   r   r—   ¦  s   



þzCancelFlightServer.do_exchangeN)rm   rn   ro   rp   rk   r—   r   r   r   r   rü  ž  r¤  rü  c                     s  t  ¡ jt  ¡ jkrt d¡ dd„ ‰ttjf‰ ‡ ‡fdd„} t	ƒ Z}t
d|jfƒ:}| t d¡¡}| |jƒ tj d¡}| |¡\}}| |jƒ z| ¡  W n ttjfy\   Y nw W d   ƒ n1 sgw   Y  W d   ƒ d S W d   ƒ d S 1 sw   Y  d S )	Nz'test only works from main Python threadc                   S   s   t  d¡ t tj¡ d S râ   )rä   rå   ÚsignalÚraise_signalÚSIGINTr   r   r   r   Úsignal_from_thread´  s   
z*test_interrupt.<locals>.signal_from_threadc                    s²   z0z(t jˆd}t ˆ ¡}| ¡  | ƒ  W d   ƒ n1 sw   Y  W | ¡  n| ¡  w W n ty>   t d¡ Y nw |j}t	|t
jtfƒsUt	|jt
jtfƒsWJ ‚d S d S )NrÏ  z2KeyboardInterrupt didn't interrupt Flight read_all)r  r  rÁ  rÂ  r  r¼  ÚKeyboardInterruptÚfailr  rø  r5   ÚArrowCancelledÚ__context__)r”   ÚtÚexc_inforá  ©Ú	exc_typesr   r   r   rf  º  s    þ€ýÿztest_interrupt.<locals>.testr­   r«   rû   )r  Úcurrent_threadÚidentÚmain_threadrÁ  r“  r  r5   r  rü  r   r  rk   r   rÀ  r”   ra   r¾  r—   r  rð   )rf  rú  r	  rƒ   r‚   r„   r   r  r   Útest_interrupt¯  s*   

ÿ

þ€Põr  c               
   C   sÖ   d} t ƒ \}t d|jf¡;}tjtj| d | t d¡¡ 	¡  W d   ƒ n1 s,w   Y  | t d¡¡ 	¡ }|j
dksBJ ‚W d   ƒ n1 sLw   Y  W d   ƒ d S W d   ƒ d S 1 sdw   Y  d S )Nz'application server implementation errorr­   r  r«   rÚ   r0   )rÙ   r   r  r  rÁ  rÂ  r  rk   rÀ  r”   r  )r  rú  r	  rj   r   r   r   Útest_never_sends_dataÜ  s   ÿÿPør  c               
   C   s  t j dd ¡} tƒ l}t  d|jf¡K}tjtdd | 	| t
 g ¡¡\}}| ¡  W d   ƒ n1 s6w   Y  tjt
jdd | | ¡ W d   ƒ n1 sSw   Y  W d   ƒ n1 sbw   Y  W d   ƒ d S W d   ƒ d S 1 szw   Y  d S )Nr¬  r­  r­   z%Failed to serialize Flight descriptorr  )r   ra   r¾  r	   r  r  rÁ  rÂ  ÚOSErrorrŠ   r5   r`   r  rQ  r—   )Úlarge_descriptorrú  r	  r„   rN  r   r   r   Útest_large_descriptorê  s(   ÿÿÿ
ýÿþ€Púr  c                  C   sx  t j d¡} dd }tƒ ”}t  d|jf¡|}tjtj	dd. | 
| t g ¡¡\}}| | |¡ | ¡  W d   ƒ n1 sAw   Y  W d   ƒ n1 sPw   Y  tjtj	dd& | | ¡\}}| | |¡ W d   ƒ n1 sww   Y  W d   ƒ n1 s†w   Y  W d   ƒ n1 s•w   Y  W d   ƒ n1 s¤w   Y  ~tƒ „}t  d|jf¡b}tjt jdd | t  d¡¡}| ¡  W d   ƒ n1 sÖw   Y  tjtjdd% | | ¡\}}| | ¡  W d   ƒ n1 süw   Y  W d   ƒ n	1 sw   Y  W d   ƒ n1 sw   Y  W d   ƒ d S W d   ƒ d S 1 s5w   Y  d S )Nr«   r¬  r­  r­   zapp_metadata size overflowr  )r   ra   r¾  r   r  r  rÁ  rÂ  r5   ÚArrowCapacityErrorrŠ   r`   r  r  r—   r«  r  rk   rÀ  r”   rQ  )r‚   rš  rú  r	  r„   rN  rƒ   r   r   r   Útest_large_metadata_clientü  sf   ÿÿ

þ€ýÿÿ€ý€ø€ ÿÿ
ýÿ
ÿ€ý€Túr  c                   @   s   e Zd ZdZg Zdd„ ZdS )ÚActionNoneFlightServerz@A server that implements a side effect to a non iterable action.c                 C   s<   |j dkrt | j¡ d¡gS |j dkr| j d¡ d S t‚)NÚ	get_valuer¡   rœ  T)r?   ÚjsonÚdumpsÚVALUESr¤   rœ  r¥   r¦   r   r   r   r¨   "	  s   

z ActionNoneFlightServer.do_actionN)rm   rn   ro   rp   r  r¨   r   r   r   r   r  	  s    r  c               	   C   s¬   t ƒ I} td| jfƒ)}| t dd¡¡ | t dd¡¡}t t|ƒj	 
¡ ¡dgks-J ‚W d  ƒ n1 s7w   Y  W d  ƒ dS W d  ƒ dS 1 sOw   Y  dS )z…Ensure that actions are executed even when we don't consume iterator.

    See https://issues.apache.org/jira/browse/ARROW-14255
    r­   rœ  r«   r  TN)r  r   r  r¨   r   r½  r  Úloadsrd  r6  r   )rú  r	  Úrr   r   r   Útest_none_action_side_effect+	  s   ÿ Pür  c               
      s8  d} d}t j| |d‰ t j d¡}t dt ¡ fg¡}G ‡ fdd„dt jƒ}|ƒ è}td|j	fƒÈ}| 
||¡\}‰‡fd	d
„}tj|dd}	|	 ¡  t t j¡}
	 | tjdgg|d¡ qS1 scw   Y  |
jj|kspJ ‚t t j¡}
| ¡  W d  ƒ n1 s…w   Y  |
jj|ks’J ‚|	 ¡  | |¡\}‰‡fdd
„}tj|dd}	|	 ¡  t t j¡}
	 | d¡ q¶1 s¿w   Y  |
jj|ksÌJ ‚t t j¡}
| ¡  W d  ƒ n1 sáw   Y  |
jj|ksîJ ‚|	 ¡  W d  ƒ n1 süw   Y  W d  ƒ dS W d  ƒ dS 1 sw   Y  dS )zƒ
    Ensure that exceptions during writing preserve error context.

    See https://issues.apache.org/jira/browse/ARROW-16592.
    r;   rÖ  )rà  r«   r°  c                       s$   e Zd Z‡ fdd„Z‡ fdd„ZdS )z0test_write_error_propagation.<locals>.FailServerc                    ó   ˆ ‚rŽ   r   r•   ©Úexcr   r   rŠ   G	  rŸ   z7test_write_error_propagation.<locals>.FailServer.do_putc                    r  rŽ   r   r•   r  r   r   r—   J	  rŸ   z<test_write_error_propagation.<locals>.FailServer.do_exchangeN)rm   rn   ro   rŠ   r—   r   r  r   r   Ú
FailServerF	  s    r  r­   c                      ó$   z	 ˆ   ¡  q tjy   Y d S w rŽ   )r   r   ÚFlightErrorr   ©rƒ   r   r   Ú_readerT	  ó   ÿÿz-test_write_error_propagation.<locals>._readerTr   r@   rÛ   Nc                      r  rŽ   )r  r   r   r   r!  r   r   r"  k	  r#  r¬  )r   rð   ra   r¾  r5   r`   r°  r	   r   r  rŠ   r  r  r  rÁ  rÂ  r  r±  r  rà  r  r¼  r—   r  )Úexpected_messageÚexpected_infor‚   r`   r  rú  r	  r„   r"  r
  r  r   )r  rƒ   r   Útest_write_error_propagation8	  sV   ÿÿÿÿ
ÿ
ÿÿ
ÿ
RÑr&  c                   C   s   t  d¡ dS )z…
    Ensure that the gRPC server is stopped at interpreter shutdown.

    See https://issues.apache.org/jira/browse/ARROW-16597.
    zarrow_16597.pyN)r   Úinvoke_scriptr   r   r   r   Útest_interpreter_shutdown	  s   r(  c                   @   rÉ   )ÚTracingFlightServerz/A server that echoes back trace context values.c                 C   s   |  d¡j}dd„ | ¡ D ƒS )NÚtracingc                 s   s(    | ]\}}|› d |›   d¡V  qdS )z: r¡   N)r¤   )r<  r)   r  r   r   r   Ú	<genexpr>	  s   € ÿz0TracingFlightServer.do_action.<locals>.<genexpr>)ru  Útrace_contextrì  )rX   rd   r§   r,  r   r   r   r¨   ‹	  s   ÿzTracingFlightServer.do_actionNrw  r   r   r   r   r)  ˆ	  rË   r)  c               	   C   sš   t dt ¡ id:} td| jfƒ}tjddgd}|jd|dD ]}q!W d   ƒ n1 s.w   Y  W d   ƒ d S W d   ƒ d S 1 sFw   Y  d S )	Nr*  r|  r­   )s   traceparents7   00-000ff00f00f0ff000f0f00ff0f00fff0-000f0000f0f00000-00)s
   tracestater«   rv  )r«   r«   rg   )r)  r   ÚTracingServerMiddlewareFactoryr   r  rS  r¨   )rú  r	  rW   r  r   r   r   Útest_tracing”	  s   ÿýüÿPór.  c                  C   sZ   t ddd} d}tjt|d | jtj d¡d d W d   ƒ d S 1 s&w   Y  d S )Nzgrpc+tls://localhost:9643Tr‘  zRArgument 'schema' has incorrect type \(expected pyarrow.lib.Schema, got NoneType\)r  r;   rÛ   )r   rÁ  rÂ  rÃ  rŠ   r   ra   r¾  )r	  Úmsgr   r   r   Ú.test_do_put_does_not_crash_when_schema_is_none¦	  s   ÿÿ"ÿr0  c               	      sô   G dd„ dt ƒ} G ‡ fdd„dtƒ}G dd„ dtƒ‰ |ƒ }| ƒ P}td|jf|gd-}| tj d	¡¡ d
|j	v s<J ‚d|j	v sCJ ‚d|j	v sJJ ‚d|j	v sQJ ‚W d  ƒ n1 s[w   Y  W d  ƒ dS W d  ƒ dS 1 ssw   Y  dS )z9Ensure that server-sent headers/trailers make it through.c                   @   r  )z:test_headers_trailers.<locals>.HeadersTrailersFlightServerc                 S   sD   |  dd¡ |  dd¡ | dd¡ | dd¡ t t g ¡|g ¡S )	Núx-headerúheader-valueúx-header-binzheadervalueú	x-trailerútrailer-valueúx-trailer-binztrailervalue)Ú
add_headerÚadd_trailerr   r_   r5   r`   r¹   r   r   r   rº   ´	  s   ýzJtest_headers_trailers.<locals>.HeadersTrailersFlightServer.get_flight_infoN)rm   rn   ro   rº   r   r   r   r   ÚHeadersTrailersFlightServer³	  r“  r9  c                       s    e Zd Zdd„ Z‡ fdd„ZdS )z?test_headers_trailers.<locals>.HeadersTrailersMiddlewareFactoryc                 S   rP  rŽ   rv  r:  r   r   r   rU   À	  rS  zHtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.__init__c                    s   ˆ | ƒS rŽ   r   rV  ©ÚHeadersTrailersMiddlewarer   r   rW  Ã	  rX  zJtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.start_callN)rm   rn   ro   rU   rW  r   r:  r   r   Ú HeadersTrailersMiddlewareFactory¿	  s    r<  c                   @   s   e Zd Zdd„ Zdd„ ZdS )z8test_headers_trailers.<locals>.HeadersTrailersMiddlewarec                 S   rY  rŽ   r[  r]  r   r   r   rU   Ç	  rS  zAtest_headers_trailers.<locals>.HeadersTrailersMiddleware.__init__c                 S   s2   |  ¡ D ]\}}|D ]}| jj ||f¡ q
qd S rŽ   )rì  r\  rL  rœ  )rX   rL  r)   rl  r  r   r   r   ra  Ê	  s
   ÿÿzItest_headers_trailers.<locals>.HeadersTrailersMiddleware.received_headersN)rm   rn   ro   rU   ra  r   r   r   r   r;  Æ	  s    r;  r­   r|  rÃ   )r1  r2  )r3  s   headervalue)r4  r5  )r6  s   trailervalueN)
r	   r   r   r   r  rº   r   ra   rb   rL  )r9  r<  r\  rú  r	  r   r:  r   Útest_headers_trailers°	  s   	ÿPúr=  )¯ró  rA  rÞ   r   r   rý  r}   rG  r  rä   r"   r  r   Únumpyr§  ÚImportErrorrÁ  r   r5   Úpyarrow.libr   r   Úpyarrow.utilr   Úpyarrow.testsr   r   r   r   r	   r
   r   r   r   r   r   rÄ  ÚmarkÚ
pytestmarkr   r   r'   r-   r:   rG   rO   rP   rr   r   r™   rª   r¿   rÊ   rÌ   rÑ   rÙ   rà   ræ   rú   r  r4  r>  rF  rH  rN  rO  rU  rb  rk  rt  rx  rz  r}  r„  r†  r‡  rˆ  r‹  r‘  r’  r•  r   r¡  r£  r©  rª  r«  rÐ  rò  rö  rû  rý  Úslowr  r  r  r   Úpandasr$  r%  r&  r*  r+  r,  r-  rA  rB  rD  ÚskipifrJ  rL  rO  rP  rR  rT  rU  r\  r`  rk  rb  rg  ri  rl  rm  Ú%header_auth_server_middleware_factoryrq  rt  ru  r{  r€  rƒ  r…  r‡  Úrequires_testing_datar  r  r”  r—  rœ  r¡  r¢  r¤  r°  r±  r¾  r¿  rÆ  rË  rÑ  rÒ  rÕ  rß  rã  rè  ré  rì  rî  rï  rñ  rø  rû  rü  r  r  Úlarge_memoryr  r  r  r  r&  r(  r)  r.  r0  r=  r   r   r   r   Ú<module>   sˆ  ÿ,


û	"&1F	


	
<c	


	
	ÿ

ÿÿ

ÿ


 	


 

 	;&',
&

, F	
