U
    âÇ-euJ ã                   @   sL  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Z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 z8d dlmZ d dlmZmZmZmZmZmZm Z m!Z! W nB e"k
r   dZe#e# ZZe#e# ZZe#e# ZZe#e# Z Z!Y nX 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ƒZ/G dd„ de/ƒZ0G dd„ deƒ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/d0„ d0eƒZ:G d1d2„ d2eƒZ;G d3d4„ d4eƒZ<G d5d6„ d6eƒZ=G d7d8„ d8eƒZ>d9d:„ Z?G d;d<„ d<e!ƒZ@G d=d>„ d>e ƒZAG d?d@„ d@eƒZBG dAdB„ dBeƒZCG dCdD„ dDeƒZDG dEdF„ dFeƒZEG dGdH„ dHeƒZFG dIdJ„ dJeƒZGG dKdL„ dLeƒZHG dMdN„ dNeƒZIG dOdP„ dPeƒZJG dQdR„ dReƒZKG dSdT„ dTeƒZLG dUdV„ dVe!ƒZMG dWdX„ dXe ƒZNG dYdZ„ dZeƒZOG d[d\„ d\e!ƒZPG d]d^„ d^e!ƒZQG d_d`„ d`e ƒZRG dadb„ dbeƒZSG dcdd„ ddeƒZTG dedf„ dfeƒZUdgdh„ ZVdidj„ ZWdkdl„ ZXdmdn„ ZYej$jZdodp„ ƒZ[dqdr„ Z\dsdt„ Z]dudv„ Z^ej$j_dwdx„ ƒZ`dydz„ Zad{d|„ Zbd}d~„ Zcdd€„ Zddd‚„ ZeG dƒd„„ d„eƒZfd…d†„ Zgd‡dˆ„ Zhd‰dŠ„ Ziej$jjejkd‹kdŒddŽd„ ƒZlej$jZdd‘„ ƒZmd’d“„ Znd”d•„ Zod–d—„ Zpd˜d™„ Zqdšd›„ Zre:dœdidžZse<dœdidžZtej$jZdŸd „ ƒZuej$jjejkd‹kd¡dd¢d£„ ƒZvd¤d¥„ Zwd¦d§„ Zxd¨d©„ ZyeBƒ Zze>ƒ Z{dªd«„ Z|d¬d­„ Z}d®d¯„ Z~d°d±„ Zd²d³„ Z€d´dµ„ Zd¶d·„ Z‚ej$jZe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Ç„ Z‹ej$jZdÈdÉ„ ƒZŒej$jZdÊdË„ ƒZdÌdÍ„ ZŽdÎdÏ„ ZdÐdÑ„ ZdÒ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å„ Zšdædç„ Z›dèdé„ Zœej$jƒdêdë„ ƒZG dìdí„ díeƒZždîdï„ ZŸdðdñ„ Z ej$j¡ej$jZdòdó„ ƒƒZ¢ej$j¡ej$jZdôdõ„ ƒƒZ£G död÷„ d÷e/ƒZ¤dødù„ Z¥ej$jZdúdû„ ƒZ¦düdý„ Z§G dþdÿ„ dÿeƒZ¨d d„ Z©dd„ ZªdS (  é    N)Ú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   úZ/var/www/html/Darija-Ai-Train/env/lib/python3.8/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.Z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_root@   s    r   c              
   C   sp   t ƒ }|sdS z0||   d¡}| ¡ W  5 Q R £ W S Q R X W n, tk
rj   td ||  t ¡ ¡ƒ‚Y nX dS )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_resourceH   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   ZCertKeyPairr   r   r   r   Úexample_tls_certsW   s    þþûþr*   c                  C   s(   t  dddddg¡g} t jj| dgdS )Néöÿÿÿéûÿÿÿr   é   é
   Ú	some_ints©Únames)ÚpaÚarrayÚTableÚfrom_arrays)Údatar   r   r   Úsimple_ints_tableh   s    ÿr7   c                  C   sX   t jdddgt  ¡ d} t  t j ddd g| ¡t j ddg| ¡g¡g}t jj|dgd	S )
NÚfooÚbazZquux©Útypeé   r   é   Z
some_dictsr0   )r2   r3   Úutf8Zchunked_arrayZDictionaryArrayr5   r4   )Údict_valuesr6   r   r   r   Úsimple_dicts_tableo   s    þÿr@   c                   C   s4   t jjt  ddddg¡t  ddddg¡gd	d
gdS )Nr8   Úbarr9   Zquxr<   r=   é   é   ÚaÚbr0   )r2   r4   r5   r3   r   r   r   r   Úmultiple_column_tablez   s
    ÿþrF   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|Ž tttdœ| _|| _d S )N)ó   intsó   dictsó   multi)ÚsuperÚ__init__r7   r@   rF   Útable_factoriesÚoptions)ÚselfÚlocationrN   Úkwargs©Ú	__class__r   r   rL   ‰   s    ýzConstantFlightServer.__init__c                 c   s0   || j kr,t t g ¡tj d¡g dd¡V  d S )Nú/fooéÿÿÿÿ)ÚCRITERIAr   Ú
FlightInfor2   ÚschemaÚFlightDescriptorÚfor_path©rO   ÚcontextÚcriteriar   r   r   Úlist_flights“   s    

 üz!ConstantFlightServer.list_flightsc                 C   s   | j |j ƒ }tj|| jdS )N©rN   )rM   Úticketr   ÚRecordBatchStreamrN   )rO   r\   r`   Útabler   r   r   Údo_getœ   s    zConstantFlightServer.do_get)NN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__rV   rL   r^   rc   Ú__classcell__r   r   rR   r   rG   €   s
   
	rG   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                    s   t ƒ jf |Ž || _d S ©N©rK   rL   rN   ©rO   rN   rQ   rR   r   r   rL   ¦   s    zMetadataFlightServer.__init__c                 C   sB   t  dddddg¡g}t jj|dgd}tj|j|  |¡| jdS )	Nr+   r,   r   r-   r.   rD   r0   r_   )	r2   r3   r4   r5   r   ÚGeneratorStreamrX   Únumber_batchesrN   )rO   r\   r`   r6   rb   r   r   r   rc   ª   s    ÿýzMetadataFlightServer.do_getc           
      C   s¬   d}dddddg}z||  ¡ \}}| tj t || g¡gdg¡¡sHt‚|d k	sTt‚t d| 	¡ ¡\}	||	ksrt‚| 
t d|¡¡ |d7 }W q tk
r¤   Y d S X qd S )	Nr   r+   r,   r-   r.   rD   ú<ir<   )Ú
read_chunkÚequalsr2   ÚRecordBatchr5   r3   ÚAssertionErrorÚstructÚunpackÚ
to_pybytesÚwriteÚpackÚStopIteration)
rO   r\   Ú
descriptorÚreaderÚwriterÚcounterZexpected_dataÚbatchÚbufZclient_counterr   r   r   Údo_put´   s    
þ
zMetadataFlightServer.do_putc                 c   s0   t |  ¡ ƒD ]\}}t d|¡}||fV  qd S )Nro   )Ú	enumerateÚ
to_batchesrt   rx   )rb   Úidxr~   r   r   r   r   rn   Æ   s    z#MetadataFlightServer.number_batches)N)
rd   re   rf   rg   rL   rc   r€   Ústaticmethodrn   rh   r   r   rR   r   ri   £   s   
ri   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|Ž d | _|| _d S rj   )rK   rL   Úlast_messageÚexpected_schema)rO   rP   r‡   rQ   rR   r   r   rL   Ð   s    zEchoFlightServer.__init__c                 C   s   t  | j¡S rj   )r   ra   r†   ©rO   r\   r`   r   r   r   rc   Õ   s    zEchoFlightServer.do_getc                 C   s$   | j r| j |jkst‚| ¡ | _d S rj   )r‡   rX   rs   Úread_allr†   ©rO   r\   rz   r{   r|   r   r   r   r€   Ø   s    zEchoFlightServer.do_putc                 C   s   |D ]}qd S rj   r   )rO   r\   rz   r{   r|   Úchunkr   r   r   Údo_exchangeÝ   s    zEchoFlightServer.do_exchange)NN)	rd   re   rf   rg   rL   rc   r€   rŒ   rh   r   r   rR   r   r…   Í   s
   r…   c                   @   s(   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é   ©Zmax_chunksize)r   rm   r†   rX   r‚   rˆ   r   r   r   rc   å   s    þzEchoStreamFlightServer.do_getc                 C   s   g S rj   r   ©rO   r\   r   r   r   Úlist_actionsê   s    z#EchoStreamFlightServer.list_actionsc                 C   s(   |j dkr | ¡ | ¡  d¡gS t‚d S )Núwho-am-iúutf-8)r;   Zpeer_identityZpeerÚencodeÚNotImplementedError©rO   r\   Úactionr   r   r   Ú	do_actioní   s    
z EchoStreamFlightServer.do_actionN)rd   re   rf   rg   rc   r‘   r˜   r   r   r   r   r   â   s   r   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚGetInfoFlightServerz)A Flight server that tests GetFlightInfo.c                 C   sD   t  t dt ¡ fg¡|t  ddg¡t  dt j dd¡g¡gdd¡S )NrD   ó    úgrpc://testÚ	localhosté  rU   )r   rW   r2   rX   Úint32ÚFlightEndpointÚLocationÚfor_grpc_tcp)rO   r\   rz   r   r   r   Úget_flight_infoö   s    þþõz#GetInfoFlightServer.get_flight_infoc                 C   s   |   ||¡}t |j¡S rj   )r¢   r   ÚSchemaResultrX   )rO   r\   rz   Úinfor   r   r   Ú
get_schema  s    zGetInfoFlightServer.get_schemaN)rd   re   rf   rg   r¢   r¥   r   r   r   r   r™   ó   s   r™   c                   @   s$   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 rj   )r®   r   r   r   r   r‘     s    z$ListActionsFlightServer.list_actionsN)rd   re   rf   rg   Úclassmethodr®   r‘   r   r   r   r   r¦   
  s   
r¦   c                   @   s   e Zd ZdZdd„ ZdS )ÚListActionsErrorFlightServerr§   c                 c   s   dV  dV  d S )N)r¨   rª   r8   r   r   r   r   r   r‘     s    z)ListActionsErrorFlightServer.list_actionsN)rd   re   rf   rg   r‘   r   r   r   r   r°     s   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|Ž || _d S rj   )rK   rL   Úexpected_ticket)rO   r²   rP   rQ   rR   r   r   rL   $  s    z CheckTicketFlightServer.__init__c                 C   sJ   | j |jkst‚tjdddddgt ¡ dg}tjj|dgd}t 	|¡S ©	Nr+   r,   r   r-   r.   r:   rD   r0   )
r²   r`   rs   r2   r3   rž   r4   r5   r   ra   )rO   r\   r`   Údata1rb   r   r   r   rc   (  s    zCheckTicketFlightServer.do_getc                 C   s   |  ¡ | _d S rj   )r‰   r†   )rO   r\   rz   r{   r   r   r   r€   .  s    zCheckTicketFlightServer.do_put)N)rd   re   rf   rg   rL   rc   r€   rh   r   r   rR   r   r±   !  s   r±   c                   @   s,   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.rD   c                 C   s’   t jdddddgt  ¡ dg}t jddd	d
dgt  ¡ dg}|j|jksLt‚t jj|dgd}t jj|dgd}|j| jks€t‚t	 
| j||g¡S )Nr+   r,   r   r-   r.   r:   g      $Àg      Àg        ç      @g      $@rD   r0   )r2   r3   rž   Zfloat64r;   rs   r4   r5   rX   r   rm   )rO   r\   r`   r´   Zdata2Ztable1Ztable2r   r   r   rc   7  s    z InvalidStreamFlightServer.do_getN©rd   re   rf   rg   r2   rX   rž   rc   r   r   r   r   rµ   2  s   rµ   c                   @   s,   e Zd ZdZe de ¡ fg¡Zdd„ ZdS )ÚNeverSendsDataFlightServerz0A Flight server that never actually yields data.rD   c                 C   s\   |j dkrB| j ¡ | j ¡ tjjtdƒg| jdg}t | j|¡S t | jt	 
| j ¡ ¡¡S )Nó
   yield_datar-   ©rX   )r`   rX   Zempty_tabler2   rr   r5   Úranger   rm   Ú	itertoolsÚrepeat)rO   r\   r`   r6   r   r   r   rc   G  s    
