o
    'i                    @   sv  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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$m%Z% W n! ey   dZe&e&ZZe&e&ZZ e&e&Z!Z"e&e&Z#Z$e&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Z0G dd deZ1G dd deZ2G dd de2Z3G dd de2Z4G d d! d!e2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 d,d- d-eZ;G d.d/ d/eZ<G d0d1 d1eZ=G d2d3 d3eZ>G d4d5 d5eZ?G d6d7 d7e Z@G d8d9 d9eZAG d:d; d;e ZBG d<d= d=eZCd>d? ZDG d@dA dAe$ZEG dBdC dCe#ZFG dDdE dEe"ZGG dFdG dGe!ZHG dHdI dIeZIG dJdK dKe"ZJG dLdM dMe!ZKG dNdO dOeZLG dPdQ dQe!ZMG dRdS dSe"ZNG dTdU dUeZOG dVdW dWeZPG dXdY dYe"ZQG dZd[ d[e$ZRG d\d] d]e#ZSG d^d_ d_e"ZTG d`da dae$ZUG dbdc dce$ZVG ddde dee#ZWG dfdg dge"ZXG dhdi die!ZYG djdk dkeZZdldm Z[dndo Z\dpdq Z]drds Z^dtdu Z_ej'jej'j`dvdw Zadxdy Zbdzd{ Zcd|d} Zdej'jed~d Zfdd Zgdd Zhdd Zidd Zjdd ZkG dd deZldd Zmdd Zndd Zoej'jpejqdkdddd Zrej'j`dd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}e?ddidZ~eAddidZej'j`dd Zej'jpejqdkdddd Zdd Zdd Zdd ZeG ZeC Zdd Zdd Zdd Zdd ZddĄ ZddƄ ZddȄ Zej'j`ej'jddʄ Zej'jdd̄ Zej'jdd΄ Zej'jddЄ Zdd҄ ZddԄ Zddք Zdd؄ Zej'jddڄ Zej'j`dd܄ Zej'jej'j`ddބ Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zej'jdd Zdd Zdd Zdd Zdd Zdd Zdd Zej'jdd ZG dd  d eZej'jdd Zdd Zej'jej'j`dd Zej'jej'j`dd ZG d	d
 d
e2Zdd Zej'j`dd Zdd ZG dd deZdd Zdd Zdd Zdd Zejdd Zej'jdddgdd d!d" ZdS (#      N)datetime)IpcReadOptions	ReadStatstobytes)find_free_port)util)flight)	FlightClientFlightServerBaseServerAuthHandlerClientAuthHandlerServerMiddlewareServerMiddlewareFactoryClientMiddlewareClientMiddlewareFactoryFlightCallOptionsc                  C   s   dd l } d S )Nr   )pyarrow.flight)pyarrow r   W/home/ubuntu/transcripts/venv/lib/python3.10/site-packages/pyarrow/tests/test_flight.pytest_importA   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_rootF   s   r   c              	   C   sx   t  }|sdS z||  d}| W  d   W S 1 sw   Y  W dS  ty;   td||   dt  w )z)Get the contents of a test resource file.NrbzTest resource z< not found; did you initialize the test resource submodule?
)r   openreadFileNotFoundErrorr   	traceback
format_exc)pathrootfr   r   r   read_flight_resourceN   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ir      
   	some_intsnames)paarrayTablefrom_arrays)datar   r   r   simple_ints_tablen   s   r;   c                  C   sz   t jg dt  d} t jg dt  d}t t jg d| t jddg| t jddg|gg}t jj|d	gd
S )N)foobazquuxtype)r<   r=   r>   new)   r   N   rB   r      
some_dictsr4   )r6   r7   utf8chunked_arrayDictionaryArrayr9   r8   )dict_valuesnew_dict_valuesr:   r   r   r   simple_dicts_tableu   s   rK   c                   C   s,   t jjt g dt g dgddgdS )N)r<   barr=   quxrB   rC   rD      abr4   )r6   r8   r9   r7   r   r   r   r   multiple_column_table   s
   rR   c                       s6   e Zd ZdZdZd
 fdd	Zdd Zdd	 Z  ZS )ConstantFlightServerzA 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;   rK   rR   table_factoriesoptions)selflocationrZ   kwargs	__class__r   r   rX      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   
FlightInfor6   schemaFlightDescriptorfor_pathr[   contextcriteriar   r   r   list_flights   s   


z!ConstantFlightServer.list_flightsc                 C   s   | j |j  }tj|| jdS )NrZ   )rY   ticketr   RecordBatchStreamrZ   )r[   rg   rk   tabler   r   r   do_get   s   zConstantFlightServer.do_getNN)	__name__
__module____qualname____doc__ra   rX   ri   rn   __classcell__r   r   r^   r   rS      s    
rS   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   rW   rX   rZ   r[   rZ   r]   r^   r   r   rX         
zMetadataFlightServer.__init__c                 C   s<   t g dg}t jj|dgd}tj|j| || jdS )Nr/   rP   r4   rj   )	r6   r7   r8   r9   r   GeneratorStreamrc   number_batchesrZ   )r[   rg   rk   r:   rm   r   r   r   rn      s   zMetadataFlightServer.do_getc           
   	   C   s   d}g d}|j jdksJ |D ]:\}}|tjt|| ggdgs(J |d us.J td|	 \}	||	ks=J |
td| |d7 }q|j jdksSJ |j jdks[J d S )Nr   r/   rB   rP   <i   r1   )statsnum_messagesequalsr6   RecordBatchr9   r7   structunpack
to_pybyteswritepacknum_record_batches)
r[   rg   
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 )Nr}   )	enumerate
to_batchesr   r   )rm   idxr   r   r   r   r   r|      s
   z#MetadataFlightServer.number_batchesN)
