o
    Ghj                    @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlmZ zd dlZW n eyG   dZY nw d dlZd dlZd dlmZmZ d dlmZ d dlmZ zd dlmZ d dlmZmZmZmZm Z m!Z!m"Z"m#Z# W n ey   dZe$e$ZZe$e$ZZe$e$Z Z!e$e$Z"Z#Y nw ej%jZ&dd	 Z'd
d Z(dd Z)dd Z*dd Z+dd Z,dd Z-G dd deZ.G dd deZ/G dd deZ0G dd de0Z1G dd deZ2G d d! d!eZ3G d"d# d#eZ4G d$d% d%eZ5G d&d' d'eZ6G d(d) d)eZ7G d*d+ d+eZ8G d,d- d-eZ9G d.d/ d/eZ:G d0d1 d1eZ;G d2d3 d3eZ<G d4d5 d5eZ=G d6d7 d7eZ>G d8d9 d9eZ?d:d; Z@G d<d= d=e#ZAG d>d? d?e"ZBG d@dA dAe!ZCG dBdC dCe ZDG dDdE dEeZEG dFdG dGe!ZFG dHdI dIe ZGG dJdK dKeZHG dLdM dMe ZIG dNdO dOe!ZJG dPdQ dQeZKG dRdS dSeZLG dTdU dUe!ZMG dVdW dWe#ZNG dXdY dYe"ZOG dZd[ d[e!ZPG d\d] d]e#ZQG d^d_ d_e#ZRG d`da dae"ZSG dbdc dce!ZTG ddde dee ZUG dfdg dgeZVdhdi ZWdjdk ZXdldm ZYdndo ZZdpdq Z[ej%jej%j\drds Z]dtdu Z^dvdw Z_dxdy Z`ej%jadzd{ Zbd|d} Zcd~d Zddd Zedd Zfdd ZgG dd deZhdd Zidd Zjdd Zkej%jlejmdkdddd Znej%j\dd Zodd Zpdd Zqdd Zrdd Zsdd Zte;ddidZue=ddidZvej%j\dd Zwej%jlejmdkdddd Zxdd Zydd Zzdd Z{eC Z|e? Z}dd Z~dd Zdd 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 dd deZej%jdd Zdd Zej%jej%j\dd Zej%jej%j\dd ZG dd de0Zdd Zej%j\dd  Zdd ZG dd deZdd Zdd Zd	d
 ZdS (      N)datetime)IpcReadOptionstobytes)find_free_port)util)flight)FlightClientFlightServerBaseServerAuthHandlerClientAuthHandlerServerMiddlewareServerMiddlewareFactoryClientMiddlewareClientMiddlewareFactoryc                  C   s   dd l } d S )Nr   )pyarrow.flight)pyarrow r   Z/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/pyarrow/tests/test_flight.pytest_import?   s   r   c                   C   s(   t jds
tdtt jd d S )z-Get the path to the test resources directory.ARROW_TEST_DATAzITest resources not found; set ARROW_TEST_DATA to <repo root>/testing/datar   )osenvirongetRuntimeErrorpathlibPathr   r   r   r   resource_rootD   s   r   c              	   C   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_resourceL   s   (r&   c                   C   s6   t dtjt dt ddtjt dt ddgdS )z'Get the paths to test TLS certificates.zroot-ca.pemz	cert0.pemz	cert0.key)certkeyz	cert1.pemz	cert1.key)	root_certcertificates)r&   r   CertKeyPairr   r   r   r   example_tls_certs[   s   r,   c                  C   s"   t g dg} t jj| dgdS )Nir      
   	some_intsnames)paarrayTablefrom_arrays)datar   r   r   simple_ints_tablel   s   r9   c                  C   sT   t jg dt  d} t t jg d| t jddg| gg}t jj|dgdS )N)foobazquuxtype)   r   N   r?   
some_dictsr2   )r4   r5   utf8chunked_arrayDictionaryArrayr7   r6   )dict_valuesr8   r   r   r   simple_dicts_tables   s   rF   c                   C   s,   t jjt g dt g dgddgdS )N)r:   barr;   quxr?   r@         abr2   )r4   r6   r7   r5   r   r   r   r   multiple_column_table~   s
   rN   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__r9   rF   rN   table_factoriesoptions)selflocationrV   kwargs	__class__r   r   rT      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   
FlightInfor4   schemaFlightDescriptorfor_pathrW   contextcriteriar   r   r   list_flights   s   


z!ConstantFlightServer.list_flightsc                 C   s   | j |j  }tj|| jdS )NrV   )rU   ticketr   RecordBatchStreamrV   )rW   rc   rg   tabler   r   r   do_get   s   zConstantFlightServer.do_getNN)	__name__
__module____qualname____doc__r]   rT   re   rj   __classcell__r   r   rZ   r   rO      s    
rO   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   rS   rT   rV   rW   rV   rY   rZ   r   r   rT         
zMetadataFlightServer.__init__c                 C   s<   t g dg}t jj|dgd}tj|j| || jdS )Nr-   rL   r2   rf   )	r4   r5   r6   r7   r   GeneratorStreamr_   number_batchesrV   )rW   rc   rg   r8   ri   r   r   r   rj      s   zMetadataFlightServer.do_getc           
   	   C   s   d}g d}|D ]:\}}| tjt|| ggdgs J |d us&J td| \}	||	ks5J |t	d| |d7 }qd S )Nr   r-   rL   <ir?   )
equalsr4   RecordBatchr7   r5   structunpack
to_pybyteswritepack)
rW   rc   
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 )Nry   )	enumerate
to_batchesr|   r   )ri   idxr   r   r   r   r   rx      s
   z#MetadataFlightServer.number_batchesN)