ý ÿz!NeverSendsDataFlightServer.do_getNr·   r   r   r   r   r¸   B  s   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 )NrD   )r   rm   r2   rX   rž   Úslow_streamrˆ   r   r   r   rc   X  s    ÿzSlowFlightServer.do_getc                 C   s   t  d¡ g S ©Nç      à?)ÚtimeÚsleepr–   r   r   r   r˜   \  s    
zSlowFlightServer.do_actionc                  c   sT   t jdddddgt  ¡ dg} t jj| dgdV  t d¡ t jj| dgdV  d S r³   )r2   r3   rž   r4   r5   rÂ   rÃ   )r´   r   r   r   r¿   `  s    
zSlowFlightServer.slow_streamN)rd   re   rf   rg   rc   r˜   r„   r¿   r   r   r   r   r¾   U  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ÚunauthorizedZnotimplementedÚinvalidr'   )
r   ÚFlightInternalErrorÚFlightTimedOutErrorÚFlightCancelledErrorÚFlightUnauthenticatedErrorÚFlightUnauthorizedErrorr•   r2   ÚArrowInvalidÚKeyErrorr   r   r   r   Úerror_casesm  s    øzErrorFlightServer.error_casesc                 C   sD   t  ¡ }|j|kr"||j dƒ‚n|jdkr<d}t d|¡‚t‚d S )Nr8   Úprotobufó   this is an error message)rÄ   rÒ   r;   r   rÏ   r•   )rO   r\   r—   rÒ   Úerr_msgr   r   r   r˜   z  s    

zErrorFlightServer.do_actionc                 c   s0   t  t g ¡t j d¡g dd¡V  t  d¡‚d S )NrT   rU   r8   )r   rW   r2   rX   rY   rZ   rË   r[   r   r   r   r^   ƒ  s    
 üzErrorFlightServer.list_flightsc                 C   sŒ   |j dkrt d¡‚nr|j dkr,t d¡‚n\|j dkrBt d¡‚nF|j dkrXt d¡‚n0|j dkrnt d¡‚n|j dkrˆd}t d|¡‚d S )	Ns   internalr8   s   timedouts   cancels   unauthenticateds   unauthorizeds   protobufrÔ   )Úcommandr   rË   rÌ   rÍ   rÎ   rÏ   )rO   r\   rz   r{   r|   rÕ   r   r   r   r€   Œ  s    





zErrorFlightServer.do_putN)	rd   re   rf   rg   r„   rÒ   r˜   r^   r€   r   r   r   r   rÄ   j  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                    s   t ƒ jf |Ž || _d S rj   rk   rl   rR   r   r   rL   Ÿ  s    zExchangeFlightServer.__init__c                 C   s   |j tjjkrt d¡‚nr|jdkr2|  |||¡S |jdkrJ|  |||¡S |jdkrb|  	|||¡S |jdkrz|  
|||¡S t d |j¡¡‚d S )Nz!Must provide a command descriptoró   echoó   getó   putó	   transformzUnknown command: {})Zdescriptor_typer   ZDescriptorTypeZCMDr2   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   é (  rD   r0   N)r2   r4   r5   r3   r»   ÚbeginrX   Úwrite_table)rO   r\   r{   r|   r6   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)r6   r2   rÐ   Úwrite_metadataÚstrr”   )rO   r\   r{   r|   Znum_batchesr‹   r   r   r   rÞ   º  s    

z$ExchangeFlightServer.exchange_do_putc                 C   s†   d}|D ]x}|s.|j r.|j|j j| jd d}|jrL|j rL| |j |j¡ q|jr`| |j¡ q|j rt| |j ¡ qdstdƒ‚qdS )zRun a simple echo server.Fr_   TzShould not happenN)	r6   râ   rX   rN   Úapp_metadataÚwrite_with_metadatarå   Úwrite_batchrs   )rO   r\   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  < qPqDtjjt |¡gdgd}
| |
j ¡ | |
¡ dS )zSum rows in an uploaded table.zInvalid field: r   Úsumr0   N)rX   r2   ÚtypesÚ
is_integerr;   rÐ   Úreprr‰   Únum_rowsr   Zas_pyr4   r5   r3   râ   rã   )rO   r\   r{   r|   Úfieldrb   ZsumsÚcolumnÚrowÚvalueÚresultr   r   r   rß   Ó  s    
z'ExchangeFlightServer.exchange_transform)N)rd   re   rf   rg   rL   rŒ   rÝ   rÞ   rÜ   rß   rh   r   r   rR   r   r×   œ  s   	r×   c                       s0   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                    s   t ƒ  ¡  || _d S rj   ©rK   rL   Úcreds©rO   rø   rR   r   r   rL   å  s    
z#HttpBasicServerAuthHandler.__init__c                 C   sZ   |  ¡ }tj |¡}|j| jkr*t d¡‚| j|j |jkrFt d¡‚| t	|jƒ¡ d S )Núunknown userzwrong password)
r   r   Ú	BasicAuthÚdeserializeÚusernamerø   rÎ   Úpasswordrw   r   )rO   ÚoutgoingÚincomingr   Úauthr   r   r   Úauthenticateé  s    

z'HttpBasicServerAuthHandler.authenticatec                 C   s&   |st  d¡‚|| jkr"t  d¡‚|S )Nztoken not providedrú   )r   rÎ   rø   ©rO   Útokenr   r   r   Úis_validò  s
    


z#HttpBasicServerAuthHandler.is_valid©rd   re   rf   rg   rL   r  r  rh   r   r   rR   r   rõ   â  s   	rõ   c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚHttpBasicClientAuthHandlerrö   c                    s"   t ƒ  ¡  t ||¡| _d | _d S rj   )rK   rL   r   rû   Ú
basic_authr  ©rO   rý   rþ   rR   r   r   rL   ý  s    
z#HttpBasicClientAuthHandler.__init__c                 C   s"   | j  ¡ }| |¡ | ¡ | _d S rj   )r  Ú	serializerw   r   r  )rO   rÿ   r   r  r   r   r   r    s    

z'HttpBasicClientAuthHandler.authenticatec                 C   s   | j S rj   ©r  ©rO   r   r   r   Ú	get_token  s    z$HttpBasicClientAuthHandler.get_token©rd   re   rf   rg   rL   r  r  rh   r   r   rR   r   r  ú  s   r  c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚTokenServerAuthHandlerú:An example implementation of authentication via handshake.c                    s   t ƒ  ¡  || _d S rj   r÷   rù   rR   r   r   rL     s    
zTokenServerAuthHandler.__init__c                 C   sL   |  ¡ }|  ¡ }|| jkr>| j| |kr>| t d| ¡¡ n
t d¡‚d S )Nó   secret:zinvalid username/password)r   rø   rw   Úbase64Ú	b64encoder   rÎ   )rO   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é   )r  Ú	b64decodeÚ
startswithr   rÎ   r  r   r   r   r    s    


zTokenServerAuthHandler.is_validr  r   r   rR   r   r    s   	r  c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚTokenClientAuthHandlerr  c                    s    t ƒ  ¡  || _|| _d| _d S )Nrš   )rK   rL   rý   rþ   r  r	  rR   r   r   rL   %  s    
zTokenClientAuthHandler.__init__c                 C   s&   |  | j¡ |  | j¡ | ¡ | _d S rj   )rw   rý   rþ   r   r  ©rO   rÿ   r   r   r   r   r  +  s    z#TokenClientAuthHandler.authenticatec                 C   s   | j S rj   r  r  r   r   r   r  0  s    z TokenClientAuthHandler.get_tokenr  r   r   rR   r   r  "  s   r  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚNoopAuthHandlerzA no-op auth handler.c                 C   s   dS )zDo nothing.Nr   r  r   r   r   r  7  s    zNoopAuthHandler.authenticatec                 C   s   dS )zV
        Returning an empty string.
        Returning None causes Type error.
        rª   r   r  r   r   r   r  :  s    zNoopAuthHandler.is_validN)rd   re   rf   rg   r  r  r   r   r   r   r  4  s   r  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   )ÚheadersZ
lookup_keyr'   r   r   r   Úcase_insensitive_header_lookupB  s    r  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	Ú!ClientHeaderAuthMiddlewareFactoryz@ClientMiddlewareFactory that creates ClientAuthHeaderMiddleware.c                 C   s
   g | _ d S rj   ©Úcall_credentialr  r   r   r   rL   N  s    z*ClientHeaderAuthMiddlewareFactory.__init__c                 C   s   t | ƒS rj   )ÚClientHeaderAuthMiddleware©rO   r¤   r   r   r   Ú
start_callQ  s    z,ClientHeaderAuthMiddlewareFactory.start_callc                 C   s
   || _ d S rj   r  )rO   r  r   r   r   Úset_call_credentialT  s    z5ClientHeaderAuthMiddlewareFactory.set_call_credentialN)rd   re   rf   rg   rL   r"  r#  r   r   r   r   r  K  s   r  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )r   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   s
   || _ d S rj   ©Úfactory©rO   r%  r   r   r   rL   h  s    z#ClientHeaderAuthMiddleware.__init__c                 C   s(   t |dƒ}| j d|d  d¡g¡ d S )NÚAuthorizationó   authorizationr   r“   )r  r%  r#  r”   )rO   r  Úauth_headerr   r   r   Úreceived_headersk  s
    