rp   rq   rr   rs   rX   rn   r   staticmethodr|   rt   r   r   r^   r   ru      s    
ru   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   )rW   rX   last_messageexpected_schema)r[   r\   r   r]   r^   r   r   rX      s   
zEchoFlightServer.__init__c                 C   s   t | jS r   )r   rl   r   r[   rg   rk   r   r   r   rn      s   zEchoFlightServer.do_getc                 C   s$   | j r| j |jksJ | | _d S r   )r   rc   read_allr   r[   rg   r   r   r   r   r   r   r      s   zEchoFlightServer.do_putc                 C   s   |D ]}qd S r   r   )r[   rg   r   r   r   chunkr   r   r   do_exchange   s   zEchoFlightServer.do_exchangero   )	rp   rq   rr   rs   rX   rn   r   r   rt   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   r{   r   rc   r   r   r   r   r   rn      s   zEchoStreamFlightServer.do_getc                 C      g S r   r   r[   rg   r   r   r   list_actions      z#EchoStreamFlightServer.list_actionsc                 C   $   |j dkr| | dgS tNwho-am-iutf-8r@   peer_identitypeerencodeNotImplementedErrorr[   rg   actionr   r   r   	do_action      
z EchoStreamFlightServer.do_actionNrp   rq   rr   rs   rn   r   r   r   r   r   r   r      
    r   c                   @   r   )	EchoTableStreamFlightServerz,An echo server that streams the whole table.c                 C   s   t | jj| jgS r   )r   r{   r   rc   r   r   r   r   rn      s   z"EchoTableStreamFlightServer.do_getc                 C   r   r   r   r   r   r   r   r     r   z(EchoTableStreamFlightServer.list_actionsc                 C   r   r   r   r   r   r   r   r     r   z%EchoTableStreamFlightServer.do_actionNr   r   r   r   r   r      r   r   c                   @   r   )	'EchoRecordBatchReaderStreamFlightServerzCAn echo server that streams the whole table as a RecordBatchReader.c                 C   s   t | jj| j gS r   )r   r{   r   rc   	to_readerr   r   r   r   rn     s   
z.EchoRecordBatchReaderStreamFlightServer.do_getc                 C   r   r   r   r   r   r   r   r     r   z4EchoRecordBatchReaderStreamFlightServer.list_actionsc                 C   r   r   r   r   r   r   r   r     r   z1EchoRecordBatchReaderStreamFlightServer.do_actionNr   r   r   r   r   r   
  r   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 )NrP       grpc://test	localhost  2023-04-05T12:34:56.789012345nszendpoint app metadatarB   *   Tzinfo app metadata)r   rb   r6   rc   int32FlightEndpointLocationfor_grpc_tcpscalarcast	timestampr[   rg   r   r   r   r   get_flight_info  s    	z#GetInfoFlightServer.get_flight_infoc                 C   s   |  ||}t|jS r   )r   r   SchemaResultrc   )r[   rg   r   infor   r   r   
get_schema1  s   zGetInfoFlightServer.get_schemaN)rp   rq   rr   rs   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_actions9  s   
z(ListActionsFlightServer.expected_actionsc                 c   s    |   E d H  d S r   )r   r   r   r   r   r   A  s   z$ListActionsFlightServer.list_actionsN)rp   rq   rr   rs   classmethodr   r   r   r   r   r   r   6  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   H  s   
z)ListActionsErrorFlightServer.list_actionsN)rp   rq   rr   rs   r   r   r   r   r   r   E      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   )rW   rX   expected_ticket)r[   r   r\   r]   r^   r   r   rX   P  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?   rP   r4   )	r   rk   r6   r7   r   r8   r9   r   rl   )r[   rg   rk   data1rm   r   r   r   rn   T  s   
zCheckTicketFlightServer.do_getc                 C   s   |  | _d S r   )r   r   )r[   rg   r   r   r   r   r   r   Z     zCheckTicketFlightServer.do_putr   )rp   rq   rr   rs   rX   rn   r   rt   r   r   r^   r   r   M  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.rP   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      $@rP   r4   )
r6   r7   r   float64r@   r8   r9   rc   r   r{   )r[   rg   rk   r   data2table1table2r   r   r   rn   c  s   z InvalidStreamFlightServer.do_getNrp   rq   rr   rs   r6   rc   r   rn   r   r   r   r   r   ^      r   c                   @   r   )NeverSendsDataFlightServerz0A Flight server that never actually yields data.rP   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_datar1   rc   )rk   rc   empty_tabler6   r   r9   ranger   r{   	itertoolsrepeat)r[   rg   rk   r:   r   r   r   rn   s  s   
z!NeverSendsDataFlightServer.do_getNr   r   r   r   r   r   n  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 )NrP   )r   r{   r6   rc   r   slow_streamr   r   r   r   rn     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?   rP   r4   r2   )r6   r7   r   r8   r9   r   r   )r   r   r   r   r     s
   
zSlowFlightServer.slow_streamN)rp   rq   rr   rs   rn   r   r   r   r   r   r   r   r     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   r6   ArrowInvalidKeyErrorr   r   r   r   error_cases  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   )r[   rg   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   rb   r6   rc   rd   re   r   rf   r   r   r   ri     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  )r[   rg   r   r   r   r	  r   r   r   r     s   










zErrorFlightServer.do_putN)	rp   rq   rr   rs   r   r  r   ri   r   r   r   r   r   r     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                    rv   rw   rx   ry   r^   r   r   rX     rz   zExchangeFlightServer.__init__c                 C   s   |j jdksJ |jtjjkrtd|jdkr | 	|||S |jdkr,| 
|||S |jdkr8| |||S |jdkrD| |||S td|j )Nr   z!Must provide a command descriptor   echo   get   put	   transformzUnknown command: )r   r   descriptor_typer   DescriptorTypeCMDr6   r  r
  exchange_echoexchange_do_getexchange_do_putexchange_transformr   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    (  rP   r4   N)r6   r8   r9   r7   r   beginrc   write_table)r[   rg   r   r   r:   r   r   r   r    s   z$ExchangeFlightServer.exchange_do_getc                 C   s^   d}|D ]}|j std|jjdksJ |d7 }q|jj|ks#J |t|d dS )Emulate DoPut with DoExchange.r   zAll chunks must have data.rB   r   N)	r:   r6   r  r   r   r   write_metadatastrr   )r[   rg   r   r   num_batchesr   r   r   r   r    s   

z$ExchangeFlightServer.exchange_do_putc                 C   s   |j jdksJ d}|D ]A}|s|jr|j|jj| jd d}|jr.|jr.||j|j q|jr8||j q|jrJ|j jdksCJ |	|j qJ ddS )zRun a simple echo server.r   Frj   TzShould not happenN)
r   r   r:   r  rc   rZ   app_metadatawrite_with_metadatar  write_batch)r[   rg   r   r   startedr   r   r   r   r    s   
z"ExchangeFlightServer.exchange_echoc                 C   s   |j jdksJ |jD ]}tj|jstdt| q|	 }|j jdks*J dg|j
 }|D ]}t|D ]\}}	||  |	 7  < q8q2tjjt|gdgd}
||
j ||
 dS )zSum rows in an uploaded table.r   zInvalid field: sumr4   N)r   r   rc   r6   types