rl   rm   rn   ro   rT   rj   r   staticmethodrx   rp   r   r   rZ   r   rq      s    
rq   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   )rS   rT   last_messageexpected_schema)rW   rX   r   rY   rZ   r   r   rT      s   
zEchoFlightServer.__init__c                 C   s   t | jS r   )r   rh   r   rW   rc   rg   r   r   r   rj      s   zEchoFlightServer.do_getc                 C   s$   | j r| j |jksJ | | _d S r   )r   r_   read_allr   rW   rc   r   r   r   r   r   r   r      s   zEchoFlightServer.do_putc                 C   s   |D ]}qd S r   r   )rW   rc   r   r   r   chunkr   r   r   do_exchange   s   zEchoFlightServer.do_exchangerk   )	rl   rm   rn   ro   rT   rj   r   r   rp   r   r   rZ   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   rw   r   r_   r   r   r   r   r   rj      s   zEchoStreamFlightServer.do_getc                 C   s   g S r   r   rW   rc   r   r   r   list_actions      z#EchoStreamFlightServer.list_actionsc                 C   s$   |j dkr| | dgS t)Nwho-am-iutf-8)r>   peer_identitypeerencodeNotImplementedErrorrW   rc   actionr   r   r   	do_action   s   
z EchoStreamFlightServer.do_actionN)rl   rm   rn   ro   rj   r   r   r   r   r   r   r      s
    r   c                   @       e Zd ZdZdd Zdd ZdS )GetInfoFlightServerz)A Flight server that tests GetFlightInfo.c                 C   s^   t tdt fg|t ddgt dt jddgtd	t
ddgd	d
ddS )NrL       grpc://test	localhost  2023-04-05T12:34:56.789012345nszendpoint app metadatar?   *   Tzinfo app metadata)r   r^   r4   r_   int32FlightEndpointLocationfor_grpc_tcpscalarcast	timestamprW   rc   r   r   r   r   get_flight_info   s    	z#GetInfoFlightServer.get_flight_infoc                 C   s   |  ||}t|jS r   )r   r   SchemaResultr_   )rW   rc   r   infor   r   r   
get_schema  s   zGetInfoFlightServer.get_schemaN)rl   rm   rn   ro   r   r   r   r   r   r   r      s    r   c                   @   $   e Zd ZdZedd Zdd ZdS )ListActionsFlightServer'A Flight server that tests ListActions.c                 C   s   ddt ddgS )N)action-1description)zaction-2 zaction-3zmore detailr   
ActionType)clsr   r   r   expected_actions  s   
z(ListActionsFlightServer.expected_actionsc                 c   s    |   E d H  d S r   )r   r   r   r   r   r     s   z$ListActionsFlightServer.list_actionsN)rl   rm   rn   ro   classmethodr   r   r   r   r   r   r     s
    
r   c                   @      e Zd ZdZdd ZdS )ListActionsErrorFlightServerr   c                 c   s    dV  dV  d S )N)r   r   r:   r   r   r   r   r   r     s   
z)ListActionsErrorFlightServer.list_actionsN)rl   rm   rn   ro   r   r   r   r   r   r         r   c                       s2   e Zd ZdZd	 fdd	Zdd Zdd Z  ZS )
CheckTicketFlightServerzDA Flight server that compares the given ticket to an expected value.Nc                    s   t  j|fi | || _d S r   )rS   rT   expected_ticket)rW   r   rX   rY   rZ   r   r   rT   '  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=   rL   r2   )	r   rg   r4   r5   r   r6   r7   r   rh   )rW   rc   rg   data1ri   r   r   r   rj   +  s   
zCheckTicketFlightServer.do_getc                 C   s   |  | _d S r   )r   r   )rW   rc   r   r   r   r   r   r   1     zCheckTicketFlightServer.do_putr   )rl   rm   rn   ro   rT   rj   r   rp   r   r   rZ   r   r   $  s
    r   c                   @   ,   e Zd ZdZede fgZdd ZdS )InvalidStreamFlightServerzEA Flight server that tries to return messages with differing schemas.rL   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      $@rL   r2   )
r4   r5   r   float64r>   r6   r7   r_   r   rw   )rW   rc   rg   r   data2table1table2r   r   r   rj   :  s   z InvalidStreamFlightServer.do_getNrl   rm   rn   ro   r4   r_   r   rj   r   r   r   r   r   5      r   c                   @   r   )NeverSendsDataFlightServerz0A Flight server that never actually yields data.rL   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_datar/   r_   )rg   r_   empty_tabler4   r{   r7   ranger   rw   	itertoolsrepeat)rW   rc   rg   r8   r   r   r   rj   J  s   
z!NeverSendsDataFlightServer.do_getNr   r   r   r   r   r   E  r   r   c                   @   s,   e Zd ZdZdd Zdd Zedd ZdS )	SlowFlightServerz;A Flight server that delays its responses to test timeouts.c                 C   s    t tdt fg|  S )NrL   )r   rw   r4   r_   r   slow_streamr   r   r   r   rj   [  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=   rL   r2   r0   )r4   r5   r   r6   r7   r   r   )r   r   r   r   r   c  s
   
zSlowFlightServer.slow_streamN)rl   rm   rn   ro   rj   r   r   r   r   r   r   r   r   X  s    r   c                   @   s4   e Zd ZdZedd Zdd Zdd Zdd	 Zd
S )ErrorFlightServerz9A Flight server that uses all the Flight-specific errors.c                	   C   s"   t jt jt jt jt jttjt	dS )N)internaltimedoutcancelunauthenticatedunauthorizednotimplementedinvalidr(   )
r   FlightInternalErrorFlightTimedOutErrorFlightCancelledErrorFlightUnauthenticatedErrorFlightUnauthorizedErrorr   r4   ArrowInvalidKeyErrorr   r   r   r   error_casesp  s   zErrorFlightServer.error_casesc                 C   s>   t  }|j|v r||j d|jdkrd}td|t)Nr:   protobuf   this is an error message)r   r   r>   r   r   r   )rW   rc   r   r   err_msgr   r   r   r   }  s   