þz+ClientHeaderAuthMiddleware.received_headersN)rd   re   rf   rg   rL   r*  r   r   r   r   r   X  s   r   c                   @   s   e Zd ZdZdd„ ZdS )Ú!HeaderAuthServerMiddlewareFactoryz)Validates incoming username and password.c           	      C   s¬   t |dƒ}|d  d¡}d}d}|d dkrrt |d ¡}| d¡ d	¡}|d d
krb|d dkslt |¡‚d}n2|d dkrš|d }|dks¤t |¡‚n
t |¡‚t|ƒS )Nr'  r   ú rª   zInvalid credentialsZBasicr<   r“   ú:Útestrþ   Z	token1234ZBearer)r  Úsplitr  r  Údecoder   rÎ   ÚHeaderAuthServerMiddleware)	rO   r¤   r  r)  Úvaluesr  Úerror_messageÚdecodedÚpairr   r   r   r"  u  s&    þ

z,HeaderAuthServerMiddlewareFactory.start_callN©rd   re   rf   rg   r"  r   r   r   r   r+  r  s   r+  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )r1  zBA ServerMiddleware that transports incoming username and password.c                 C   s
   || _ d S rj   r  r  r   r   r   rL   ‘  s    z#HeaderAuthServerMiddleware.__init__c                 C   s   dd| j  iS )NÚauthorizationzBearer r  r  r   r   r   Úsending_headers”  s    z*HeaderAuthServerMiddleware.sending_headersN©rd   re   rf   rg   rL   r8  r   r   r   r   r1  Ž  s   r1  c                   @   s   e Zd ZdZdd„ ZdS )ÚHeaderAuthFlightServerz<A Flight server that tests with basic token authentication. c                 C   sD   |  d¡}|r6t| ¡ dƒ}| d¡}|d  d¡gS t d¡‚d S )Nr  r'  r,  r<   r“   zNo token auth middleware found.)Úget_middlewarer  r8  r/  r”   r   rÎ   )rO   r\   r—   Ú
middlewarer)  r2  r   r   r   r˜   ›  s    
 ÿ
ÿz HeaderAuthFlightServer.do_actionN©rd   re   rf   rg   r˜   r   r   r   r   r:  ˜  s   r:  c                   @   s   e Zd ZdZdd„ ZdS )Ú'ArbitraryHeadersServerMiddlewareFactoryz<A ServerMiddlewareFactory that transports arbitrary headers.c                 C   s   t |ƒS rj   )Ú ArbitraryHeadersServerMiddleware©rO   r¤   r  r   r   r   r"  ©  s    z2ArbitraryHeadersServerMiddlewareFactory.start_callNr6  r   r   r   r   r>  ¦  s   r>  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )r?  z5A ServerMiddleware that transports arbitrary headers.c                 C   s
   || _ d S rj   ©r   )rO   r   r   r   r   rL   °  s    z)ArbitraryHeadersServerMiddleware.__init__c                 C   s   | j S rj   rA  r  r   r   r   r8  ³  s    z0ArbitraryHeadersServerMiddleware.sending_headersNr9  r   r   r   r   r?  ­  s   r?  c                   @   s   e Zd ZdZdd„ ZdS )ÚArbitraryHeadersFlightServerz6A Flight server that tests multiple arbitrary headers.c           	      C   s\   |  d¡}|rN| ¡ }t|dƒ}t|dƒ}|d  d¡}|d  d¡}||gS t d¡‚d S )Núarbitrary-headersztest-header-1ztest-header-2r   r“   zNo headers middleware found)r;  r8  r  r”   r   ÚFlightServerError)	rO   r\   r—   r<  r  Zheader_1Zheader_2Zvalue1Zvalue2r   r   r   r˜   º  s    
þþz&ArbitraryHeadersFlightServer.do_actionNr=  r   r   r   r   rB  ·  s   rB  c                   @   s   e Zd ZdZdd„ ZdS )ÚHeaderServerMiddlewarez/Expose a per-call value to the RPC method body.c                 C   s
   || _ d S rj   )Úspecial_value)rO   rF  r   r   r   rL   Ï  s    zHeaderServerMiddleware.__init__N)rd   re   rf   rg   rL   r   r   r   r   rE  Ì  s   rE  c                   @   s   e Zd ZdZdd„ ZdS )ÚHeaderServerMiddlewareFactoryz:Expose a per-call hard-coded value to the RPC method body.c                 C   s   t dƒS )Nzright value)rE  r@  r   r   r   r"  Ö  s    z(HeaderServerMiddlewareFactory.start_callNr6  r   r   r   r   rG  Ó  s   rG  c                   @   s   e Zd ZdZdd„ ZdS )ÚHeaderFlightServerz(Echo back the per-call hard-coded value.c                 C   s    |  d¡}|r|j ¡ gS dgS )Nr.  rš   )r;  rF  r”   )rO   r\   r—   r<  r   r   r   r˜   Ý  s    
zHeaderFlightServer.do_actionNr=  r   r   r   r   rH  Ú  s   rH  c                   @   s   e Zd ZdZdd„ ZdS )ÚMultiHeaderFlightServerú8Test sending/receiving multiple (binary-valued) headers.c                 C   s    |  d¡}t|jƒ d¡}|gS )Nr.  r“   )r;  rî   Úclient_headersr”   )rO   r\   r—   r<  r  r   r   r   r˜   ç  s    
z!MultiHeaderFlightServer.do_actionNr=  r   r   r   r   rI  ä  s   rI  c                   @   s   e Zd ZdZdd„ ZdS )Ú$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rDt d¡‚t|ƒS )Núx-auth-tokenzNo tokenr   rþ   zInvalid token)Úmethodr   ÚFlightMethodÚLIST_ACTIONSr   rÎ   rE  )rO   r¤   r  r  r   r   r   r"  ð  s    


z/SelectiveAuthServerMiddlewareFactory.start_callNr6  r   r   r   r   rL  í  s   rL  c                   @   s   e Zd Zdd„ ZdS )Ú$SelectiveAuthClientMiddlewareFactoryc                 C   s   t ƒ S rj   )ÚSelectiveAuthClientMiddlewarer!  r   r   r   r"    s    z/SelectiveAuthClientMiddlewareFactory.start_callN)rd   re   rf   r"  r   r   r   r   rQ     s   rQ  c                   @   s   e Zd Zdd„ ZdS )rR  c                 C   s   ddiS )NrM  rþ   r   r  r   r   r   r8    s     ÿz-SelectiveAuthClientMiddleware.sending_headersN)rd   re   rf   r8  r   r   r   r   rR    s   rR  c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )Ú RecordingServerMiddlewareFactoryú Record what methods were called.c                    s   t ƒ  ¡  g | _d S rj   ©rK   rL   Úmethodsr  rR   r   r   rL     s    
z)RecordingServerMiddlewareFactory.__init__c                 C   s   | j  |j¡ d S rj   ©rV  ÚappendrN  r@  r   r   r   r"    s    z+RecordingServerMiddlewareFactory.start_call©rd   re   rf   rg   rL   r"  rh   r   r   rR   r   rS    s   rS  c                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )Ú RecordingClientMiddlewareFactoryrT  c                    s   t ƒ  ¡  g | _d S rj   rU  r  rR   r   r   rL     s    
z)RecordingClientMiddlewareFactory.__init__c                 C   s   | j  |j¡ d S rj   rW  r!  r   r   r   r"    s    z+RecordingClientMiddlewareFactory.start_callrY  r   r   rR   r   rZ    s   rZ  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú"MultiHeaderClientMiddlewareFactoryrJ  c                 C   s
   i | _ d S rj   )Úlast_headersr  r   r   r   rL   '  s    z+MultiHeaderClientMiddlewareFactory.__init__c                 C   s   t | ƒS rj   )ÚMultiHeaderClientMiddlewarer!  r   r   r   r"  ,  s    z-MultiHeaderClientMiddlewareFactory.start_callN)rd   re   rf   rg   rL   r"  r   r   r   r   r[  $  s   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]  rJ  r8   rA   ó    ó   r9   )zx-textzx-binary-binzx-MIXED-cases   x-other-MIXED-casec                 C   s
   || _ d S rj   r$  r&  r   r   r   rL   ;  s    z$MultiHeaderClientMiddleware.__init__c                 C   s   | j S rj   )ÚEXPECTEDr  r   r   r   r8  >  s    z+MultiHeaderClientMiddleware.sending_headersc                 C   s   || j _d S rj   )r%  r\  )rO   r  r   r   r   r*  A  s    z,MultiHeaderClientMiddleware.received_headersN)rd   re   rf   rg   r`  rL   r8  r*  r   r   r   r   r]  0  s   ûr]  c                   @   s   e Zd ZdZdd„ ZdS )Ú"MultiHeaderServerMiddlewareFactoryrJ  c                 C   s   t |ƒS rj   )ÚMultiHeaderServerMiddlewarer@  r   r   r   r"  J  s    z-MultiHeaderServerMiddlewareFactory.start_callNr6  r   r   r   r   ra  G  s   ra  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )rb  rJ  c                 C   s
   || _ d S rj   )rK  )rO   rK  r   r   r   rL   Q  s    z$MultiHeaderServerMiddleware.__init__c                 C   s   t jS rj   )r]  r`  r  r   r   r   r8  T  s    z+MultiHeaderServerMiddleware.sending_headersNr9  r   r   r   r   rb  N  s   rb  c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚLargeMetadataFlightServerz Regression test for ARROW-13253.c                    s   t ƒ j||Ž dd | _d S )Nó    ì       )rK   rL   Ú	_metadata)rO   ÚargsrQ   rR   r   r   rL   [  s    z"LargeMetadataFlightServer.__init__c                 C   s6   t  dt  ¡ fg¡}t |t jdgg|d| jfg¡S )NrD   r<   rº   )r2   rX   Úint64r   rm   Úrecord_batchrf  )rO   r\   r`   rX   r   r   r   rc   _  s    ÿz LargeMetadataFlightServer.do_getc                 C   s   |  | j¡ d S rj   )rå   rf  rŠ   r   r   r   rŒ   e  s    z%LargeMetadataFlightServer.do_exchange)rd   re   rf   rg   rL   rc   rŒ   rh   r   r   rR   r   rc  X  s   rc  c               	   C   sv  d} d}d}d}d}d}d}d}d	}d
}	t t dd¡ƒ| ks@t‚t t dd¡ƒ|ksXt‚t t dd¡ƒ|kspt‚t tj d¡ƒ|ksˆt‚t t dg ¡ƒ|ks t‚t 	t
 g ¡tj ¡ g dd¡}