is_integerr@   r  reprr   num_rowsr   as_pyr8   r9   r7   r  r  )r[   rg   r   r   fieldrm   sumscolumnrowvalueresultr   r   r   r    s   
z'ExchangeFlightServer.exchange_transformr   )rp   rq   rr   rs   rX   r   r  r  r  r  rt   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 )HttpBasicServerAuthHandler7An example implementation of HTTP basic authentication.c                       t    || _d S r   rW   rX   credsr[   r4  r^   r   r   rX        

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usernamer4  r  passwordr   r   )r[   outgoingincomingr   authr   r   r   authenticate  s   

z'HttpBasicServerAuthHandler.authenticatec                 C   s&   |st d|| jvrt d|S )Nztoken not providedr7  )r   r  r4  r[   tokenr   r   r   is_valid$  s
   


z#HttpBasicServerAuthHandler.is_validrp   rq   rr   rs   rX   r?  rB  rt   r   r   r^   r   r0    
    	r0  c                       r/  )HttpBasicClientAuthHandlerr1  c                    s"   t    t||| _d | _d S r   )rW   rX   r   r8  
basic_authrA  r[   r:  r;  r^   r   r   rX   /  s   

z#HttpBasicClientAuthHandler.__init__c                 C   s"   | j  }|| | | _d S r   )rF  	serializer   r!   rA  )r[   r<  r=  r>  r   r   r   r?  4  s   

z'HttpBasicClientAuthHandler.authenticatec                 C      | j S r   rA  r[   r   r   r   	get_token9     z$HttpBasicClientAuthHandler.get_tokenrp   rq   rr   rs   rX   r?  rL  rt   r   r   r^   r   rE  ,  s
    rE  c                       r/  )TokenServerAuthHandler:An example implementation of authentication via handshake.c                    r2  r   r3  r5  r^   r   r   rX   @  r6  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!   r4  r   base64	b64encoder   r  )r[   r<  r=  r:  r;  r   r   r   r?  D  s   z#TokenServerAuthHandler.authenticatec                 C   s*   t |}|dstd|dd  S )NrQ  zinvalid token   )rR  	b64decode
startswithr   r  r@  r   r   r   rB  M  s   


zTokenServerAuthHandler.is_validrC  r   r   r^   r   rO  =  rD  rO  c                       r/  )TokenClientAuthHandlerrP  c                    s    t    || _|| _d| _d S )Nr   )rW   rX   r:  r;  rA  rG  r^   r   r   rX   W  s   

zTokenClientAuthHandler.__init__c                 C   s&   | | j | | j | | _d S r   )r   r:  r;  r!   rA  r[   r<  r=  r   r   r   r?  ]  s   z#TokenClientAuthHandler.authenticatec                 C   rI  r   rJ  rK  r   r   r   rL  b  rM  z TokenClientAuthHandler.get_tokenrN  r   r   r^   r   rW  T  s
    rW  c                   @   r   )NoopAuthHandlerzA no-op auth handler.c                 C      dS )zDo nothing.Nr   rX  r   r   r   r?  i  s    zNoopAuthHandler.authenticatec                 C   rZ  )zV
        Returning an empty string.
        Returning None causes Type error.
        r   r   r@  r   r   r   rB  l  s   zNoopAuthHandler.is_validN)rp   rq   rr   rs   r?  rB  r   r   r   r   rY  f      rY  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_lookupt  s
   r_  c                   @   r   )	!ClientHeaderAuthMiddlewareFactoryz@ClientMiddlewareFactory that creates ClientAuthHeaderMiddleware.c                 C   
   g | _ d S r   call_credentialrK  r   r   r   rX        
z*ClientHeaderAuthMiddlewareFactory.__init__c                 C      t | S r   )ClientHeaderAuthMiddlewarer[   r   r   r   r   
start_call     z,ClientHeaderAuthMiddlewareFactory.start_callc                 C   
   || _ d S r   rb  )r[   rc  r   r   r   set_call_credential  rd  z5ClientHeaderAuthMiddlewareFactory.set_call_credentialN)rp   rq   rr   rs   rX   rh  rk  r   r   r   r   r`  }  s
    r`  c                   @   r   )rf  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   rj  r   factoryr[   rm  r   r   r   rX     rd  z#ClientHeaderAuthMiddleware.__init__c                 C   s0   t |d}|r| jd|d dg d S d S )NAuthorization   authorizationr   r   )r_  rm  rk  r   )r[   r]  auth_headerr   r   r   received_headers  s   

z+ClientHeaderAuthMiddleware.received_headersN)rp   rq   rr   rs   rX   rr  r   r   r   r   rf    s    rf  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|)Nro  r    r   zInvalid credentialsBasicrB   r   :testr;  	token1234Bearer)r_  splitrR  rU  decoder   r  HeaderAuthServerMiddleware)	r[   r   r]  rq  valuesrA  error_messagedecodedpairr   r   r   rh    s(   


z,HeaderAuthServerMiddlewareFactory.start_callNrp   rq   rr   rs   rh  r   r   r   r   rs    r   rs  c                   @   r   )r|  zBA ServerMiddleware that transports incoming username and password.c                 C   rj  r   rJ  r@  r   r   r   rX     rd  z#HeaderAuthServerMiddleware.__init__c                 C   s   dd| j  iS )NauthorizationzBearer rJ  rK  r   r   r   sending_headers  r   z*HeaderAuthServerMiddleware.sending_headersNrp   rq   rr   rs   rX   r  r   r   r   r   r|    r[  r|  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>  ro  rt  rB   r   zNo token auth middleware found.)get_middlewarer_  r  rz  r   r   r  )r[   rg   r   
middlewarerq  r}  r   r   r   r     s   

z HeaderAuthFlightServer.do_actionNrp   rq   rr   rs   r   r   r   r   r   r    r   r  c                   @   r   )'ArbitraryHeadersServerMiddlewareFactoryz<A ServerMiddlewareFactory that transports arbitrary headers.c                 C      t |S r   ) ArbitraryHeadersServerMiddlewarer[   r   r]  r   r   r   rh    ri  z2ArbitraryHeadersServerMiddlewareFactory.start_callNr  r   r   r   r   r    r   r  c                   @   r   )r  z5A ServerMiddleware that transports arbitrary headers.c                 C   rj  r   r=  )r[   r=  r   r   r   rX     rd  z)ArbitraryHeadersServerMiddleware.__init__c                 C   rI  r   r  rK  r   r   r   r    rM  z0ArbitraryHeadersServerMiddleware.sending_headersNr  r   r   r   r   r    r[  r  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)r  r  r_  r   r   FlightServerError)	r[   rg   r   r  r]  header_1header_2value1value2r   r   r   r     s   