zErrorFlightServer.do_actionc                 c   s*    t tg t jdg V  t d)Nr\   r:   )r   r^   r4   r_   r`   ra   r   rb   r   r   r   re     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   )rW   rc   r   r   r   r   r   r   r   r     s   










zErrorFlightServer.do_putN)	rl   rm   rn   ro   r   r   r   re   r   r   r   r   r   r   m  s    
	r   c                       sJ   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )ExchangeFlightServerz A server for testing DoExchange.Nc                    rr   rs   rt   ru   rZ   r   r   rT     rv   zExchangeFlightServer.__init__c                 C   s   |j tjjkrtd|jdkr| |||S |jdkr$| |||S |jdkr0| 	|||S |jdkr<| 
|||S td|j )Nz!Must provide a command descriptor   echo   get   put	   transformzUnknown command: )descriptor_typer   DescriptorTypeCMDr4   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    (  rL   r2   N)r4   r6   r7   r5   r   beginr_   write_table)rW   rc   r   r   r8   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)r8   r4   r   write_metadatastrr   )rW   rc   r   r   num_batchesr   r   r   r   r    s   

z$ExchangeFlightServer.exchange_do_putc                 C   s   d}|D ]9}|s|j r|j|j j| jd d}|jr&|j r&||j |j q|jr0||j q|j r:||j  qJ ddS )zRun a simple echo server.Frf   TzShould not happenN)r8   r  r_   rV   app_metadatawrite_with_metadatar
  write_batch)rW   rc   r   r   startedr   r   r   r   r    s   
z"ExchangeFlightServer.exchange_echoc                 C   s   |j D ]}tj|jstdt| q| }dg|j }|D ]}t	|D ]\}}	||  |	
 7  < q(q"tjjt|gdgd}
||
j  ||
 dS )zSum rows in an uploaded table.zInvalid field: r   sumr2   N)r_   r4   types
is_integerr>   r   reprr   num_rowsr   as_pyr6   r7   r5   r  r  )rW   rc   r   r   fieldri   sumscolumnrowvalueresultr   r   r   r    s   
z'ExchangeFlightServer.exchange_transformr   )rl   rm   rn   ro   rT   r   r  r  r  r  rp   r   r   rZ   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   rS   rT   credsrW   r"  rZ   r   r   rT        

z#HttpBasicServerAuthHandler.__init__c                 C   sZ   |  }tj|}|j| jvrtd| j|j |jkr#td|t	|j d S )Nunknown userzwrong password)
r   r   	BasicAuthdeserializeusernamer"  r   passwordr   r   )rW   outgoingincomingr   authr   r   r   authenticate  s   

z'HttpBasicServerAuthHandler.authenticatec                 C   s&   |st d|| jvrt d|S )Nztoken not providedr%  )r   r   r"  rW   tokenr   r   r   is_valid  s
   


z#HttpBasicServerAuthHandler.is_validrl   rm   rn   ro   rT   r-  r0  rp   r   r   rZ   r   r    
    	r  c                       r  )HttpBasicClientAuthHandlerr  c                    s"   t    t||| _d | _d S r   )rS   rT   r   r&  
basic_authr/  rW   r(  r)  rZ   r   r   rT     s   

z#HttpBasicClientAuthHandler.__init__c                 C   s"   | j  }|| | | _d S r   )r4  	serializer   r   r/  )rW   r*  r+  r,  r   r   r   r-    s   

z'HttpBasicClientAuthHandler.authenticatec                 C      | j S r   r/  rW   r   r   r   	get_token	     z$HttpBasicClientAuthHandler.get_tokenrl   rm   rn   ro   rT   r-  r:  rp   r   r   rZ   r   r3    s
    r3  c                       r  )TokenServerAuthHandler:An example implementation of authentication via handshake.c                    r   r   r!  r#  rZ   r   r   rT     r$  zTokenServerAuthHandler.__init__c                 C   sJ   |  }|  }|| jv r | j| |kr |td|  d S td)N   secret:zinvalid username/password)r   r"  r   base64	b64encoder   r   )rW   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   r0    s   


zTokenServerAuthHandler.is_validr1  r   r   rZ   r   r=    r2  r=  c                       r  )TokenClientAuthHandlerr>  c                    s    t    || _|| _d| _d S )Nr   )rS   rT   r(  r)  r/  r5  rZ   r   r   rT   '  s   

zTokenClientAuthHandler.__init__c                 C   s&   | | j | | j | | _d S r   )r   r(  r)  r   r/  rW   r*  r+  r   r   r   r-  -  s   z#TokenClientAuthHandler.authenticatec                 C   r7  r   r8  r9  r   r   r   r:  2  r;  z TokenClientAuthHandler.get_tokenr<  r   r   rZ   r   rE  $  s
    rE  c                   @   r   )NoopAuthHandlerzA no-op auth handler.c                 C      dS )zDo nothing.Nr   rF  r   r   r   r-  9  s    zNoopAuthHandler.authenticatec                 C   rH  )zV
        Returning an empty string.
        Returning None causes Type error.
        r   r   r.  r   r   r   r0  <  s   zNoopAuthHandler.is_validN)rl   rm   rn   ro   r-  r0  r   r   r   r   rG  6      rG  c                 C   s,   | D ]}|  |  kr| |  S qdS )zcLookup the value of given key in the given headers.
       The key lookup is case-insensitive.
    N)lowerr   )headers
lookup_keyr(   r   r   r   case_insensitive_header_lookupD  s
   rM  c                   @   r   )	!ClientHeaderAuthMiddlewareFactoryz@ClientMiddlewareFactory that creates ClientAuthHeaderMiddleware.c                 C   
   g | _ d S r   call_credentialr9  r   r   r   rT   P     
z*ClientHeaderAuthMiddlewareFactory.__init__c                 C      t | S r   )ClientHeaderAuthMiddlewarerW   r   r   r   r   
start_callS     z,ClientHeaderAuthMiddlewareFactory.start_callc                 C   
   || _ d S r   rP  )rW   rQ  r   r   r   set_call_credentialV  rR  z5ClientHeaderAuthMiddlewareFactory.set_call_credentialN)rl   rm   rn   ro   rT   rV  rY  r   r   r   r   rN  M  s
    rN  c                   @   r   )rT  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   rX  r   factoryrW   r[  r   r   r   rT   j  rR  z#ClientHeaderAuthMiddleware.__init__c                 C   s0   t |d}|r| jd|d dg d S d S )NAuthorization   authorizationr   r   )rM  r[  rY  r   )rW   rK  auth_headerr   r   r   received_headersm  s   

z+ClientHeaderAuthMiddleware.received_headersN)rl   rm   rn   ro   rT   r`  r   r   r   r   rT  Z  s    rT  c                   @   r   )!HeaderAuthServerMiddlewareFactoryz)Validates incoming username and password.c           	      C   s   t |d}|d d}d}d}|d dkr<t|d }|dd	}|d d
kr1|d dks6t|d}t|S |d dkrS|d }|dksOt|t|S t|)Nr]  r    r   zInvalid credentialsBasicr?   r   :testr)  	token1234Bearer)rM  splitr@  rC  decoder   r   HeaderAuthServerMiddleware)	rW   r   rK  r_  valuesr/  error_messagedecodedpairr   r   r   rV  x  s(   


z,HeaderAuthServerMiddlewareFactory.start_callNrl   rm   rn   ro   rV  r   r   r   r   ra  u  r   ra  c                   @   r   )rj  zBA ServerMiddleware that transports incoming username and password.c                 C   rX  r   r8  r.  r   r   r   rT     rR  z#HeaderAuthServerMiddleware.__init__c                 C   s   dd| j  iS )NauthorizationzBearer r8  r9  r   r   r   sending_headers  r   z*HeaderAuthServerMiddleware.sending_headersNrl   rm   rn   ro   rT   rq  r   r   r   r   rj    rI  rj  c                   @   r   )HeaderAuthFlightServerz<A Flight server that tests with basic token authentication. c                 C   s@   | d}|rt| d}|d}|d dgS td)Nr,  r]  rb  r?   r   zNo token auth middleware found.)get_middlewarerM  rq  rh  r   r   r   )rW   rc   r   
middlewarer_  rk  r   r   r   r     s   