t |
ƒ|ksÎt‚t t d¡ƒ|ksät‚t t d¡ƒ|ksút‚t t t
 g ¡¡ƒ|kst‚t t t
 dg¡¡ƒdks8t‚t t d¡ƒ|	ksPt‚t t¡ t dd ¡ W 5 Q R X 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'>zY<pyarrow.flight.FlightEndpoint ticket=<pyarrow.flight.Ticket ticket=b'foo'> locations=[]>z…<pyarrow.flight.FlightInfo schema= descriptor=<pyarrow.flight.FlightDescriptor path=[]> endpoints=[] total_records=-1 total_bytes=-1>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'>r8   rš   rA   ÚuserÚpassó   foorU   úgrpc+tcp://localhost:1234)Úintrh  z1<pyarrow.flight.SchemaResult schema=(int: int64)>)rî   r   ÚActionrs   r¬   rû   rY   Úfor_commandrŸ   rW   r2   rX   rZ   r    ÚResultr£   ÚTicketÚpytestÚraisesÚ	TypeError)Zaction_reprZaction_type_reprZbasic_auth_reprZdescriptor_reprZendpoint_reprZ	info_reprZlocation_reprZresult_reprZschema_result_reprZticket_reprr¤   r   r   r   Ú	test_repri  sB    ÿ    ÿÿ
rv  c                  C   s†   dd„ dd„ dd„ dd„ dd„ dd„ dd„ d	d„ d
d„ dd„ g
} | D ]<}|ƒ \}}|ƒ \}}||ksht ‚||kstt ‚||ksDt ‚qDd S )Nc                   S   s   t  dd¡t  dd¡fS )Nr8   rš   ó   bar)r   ro  r   r   r   r   Ú<lambda>’  rš   ztest_eq.<locals>.<lambda>c                   S   s   t  dd¡t  dd¡fS )Nr8   rA   r9   r«   r   r   r   r   rx  “  s   

ÿc                   S   s   t  dd¡t  dd¡fS )Nrj  rk  Zuser2)r   rû   r   r   r   r   rx  •  s   

ÿc                   S   s   t j d¡t j d¡fS )Nr8   )r   rY   rp  rZ   r   r   r   r   rx  —  s   

ÿc                   S   s   t  dg ¡t  dg ¡fS )Nrl  rš   )r   rŸ   r   r   r   r   rx  ™  s   

ÿc                   S   s>   t  t g ¡t j ¡ g dd¡t  t g ¡t j d¡g dd¡fS )NrU   rl  é*   )r   rW   r2   rX   rY   rZ   rp  r   r   r   r   rx  ›  s       þ
   þüc                   S   s   t  d¡t  d¡fS )Nrm  zgrpc+tls://localhost:1234)r   r    r   r   r   r   rx  ¢  s   ÿc                   S   s   t  d¡t  d¡fS )Nrl  rw  )r   rq  r   r   r   r   rx  ¤  rš   c                   S   s*   t  t g ¡¡t  t dt ¡ fg¡¡fS )NZints)r   r£   r2   rX   rh  r   r   r   r   rx  ¥  s   ÿc                   S   s   t  d¡t  d¡fS )Nrš   rl  )r   rr  r   r   r   r   rx  §  rš   )rs   )ÚitemsÚgenZlhs1Zrhs1Zlhs2Zrhs2r   r   r   Útest_eq  s"    ê

r|  c               
   C   s@   d ddt ƒ fg} | D ]&}t|ƒ}t|tƒs0t‚W 5 Q R X qd S )Núgrpc://localhost:0rœ   )r   r   Ú
isinstancers   )Ú	locationsrP   Úserverr   r   r   Ú$test_flight_server_location_argument²  s    ý
r  c                
   C   s2   t  t¡ tƒ  tƒ ‚W 5 Q R X W 5 Q R X d S rj   )rs  rt  Ú
ValueErrorr   r   r   r   r   Ú#test_server_exit_reraises_exception½  s    rƒ  c               	      st   dt ƒ f‰ d } ‡ fdd„}tˆ ƒH}tj|dd}| ¡  t ¡ }|jdd t ¡ | }|dksft‚W 5 Q R X d S )	Nrœ   c                      s   t  d¡ tˆ ƒat ¡  d S rÀ   )rÂ   rÃ   r   r€  Úserver   ©rP   r   r   r„  È  s    
z-test_client_wait_for_available.<locals>.serveT©ÚtargetÚdaemonr-   ©ÚtimeoutrÁ   )r   r   Ú	threadingÚThreadÚstartrÂ   Zwait_for_availablers   )r€  r„  ÚclientÚthreadrê   Úelapsedr   r…  r   Útest_client_wait_for_availableÃ  s    

r‘  c               
   C   sf   t ƒ V} t d| jf¡:}t| ¡ ƒg ks.t‚| t j¡}tt|ƒƒdksNt‚W 5 Q R X W 5 Q R X dS )zTry a simple list_flights call.rœ   r<   N)	rG   r   ÚconnectÚportÚlistr^   rs   rV   Úlen)r€  rŽ  Zflightsr   r   r   Útest_flight_list_flightsØ  s    ÿr–  c                  C   sz   t ƒ j} t d| jf¡N}t| ¡ ƒg ks.t‚| ¡  | ¡  t 	t
j¡ t| ¡ ƒ W 5 Q R X W 5 Q R X W 5 Q R X d S )Nrœ   )rG   r   r’  r“  r”  r^   rs   Úclosers  rt  r2   rÐ   ©r€  rŽ  r   r   r   Útest_flight_client_closeá  s    ÿr™  c                  C   sJ  t ƒ } tƒ D}t d|jf¡(}| t d¡¡ ¡ }| | ¡sBt	‚W 5 Q R X W 5 Q R X t
jjt
jjjd}t|dj}t d|jf¡N}| t d¡¡ ¡ }| | ¡sªt	‚| t d¡¡ ¡  ¡ }| | ¡sÐt	‚W 5 Q R X W 5 Q R X tjtjddL tdd6}t d|jf¡}| t d¡¡ ¡ }W 5 Q R X W 5 Q R X W 5 Q R X dS )	úTry a simple do_get call.rœ   rH   ©Úmetadata_versionr_   z+expected IpcWriteOptions, got <class 'int'>©Úmatchry  N)r7   rG   r   r’  r“  rc   rr  r‰   rq   rs   r2   ÚipcÚIpcWriteOptionsÚMetadataVersionÚV4Z	to_readerrs  rt  rD  )rb   r€  rŽ  r6   rN   r   r   r   Útest_flight_do_get_intsë  s4    ÿ"ÿÿ"ÿÿr£  c               
   C   sj   t ƒ } tƒ T}t d|jf¡8}| t d¡¡ ¡ }t|d ƒ|  	d¡ 
¡ ksRt‚W 5 Q R X W 5 Q R X dS )rš  rœ   rH   r/   r   N)r7   rG   r   r’  r“  rc   rr  Zread_pandasr”  rñ   Z	to_pylistrs   ©rb   r€  rŽ  r6   r   r   r   Útest_do_get_ints_pandas  s    ÿr¥  c               
   C   sZ   t ƒ } tƒ D}t d|jf¡(}| t d¡¡ ¡ }| | ¡sBt	‚W 5 Q R X W 5 Q R X d S )Nrœ   rI   )
r@   rG   r   r’  r“  rc   rr  r‰   rq   rs   r¤  r   r   r   Útest_flight_do_get_dicts  s    ÿr¦  c               
   C   sˆ   t jdddddgt  ¡ dg} t jj| dgd}td	d
D}t d|jf¡(}| 	t 
d	¡¡ ¡ }| |¡spt‚W 5 Q R X W 5 Q R X dS )z+Make sure Tickets get passed to the server.r+   r,   r   r-   r.   r:   rD   r0   s
   the-ticket)r²   rœ   N)r2   r3   rž   r4   r5   r±   r   r’  r“  rc   rr  r‰   rq   rs   )r´   rb   r€  rŽ  r6   r   r   r   Útest_flight_do_get_ticket  s    ÿr§  c               	   C   sÚ   t ƒ Ê} td| jfƒ}| tj d¡¡}|jdks6t‚|j	dksDt‚|j
t 
dt ¡ fg¡ksbt‚t|jƒdkstt‚t|jd jƒdksŒt‚|jd jd t d¡ksªt‚|jd jd tj dd	¡ksÌt‚W 5 Q R X d
S )z8Make sure FlightEndpoint accepts string and object URIs.rœ   rš   rU   rD   r=   r   r<   r›   r   N)r™   r   r“  r¢   r   rY   rp  Útotal_recordsrs   Útotal_bytesrX   r2   rž   r•  Ú	endpointsr  r    r¡   ©r€  rŽ  r¤   r   r   r   Útest_flight_get_info$  s    ÿr¬  c               
   C   s`   t ƒ P} td| jfƒ6}| tj d¡¡}|jt dt 	¡ fg¡ksHt
‚W 5 Q R X W 5 Q R X dS )z+Make sure GetSchema returns correct schema.rœ   rš   rD   N)r™   r   r“  r¥   r   rY   rp  rX   r2   rž   rs   r«  r   r   r   Útest_flight_get_schema3  s    ÿr­  c                  C   sœ   t ƒ H} td| jfƒ.}tjtjdd t| ¡ ƒ W 5 Q R X W 5 Q R X W 5 Q R X t	ƒ 8} td| jfƒ}t| ¡ ƒt	 
¡ ks„t‚W 5 Q R X W 5 Q R X 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“  rs  rt  r   rD  r”  r‘   r¦   r®   rs   r˜  r   r   r   Útest_list_actions;  s     ÿþ*ÿ
ÿr®  c                   @   s$   e Zd ZdZedd„ ƒZdd„ ZdS )ÚConvenienceServerzT
    Server for testing various implementation conveniences (auto-boxing, etc.)
    c                 C   s
   dddgS )Nrl  rw  s   bazr   r  r   r   r   Úsimple_action_resultsR  s    z'ConvenienceServer.simple_action_resultsc                    sf   |j dkr| jS |j dkr"|jgS |j dkr2dgS |j dkrFt ¡ ‚n|j dkrb‡ fdd„}|ƒ S d S )	Núsimple-actionÚechoú
bad-actionr8   úarrow-exceptionÚforeverc                   3   s   ˆ   ¡ sdV  q d S )Nrl  )Úis_cancelledr   ©r\   r   r   r{  `  s    z(ConvenienceServer.do_action.<locals>.gen)r;   r°  Úbodyr2   ÚArrowMemoryError)rO   r\   r—   r{  r   r·  r   r˜   V  s    





zConvenienceServer.do_actionN)rd   re   rf   rg   Úpropertyr°  r˜   r   r   r   r   r¯  M  s   
r¯  c               
   C   s|   t ƒ l} td| jfƒR}dd„ | d¡D ƒ}|| jks:t‚d}dd„ | d|f¡D ƒ}||gksdt‚W 5 Q R X W 5 Q R X d S )Nrœ   c                 S   s   g | ]
}|j ‘qS r   ©r¸  ©Ú.0Úxr   r   r   Ú
<listcomp>k  s     z5test_do_action_result_convenience.<locals>.<listcomp>r±  s   the-bodyc                 S   s   g | ]
}|j ‘qS r   r»  r¼  r   r   r   r¿  p  s     r²  )r¯  r   r“  r˜   r°  rs   )r€  rŽ  Úresultsr¸  r   r   r   Ú!test_do_action_result_conveniencef  s    ÿrÁ  c                  C   s„   t ƒ t} td| jfƒZ}tjtjdd t| d¡ƒ W 5 Q R X tjtjdd t| d¡ƒ W 5 Q R X W 5 Q R X W 5 Q R X d S )Nrœ   za bytes-like object is requiredr  r³  r¹  r´  )	r¯  r   r“  rs  rt  r   rD  r”  r˜   r˜  r   r   r   Útest_nicer_server_exceptionst  s    ÿÿÿrÂ  c                  C   s*   t dƒ} z| jdkst‚W 5 |  ¡  X dS )zMake sure port() works.r}  r   N)r™   Úshutdownr“  rs   )r€  r   r   r   Útest_get_portƒ  s    rÄ  Úntz'Unix sockets can't be tested on Windows)Úreasonc                  C   sÔ   t  ¡ Â} |  ¡  tj | j¡}t|d– t|ƒ‚}| 	t 
d¡¡}tƒ }|j |j¡s^t‚| ¡ }| |¡stt‚| 	t 
d¡¡}tƒ }|j |j¡sœt‚| ¡ }| |¡s²t‚W 5 Q R X W 5 Q R X W 5 Q R X dS )z3Try a simple do_get call over a Unix domain socket.r…  rH   rI   N)ÚtempfileÚNamedTemporaryFiler—  r   r    Zfor_grpc_unixÚnamerG   r   rc   rr  r7   rX   rq   rs   r‰   r@   )ÚsockrP   rŽ  r{   rb   r6   r   r   r   Útest_flight_domain_socketŒ  s"    
ÿrË  c               
   C   s¦   t jjt  tddƒ¡gdgd} t| jdp}td|jfƒV}| 	t