z&ArbitraryHeadersFlightServer.do_actionNr  r   r   r   r   r    r   r  c                   @   r   )HeaderServerMiddlewarez/Expose a per-call value to the RPC method body.c                 C   rj  r   )special_value)r[   r  r   r   r   rX     rd  zHeaderServerMiddleware.__init__N)rp   rq   rr   rs   rX   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   rh  	  ri  z(HeaderServerMiddlewareFactory.start_callNr  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 )Nrw  r   )r  r  r   )r[   rg   r   r  r   r   r   r     s   
zHeaderFlightServer.do_actionNr  r   r   r   r   r    r   r  c                   @   r   )MultiHeaderFlightServer8Test sending/receiving multiple (binary-valued) headers.c                 C   s    | d}t|jd}|gS )Nrw  r   )r  r&  client_headersr   )r[   rg   r   r  r]  r   r   r   r     s   
z!MultiHeaderFlightServer.do_actionNr  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  )r[   r   r]  rA  r   r   r   rh  #  s   


z/SelectiveAuthServerMiddlewareFactory.start_callNr  r   r   r   r   r     r   r  c                   @      e Zd Zdd ZdS )$SelectiveAuthClientMiddlewareFactoryc                 C   s   t  S r   )SelectiveAuthClientMiddlewarerg  r   r   r   rh  4  rM  z/SelectiveAuthClientMiddlewareFactory.start_callN)rp   rq   rr   rh  r   r   r   r   r  3      r  c                   @   r  )r  c                 C   s   ddiS )Nr  r;  r   rK  r   r   r   r  9  s   z-SelectiveAuthClientMiddleware.sending_headersN)rp   rq   rr   r  r   r   r   r   r  8  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   rW   rX   methodsrK  r^   r   r   rX   B  r6  z)RecordingServerMiddlewareFactory.__init__c                 C      | j |j d S r   r  appendr  r  r   r   r   rh  F     z+RecordingServerMiddlewareFactory.start_callrp   rq   rr   rs   rX   rh  rt   r   r   r^   r   r  ?      r  c                       r  ) RecordingClientMiddlewareFactoryr  c                    r  r   r  rK  r^   r   r   rX   N  r6  z)RecordingClientMiddlewareFactory.__init__c                 C   r  r   r  rg  r   r   r   rh  R  r  z+RecordingClientMiddlewareFactory.start_callr  r   r   r^   r   r  K  r  r  c                   @   r   )"MultiHeaderClientMiddlewareFactoryr  c                 C   s
   i | _ d S r   )last_headersrK  r   r   r   rX   Z  s   
z+MultiHeaderClientMiddlewareFactory.__init__c                 C   re  r   )MultiHeaderClientMiddlewarerg  r   r   r   rh  _  ri  z-MultiHeaderClientMiddlewareFactory.start_callN)rp   rq   rr   rs   rX   rh  r   r   r   r   r  W      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<   rL          r=   )zx-textzx-binary-binzx-MIXED-cases   x-other-MIXED-casec                 C   rj  r   rl  rn  r   r   r   rX   n  rd  z$MultiHeaderClientMiddleware.__init__c                 C   rI  r   )EXPECTEDrK  r   r   r   r  q  rM  z+MultiHeaderClientMiddleware.sending_headersc                 C   s   | j j| d S r   )rm  r  update)r[   r]  r   r   r   rr  t  s   z,MultiHeaderClientMiddleware.received_headersN)rp   rq   rr   rs   r  rX   r  rr  r   r   r   r   r  c  s    r  c                   @   r   )"MultiHeaderServerMiddlewareFactoryr  c                 C   r  r   )MultiHeaderServerMiddlewarer  r   r   r   rh  }  ri  z-MultiHeaderServerMiddlewareFactory.start_callNr  r   r   r   r   r  z  r   r  c                   @   r   )r  r  c                 C   rj  r   )r  )r[   r  r   r   r   rX     rd  z$MultiHeaderServerMiddleware.__init__c                 C   s   t jS r   )r  r  rK  r   r   r   r    rM  z+MultiHeaderServerMiddleware.sending_headersNr  r   r   r   r   r    r[  r  c                       r/  )LargeMetadataFlightServerz Regression test for ARROW-13253.c                    s    t  j|i | dd | _d S )N           )rW   rX   	_metadata)r[   argsr]   r^   r   r   rX     s   z"LargeMetadataFlightServer.__init__c                 C   s6   t dt  fg}t|t jdgg|d| jfgS )NrP   rB   r   )r6   rc   int64r   r{   record_batchr  )r[   rg   rk   rc   r   r   r   rn     s   z LargeMetadataFlightServer.do_getc                 C   s   | | j d S r   )r  r  r   r   r   r   r     s   z%LargeMetadataFlightServer.do_exchange)rp   rq   rr   rs   rX   rn   r   rt   r   r   r^   r   r    s
    r  c                  C   s4  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sJ t ttg |ksJ t ttdgdksJ t td|	ksJ |jtg ksJ td tj g dddd}d}t ||ksJ |jd u sJ tt tdd  W d    n1 sw   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 s0w   Y  tt tjdg dd W d    n	1 sNw   Y  tt tjdg td d!d"dd#d$d W d    n	1 ssw   Y  tt tjdg t d% W d    d S 1 sw   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   rL   userpass   foo2023-04-05T12:34:56s   endpoint app metadatarB   r   T   test app metadatagrpc+tcp://localhost:1234)intr  z1<pyarrow.flight.SchemaResult schema=(int: int64)>z<pyarrow.flight.FlightInfo schema=None descriptor=<pyarrow.flight.FlightDescriptor path=[]> endpoints=[] total_records=1 total_bytes=42 ordered=True app_metadata=b'test app metadata'>r   s   grpc://testz2023-04-05T01:02:03)expiration_timei  rO   r1   rC   rD   r  )r&  r   Actionr   r8  rd   for_commandr   r6   r   r   r   rb   rc   re   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_repr  sv   		 $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   rL   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<   rL   r=   r   r   r   r   r   r       
 
c                   S   r  )Nr  r  user2r   r8  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   rd   r  re   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   r6   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   rb   r6   rc   rd   re   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   rb   r6   rc   rd   re   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   rb   r6   rc   rd   re   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_recordsrB   r   rb   r6   rc   rd   re   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  1  r  c                   S      t dt dfS )Nr  r  )r   r   r   r   r   r   r  8  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   r6   rc   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   rb   r6   rc   rd   re   r  r  )fi1fi2fi3r   r   r   test_flight_info_defaultsL  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)	locationsr\   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_exceptioni  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   r\   r   r   r  u  s   
z-test_client_wait_for_available.<locals>.serveTtargetdaemonr1   timeoutr   )r   r	   	threadingThreadstartr   wait_for_available)r  r  clientthreadr"  elapsedr   r  r   test_client_wait_for_availableo  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   rB   N)rS   r   connectportlistri   ra   len)r  r  flightsr   r   r   test_flight_list_flights  s   Pr#  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   )rS   r   r  r  r   ri   closer  r  r6   r  r  r  r   r   r   test_flight_client_close  s   Pr&  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 sw   Y  W d   n1 sw   Y  tjtjddH tdd*}td|jf}|td }W d   n1 sw   Y  W d   n1 sw   Y  W d   dS W d   dS 1 sw   Y  dS )	Try a simple do_get call.r   rT   Nmetadata_versionrj   z+expected IpcWriteOptions, got <class 'int'>matchr   )r;   rS   r   r  r  rn   r  r   r   r6   ipcIpcWriteOptionsMetadataVersionV4r   r  r  r  )rm   r  r  r:   rZ   r   r   r   test_flight_do_get_ints  sL     	 "r0  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   rT   r3   r   N)r;   rS   r   r  r  rn   r  read_pandasr   r+  	to_pylist)rm   r  r  r:   r   r   r   test_do_get_ints_pandas  s    Pr3  c               
   C   s   t  } t R}td|jf1}|td}|jjdks J |	 }|