z HeaderAuthFlightServer.do_actionNrl   rm   rn   ro   r   r   r   r   r   rs    r   rs  c                   @   r   )'ArbitraryHeadersServerMiddlewareFactoryz<A ServerMiddlewareFactory that transports arbitrary headers.c                 C      t |S r   ) ArbitraryHeadersServerMiddlewarerW   r   rK  r   r   r   rV    rW  z2ArbitraryHeadersServerMiddlewareFactory.start_callNro  r   r   r   r   rw    r   rw  c                   @   r   )ry  z5A ServerMiddleware that transports arbitrary headers.c                 C   rX  r   r+  )rW   r+  r   r   r   rT     rR  z)ArbitraryHeadersServerMiddleware.__init__c                 C   r7  r   r{  r9  r   r   r   rq    r;  z0ArbitraryHeadersServerMiddleware.sending_headersNrr  r   r   r   r   ry    rI  ry  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)rt  rq  rM  r   r   FlightServerError)	rW   rc   r   ru  rK  header_1header_2value1value2r   r   r   r     s   

z&ArbitraryHeadersFlightServer.do_actionNrv  r   r   r   r   r|    r   r|  c                   @   r   )HeaderServerMiddlewarez/Expose a per-call value to the RPC method body.c                 C   rX  r   )special_value)rW   r  r   r   r   rT     rR  zHeaderServerMiddleware.__init__N)rl   rm   rn   ro   rT   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  rz  r   r   r   rV    rW  z(HeaderServerMiddlewareFactory.start_callNro  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 )Nre  r   )rt  r  r   )rW   rc   r   ru  r   r   r   r     s   
zHeaderFlightServer.do_actionNrv  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 )Nre  r   )rt  r  client_headersr   )rW   rc   r   ru  rK  r   r   r   r     s   
z!MultiHeaderFlightServer.do_actionNrv  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  )rW   r   rK  r/  r   r   r   rV    s   


z/SelectiveAuthServerMiddlewareFactory.start_callNro  r   r   r   r   r    r   r  c                   @      e Zd Zdd ZdS )$SelectiveAuthClientMiddlewareFactoryc                 C   s   t  S r   )SelectiveAuthClientMiddlewarerU  r   r   r   rV    r;  z/SelectiveAuthClientMiddlewareFactory.start_callN)rl   rm   rn   rV  r   r   r   r   r        r  c                   @   r  )r  c                 C   s   ddiS )Nr  r)  r   r9  r   r   r   rq  	  s   z-SelectiveAuthClientMiddleware.sending_headersN)rl   rm   rn   rq  r   r   r   r   r    r  r  c                       (   e Zd ZdZ fddZdd Z  ZS ) RecordingServerMiddlewareFactory Record what methods were called.c                       t    g | _d S r   rS   rT   methodsr9  rZ   r   r   rT     r$  z)RecordingServerMiddlewareFactory.__init__c                 C      | j |j d S r   r  appendr  rz  r   r   r   rV       z+RecordingServerMiddlewareFactory.start_callrl   rm   rn   ro   rT   rV  rp   r   r   rZ   r   r        r  c                       r  ) RecordingClientMiddlewareFactoryr  c                    r  r   r  r9  rZ   r   r   rT     r$  z)RecordingClientMiddlewareFactory.__init__c                 C   r  r   r  rU  r   r   r   rV  "  r  z+RecordingClientMiddlewareFactory.start_callr  r   r   rZ   r   r    r  r  c                   @   r   )"MultiHeaderClientMiddlewareFactoryr  c                 C   s
   i | _ d S r   )last_headersr9  r   r   r   rT   *  s   
z+MultiHeaderClientMiddlewareFactory.__init__c                 C   rS  r   )MultiHeaderClientMiddlewarerU  r   r   r   rV  /  rW  z-MultiHeaderClientMiddlewareFactory.start_callN)rl   rm   rn   ro   rT   rV  r   r   r   r   r  '      r  c                   @   sB   e Zd ZdZddgddgdgdgdZdd	 Zd
d Zdd ZdS )r  r  r:   rG          r;   )zx-textzx-binary-binzx-MIXED-cases   x-other-MIXED-casec                 C   rX  r   rZ  r\  r   r   r   rT   >  rR  z$MultiHeaderClientMiddleware.__init__c                 C   r7  r   )EXPECTEDr9  r   r   r   rq  A  r;  z+MultiHeaderClientMiddleware.sending_headersc                 C   s   | j j| d S r   )r[  r  update)rW   rK  r   r   r   r`  D  s   z,MultiHeaderClientMiddleware.received_headersN)rl   rm   rn   ro   r  rT   rq  r`  r   r   r   r   r  3  s    r  c                   @   r   )"MultiHeaderServerMiddlewareFactoryr  c                 C   rx  r   )MultiHeaderServerMiddlewarerz  r   r   r   rV  M  rW  z-MultiHeaderServerMiddlewareFactory.start_callNro  r   r   r   r   r  J  r   r  c                   @   r   )r  r  c                 C   rX  r   )r  )rW   r  r   r   r   rT   T  rR  z$MultiHeaderServerMiddleware.__init__c                 C   s   t jS r   )r  r  r9  r   r   r   rq  W  r;  z+MultiHeaderServerMiddleware.sending_headersNrr  r   r   r   r   r  Q  rI  r  c                       r  )LargeMetadataFlightServerz Regression test for ARROW-13253.c                    s    t  j|i | dd | _d S )N           )rS   rT   	_metadata)rW   argsrY   rZ   r   r   rT   ^  s   z"LargeMetadataFlightServer.__init__c                 C   s6   t dt  fg}t|t jdgg|d| jfgS )NrL   r?   r   )r4   r_   int64r   rw   record_batchr  )rW   rc   rg   r_   r   r   r   rj   b  s   z LargeMetadataFlightServer.do_getc                 C   s   | | j d S r   )r
  r  r   r   r   r   r   h  s   z%LargeMetadataFlightServer.do_exchange)rl   rm   rn   ro   rT   rj   r   rp   r   r   rZ   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   rG   userpass   foo2023-04-05T12:34:56s   endpoint app metadatar?   r   T   test app metadatagrpc+tcp://localhost:1234)intr  z1<pyarrow.flight.SchemaResult schema=(int: int64)>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  rK   r/   r@   rJ   r  )r  r   Actionr   r&  r`   for_commandr   r4   r   r   r   r^   r_   ra   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_reprl  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   rG   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:   rG   r;   r   r   r   r   r   r       
 