j d¡| j¡\}}| | d¡ | ¡  | t
 d¡¡ ¡ }| | ¡sŽt‚W 5 Q R X W 5 Q R X 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    rD   r0   )r‡   rœ   r.  rš   N)r2   r4   r5   r3   r»   r…   rX   r   r“  r€   r   rY   rZ   rã   r—  rc   rr  r‰   rq   rs   ©r6   r€  rŽ  r|   Ú_rô   r   r   r   Útest_flight_large_message£  s     ÿþÿÿrÎ  c               
   C   sž   t jjt  tddƒ¡gdgd} tƒ n}td|jfƒT}| t	j
 d¡| j¡\}}| | ¡ | ¡  | t	 d¡¡ ¡ }| | ¡s†t‚W 5 Q R X W 5 Q R X dS )	z?Try downloading a flight of RecordBatches in a GeneratorStream.r   rá   rD   r0   rœ   r.  rš   N)r2   r4   r5   r3   r»   r   r   r“  r€   r   rY   rZ   rX   rã   r—  rc   rr  r‰   rq   rs   rÌ  r   r   r   Útest_flight_generator_stream¹  s     ÿþÿÿ
rÏ  c                  C   s\   t ƒ L} td| jfƒ2}t tj¡ | t 	d¡¡ 
¡  W 5 Q R X W 5 Q R X W 5 Q R X dS )z+Try streaming data with mismatched schemas.rœ   rš   N)rµ   r   r“  rs  rt  r2   ÚArrowExceptionrc   r   rr  r‰   r˜  r   r   r   Ú$test_flight_invalid_generator_streamÉ  s    ÿrÑ  c                  C   sr   t ƒ b} td| jfƒH}t dd¡}tjdd}t tj¡ t	|j
||dƒ W 5 Q R X W 5 Q R X W 5 Q R X dS )z)Make sure timeouts fire on slow requests.rœ   rª   rš   gš™™™™™É?r‰  r_   N)r¾   r   r“  r   ro  ÚFlightCallOptionsrs  rt  rÌ   r”  r˜   )r€  rŽ  r—   rN   r   r   r   Útest_timeout_firesÑ  s    ÿrÓ  c               
   C   sT   t ƒ D} td| jfƒ*}tjdd}|jt d¡|d ¡  W 5 Q R X W 5 Q R X dS )z0Make sure timeouts do not fire on fast requests.rœ   r¶   r‰  rH   r_   N)rG   r   r“  r   rÒ  rc   rr  r‰   )r€  rŽ  rN   r   r   r   Útest_timeout_passesß  s    ÿrÔ  c               
   C   sÈ   t jjt  ddddg¡gdgd} tƒ –}td|jfƒ|}tjt	dgdd	}|j