| s+J |jtddddddks9J W d    n1 sCw   Y  W d    d S W d    d S 1 s[w   Y  d S )	Nr   rU   rB   r~   rD   rC   r   r   r   num_dictionary_batchesnum_dictionary_deltasnum_replaced_dictionaries)rK   rS   r   r  r  rn   r  r   r   r   r   r   )rm   r  r  r   r:   r   r   r   test_flight_do_get_dicts  s"   Pr8  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?   rP   r4   s
   the-ticket)r   r   N)r6   r7   r   r8   r9   r   r   r  r  rn   r  r   r   )r   rm   r  r  r:   r   r   r   test_flight_do_get_ticket  s   Pr9  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sJ |jd j
dksJ |jd jd tjddksJ W d	   d	S 1 sw   Y  d	S )z8Make sure FlightEndpoint accepts string and object URIs.r   r   rB   r   s   info app metadatarP   rC   r   Nr   z#2023-04-05T12:34:56.789012345+00:00r   UTCr  r   )r   r	   r  r   r   rd   r  r  r  r  r  rc   r6   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   rP   N)
r   r	   r  r   r   rd   r  rc   r6   r   r<  r   r   r   test_flight_get_schema  s    Pr>  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 sw   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,    	

Pr?  c                   @   r   )ConvenienceServerzT
    Server for testing various implementation conveniences (auto-boxing, etc.)
    c                 C   s   g dS )N)r  r  s   bazr   rK  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   rg   r   r   r    s   z(ConvenienceServer.do_action.<locals>.gen)r@   rA  bodyr6   ArrowMemoryError)r[   rg   r   r  r   rH  r   r     s   




zConvenienceServer.do_actionN)rp   rq   rr   rs   propertyrA  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   rI  .0xr   r   r   
<listcomp>)      z5test_do_action_result_convenience.<locals>.<listcomp>rB  s   the-bodyc                 S   rL  r   rM  rN  r   r   r   rQ  .  rR  rC  )r@  r	   r  r   rA  )r  r  resultsrI  r   r   r   !test_do_action_result_convenience$  s   PrT  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*  rD  rJ  rE  )	r@  r	   r  r  r  r   r  r   r   r%  r   r   r   test_nicer_server_exceptions2  s    PrU  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_portA  s   rW  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 sw   Y  dS )z3Try a simple do_get call over a Unix domain socket.r  rT   rU   N)tempfileNamedTemporaryFiler$  r   r   for_grpc_unixnamerS   r	   rn   r  r;   rc   r   r   rK   )sockr\   r  r   rm   r:   r   r   r   test_flight_domain_socketJ  s.   
 "r_  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   rP   r4   )r   r   rw  r   N)r6   r8   r9   r7   r   r   rc   r	   r  r   r   rd   re   r  r$  rn   r  r   r   r:   r  r  r   _r.  r   r   r   test_flight_large_messagea  s"   Prb  c               	   C      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  rP   r4   r   rw  r   N)r6   r8   r9   r7   r   r   r	   r  r   r   rd   re   rc   r  r$  rn   r  r   r   r`  r   r   r   'test_flight_generator_stream_of_batchesw  "   
Prd  c               	   C      t jjt g dt t  t  t g dgddgd} t O}td|j	f/}|
tjd| j\}}||  |  |td }|| sRJ W d	   n1 s\w   Y  W d	   d	S W d	   d	S 1 stw   Y  d	S )
z_
    Try downloading a flight of RecordBatches with dictionaries
    in a GeneratorStream.
    r<   rL   r=   r<   r<   {      iY  i  i7  rP   rQ   r4   r   rw  r   Nr6   r8   r9   r7   
dictionaryr  rF   r   r	   r  r   r   rd   re   rc   r  r$  rn   r  r   r   r`  r   r   r   1test_flight_generator_stream_of_batches_with_dict  (   

Prm  c               	   C   rc  )	z7Try downloading a flight of Table in a GeneratorStream.r   r  rP   r4   r   rw  r   N)r6   r8   r9   r7   r   r   r	   r  r   r   rd   re   rc   r  r$  rn   r  r   r   r`  r   r   r   %test_flight_generator_stream_of_table  re  ro  c               	   C   rf  )
zW
    Try downloading a flight of Table with dictionaries
    in a GeneratorStream.
    rg  rh  rP   rQ   r4   r   rw  r   Nrk  r`  r   r   r   /test_flight_generator_stream_of_table_with_dict  rn  rp  c               	   C   rc  )	zCTry downloading a flight of RecordBatchReader in a GeneratorStream.r   r  rP   r4   r   rw  r   N)r6   r8   r9   r7   r   r   r	   r  r   r   rd   re   rc   r  r$  rn   r  r   r   r`  r   r   r   3test_flight_generator_stream_of_record_batch_reader  re  rq  c               	   C   rf  )
zc
    Try downloading a flight of RecordBatchReader with dictionaries
    in a GeneratorStream.
    rg  rh  rP   rQ   r4   r   rw  r   Nrk  r`  r   r   r   =test_flight_generator_stream_of_record_batch_reader_with_dict  rn  rr  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  r6   ArrowExceptionrn   r   r  r   r%  r   r   r   $test_flight_invalid_generator_stream  s   Prt  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  rj   N)r   r	   r  r   r  r   r  r  r   r   r   )r  r  r   rZ   r   r   r   test_timeout_fires  s   Pru  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  rT   rj   N)rS   r	   r  r   r   rn   r  r   )r  r  rZ   r   r   r   test_timeout_passes  s   Prv  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.rN   rQ   r4   r   rB   )included_fields)read_optionsrV   rj   rC   N)r6   r8   r9   r7   rS   r	   r  r   r   r   rn   r  r   num_columnsrR   )expectedr  r  rZ   	response1	response2r   r   r   test_read_options  s*   