c                   S   r  )Nr  r  user2r   r&  r   r   r   r   r    r  c                   S   r  )Nr  r  pass2r  r   r   r   r   r    r  c                   S   s   t jdt jdfS )Nr:   )r   r`   r  ra   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   r4   r   r   r   r   r   r   r   r    s   c                   S   s    t jdg ddt jdg ddfS )Nr  r   r     metar  r   r   r   r   r    s    c                   S   s>   t tg t j g t tdt fgt j g fS Nints)r   r^   r4   r_   r`   ra   r  r   r   r   r   r    s   

c                   S   s6   t tg t j g t tg t jdg fS Nr  )r   r^   r4   r_   r`   ra   r  r   r   r   r   r    s   
c                	   S   sH   t tg t j t dg gt tg t j t dg gfS r  )r   r^   r4   r_   r`   ra   r   r   r   r   r   r    s   c                   S   <   t jtg t j g ddt jtg t j g ddfS )N)total_recordsr?   r   r^   r4   r_   r`   ra   r   r   r   r   r       c                   S   r  )Nr  )total_bytesr   r  r   r   r   r   r    r  c                   S   r  )NF)orderedTr  r   r   r   r   r    r  c                   S   r  )Nr   r  r  r  r   r   r   r   r    r  c                   S      t dt dfS )Nr  r  )r   r   r   r   r   r   r    s    c                   S   r  r  )r   r  r   r   r   r   r  
      c                   S   s*   t tg t tdt fgfS r  )r   r   r4   r_   r  r   r   r   r   r    s    c                   S   r  )Nr   r  )r   r  r   r   r   r   r    r  r   )itemsgenlhs1rhs1lhs2rhs2r   r   r   test_eq  sB   	V

r  c                  C   s   t tg t j g } t jtg t j g ddd}t jtg t j g d d d}| jdks4J |jdks;J |jdksBJ | jdksIJ |jdksPJ |jdksWJ d S )Nr  )r  r  )r   r^   r4   r_   r`   ra   r  r  )fi1fi2fi3r   r   r   test_flight_info_defaults  s   r  c               	   C   sT   d ddt  fg} | D ]}t|}t|tsJ W d    n1 s"w   Y  q
d S )Ngrpc://localhost:0r   )r   r	   
isinstance)	locationsrX   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_exception9  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   rX   r   r   r  E  s   
z-test_client_wait_for_available.<locals>.serveTtargetdaemonr/   timeoutr   )r   r   	threadingThreadstartr   wait_for_available)r  r  clientthreadr  elapsedr   r  r   test_client_wait_for_available?  s   

"r  c               	   C   s   t  C} td| jf"}t| g ksJ |t j}tt|dks'J W d   n1 s1w   Y  W d   dS W d   dS 1 sIw   Y  dS )zTry a simple list_flights call.r   r?   N)rO   r   connectportlistre   r]   len)r  r  flightsr   r   r   test_flight_list_flightsU  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   )rO   r   r  r  r  re   closer  r  r4   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   rP   Nmetadata_versionrf   z+expected IpcWriteOptions, got <class 'int'>matchr   )r9   rO   r   r  r  rj   r  r   rz   r4   ipcIpcWriteOptionsMetadataVersionV4	to_readerr  r  r~  )ri   r  r  r8   rV   r   r   r   test_flight_do_get_intsh  sL     	 "r  c               	   C   s   t  } t B}td|jf!}|td }t|d | 	d
 ks)J W d   n1 s3w   Y  W d   dS W d   dS 1 sKw   Y  dS )r  r   rP   r1   r   N)r9   rO   r   r  r  rj   r  read_pandasr  r  	to_pylistri   r  r  r8   r   r   r   test_do_get_ints_pandas  s    Pr#  c               	   C   s   t  } t :}td|jf}|td }|| s!J W d    n1 s+w   Y  W d    d S W d    d S 1 sCw   Y  d S )Nr   rQ   )	rF   rO   r   r  r  rj   r  r   rz   r"  r   r   r   test_flight_do_get_dicts  s   Pr$  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=   rL   r2   s
   the-ticket)r   r   N)r4   r5   r   r6   r7   r   r   r  r  rj   r  r   rz   )r   ri   r  r  r8   r   r   r   test_flight_do_get_ticket  s   Pr%  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   r?   r   s   info app metadatarL   r@   r   Nr   z#2023-04-05T12:34:56.789012345+00:00r   UTCr  r   )r   r   r  r   r   r`   r  r  r  r  r  r_   r4   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   rL   N)