t d
¡|d ¡ }| 
t d
¡¡ ¡ }|jdksˆt‚|jdks–t‚|| ks¢t‚|tƒ ks°t‚W 5 Q R X W 5 Q R X dS )z"Make sure ReadOptions can be used.r<   r=   rB   rC   rE   r0   rœ   )Zincluded_fields)Zread_optionsrJ   r_   N)r2   r4   r5   r3   rG   r   r“  r   rÒ  r   rc   rr  r‰   Znum_columnsrs   rF   )Úexpectedr€  rŽ  rN   Z	response1Z	response2r   r   r   Útest_read_optionsç  s$    "ÿ
ÿÿÿ
rÖ  ó   tests   p4ssw0rd)rø   c                  C   sj   t tdV} td| jfƒ<}t dd¡}tjtjdd t	| 
|¡ƒ W 5 Q R X W 5 Q R X W 5 Q R X dS )z,Test that auth fails when not authenticated.©Úauth_handlerrœ   r’   rš   z.*unauthenticated.*r  N)r   Úbasic_auth_handlerr   r“  r   ro  rs  rt  rÎ   r”  r˜   ©r€  rŽ  r—   r   r   r   Útest_http_basic_unauth  s    ÿÿrÜ  z,ARROW-10013: gRPC on Windows corrupts peer()c               
   C   sŽ   t tdz} td| jfƒ`}t dd¡}| tddƒ¡ | |¡}t	|ƒ}|j
 ¡ dks\t‚t	|ƒ}|j
 ¡ dksvt‚W 5 Q R X W 5 Q R X dS )	z:Test a Python implementation of HTTP basic authentication.rØ  rœ   r’   rš   r.  Úp4ssw0rdr×  N)r   rÚ  r   r“  r   ro  r  r  r˜   Únextr¸  rv   rs   )r€  rŽ  r—   rÀ  ÚidentityZpeer_addressr   r   r   Útest_http_basic_auth  s    ÿ
rà  c                  C   sz   t tdf} td| jfƒL}t dd¡}tjtjdd$ | 	t
ddƒ¡ t| |¡ƒ W 5 Q R X W 5 Q R X W 5 Q R X d	S )
z-Test that auth fails with the wrong password.rØ  rœ   r’   rš   z.*wrong password.*r  r.  ÚwrongN)r   rÚ  r   r“  r   ro  rs  rt  rÎ   r  r  rÞ  r˜   rÛ  r   r   r   Ú%test_http_basic_auth_invalid_password  s    ÿÿrâ  c               
   C   sp   t td\} td| jfƒB}t dd¡}| tddƒ¡ t| 	|¡ƒ}|j
 ¡ dksXt‚W 5 Q R X W 5 Q R X dS )	ú-Test an auth mechanism that uses a handshake.rØ  rœ   r’   rš   r.  rÝ  r×  N)r   Útoken_auth_handlerr   r“  r   ro  r  r  rÞ  r˜   r¸  rv   rs   )r€  rŽ  r—   rß  r   r   r   Útest_token_auth&  s    ÿrå  c                  C   s\   t tdH} td| jfƒ.}t tj¡ | t	ddƒ¡ W 5 Q R X W 5 Q R X W 5 Q R X dS )rã  rØ  rœ   r.  rá  N)
r   rä  r   r“  rs  rt  r   rÎ   r  r  r˜  r   r   r   Útest_token_auth_invalid0  s    ÿræ  c               
   C   sh   t tdtƒ idL} td| jfƒ2}| dd¡}|d dks@t‚|d d	ksPt‚W 5 Q R X W 5 Q R X d
S )zATest authenticate_basic_token with bearer token and auth headers.r  ©rÙ  r<  rœ   r×  ó   passwordr   r(  r<   ó   Bearer token1234N)r:  Úno_op_auth_handlerr+  r   r“  Úauthenticate_basic_tokenrs   )r€  rŽ  Ú
token_pairr   r   r   Útest_authenticate_basic_token<  s     ÿýrí  c                  C   s`   t tdtƒ idD} td| jfƒ*}t tj¡ | 	dd¡ W 5 Q R X W 5 Q R X W 5 Q R X dS )z7Test authenticate_basic_token with an invalid password.r  rç  rœ   r×  s   badpasswordN)
r:  rê  r+  r   r“  rs  rt  r   rÎ   rë  r˜  r   r   r   Ú.test_authenticate_basic_token_invalid_passwordG  s     ÿýrî  c               
   C   s¦   t tdtƒ idŠ} td| jfƒp}| dd¡}|d dks@t‚|d d	ksPt‚tj|gd
}t	|j
t dd¡|dƒ}|d j ¡ dksŽt‚W 5 Q R X W 5 Q R X dS )z@Test authenticate_basic_token and doAction after authentication.r  rç  rœ   r×  rè  r   r(  r<   ré  ©r  útest-actionrš   ©r—   rN   ó	   token1234N)r:  rê  r+  r   r“  rë  rs   r   rÒ  r”  r˜   ro  r¸  rv   ©r€  rŽ  rì  rN   rô   r   r   r   Ú(test_authenticate_basic_token_and_actionQ  s"     ÿý
 ÿ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~t‚|jd dkst‚|jd dks¢t‚t
|jt d	d
¡|dƒ}|d j ¡ dksÒt‚|jd dksät‚|jd dksöt‚| ¡  W 5 Q R X dS )zšTest authenticate_basic_token with client middleware
       to intercept authorization header returned by the
       HTTP header auth enabled server.
    r  rç  rœ   ©r<  s   test:passwordr(  s   Basic rï  rð  rš   rñ  r   rò  r<   ré  N)r:  rê  r+  r  r   r“  r  r  r   rÒ  r”  r˜   ro  r¸  rv   rs   r  r—  )r€  Zclient_auth_middlewarerŽ  Zencoded_credentialsrN   rô   Zresult2r   r   r   Ú4test_authenticate_basic_token_with_client_middleware`  sB     ÿþ

ÿ
 ÿÿ
 ÿÿrö  c               
   C   sÄ   t ttƒ tƒ dœd¤} td| jfƒŠ}| dd¡}|d dksDt‚|d d	ksTt‚tj	|d
dgd}t
|jt dd¡|dƒ}|d j ¡ dks–t‚|d j ¡ dks¬t‚W 5 Q R X W 5 Q R X dS )z:Test passing multiple arbitrary headers to the middleware.)r  rC  rç  rœ   r×  rè  r   r(  r<   ré  )s   test-header-1ó   value1)s   test-header-2ó   value2rï  rð  rš   r_   r÷  rø  N)rB  rê  r+  r>  r   r“  rë  rs   r   rÒ  r”  r˜   ro  r¸  rv   ró  r   r   r   Ú-test_arbitrary_headers_in_flight_call_options€  s4    þþúý
 ÿÿrù  c                	   C   sN   t jtjdd t d¡ W 5 Q R X t jtjdd tdƒ W 5 Q R X dS )zTest constructing invalid URIs.z.*Cannot parse URI:.*r  ú%N)rs  rt  r2   rÐ   r   r’  rG   r   r   r   r   Útest_location_invalid—  s    rû  c                   C   s,   t  d¡jdkst‚t  d¡jdks(t‚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    Úurirs   r   r   r   r   Útest_location_unknown_scheme   s    
ÿrý  c                  C   sn   t ƒ } t| d dP}tdt|jƒ ƒ2}t tj¡ | 	t 
d¡¡ ¡  W 5 Q R X W 5 Q R X W 5 Q R X dS )z>Make sure clients cannot connect when cert verification fails.r)   ©Útls_certificateszgrpc+tls://localhost:rH   N)r*   rG   r   ræ   r“  rs  rt  r   ÚFlightUnavailableErrorrc   rr  r‰   ©ÚcertsÚsrŽ  r   r   r   Útest_tls_fails§  s    ÿr  c               
   C   sn   t ƒ } tƒ }t|d dJ}td|jf|d d(}| t d¡¡ ¡ }| 	| ¡sVt
‚W 5 Q R X W 5 Q R X dS )z"Try a simple do_get call over TLS.r)   rþ  rœ   r(   )Útls_root_certsrH   N)r7   r*   rG   r   r“  rc   r   rr  r‰   rq   rs   ©rb   r  r  rŽ  r6   r   r   r   Útest_tls_do_get·  s    
ÿÿr  c               	   C   sŠ   t ƒ } tƒ }t|d df}ztd|jfdd}W n tk
rP   t d¡ Y nX | t	 
d¡¡ ¡ }| | ¡stt‚| ¡  W 5 Q R X dS )	zDTry a simple do_get call over TLS with server verification disabled.r)   rþ  rœ   T©Zdisable_server_verificationz4disable_server_verification feature is not availablerH   N)r7   r*   rG   r   r“  r•   rs  Úskiprc   r   rr  r‰   rq   rs   r—  r  r   r   r   Ú$test_tls_disable_server_verificationÄ  s    
ÿ
r
  c                  C   sr   t ƒ } t| d dT}tjd|jf| d dd.}t tj¡ | t 	d¡¡ W 5 Q R X W 5 Q R X W 5 Q R X dS )	z5Check that incorrectly overriding the hostname fails.r)   rþ  rœ   r(   Úfakehostname)r  Zoverride_hostnamerH   N)
r*   rG   r   r’  r“  rs  rt  r   rc   rr  r  r   r   r   Útest_tls_override_hostnameÕ  s    þÿr  c            
   
   C   sæ   t  dddddg¡g} t jj| dgd}g }tƒ ª}td|jfƒ}| t 	d	¡¡}d}z@| 
¡ \}}| |¡ t d
| ¡ ¡\}	||	ksŽt‚|d7 }W qX tk
r°   Y q´Y qXX qXt j |¡} |  |¡sÎt‚W 5 Q R X W 5 Q R X dS )z'Try a simple do_get call with metadata.r+   r,   r   r-   r.   rD   r0   rœ   rš   ro   r<   N)r2   r3   r4   r5   ri   r   r“  rc   r   rr  rp   rX  rt   ru   rv   rs   ry   Úfrom_batchesrq   )
r6   rb   Úbatchesr€  rŽ  r{   rƒ   r~   ÚmetadataÚ
server_idxr   r   r   Útest_flight_do_get_metadataâ  s(    ÿÿ
r  c               
   C   s’   t jjt  dddddg¡gdgd} t jjt jjjd}t|d	F}t	d
|j
fƒ,}| t d¡¡}| ¡ }| | ¡szt‚W 5 Q R X W 5 Q R X dS )z2Try a simple do_get call with V4 metadata version.r+   r,   r   r-   r.   rD   r0   r›  r_   rœ   rš   N)r2   r4   r5   r3   rŸ  r   r¡  r¢  ri   r   r“  rc   r   rr  r‰   rq   rs   )rb   rN   r€  rŽ  r{   r6   r   r   r   Útest_flight_do_get_metadata_v4û  s     ÿÿÿr  c                  C   sæ   t  dddddg¡g} t jj| dgd}tƒ ®}td|jfƒ”}| tj	 
d	¡|j¡\}}|j t|jd
dƒD ]R\}}t d|¡}| ||¡ | ¡ }	|	dk	s¤t‚t d|	 ¡ ¡\}
||
kspt‚qpW 5 Q R X W 5 Q R X W 5 Q R X dS )z'Try a simple do_put call with metadata.r+   r,   r   r-   r.   rD   r0   rœ   rª   r<   r   ro   N)r2   r3   r4   r5   ri   r   r“  r€   r   rY   rZ   rX   r   r‚   rt   rx   rè   r   rs   ru   rv   )r6   rb   r€  rŽ  r|   Úmetadata_readerrƒ   r~   r  r   r  r   r   r   Útest_flight_do_put_metadata  s&    ÿÿ
þr  c            
      C   s  t jjt  tjdt ¡ d¡gdgd} tƒ Ü}td|j	fdd¾}| 
tj d¡| j¡\}}|f tjtjd	d
}| | ¡ W 5 Q R X |jjdksšt‚|  dd¡|  d¡g}|D ]}| |¡ q´W 5 Q R X t j | g¡}| t d¡¡ ¡ }	||	ksüt‚W 5 Q R X W 5 Q R X dS )z+Try a simple do_put call with a size limit.i   )ZdtyperD   r0   rœ   i   )Zwrite_size_limit_bytesrª   zexceeded soft limitr  r   i€  rš   N)r2   rr   r5   r3   ÚnpZonesrh  r…   r   r“  r€   r   rY   rZ   rX   rs  rt  ZFlightWriteSizeExceededErrorré   ró   Úlimitrs   Úslicer4   r  rc   rr  r‰   )
Zlarge_batchr€  rŽ  r|   r  ÚexcinfoZsmaller_batchesr~   rÕ  Úactualr   r   r   Útest_flight_do_put_limit  s<    ÿþ
ÿÿ
þÿ
þr  c                  C   sl   t ƒ \} td| jfƒB}| t d¡¡}| ¡  tjtj	dd | 
¡  W 5 Q R X W 5 Q R X W 5 Q R X dS )z4Test canceling a DoGet operation on the client side.rœ   rH   z(?i).*cancel.*r  N)rG   r   r“  rc   r   rr  rÇ   rs  rt  rÍ   rp   )r€  rŽ  r{   r   r   r   Útest_cancel_do_get:  s    ÿÿr  c                     sÎ   t ƒ ¾} td| jfƒ¤}| t d¡¡‰t ¡ ‰t ¡ ‰t ¡ ‰t ¡ ‰ ‡ ‡‡‡‡fdd„}tj	|dd}| 
¡  ˆjdd ˆ ¡  ˆ ¡  |jd	d ˆ ˆ  ¡ s¬t‚W 5 Q R X W 5 Q R X W 5 Q R X d
S )z5Test canceling a DoGet operation from another thread.rœ   rH   c                      s\   ˆ  ¡  ˆ ¡  ˆjdd zˆ  ¡  W n. tjk
rV   ˆ ˆ  ¡  W 5 Q R X Y nX d S )Nr-   r‰  )rp   ÚsetÚwaitr   rÍ   r   ©Zraised_proper_exceptionZread_first_messager{   Zresult_lockZstream_canceledr   r   Ú
block_readR  s    z/test_cancel_do_get_threaded.<locals>.block_readTr†  r-   r‰  r<   N)r¾   r   r“  rc   r   rr  r‹  ÚEventÚLockrŒ  r  r  rÇ   r  ÚjoinÚis_setrs   )r€  rŽ  r  r  r   r  r   Útest_cancel_do_get_threadedF  s$    ÿ
r$  c               
   C   sV   t ƒ F} td| jfƒ,}| t dd¡¡}t|ƒjdks<t‚~W 5 Q R X W 5 Q R X d S )Nrœ   rµ  rš   rl  )	r¯  r   r“  r˜   r   ro  rÞ  r¸  rs   )r€  rŽ  rÀ  r   r   r   Útest_streaming_do_actiong  s    ÿr%  c            	      C   sò  t  dd¡} | t j |  ¡ ¡ks$t‚t  d¡}|t j | ¡ ¡ksFt‚t  d¡}|t j | ¡ ¡ksht‚t  dd¡}|t j | ¡ ¡ksŒt‚t  t	 
dt	 ¡ fg¡¡}|t j | ¡ ¡ks¾t‚t j d¡}|t j | ¡ ¡ksât‚t j dd	d
¡}|t j | ¡ ¡kst‚t  t	 
dt	 ¡ fg¡|t  ddg¡t  dt j dd¡g¡gdd¡}t j | ¡ ¡}|j
|j
ksrt‚|j|jks„t‚|j|jks–t‚|j|jks¨t‚|j|jksºt‚t  |dt j dd¡g¡}|t j | ¡ ¡ksît‚dS )z(Make sure serializable types round-trip.Zaction1s   action1-bodyr8   s   result1Z	username1Z	password1rD   r.  rE   z
test.arrowrš   r›   rœ   r   rU   N)r   ro  rü   r
  rs   rr  rq  rû   r£   r2   rX   rž   rY   rp  rZ   rW   rŸ   r    r¡   rz   r©  r¨  rª  )	r—   r`   rô   r  Zschema_resultÚdescr¤   Zinfo2Zendpointr   r   r   Útest_roundtrip_typesp  sN    