Pr}     tests   p4ssw0rd)r4  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_unauth  s   Pr  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   rw  p4ssw0rdr~  N)r   r  r	   r  r   r  r?  rE  r   nextrI  r   )r  r  r   rS  identitypeer_addressr   r   r   test_http_basic_auth)  s   
Pr  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*  rw  wrongN)r   r  r	   r  r   r  r  r  r  r?  rE  r  r   r  r   r   r   %test_http_basic_auth_invalid_password8  s   Pr  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   rw  r  r~  N)r   token_auth_handlerr	   r  r   r  r?  rW  r  r   rI  r   )r  r  r   r  r   r   r   test_token_authC  s   Pr  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 )r  r  r   rw  r  N)
r   r  r	   r  r  r  r   r  r?  rW  r%  r   r   r   test_token_auth_invalidM  s   Pr  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  r  r   r~     passwordr   rp  rB      Bearer token1234N)r  no_op_auth_handlerrs  r	   r  authenticate_basic_token)r  r  
token_pairr   r   r   test_authenticate_basic_tokenY  s   Pr  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>  r  r   r~  s   badpasswordN)
r  r  rs  r	   r  r  r  r   r  r  r%  r   r   r   .test_authenticate_basic_token_invalid_passwordd  s   Pr  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>  r  r   r~  r  r   rp  rB   r  r]  test-actionr   r   rZ   	   token1234N)r  r  rs  r	   r  r  r   r   r   r   r  rI  r   r  r  r  rZ   r.  r   r   r   (test_authenticate_basic_token_and_actionn  s    Pr  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 sw   Y  dS )zTest authenticate_basic_token with client middleware
       to intercept authorization header returned by the
       HTTP header auth enabled server.
    r>  r  r   r  s   test:passwordrp  s   Basic r  r  r   r  r   r  rB   r  N)r  r  rs  r`  r	   r  rR  rS  r   r   r   r   r  rI  r   rc  r$  )r  client_auth_middlewarer  encoded_credentialsrZ   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  r  r   r~  r  r   rp  rB   r  )s   test-header-1   value1)s   test-header-2   value2r  r  r   rj   r  r  N)r  r  rs  r  r	   r  r  r   r   r   r   r  rI  r   r  r   r   r   -test_arbitrary_headers_in_flight_call_options  s4   
Pr  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  r6   r  r   r  rS   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:rT   N)r.   rS   r	   r  r  r  r  r   FlightUnavailableErrorrn   r  r   certsr  r  r   r   r   test_tls_fails  s   Pr  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_certsrT   N)
r;   r.   rS   r	   r  rn   r   r  r   r   rm   r  r  r  r:   r   r   r   test_tls_do_get  s   
Pr  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 availablerT   N)r;   r.   rS   r	   r  r   r  skiprn   r   r  r   r   r$  r  r   r   r   $test_tls_disable_server_verification  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_hostnamerT   N)
r.   rS   r   r  r  r  r  r  rn   r  r  r   r   r   test_tls_override_hostname  s   Pr  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/   rP   r4   r   r   r   r}   rB   N)r6   r7   r8   r9   ru   r	   r  rn   r   r  r  r   r   r   from_batchesr   )
r:   rm   batchesr  r  r   r   r   metadata
server_idxr   r   r   test_flight_do_get_metadata  s$   

Pr  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sJ |d7 }q|W d   n1 sw   Y  W d   n1 sw   Y  | |ksJ dS )z0Verify the iterator interface works as expected.r   r   r   Tr}   rB   N)ru   r	   r  rn   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_iterator  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/   rP   r4   r(  rj   r   r   N)r6   r8   r9   r7   r,  r-  r.  r/  ru   r	   r  rn   r   r  r   r   )rm   rZ   r  r  r   r:   r   r   r   test_flight_do_get_metadata_v44  s   Pr  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/   rP   r4   r   r   rB   r   r}   N)r6   r7   r8   r9   ru   r	   r  r   r   rd   re   rc   r   r   r   r   r   r!   r   r   )r:   rm   r  r  r   metadata_readerr   r   r  r   r  r   r   r   test_flight_do_put_metadataA  s.   
Pr  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sJ W d   n1 sw   Y  W d   dS W d   dS 1 sw   Y  dS )z+Try a simple do_put call with a size limit.i   )dtyperP   r4   r   i   )write_size_limit_bytesr   zexceeded soft limitr*  Nr   i  r   )r6   r   r9   r7   nponesr  r   r	   r  r   r   rd   re   rc   r  r  FlightWriteSizeExceededErrorr!  r-  limitslicer8   r  rn   r  r   )
large_batchr  r  r   r  excinfosmaller_batchesr   rz  actualr   r   r   test_flight_do_put_limitW  sD   


Pr  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   rT   z(?i).*cancel.*r*  N)rS   r	   r  rn   r   r  r   r  r  r  r  )r  r  r   r   r   r   test_cancel_do_gett  s   
Pr  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 sw   Y  d
S )z5Test canceling a DoGet operation from another thread.r   rT   c                      sr        jdd z   W d S  tjy8       W d    Y d S 1 s0w   Y  Y d S w )Nr1   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  r1   r  rB   N)r   r	   r  rn   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*   
Pr  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   rF  r   r  )r@  r	   r  r   r   r  r  rI  )r  r  rS  r   r   r   test_streaming_do_action  s   Pr  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sJ 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sJ |j|jksJ |j|jksJ |j|jksJ |j|jksJ |j|jksJ |j|jksJ 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	password1rP   rw  rQ   z
test.arrowr   r   r   r   r   r   r  rB   r   Tr  r  r  N)r   r  r9  rH  r  r  r8  r   r6   rc   r   rd   r  re   rb   r   r   r   r   r   r   r   r  r  r  r  r;  )	r   rk   r.  rF  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 sw   Y  tj|dd |t	j||j\}	}
|	  W d   n1 sw   Y  qyW d   n1 sw   Y  W d   dS W d   dS 1 sw   Y  dS )
z:Ensure that Flight errors propagate from server to client.r   z.*foo.*r*  r   Nr/   rP   r4   )r   r   r   r   r   )r   r	   r  r  r  r  r  r   r   r   r  r   ri   r6   r7   r8   r9   r   r  r  r  r   rd   r  rc   r  r$  )r  r  argexc_typer:   rm   
exceptionsr
  	exceptionr   r   r   r   r   test_roundtrip_errors  sN   




Pr  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 sw   Y  W d   dS W d   dS 1 sw   Y  dS )z7Ensure that separate threads can read/write on a DoPut.r/   rP   r4   r   r   r   c                      s0     d ur d  d7  <   d usd S d S )Nr   rB   )r!   r   countr  r   r   _reader_thread  s   z:test_do_put_independent_read_write.<locals>._reader_threadr  rB   r   r}   N)r6   r7   r8   r9   ru   r	   r  r   r   rd   re   rc   r  r  r  r   r   r   r   r   done_writingr  r!  )r:   rm   r  r  r   r  r  r  r   r   r  r   r  r   "test_do_put_independent_read_write  s2   


Pr  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.rw  r  r   r~  r   rB   r   s   right valueN)r  r  r	   r  r   r   r   r  r!  rI  r   )r  r  rS  r-  r   r   r   "test_server_middleware_same_thread3  s   Pr  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.rw  r  r   Nr   r  )r  r  r	   r  r  r  r6   ArrowNotImplementedErrorr   r   r   r  r   r  r  r  rI  r   )r  r  responser   r   r   test_middleware_reject?  s(   Pr  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 sw   Y  t	t
 ||tg \}}|  W d   n1 sw   Y  t	t
 t|tdd W d   n1 sw   Y  t	t
 t|  W d   n1 sw   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.rw  r  r   r   N)#r  r  r
   r	   r  r   rd   r  r  r  r   r   ri   r   r   rn   r  r   r6   rc   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   ra  rz  r   r   r   test_middleware_mappingU  s`   