r   r   r  r   r   r`   r  r_   r4   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   r9  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   rc   r   r   r    s   z(ConvenienceServer.do_action.<locals>.gen)r>   r-  bodyr4   ArrowMemoryError)rW   rc   r   r  r   r4  r   r     s   




zConvenienceServer.do_actionN)rl   rm   rn   ro   propertyr-  r   r   r   r   r   r,    s
    
r,  c               	   C   s   t  N} td| jf.}dd |dD }|| jksJ d}dd |d|fD }||gks2J W d    n1 s<w   Y  W d    d S W d    d S 1 sTw   Y  d S )Nr   c                 S      g | ]}|j qS r   r5  .0xr   r   r   
<listcomp>      z5test_do_action_result_convenience.<locals>.<listcomp>r.  s   the-bodyc                 S   r8  r   r9  r:  r   r   r   r=    r>  r/  )r,  r   r  r   r-  )r  r  resultsr5  r   r   r   !test_do_action_result_convenience  s   Pr@  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  r0  r6  r1  )	r,  r   r  r  r  r   r~  r  r   r  r   r   r   test_nicer_server_exceptions  s    PrA  c                  C   s0   t d} z| jdksJ W |   dS |   w )zMake sure port() works.r  r   N)r   r  shutdown)r  r   r   r   test_get_port  s   rC  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  rP   rQ   N)tempfileNamedTemporaryFiler  r   r   for_grpc_unixnamerO   r   rj   r  r9   r_   rz   r   rF   )sockrX   r  r   ri   r8   r   r   r   test_flight_domain_socket  s.   
 "rK  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   rL   r2   )r   r   re  r   N)r4   r6   r7   r5   r   r   r_   r   r  r   r   r`   ra   r  r  rj   r  r   rz   r8   r  r  r   _r  r   r   r   test_flight_large_message(  s"   PrN  c               	   C   s   t jjt tddgdgd} t O}td|jf/}|t	j
d| j\}}||  |  |t	d }|| sCJ W d   n1 sMw   Y  W d   dS W d   dS 1 sew   Y  dS )	z?Try downloading a flight of RecordBatches in a GeneratorStream.r   r  rL   r2   r   re  r   N)r4   r6   r7   r5   r   r   r   r  r   r   r`   ra   r_   r  r  rj   r  r   rz   rL  r   r   r   test_flight_generator_stream>  s"   
PrO  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  r4   ArrowExceptionrj   r   r  r   r  r   r   r   $test_flight_invalid_generator_streamN  s   PrQ  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  rf   N)r   r   r  r   r  FlightCallOptionsr  r  r   r  r   )r  r  r   rV   r   r   r   test_timeout_firesV  s   PrS  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  rP   rf   N)rO   r   r  r   rR  rj   r  r   )r  r  rV   r   r   r   test_timeout_passesd  s   PrT  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.rI   rM   r2   r   r?   )included_fields)read_optionsrR   rf   r@   N)r4   r6   r7   r5   rO   r   r  r   rR  r   rj   r  r   num_columnsrN   )expectedr  r  rV   	response1	response2r   r   r   test_read_optionsl  s*   
Pr[     tests   p4ssw0rd)r"  c               
   C   s   t tdM} td| jf-}tdd}tjtjdd t	|
| W d   n1 s.w   Y  W d   n1 s=w   Y  W d   dS W d   dS 1 sUw   Y  dS )z,Test that auth fails when not authenticated.auth_handlerr   r   r   z.*unauthenticated.*r  N)r   basic_auth_handlerr   r  r   r  r  r  r   r  r   r  r  r   r   r   r   test_http_basic_unauth  s   Pra  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   re  p4ssw0rdr\  N)r   r_  r   r  r   r  r-  r3  r   nextr5  r~   )r  r  r   r?  identitypeer_addressr   r   r   test_http_basic_auth  s   
Prf  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  re  wrongN)r   r_  r   r  r   r  r  r  r   r-  r3  rc  r   r`  r   r   r   %test_http_basic_auth_invalid_password  s   Prh  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   re  rb  r\  N)r   token_auth_handlerr   r  r   r  r-  rE  rc  r   r5  r~   )r  r  r   rd  r   r   r   test_token_auth  s   Prk  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 )ri  r]  r   re  rg  N)
r   rj  r   r  r  r  r   r   r-  rE  r  r   r   r   test_token_auth_invalid  s   Prl  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^  ru  r   r\     passwordr   r^  r?      Bearer token1234N)rs  no_op_auth_handlerra  r   r  authenticate_basic_token)r  r  
token_pairr   r   r   test_authenticate_basic_token  s   Prs  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,  rm  r   r\  s   badpasswordN)
rs  rp  ra  r   r  r  r  r   r   rq  r  r   r   r   .test_authenticate_basic_token_invalid_password  s   Prt  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,  rm  r   r\  rn  r   r^  r?   ro  rK  test-actionr   r   rV   	   token1234N)rs  rp  ra  r   r  rq  r   rR  r  r   r  r5  r~   r  r  rr  rV   r  r   r   r   (test_authenticate_basic_token_and_action  s    Prz  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,  rm  r   ru  s   test:passwordr^  s   Basic ru  rv  r   rw  r   rx  r?   ro  N)rs  rp  ra  rN  r   r  r@  rA  r   rR  r  r   r  r5  r~   rQ  r  )r  client_auth_middlewarer  encoded_credentialsrV   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}  rm  r   r\  rn  r   r^  r?   ro  )s   test-header-1   value1)s   test-header-2   value2ru  rv  r   rf   r  r  N)r|  rp  ra  rw  r   r  rq  r   rR  r  r   r  r5  r~   ry  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  r4   r   r   r  rO   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:rP   N)r,   rO   r   r  r  r  r  r   FlightUnavailableErrorrj   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_certsrP   N)
r9   r,   rO   r   r  rj   r   r  r   rz   ri   r  r  r  r8   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 availablerP   N)r9   r,   rO   r   r  r   r  skiprj   r   r  r   rz   r  r  r   r   r   $test_tls_disable_server_verificationI  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_hostnamerP   N)
r,   rO   r   r  r  r  r  r  rj   r  r  r   r   r   test_tls_override_hostnameZ  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-   rL   r2   r   r   r   ry   r?   N)r4   r5   r6   r7   rq   r   r  rj   r   r  r  r|   r}   r~   from_batchesrz   )
r8   ri   batchesr  r  r   r   r   metadata
server_idxr   r   r   test_flight_do_get_metadatag  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   Try   r?   N)rq   r   r  rj   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-   rL   r2   r  rf   r   r   N)r4   r6   r7   r5   r  r  r  r  rq   r   r  rj   r   r  r   rz   )ri   rV   r  r  r   r8   r   r   r   test_flight_do_get_metadata_v4  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-   rL   r2   r   r   r?   r   ry   N)r4   r5   r6   r7   rq   r   r  r   r   r`   ra   r_   r   r   r|   r   r  r   r}   r~   )r8   ri   r  r  r   metadata_readerr   r   r  r   r  r   r   r   test_flight_do_put_metadata  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   )dtyperL   r2   r   i   )write_size_limit_bytesr   zexceeded soft limitr  Nr   i  r   )r4   r{   r7   r5   nponesr  r   r   r  r   r   r`   ra   r_   r  r  FlightWriteSizeExceededErrorr  r  limitslicer6   r  rj   r  r   )
large_batchr  r  r   r  excinfosmaller_batchesr   rX  actualr   r   r   test_flight_do_put_limit  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   rP   z(?i).*cancel.*r  N)rO   r   r  rj   r   r  r   r  r  r   r  )r  r  r   r   r   r   test_cancel_do_get  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   rP   c                      sr        jdd z   W d S  tjy8       W d    Y d S 1 s0w   Y  Y d S w )Nr/   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  r/   r  r?   N)r   r   r  rj   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   r2  r   r  )r,  r   r  r   r   r  rc  r5  )r  r  r?  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	password1rL   re  rM   z
test.arrowr   r   r   r   r   r   r  r?   r   Tr  r  r  N)r   r  r'  r6  r  r  r&  r   r4   r_   r   r`   r  ra   r^   r   r   r   r   r   r   r   r  r  r  r  r'  )	r   rg   r  r4  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-   rL   r2   )r   r   r   r   r   )r   r   r  r   r  r  r  r  r   r   r  r   re   r4   r5   r6   r7   r   r   r   r   r   r`   r  r_   r  r  )r  r  argexc_typer8   ri   
exceptionsr   	exceptionr   r   r   r   r   test_roundtrip_errorsN  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-   rL   r2   r   r   r   c                      s0     d ur d  d7  <   d usd S d S )Nr   r?   )r   r   countr  r   r   _reader_thread  s   z:test_do_put_independent_read_write.<locals>._reader_threadr   r?   r   ry   N)r4   r5   r6   r7   rq   r   r  r   r   r`   ra   r_   r  r  r  r   r   r|   r   r  done_writingr  r  )r8   ri   r  r  r   r  r	  r  r   r   r  r   r  r   "test_do_put_independent_read_writet  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.re  r{  r   r\  r   r?   r   s   right valueN)r  r  r   r  r  r   r   r  r  r5  r~   )r  r  r?  r  r   r   r   "test_server_middleware_same_thread  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.re  r{  r   Nr   rn  )r  r  r   r  r  r  r4   ArrowNotImplementedErrorr  r   r   r   r   r  r  rc  r5  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.re  r{  r   r   N)#r  r  r	   r   r  r   r`   r  r  r  r   r  re   r   r   rj   r  r   r4   r_   r  r   r  r   r   r  LIST_FLIGHTSGET_FLIGHT_INFO
GET_SCHEMADO_GETDO_PUT	DO_ACTIONr  DO_EXCHANGEr  )server_middlewareclient_middlewarer  r  r   r   rM  rX  r   r   r   test_middleware_mapping  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_keyrP   N)r,   r9   rO   r   r  r'   r(   rj   r   r  r   rz   )r  ri   r  r  r8   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  rL   r2   r   r   N)r4   r6   r7   r5   r   r   r   r  r   r`   r  r   r   )rX  r  r  r   r   r   ri   r   r   r   test_doexchange_get  s    
Pr  c            
   
   C   s2  t jjt tddgdgd} | jdd}t v}td|jfV}t	j