ÿ
þþõþr'  c                  C   sx  t ƒ f} td| jfƒJ}t  ¡  ¡ D ]8\}}tj|dd t| t	 
|d¡¡ƒ W 5 Q R X q(tjt	jdd t| ¡ ƒ W 5 Q R X t ddddd	g¡g}tjj|d
gd}t	jt	jt	jt	jt	jdœ}| ¡ D ]Š\}}tj|dd2 | t	j |¡|j¡\}	}
|	 |¡ |	 ¡  W 5 Q R X tj|dd( | t	j |¡|j¡\}	}
|	 ¡  W 5 Q R X qÔW 5 Q R X W 5 Q R X dS )z:Ensure that Flight errors propagate from server to client.rœ   z.*foo.*r  rš   r+   r,   r   r-   r.   rD   r0   )rÅ   rÆ   rÇ   rÈ   rÉ   N)rÄ   r   r“  rÒ   rz  rs  rt  r”  r˜   r   ro  rË   r^   r2   r3   r4   r5   rÌ   rÍ   rÎ   rÏ   r€   rY   rp  rX   rã   r—  )r€  rŽ  ÚargÚexc_typer6   rb   Ú
exceptionsrÖ   Ú	exceptionr|   r{   r   r   r   Útest_roundtrip_errors£  s>    
ÿ"û
þ

þr,  c                     s  t  dddddg¡g} t jj| dgd}tƒ Ì}td|jfƒ²}| tj	 
d	¡|j¡\}‰dg‰ ‡ ‡fd
d„}tj|d}| ¡  |jdd}|@ t|ƒD ] \}}	t d|¡}
| |	|
¡ qœ| ¡  | ¡  W 5 Q R X ˆ d t|ƒksìt‚W 5 Q R X W 5 Q R X dS )z7Ensure that separate threads can read/write on a DoPut.r+   r,   r   r-   r.   rD   r0   rœ   rª   c                      s"   ˆ  ¡ d k	rˆ d  d7  < q d S )Nr   r<   )r   r   ©Úcountr  r   r   Ú_reader_threadÛ  s    z:test_do_put_independent_read_write.<locals>._reader_thread©r‡  r<   r   ro   N)r2   r3   r4   r5   ri   r   r“  r€   r   rY   rZ   rX   r‹  rŒ  r  r‚   r   rt   rx   rè   Údone_writingr"  r•  rs   )r6   rb   r€  rŽ  r|   r/  r  r  rƒ   r~   r  r   r-  r   Ú"test_do_put_independent_read_writeÉ  s.    ÿÿ
þr2  c               
   C   sz   t dtƒ id`} td| jfƒF}t| t dd¡¡ƒ}t|ƒdksHt	‚|d j
 ¡ }d|ksbt	‚W 5 Q R X W 5 Q R X d	S )
z@Ensure that server middleware run on the same thread as the RPC.r.  rõ  rœ   r×  rš   r<   r   s   right valueN)rH  rG  r   r“  r”  r˜   r   ro  r•  rs   r¸  rv   )r€  rŽ  rÀ  ró   r   r   r   Ú"test_server_middleware_same_threadð  s     ÿýr3  c                  C   sÊ   t dtƒ id°} td| jfƒ–}t tj¡ t| 	¡ ƒ W 5 Q R X t t
j¡ t| t
 dd¡¡ƒ W 5 Q R X td| jftƒ gd}t| t
 dd¡¡ƒ}d|j ¡ ks²t‚W 5 Q R X W 5 Q R X dS )z-Test rejecting an RPC with server middleware.r.  rõ  rœ   rš   rè  N)rH  rL  r   r“  rs  rt  r2   ZArrowNotImplementedErrorr”  r‘   r   rÎ   r˜   ro  rQ  rÞ  r¸  rv   rs   )r€  rŽ  Úresponser   r   r   Útest_middleware_rejectü  s$     ÿý þr5  c                  C   sä  t ƒ } tƒ }td| id¾}td|jf|gdœ}tj d¡}t 	t
¡ t| ¡ ƒ W 5 Q R X t 	t
¡ | |¡ W 5 Q R X t 	t
¡ | |¡ W 5 Q R X t 	t
¡ | t d¡¡ W 5 Q R X t 	t
¡$ | |t g ¡¡\}}| ¡  W 5 Q R X t 	t
¡ t| t dd¡¡ƒ W 5 Q R X t 	t
¡ t| ¡ ƒ W 5 Q R X t 	t
¡ | |¡\}}| ¡  W 5 Q R X 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¼t#‚|j"|ksÌt#‚W 5 Q R X W 5 Q R X dS )z/Test that middleware records methods correctly.r.  rõ  rœ   rš   N)$rS  rZ  r   r   r“  r   rY   rp  rs  rt  r•   r”  r^   r¢   r¥   rc   rr  r€   r2   rX   r—  r˜   ro  r‘   rŒ   rO  ZLIST_FLIGHTSZGET_FLIGHT_INFOZ
GET_SCHEMAZDO_GETZDO_PUTZ	DO_ACTIONrP  ZDO_EXCHANGErV  rs   )Zserver_middlewareZclient_middlewarer€  rŽ  rz   r|   rÍ  rÕ  r   r   r   Útest_middleware_mapping  sN    þÿ ø
r6  c                  C   s˜   t ƒ ˆ} td| jfƒn}z"t| t dd¡¡ƒ ds8t‚W nD tjk
r~ } z$|j	d k	s\t‚|j	}|dksnt‚W 5 d }~X Y nX W 5 Q R X W 5 Q R X d S )Nrœ   rÓ   rš   FrÔ   )
rÄ   r   r“  r”  r˜   r   ro  rs   rÏ   Ú
extra_info)r€  rŽ  ÚeÚeir   r   r   Útest_extra_info>  s    ÿr:  c               
   C   s”   t ƒ } tƒ }t| d d gd| d db}td|jf| d | d d j| d d jd(}| t 	d¡¡ 
¡ }| |¡s|t‚W 5 Q R X W 5 Q R X d	S )
z!Test mutual TLS (mTLS) with gRPC.r)   r   Tr(   )rÿ  Zverify_clientZroot_certificatesrœ   )r  Z
cert_chainZprivate_keyrH   N)r*   r7   rG   r   r“  r&   r'   rc   r   rr  r‰   rq   rs   )r  rb   r  rŽ  r6   r   r   r   Ú	test_mtlsJ  s$    ýüür;  c                  C   sŽ   t jjt  tddƒ¡gdgd} tƒ ^}td|jfƒD}tj	 
d¡}| |¡\}}| | ¡ }W 5 Q R X | |ksvt‚W 5 Q R X W 5 Q R X dS )rà   r   rá   rD   r0   rœ   rÙ   N)r2   r4   r5   r3   r»   r×   r   r“  r   rY   rp  rŒ   r‰   rs   )rÕ  r€  rŽ  rz   r|   r{   rb   r   r   r   Útest_doexchange_get]  s    ÿþÿ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¡}| |¡\}}|d | | j¡ |D ]}| |¡ qt| ¡  | ¡ }|jd	ks¢t‚tt|ƒƒ d
¡}	|j|	ksÂt‚W 5 Q R X W 5 Q R X W 5 Q R X d	S )rä   r   rá   rD   r0   é   r   rœ   rÚ   Nr“   )r2   r4   r5   r3   r»   r‚   r×   r   r“  r   rY   rp  rŒ   râ   rX   ré   r1  rp   r6   rs   ræ   r•  r”   rç   )
r6   r  r€  rŽ  rz   r|   r{   r~   r‹   Zexpected_bufr   r   r   Útest_doexchange_putl  s*    ÿþÿ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ks¢t‚|	j|kspt‚qp| | j¡ |D ]B}
| |
¡ |j| jksàt‚| ¡ }	|	j|
ksöt‚|	jdksÂt‚qÂt|ƒD ]L\}}
t|ƒ d
¡}| |
|¡ | ¡ }	|	j|
ksHt‚|	j|kst‚qW 5 Q R X W 5 Q R X W 5 Q R X dS )zTry a DoExchange echo server.r   rá   rD   r0   r=  r   rœ   rØ   r.   r“   N)r2   r4   r5   r3   r»   r‚   r×   r   r“  r   rY   rp  rŒ   ræ   r”   rå   rp   r6   rs   rç   râ   rX   ré   r   rè   )r6   r  r€  rŽ  rz   r|   r{   Úir   r‹   r~   r   r   r   Útest_doexchange_echo‚  s@    ÿþ
ÿ

r@  c            
      C   sö   t jjt  tddƒ¡gdgd} | jdd}t jjt jjj	d}t
|d¢}td	|jfƒˆ}tj d
¡}| |¡\}}|^ |j| j|d |D ]B}| |¡ |j| jks®t‚| ¡ }	|	j|ksÄt‚|	jdkst‚qW 5 Q R X W 5 Q R X W 5 Q R X dS )z;Try a DoExchange echo server using the V4 metadata version.r   rá   rD   r0   r=  r   r›  r_   rœ   rØ   N)r2   r4   r5   r3   r»   r‚   rŸ  r   r¡  r¢  r×   r   r“  r   rY   rp  rŒ   râ   rX   ré   rs   rp   r6   rç   )
r6   r  rN   r€  rŽ  rz   r|   r{   r~   r‹   r   r   r   Útest_doexchange_echo_v4¨  s.    ÿþÿÿ
rA  c                  C   sî   t jjt  tddƒ¡t  tddƒ¡t  tddƒ¡gddd	gd
} t jjt  tdddƒ¡gdgd
}tƒ |}td|jfƒb}tj	 
d¡}| |¡\}}|, | | j¡ | | ¡ | ¡  | ¡ }W 5 Q R X ||ksÖt‚W 5 Q R X W 5 Q R X dS )z!Transform a table with a service.r   rŽ   r<   i  r=   i  rD   rE   Úcr0   rB   i  rë   rœ   rÛ   N)r2   r4   r5   r3   r»   r×   r   r“  r   rY   rp  rŒ   râ   rX   rã   r1  r‰   rs   )r6   rÕ  r€  rŽ  rz   r|   r{   rb   r   r   r   Útest_doexchange_transformÀ  s0    ýüÿþÿ
rC  c               
   C   sÌ   t dtƒ id²} tƒ }td| jf|gdŒ}t| t dd¡¡ƒ}|j	 
¡  d¡}t |¡}tj ¡ D ]J\}}| ¡ }t|tƒrŒ| d¡}| |¡|ksžt‚|j |¡|ksht‚qhW 5 Q R X W 5 Q R X dS )rJ  r.  rõ  rœ   rš   r“   ÚasciiN)rI  ra  r[  r   r“  rÞ  r˜   r   ro  r¸  rv   r0  ÚastÚliteral_evalr]  r`  rz  r  r~  Úbytesr   rs   r\  )r€  r  rŽ  r4  Zraw_headersrK  Úheaderr2  r   r   r   Útest_middleware_multi_header×  s(     ÿþ


rI  c               
   C   sÊ   t ƒ } t| d d¬}dg}tjd|jf| d |d}t tj¡ | t 	d¡¡ W 5 Q R X | 