Tr   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   Pr  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_keyrT   N)r.   r;   rS   r	   r  r)   r*   rn   r   r  r   r   )r  rm   r  r  r:   r   r   r   	test_mtls  s&   Pr	  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  rP   r4   r   r  N)r6   r8   r9   r7   r   r  r	   r  r   rd   r  r   r   )rz  r  r  r   r   r   rm   r   r   r   test_doexchange_get  s    
Pr
  c            
   
   C   sB  t jjt tddgdgd} | jdd}t ~}td|jf^}t	j
d}||\}}|? || j |D ]}|| q:|  | }|jd	u sQJ tt|d
}	|j|	ksaJ |jjdksiJ W d	   n1 ssw   Y  W d	   n1 sw   Y  W d	   d	S W d	   d	S 1 sw   Y  d	S )r  r   r  rP   r4      r   r   r  Nr   )r6   r8   r9   r7   r   r   r  r	   r  r   rd   r  r   r  rc   r!  r  r  r:   r  r!  r   r  r   r   )
r:   r  r  r  r   r   r   r   r   expected_bufr   r   r   test_doexchange_put  s2   Pr  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}
|D ]-}|| |j| jkspJ | }	|	j|ks{J |	jdu sJ |
d7 }
|jj|
ksJ qat|D ]/\}}t|d
}||| | }	|	j|ksJ |	j|ksJ |
d7 }
|jj|
ksJ qW d   n1 sw   Y  W d   n1 sw   Y  W d   dS W d   dS 1 sw   Y  dS )zTry a DoExchange echo server.r   r  rP   r4   r  r   r   r  r2   r   NrB   )r6   r8   r9   r7   r   r   r  r	   r  r   rd   r  r   r  r   r  r  r:   r  r  rc   r!  r   r   r   r   )r:   r  r  r  r   r   r   ir   r   r  r   r   r   r   test_doexchange_echo  sR   

Pr  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 sw   Y  W d   dS W d   dS 1 sw   Y  dS )z;Try a DoExchange echo server using the V4 metadata version.r   r  rP   r4   r  r   r(  rj   r   r  N)r6   r8   r9   r7   r   r   r,  r-  r.  r/  r  r	   r  r   rd   r  r   r  rc   r!  r  r:   r  )
r:   r  rZ   r  r  r   r   r   r   r   r   r   r   test_doexchange_echo_v4  s6   
Pr  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 sw   Y  dS )z!Transform a table with a service.r   r   rB   i  rC   i  )rP   rQ   cr4   rD   i  r#  r   r  N)r6   r8   r9   r7   r   r  r	   r  r   rd   r  r   r  rc   r  r  r   )r:   rz  r  r  r   r   r   rm   r   r   r   test_doexchange_transform
	  s4   

Pr  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  rw  r  r   r   r   asciiN)r  r  r  r	   r  r  r   r   r  rI  r   r{  astliteral_evalr  r  r  r\  r	  bytesr   r  )r  r]  r  r  raw_headersr  headerr}  r   r   r   test_middleware_multi_header!	  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_optionsrT   N)zgrpc.max_receive_message_length    )r.   rS   r   r  r  r  r  r  rn   r  r$  r6   r  r  )r  r  rZ   r  r   r   r   test_generic_options7	  s*   
"r  c                   @   r   )CancelFlightServerzA server for testing StopToken.c                 C   s,   t g }t jjg |d}t|t|S )Nr   )r6   rc   r   r9   r   r{   r   r   )r[   rg   rk   rc   r   r   r   r   rn   R	  s   
zCancelFlightServer.do_getc                 C   sP   t g }t jjg |d}|| | s&|| td | rd S d S )Nr   r   )	r6   rc   r   r9   r  rG  r!  r   r   )r[   rg   r   r   r   rc   r   r   r   r   r   W	  s   



zCancelFlightServer.do_exchangeN)rp   rq   rr   rs   rn   r   r   r   r   r   r  O	  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_threade	  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	  r6   ArrowCancelled__context__)r   texc_infor  	exc_typesr!  r   r   rw  k	  s    ztest_interrupt.<locals>.testr   r   r  )r  current_threadidentmain_threadr  r  r"  r6   r$  r  r	   r  rn   r   r  r   rd   r  r   r$  r  )rw  r  r  r   r   r   r   r(  r   test_interrupt`	  s*   



Pr-  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   r1   )r   r   r  r  r  r  r  rn   r  r   r'  )r+  r  r  rm   r   r   r   test_never_sends_data	  s   Pr.  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   rd   r  r
   r  r  r  r  OSErrorr   r6   rc   r$  rs  r   )large_descriptorr  r  r   ra  r   r   r   test_large_descriptor	  s(   
Pr1  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 sw   Y  W d    n1 sw   Y  W d    n1 sw   Y  ~t }t d|jfb}tjt jdd |t d}|  W d    n1 sw   Y  tjtjdd% || \}}| |  W d    n1 sw   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   rd   r  r   r  r  r  r  r6   ArrowCapacityErrorr   rc   r  r$  r   r  r  rn   r  r   rs  )r   r  r  r  r   ra  r   r   r   r   test_large_metadata_client	  sf   

 

Tr3  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)rp   rq   rr   rs   r8  r   r   r   r   r   r4  	  s    r4  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 )zEnsure that actions are executed even when we don't consume iterator.

    See https://issues.apache.org/jira/browse/ARROW-14255
    r   r  r   r5  TN)r4  r	   r  r   r   r  r6  loadsr  rI  r   )r  r  rr   r   r   test_none_action_side_effect	  s    Pr;  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 sw   Y  |
jj|ksJ |	  ||\}fdd
}tj|dd}	|	  tt j}
	 |d q1 sw   Y  |