d}||\}}|7 || j |D ]}|| q:|  | }|jd	u sQJ tt|d
}	|j|	ksaJ W d	   n1 skw   Y  W d	   n1 szw   Y  W d	   d	S W d	   d	S 1 sw   Y  d	S )r	  r   r  rL   r2      r   r   r   Nr   )r4   r6   r7   r5   r   r   r   r   r  r   r`   r  r   r  r_   r  r  r  r8   r  r  r   r  )
r8   r  r  r  r   r   r   r   r   expected_bufr   r   r   test_doexchange_put  s0   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 ]!}
||
 |j| jksnJ | }	|	j|
ksyJ |	jdu sJ q_t|D ]#\}}
t|d
}||
| | }	|	j|
ksJ |	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  rL   r2   r  r   r   r   r0   r   N)r4   r6   r7   r5   r   r   r   r   r  r   r`   r  r   r  r   r
  r  r8   r  r  r_   r  r   r  )r8   r  r  r  r   r   r   ir   r   r   r   r   r   test_doexchange_echo-  sH   

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  rL   r2   r  r   r  rf   r   r   N)r4   r6   r7   r5   r   r   r  r  r  r  r   r   r  r   r`   r  r   r  r_   r  r  r8   r  )
r8   r  rV   r  r  r   r   r   r   r   r   r   r   test_doexchange_echo_v4S  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   r?   i  r@   i  )rL   rM   cr2   rJ   i  r  r   r   N)r4   r6   r7   r5   r   r   r   r  r   r`   r  r   r  r_   r  r  r   )r8   rX  r  r  r   r   r   ri   r   r   r   test_doexchange_transformk  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  re  r{  r   r   r   asciiN)r  r  r  r   r  rc  r   r   r  r5  r~   ri  astliteral_evalr  r  r  rJ  r  bytesr   r  )r  rK  r  r  raw_headersr  headerrk  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_optionsrP   N)zgrpc.max_receive_message_length    )r,   rO   r   r  r  r  r  r  rj   r  r  r4   r   r   )r  r  rV   r  r   r   r   test_generic_options  s*   
"r  c                   @   r   )CancelFlightServerzA server for testing StopToken.c                 C   s,   t g }t jjg |d}t|t|S )Nr   )r4   r_   r{   r7   r   rw   r   r   )rW   rc   rg   r_   r   r   r   r   rj     s   
zCancelFlightServer.do_getc                 C   sP   t g }t jjg |d}|| | s&|| td | rd S d S )Nr   r   )	r4   r_   r{   r7   r  r3  r  r   r   )rW   rc   r   r   r   r_   r   r   r   r   r     s   