¡  dg}tjd|jf| d |d}t tjtjf¡ | t 	d¡¡ W 5 Q R X | 
¡  W 5 Q R X d	S )
z$Test setting generic client options.r)   rþ  )zgrpc.ssl_target_name_overrider  rœ   r(   )r  Zgeneric_optionsrH   )zgrpc.max_receive_message_lengthé    N)r*   rG   r   r’  r“  rs  rt  r   rc   rr  r—  r2   rÐ   rÍ   )r  r  rN   rŽ  r   r   r   Útest_generic_optionsí  s$    þþrK  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚCancelFlightServerzA server for testing StopToken.c                 C   s,   t  g ¡}t jjg |d}t |t |¡¡S )Nrº   )r2   rX   rr   r5   r   rm   r¼   r½   )rO   r\   r`   rX   r   r   r   r   rc     s    
zCancelFlightServer.do_getc                 C   sF   t  g ¡}t jjg |d}| |¡ | ¡ sB| |¡ t d¡ q$d S )Nrº   rÁ   )	r2   rX   rr   r5   râ   r¶  ré   rÂ   rÃ   )rO   r\   rz   r{   r|   rX   r   r   r   r   rŒ     s    


zCancelFlightServer.do_exchangeN)rd   re   rf   rg   rc   rŒ   r   r   r   r   rL    s   rL  c                     sà   t  ¡ jt  ¡ jkrt d¡ t ¡ ‰‡fdd„‰tt	j
f‰ ‡ ‡fdd„} tƒ †}td|jfƒl}| t d¡¡}| |jƒ tj d¡}| |¡\}}| |jƒ z| ¡  W n ttjfk
rÆ   Y nX W 5 Q R X W 5 Q R X d S )	Nz'test only works from main Python threadc                      s   t  d¡ ˆ tjƒ d S rÀ   )rÂ   rÃ   ÚsignalÚSIGINTr   )Úraise_signalr   r   Úsignal_from_thread  s    
z*test_interrupt.<locals>.signal_from_threadc              	      s”   zDz4tjˆd}t ˆ ¡}| ¡  | ƒ  W 5 Q R X W 5 |  ¡  X W n tk
rb   t d¡ Y nX |j}t	|t
jtfƒst	|jt
jtfƒst‚d S )Nr0  z2KeyboardInterrupt didn't interrupt Flight read_all)r"  r‹  rŒ  rs  rt  r  ÚKeyboardInterruptZfailró   r~  r2   ÚArrowCancelledÚ__context__rs   )r‰   ÚtÚexc_infor8  )Ú	exc_typesrP  r   r   r.  "  s    ÿztest_interrupt.<locals>.testrœ   rš   rØ   )r‹  Úcurrent_threadÚidentÚmain_threadrs  r	  r   Zget_raise_signalrQ  r2   rR  rL  r   r“  rc   r   rr  r‰   rY   rp  rŒ   r—  rÍ   )r.  r€  rŽ  r{   rz   r|   r   )rV  rO  rP  r   Útest_interrupt  s&    

ÿ

rZ  c                  C   sˆ   d} t ƒ t}t d|jf¡X}tjtj| d | t d¡¡ 	¡  W 5 Q R X | t d¡¡ 	¡ }|j
dkspt‚W 5 Q R X W 5 Q R X d S )Nz'application server implementation errorrœ   r  rš   r¹   r-   )r¸   r   r’  r“  rs  rt  rD  rc   rr  r‰   rï   rs   )rž  r€  rŽ  rb   r   r   r   Útest_never_sends_dataD  s    ÿr[  c                  C   s    t j dd ¡} tƒ €}t  d|jf¡d}tjtdd$ | 	| t
 g ¡¡\}}| ¡  W 5 Q R X tjt
jdd | | ¡ W 5 Q R X W 5 Q R X W 5 Q R X d S )Nrd  re  rœ   z%Failed to serialize Flight descriptorr  )r   rY   rp  r   r’  r“  rs  rt  ÚOSErrorr€   r2   rX   r—  rÐ  rŒ   )Zlarge_descriptorr€  rŽ  r|   rÍ  r   r   r   Útest_large_descriptorR  s     ÿÿÿÿr]  c                  C   s„  t j d¡} dd }tƒ º}t  d|jf¡ž}tjtj	dd> | 
| t g ¡¡\}}| | |¡ | ¡  W 5 Q R X W 5 Q R X tjtj	dd. | | ¡\}}| | |¡ W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X ~tƒ ˜}t  d|jf¡|}tjt jdd | t  d¡¡}| ¡  W 5 Q R X tjtjdd, | | ¡\}}| | ¡  W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X d S )Nrš   rd  re  rœ   zapp_metadata size overflowr  )r   rY   rp  r…   r’  r“  rs  rt  r2   ZArrowCapacityErrorr€   rX   rå   r—  rŒ   rc  rD  rc   rr  r‰   rÐ  )rz   r  r€  rŽ  r|   rÍ  r{   r   r   r   Útest_large_metadata_clientd  sF    ÿÿ
ÿ2ÿÿÿ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r8| j d¡ d S t‚d S )NÚ	get_valuer“   rX  T)r;   ÚjsonÚdumpsÚVALUESr”   rX  r•   r–   r   r   r   r˜   Š  s    

z ActionNoneFlightServer.do_actionN)rd   re   rf   rg   rc  r˜   r   r   r   r   r_  †  s   r_  c               
   C   sr   t ƒ b} td| jfƒH}| t dd¡¡ | t dd¡¡}t t|ƒj	 
¡ ¡dgksZt‚W 5 Q R X W 5 Q R X 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œ   rX  rš   r`  TN)r_  r   r“  r˜   r   ro  ra  ÚloadsrÞ  r¸  rv   rs   )r€  rŽ  Úrr   r   r   Útest_none_action_side_effect“  s    ÿrf  c                     sÐ  d} d}t j| |d‰ t j d¡}t dt ¡ fg¡}G ‡ fdd„dt jƒ}|ƒ r}td|j	fƒV}| 
||¡\}‰‡fd	d
„}tj|dd}	|	 ¡  t t j¡ }
| tjdgg|d¡ q¨W 5 Q R X |
jj|ksÜt‚t t j¡}
| ¡  W 5 Q R X |
jj|kst‚|	 ¡  | |¡\}‰‡fdd
„}tj|dd}	|	 ¡  t t j¡}
| d¡ qTW 5 Q R X |
jj|ks~t‚t t j¡}
| ¡  W 5 Q R X |
jj|ks°t‚|	 ¡  W 5 Q R X W 5 Q R X dS )zƒ
    Ensure that exceptions during writing preserve error context.

    See https://issues.apache.org/jira/browse/ARROW-16592.
    r8   rw  )r7  rš   rh  c                       s$   e Zd Z‡ fdd„Z‡ fdd„ZdS )z0test_write_error_propagation.<locals>.FailServerc                    s   ˆ ‚d S rj   r   rŠ   ©Úexcr   r   r€   ¯  s    z7test_write_error_propagation.<locals>.FailServer.do_putc                    s   ˆ ‚d S rj   r   rŠ   rg  r   r   rŒ   ²  s    z<test_write_error_propagation.<locals>.FailServer.do_exchangeN)rd   re   rf   r€   rŒ   r   rg  r   r   Ú
FailServer®  s   ri  rœ   c                      s,   zˆ   ¡  qW n tjk
r&   Y d S X d S rj   )r   r   ÚFlightErrorr   ©r{   r   r   Ú_reader¼  s    z-test_write_error_propagation.<locals>._readerTr†  r<   rº   c                      s,   zˆ   ¡  qW n tjk
r&   Y d S X d S rj   )rp   r   rj  r   rk  r   r   rl  Ó  s    rd  N)r   rÍ   rY   rp  r2   rX   rh  r   r   r“  r€   r‹  rŒ  r  rs  rt  ré   ri  ró   r7  rs   r—  r"  rŒ   rå   )Zexpected_messageZexpected_inforz   rX   ri  r€  rŽ  r|   rl  r  rU  r   )rh  r{   r   Útest_write_error_propagation   sF     ÿ
ÿ$rm  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   Zinvoke_scriptr   r   r   r   Útest_interpreter_shutdownç  s    rn  c                   @   s   e Zd ZdZdd„ ZdS )Ú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>)r;  Útrace_contextrz  )rO   r\   r—   rr  r   r   r   r˜   ó  s    ÿzTracingFlightServer.do_actionNr=  r   r   r   r   ro  ð  s   ro  c               
   C   s`   t dt ¡ idD} td| jfƒ*}tjddgd}|jd|dD ]}qBW 5 Q R X W 5 Q R X d S )	Nrp  rõ  rœ   )s   traceparents7   00-000ff00f00f0ff000f0f00ff0f00fff0-000f0000f0f00000-00)s
   tracestaterš   rï  )rš   rš   r_   )ro  r   ZTracingServerMiddlewareFactoryr   r“  rÒ  r˜   )r€  rŽ  rN   ró   r   r   r   Útest_tracingü  s     ÿýürs  c               	   C   sD   t ddd} d}tjt|d | jtj d¡d d W 5 Q R X d S )Nzgrpc+tls://localhost:9643Tr  zRArgument 'schema' has incorrect type \(expected pyarrow.lib.Schema, got NoneType\)r  r8   rº   )r   rs  rt  ru  r€   r   rY   rp  )rŽ  Úmsgr   r   r   Ú.test_do_put_does_not_crash_when_schema_is_none	  s    ÿÿru  )«rE  r  r¼   r   r   rM  rt   rÇ  r‹  rÂ   r    ra  Únumpyr  rs  r   r2   Zpyarrow.libr   r   Zpyarrow.utilr   Zpyarrow.testsr   r   r   r   r   r	   r
   r   r   r   r   ÚImportErrorÚobjectÚmarkZ
pytestmarkr   r   r%   r*   r7   r@   rF   rG   ri   r…   r   r™   r¦   r°   r±   rµ   r¸   r¾   rÄ   r×   rõ   r  r  r  r  r  r  r   r+  r1  r:  r>  r?  rB  rE  rG  rH  rI  rL  rQ  rR  rS  rZ  r[  r]  ra  rb  rc  rv  r|  r  rƒ  Zslowr‘  r–  r™  r£  Zpandasr¥  r¦  r§  r¬  r­  r®  r¯  rÁ  rÂ  rÄ  ZskipifrÉ  rË  rÎ  rÏ  rÑ  rÓ  rÔ  rÖ  rÚ  rä  rÜ  rà  râ  rå  ræ  Z%header_auth_server_middleware_factoryrê  rí  rî  rô  rö  rù  rû  rý  Zrequires_testing_datar  r  r
  r  r  r  r  r  r  r$  r%  r'  r,  r2  r3  r5  r6  r:  r;  r<  r>  r@  rA  rC  rI  rK  rL  rZ  r[  Zlarge_memoryr]  r^  r_  rf  rm  rn  ro  rs  ru  r   r   r   r   Ú<module>   sp  ,


#*2F	


	
'"
	


	
	ÿ

 ÿ ÿ

ÿ


 	




 	3&',
&
. 
F	