jj|ksJ tt j}
|  W d   n1 sw   Y  |
jj|ksJ |	  W d   n1 sw   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   	  r   z7test_write_error_propagation.<locals>.FailServer.do_putc                    r<  r   r   r   r=  r   r   r   	  r   z<test_write_error_propagation.<locals>.FailServer.do_exchangeN)rp   rq   rr   r   r   r   r=  r   r   
FailServer	  s    r?  r   c                      $   z	     q tjy   Y d S w r   )r!   r   FlightErrorr   r   r   r   _reader
     z-test_write_error_propagation.<locals>._readerTr  rB   r   Nc                      r@  r   )r  r   rA  r   rB  r   r   rC  
  rD  r  )r   r  rd   r  r6   rc   r  r
   r	   r  r   r  r  r  r  r  r!  r  r-  r  r$  r  r   r  )expected_messageexpected_infor   rc   r?  r  r  r   rC  r  r'  r   )r>  r   r   test_write_error_propagation	  sV   



RrG  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_shutdown0
  s   rI  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   )rO  r*   r-  r   r   r   	<genexpr>A
  s    z0TracingFlightServer.do_action.<locals>.<genexpr>)r  trace_contextr  )r[   rg   r   rM  r   r   r   r   <
  s   zTracingFlightServer.do_actionNr  r   r   r   r   rJ  9
  r   rJ  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 )	NrK  r  r   )s   traceparents7   00-000ff00f00f0ff000f0f00ff0f00fff0-000f0000f0f00000-00)s
   tracestater   r  )r   r   rj   )rJ  r   TracingServerMiddlewareFactoryr	   r  r   r   )r  r  rZ   r-  r   r   r   test_tracingE
  s   PrO  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   rd   r  )r  msgr   r   r   .test_do_put_does_not_crash_when_schema_is_noneW
  s   "rQ  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   rb   r6   rc   r   r   r   r   r   e
  s   zJtest_headers_trailers.<locals>.HeadersTrailersFlightServer.get_flight_infoN)rp   rq   rr   r   r   r   r   r   HeadersTrailersFlightServerd
  r  rZ  c                       s    e Zd Zdd Z fddZdS )z?test_headers_trailers.<locals>.HeadersTrailersMiddlewareFactoryc                 S   ra  r   r  rK  r   r   r   rX   q
  rd  zHtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.__init__c                    s    | S r   r   rg  HeadersTrailersMiddlewarer   r   rh  t
  ri  zJtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.start_callN)rp   rq   rr   rX   rh  r   r[  r   r    HeadersTrailersMiddlewareFactoryp
  s    r]  c                   @   s   e Zd Zdd Zdd ZdS )z8test_headers_trailers.<locals>.HeadersTrailersMiddlewarec                 S   rj  r   rl  rn  r   r   r   rX   x
  rd  zAtest_headers_trailers.<locals>.HeadersTrailersMiddleware.__init__c                 S   s2   |  D ]\}}|D ]}| jj||f q
qd S r   )r  rm  r]  r  )r[   r]  r*   r}  r-  r   r   r   rr  {
  s
   zItest_headers_trailers.<locals>.HeadersTrailersMiddleware.received_headersN)rp   rq   rr   rX   rr  r   r   r   r   r\  w
  s    r\  r   r  r   )rR  rS  )rT  s   headervalue)rU  rV  )rW  s   trailervalueN)
r
   r   r   r	   r  r   r   rd   re   r]  )rZ  r]  rm  r  r  r   r[  r   test_headers_trailersa
  s   	Pr^  c            	         s`  t ddddddt ddddddd G  fdd	d	t} |  }td
|jff}t }dD ]X}tj|}|j|tj	t
jjdddd\}}|$ |j|jt
jj|dkdd || |  | }W d    n1 sqw   Y  ||s}J |j | ksJ q.W d    n1 sw   Y  W d    d S W d    d S 1 sw   Y  d S )Nr~   rD   rC   rB   r   r4  )dict_deltasdict_replacementc                       s   e Zd Z fddZdS )zDtest_flight_dictionary_deltas_do_exchange.<locals>.DeltaFlightServerc                    s   t  }| }||sJ |j |j  ksJ |jdkr3tjjdd}|j	|j
|d || |jdkrE|	|j
 || d S d S )Ns   dict_deltasTemit_dictionary_deltasrj   s   dict_replacement)rK   r   r   r   r
  r{  r6   r,  r-  r  rc   r  )r[   rg   r   r   r   expected_tablereceived_tablerZ   expected_statsr   r   r   
  s   


zPtest_flight_dictionary_deltas_do_exchange.<locals>.DeltaFlightServer.do_exchangeN)rp   rq   rr   r   r   re  r   r   DeltaFlightServer
  s    rg  r   Tra  )write_optionsrj   r_  )r   rS   r	   r  rK   r   rd   r  r   r   r6   r,  r-  r  rc   r  r  r   r   r   )	rg  r  r  rc  r
  r   r   r   rd  r   re  r   )test_flight_dictionary_deltas_do_exchange
  sV   



Pri  c                 C   sR   | j dkrdd d d dS | j dkr'ddgtjjddtjjd	tjjjd
dS i S )NdefaultrD   )r  r]  rh  rx  allrT  )s   abcs   defzstd)compressionF)use_threadsensure_alignment)paramr6   r,  r-  r   	AlignmentDataTypeSpecific)requestr   r   r   call_options_args
  s    


rt  rj  rk  T)indirectc                 C   sX   t di | }| }|  D ]\}}|d u r||v sJ q| d| |v s)J qd S )N=r   )r   __repr__r  )rt  call_optionsr&  r  valr   r   r   test_call_options_repr
  s   rz  )r  rR  r   r   r   r  r   rZ  r  r   r#   r6  r   numpyr  ImportErrorr  r   r6   pyarrow.libr   r   r   pyarrow.utilr   pyarrow.testsr   r   r   r	   r
   r   r   r   r   r   r   r   r  mark
pytestmarkr   r   r(   r.   r;   rK   rR   rS   ru   r   r   r   r   r   r   r   r   r   r   r   r   r  r0  rE  rO  rW  rY  r_  r`  rf  rs  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  slowr  r#  r&  r0  pandasr3  r8  r9  r=  r>  r?  r@  rT  rU  rW  skipifr]  r_  rb  rd  rm  ro  rp  rq  rr  rt  ru  rv  r}  r  r  r  r  r  r  r  %header_auth_server_middleware_factoryr  r  r  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_memoryr1  r3  r4  r;  rG  rI  rJ  rO  rQ  r^  ri  fixturert  parametrizerz  r   r   r   r   <module>   s  0




")1M	


	
Mc	



	






 	


 

 	;&',
+
, F	
)8