zCancelFlightServer.do_exchangeN)rl   rm   rn   ro   rj   r   r   r   r   r   r    r  r  c                     s  t  jt  jkrtd dd ttjf  fdd} t	 Z}t
d|jf:}|td}| |j tjd}||\}}| |j z|  W n ttjfy\   Y nw W d    n1 sgw   Y  W d    d S W d    d S 1 sw   Y  d S )	Nz'test only works from main Python threadc                   S   s   t d ttj d S r   )r   r   signalraise_signalSIGINTr   r   r   r   signal_from_thread  s   
z*test_interrupt.<locals>.signal_from_threadc                    s   z0z(t jd}t }|  |   W d    n1 sw   Y  W |  n|  w W n ty>   td Y nw |j}t	|t
jtfsUt	|jt
jtfsWJ d S d S )Nr  z2KeyboardInterrupt didn't interrupt Flight read_all)r  r  r  r  r  r  KeyboardInterruptfailr  r  r4   ArrowCancelled__context__)r   texc_infor  	exc_typesr  r   r   re    s    ztest_interrupt.<locals>.testr   r   r   )r  current_threadidentmain_threadr  r  r   r4   r  r  r   r  rj   r   r  r   r`   r  r   r  r   )re  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   r/   )r   r   r  r  r  r  r~  rj   r  r   r  )r  r  r  ri   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   r`   r  r	   r  r  r  r  OSErrorr   r4   r_   r  rP  r   )large_descriptorr  r  r   rM  r   r   r   test_large_descriptor  s(   
Pr  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   r`   r  r   r  r  r  r  r4   ArrowCapacityErrorr   r_   r
  r  r   r  r~  rj   r  r   rP  )r   r  r  r  r   rM  r   r   r   r   test_large_metadata_client	  sf   

 

Tr  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   4	  s   

z ActionNoneFlightServer.do_actionN)rl   rm   rn   ro   r  r   r   r   r   r   r  0	  s    r  c               	   C   s   t  I} td| jf)}|tdd |tdd}tt|j	
 dgks-J W d   n1 s7w   Y  W d   dS W d   dS 1 sOw   Y  dS )zEnsure that actions are executed even when we don't consume iterator.

    See https://issues.apache.org/jira/browse/ARROW-14255
    r   r  r   r  TN)r  r   r  r   r   r  r  loadsrc  r5  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   Y	  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)rl   rm   rn   r   r   r   r  r   r   
FailServerX	  s    r  r   c                      $   z	     q tjy   Y d S w r   )r   r   FlightErrorr   r   r   r   _readerf	     z-test_write_error_propagation.<locals>._readerTr  r?   r   Nc                      r  r   )r  r   r  r   r   r   r   r!  }	  r"  r  )r   r   r`   r  r4   r_   r  r	   r   r  r   r  r  r  r  r  r  r  r  r  r  r  r   r
  )expected_messageexpected_infor   r_   r  r  r  r   r!  r	  r  r   )r  r   r   test_write_error_propagationJ	  sV   



Rr%  c                   C   s   t d dS )z
    Ensure that the gRPC server is stopped at interpreter shutdown.

    See https://issues.apache.org/jira/browse/ARROW-16597.
    zarrow_16597.pyN)r   invoke_scriptr   r   r   r   test_interpreter_shutdown	  s   r'  c                   @   r   )TracingFlightServerz/A server that echoes back trace context values.c                 C   s   | dj}dd | D S )Ntracingc                 s   s(    | ]\}}| d |  dV  qdS )z: r   N)r   )r;  r(   r  r   r   r   	<genexpr>	  s    z0TracingFlightServer.do_action.<locals>.<genexpr>)rt  trace_contextr  )rW   rc   r   r+  r   r   r   r   	  s   zTracingFlightServer.do_actionNrv  r   r   r   r   r(  	  r   r(  c               	   C   s   t dt id:} td| jf}tjddgd}|jd|dD ]}q!W d    n1 s.w   Y  W d    d S W d    d S 1 sFw   Y  d S )	Nr)  r{  r   )s   traceparents7   00-000ff00f00f0ff000f0f00ff0f00fff0-000f0000f0f00000-00)s
   tracestater   ru  )r   r   rf   )r(  r   TracingServerMiddlewareFactoryr   r  rR  r   )r  r  rV   r  r   r   r   test_tracing	  s   Pr-  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   r`   r  )r  msgr   r   r   .test_do_put_does_not_crash_when_schema_is_none	  s   "r/  c               	      s   G dd dt } G  fdddt}G dd dt | }|  P}td|jf|gd-}|tjd	 d
|j	v s<J d|j	v sCJ d|j	v sJJ d|j	v sQJ W d   n1 s[w   Y  W d   dS W d   dS 1 ssw   Y  dS )z9Ensure that server-sent headers/trailers make it through.c                   @   r  )z:test_headers_trailers.<locals>.HeadersTrailersFlightServerc                 S   sD   | dd | dd |dd |dd ttg |g S )	Nx-headerheader-valuex-header-binzheadervalue	x-trailertrailer-valuex-trailer-binztrailervalue)
add_headeradd_trailerr   r^   r4   r_   r   r   r   r   r   	  s   zJtest_headers_trailers.<locals>.HeadersTrailersFlightServer.get_flight_infoN)rl   rm   rn   r   r   r   r   r   HeadersTrailersFlightServer	  r  r8  c                       s    e Zd Zdd Z fddZdS )z?test_headers_trailers.<locals>.HeadersTrailersMiddlewareFactoryc                 S   rO  r   ru  r9  r   r   r   rT   	  rR  zHtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.__init__c                    s    | S r   r   rU  HeadersTrailersMiddlewarer   r   rV  	  rW  zJtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.start_callN)rl   rm   rn   rT   rV  r   r9  r   r    HeadersTrailersMiddlewareFactory	  s    r;  c                   @   s   e Zd Zdd Zdd ZdS )z8test_headers_trailers.<locals>.HeadersTrailersMiddlewarec                 S   rX  r   rZ  r\  r   r   r   rT   	  rR  zAtest_headers_trailers.<locals>.HeadersTrailersMiddleware.__init__c                 S   s2   |  D ]\}}|D ]}| jj||f q
qd S r   )r  r[  rK  r  )rW   rK  r(   rk  r  r   r   r   r`  	  s
   zItest_headers_trailers.<locals>.HeadersTrailersMiddleware.received_headersN)rl   rm   rn   rT   r`  r   r   r   r   r:  	  s    r:  r   r{  r   )r0  r1  )r2  s   headervalue)r3  r4  )r5  s   trailervalueN)
r	   r   r   r   r  r   r   r`   ra   rK  )r8  r;  r[  r  r  r   r9  r   test_headers_trailers	  s   	Pr<  )r  r@  r   r   r   r  r|   rF  r  r   r!   r  r   numpyr  ImportErrorr  r   r4   pyarrow.libr   r   pyarrow.utilr   pyarrow.testsr   r   r   r   r	   r
   r   r   r   r   r   r  mark
pytestmarkr   r   r&   r,   r9   rF   rN   rO   rq   r   r   r   r   r   r   r   r   r   r   r   r  r3  r=  rE  rG  rM  rN  rT  ra  rj  rs  rw  ry  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  slowr  r  r  r  pandasr#  r$  r%  r)  r*  r+  r,  r@  rA  rC  skipifrI  rK  rN  rO  rQ  rS  rT  r[  r_  rj  ra  rf  rh  rk  rl  %header_auth_server_middleware_factoryrp  rs  rt  rz  r  r  r  r  requires_testing_datar  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  large_memoryr  r  r  r  r%  r'  r(  r-  r/  r<  r   r   r   r   <module>   s  ,


	"&1F	


	
Mc	


	
	






 	


 

 	;&',
&

, F	
