o
    ZhQ                    @   sT  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlmZmZ d dlmZ d dlmZ 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Z/G dd de/Z0G dd deZ1G dd  d eZ2G d!d" d"eZ3G d#d$ d$eZ4G d%d& d&eZ5G d'd( d(eZ6G d)d* d*eZ7G d+d, d,eZ8G d-d. d.eZ9G d/d0 d0eZ:G d1d2 d2eZ;G d3d4 d4eZ<G d5d6 d6eZ=G d7d8 d8eZ>d9d: Z?G d;d< d<e!Z@G d=d> d>e ZAG d?d@ d@eZBG dAdB dBeZCG dCdD dDeZDG dEdF dFeZEG dGdH dHeZFG dIdJ dJeZGG dKdL dLeZHG dMdN dNeZIG dOdP dPeZJG dQdR dReZKG dSdT dTeZLG dUdV dVe!ZMG dWdX dXe ZNG dYdZ dZeZOG d[d\ d\e!ZPG d]d^ d^e!ZQG d_d` d`e ZRG dadb dbeZSG dcdd ddeZTG dedf dfeZUdgdh ZVdidj ZWdkdl ZXdmdn ZYej$jZdodp Z[dqdr Z\dsdt Z]dudv Z^ej$j_dwdx Z`dydz Zad{d| Zbd}d~ Zcdd Zddd ZeG dd deZfdd Zgdd Zhdd Ziej$jjejkdkdddd Zlej$jZdd Zmdd Zndd Zodd Zpdd Zqdd Zre:ddidZse<ddidZtej$jZdd Zuej$jjejkdkdddd Zvdd Zwdd Zxdd ZyeB Zze> Z{dd Z|dd Z}dd Z~dd Zdd Zdd Zdd Zej$jZej$jdd Zej$jdd Zej$jdd Zej$jdd Zdd ZddÄ Zddń ZddǄ Zej$jZddɄ Zej$jZdd˄ Zdd̈́ Zddτ Zddф Zddӄ ZddՄ Zddׄ Zddل Zddۄ Zej$jdd݄ Zdd߄ Zdd Zdd Zdd Zdd Zdd Zej$jdd ZG dd deZdd Zdd Zej$jej$jZdd Zej$jej$jZdd ZG dd de/Zdd Zej$jZdd Zdd ZG dd deZd d Zdd Zdd ZdS (      N)IpcReadOptionstobytes)find_free_port)util)flight)FlightClientFlightServerBaseServerAuthHandlerClientAuthHandlerServerMiddlewareServerMiddlewareFactoryClientMiddlewareClientMiddlewareFactoryc                  C   s   dd l } d S )Nr   )pyarrow.flight)pyarrow r   P/var/www/html/lang_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.ZARROW_TEST_DATAzITest resources not found; set ARROW_TEST_DATA to <repo root>/testing/datar   )osenvirongetRuntimeErrorpathlibPathr   r   r   r   resource_root@   s   r   c              	   C   st   t  }|sdS z||  d}| W  d   W S 1 sw   Y  W dS  ty9   td||  t w )z)Get the contents of a test resource file.NrbzNTest resource {} not found; did you initialize the test resource submodule?
{})r   openreadFileNotFoundErrorr   format	traceback
format_exc)pathrootfr   r   r   read_flight_resourceH   s   (r%   c                   C   s6   t dtjt dt ddtjt dt ddgdS )z'Get the paths to test TLS certificates.zroot-ca.pemz	cert0.pemz	cert0.key)certkeyz	cert1.pemz	cert1.key)	root_certcertificates)r%   r   ZCertKeyPairr   r   r   r   example_tls_certsW   s   r*   c                  C   s"   t 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_tableh   s   r7   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bazZquuxtype)   r   N   r<   Z
some_dictsr0   )r2   r3   utf8Zchunked_arrayZDictionaryArrayr5   r4   )dict_valuesr6   r   r   r   simple_dicts_tableo   s   r@   c                   C   s,   t jjt g dt g dgddgdS )N)r8   barr9   Zquxr<   r=         abr0   )r2   r4   r5   r3   r   r   r   r   multiple_column_tablez   s
   rG   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__r7   r@   rG   table_factoriesoptions)selflocationrO   kwargs	__class__r   r   rM      s   
zConstantFlightServer.__init__c                 c   s6    || j krttg tjdg ddV  d S d S )N/foo)CRITERIAr   
FlightInfor2   schemaFlightDescriptorfor_pathrP   contextcriteriar   r   r   list_flights   s   


z!ConstantFlightServer.list_flightsc                 C   s   | j |j  }tj|| jdS )NrO   )rN   ticketr   RecordBatchStreamrO   )rP   r]   ra   tabler   r   r   do_get   s   zConstantFlightServer.do_getNN)	__name__
__module____qualname____doc__rW   rM   r_   rd   __classcell__r   r   rS   r   rH      s    
	rH   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   rL   rM   rO   rP   rO   rR   rS   r   r   rM         
zMetadataFlightServer.__init__c                 C   s<   t g dg}t jj|dgd}tj|j| || jdS )Nr+   rE   r0   r`   )	r2   r3   r4   r5   r   GeneratorStreamrY   number_batchesrO   )rP   r]   ra   r6   rc   r   r   r   rd      s   zMetadataFlightServer.do_getc           
      C   s   d}g d}	 z>|  \}}|tjt|| ggdgs"J |d us(J td| \}	||	ks7J |	t
d| |d7 }W n
 tyO   Y d S w q)Nr   r+   TrE   <ir<   )
read_chunkequalsr2   RecordBatchr5   r3   structunpack
to_pybyteswritepackStopIteration)
rP   r]   
descriptorreaderwritercounterZexpected_databatchbufZclient_counterr   r   r   do_put   s$   

zMetadataFlightServer.do_putc                 c   s2    t |  D ]\}}td|}||fV  qd S )Nrs   )	enumerate
to_batchesrw   r{   )rc   idxr   r   r   r   r   rr      s
   z#MetadataFlightServer.number_batchesN)
rf   rg   rh   ri   rM   rd   r   staticmethodrr   rj   r   r   rS   r   rk      s    
rk   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   )rL   rM   last_messageexpected_schema)rP   rQ   r   rR   rS   r   r   rM      s   
zEchoFlightServer.__init__c                 C   s   t | jS r   )r   rb   r   rP   r]   ra   r   r   r   rd      s   zEchoFlightServer.do_getc                 C   s$   | j r| j |jksJ | | _d S r   )r   rY   read_allr   rP   r]   r}   r~   r   r   r   r   r      s   zEchoFlightServer.do_putc                 C   s   |D ]}qd S r   r   )rP   r]   r}   r~   r   chunkr   r   r   do_exchange   s   zEchoFlightServer.do_exchangere   )	rf   rg   rh   ri   rM   rd   r   r   rj   r   r   rS   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   Zmax_chunksize)r   rq   r   rY   r   r   r   r   r   rd      s   zEchoStreamFlightServer.do_getc                 C   s   g S r   r   rP   r]   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;   Zpeer_identityZpeerencodeNotImplementedErrorrP   r]   actionr   r   r   	do_action   s   
z EchoStreamFlightServer.do_actionN)rf   rg   rh   ri   rd   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   sD   t tdt fg|t ddgt dt jddggddS )NrE       grpc://test	localhost  rV   )r   rX   r2   rY   int32FlightEndpointLocationfor_grpc_tcprP   r]   r}   r   r   r   get_flight_info   s   z#GetInfoFlightServer.get_flight_infoc                 C   s   |  ||}t|jS r   )r   r   SchemaResultrY   )rP   r]   r}   infor   r   r   
get_schema  s   zGetInfoFlightServer.get_schemaN)rf   rg   rh   ri   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)rf   rg   rh   ri   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   r8   r   r   r   r   r   r     s   
z)ListActionsErrorFlightServer.list_actionsN)rf   rg   rh   ri   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   )rL   rM   expected_ticket)rP   r   rQ   rR   rS   r   r   rM   $  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:   rE   r0   )	r   ra   r2   r3   r   r4   r5   r   rb   )rP   r]   ra   data1rc   r   r   r   rd   (  s   
zCheckTicketFlightServer.do_getc                 C   s   |  | _d S r   )r   r   )rP   r]   r}   r~   r   r   r   r   .     zCheckTicketFlightServer.do_putr   )rf   rg   rh   ri   rM   rd   r   rj   r   r   rS   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.rE   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      $@rE   r0   )
r2   r3   r   Zfloat64r;   r4   r5   rY   r   rq   )rP   r]   ra   r   Zdata2Ztable1Ztable2r   r   r   rd   7  s   z InvalidStreamFlightServer.do_getNrf   rg   rh   ri   r2   rY   r   rd   r   r   r   r   r   2      r   c                   @   r   )NeverSendsDataFlightServerz0A Flight server that never actually yields data.rE   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-   rY   )ra   rY   Zempty_tabler2   rv   r5   ranger   rq   	itertoolsrepeat)rP   r]   ra   r6   r   r   r   rd   G  s   
z!NeverSendsDataFlightServer.do_getNr   r   r   r   r   r   B  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 )NrE   )r   rq   r2   rY   r   slow_streamr   r   r   r   rd   X  s   zSlowFlightServer.do_getc                 C   s   t d g S N      ?)timesleepr   r   r   r   r   \  s   
zSlowFlightServer.do_actionc                  c   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:   rE   r0   r.   )r2   r3   r   r4   r5   r   r   )r   r   r   r   r   `  s
   
zSlowFlightServer.slow_streamN)rf   rg   rh   ri   rd   r   r   r   r   r   r   r   r   U  s    r   c                   @   s4   e Zd ZdZedd Zdd Zdd Zdd	 Zd
S )ErrorFlightServerz9A Flight server that uses all the Flight-specific errors.c                	   C   s"   t jt jt jt jt jttjt	dS )N)internaltimedoutcancelunauthenticatedunauthorizedZnotimplementedinvalidr'   )
r   FlightInternalErrorFlightTimedOutErrorFlightCancelledErrorFlightUnauthenticatedErrorFlightUnauthorizedErrorr   r2   ArrowInvalidKeyErrorr   r   r   r   error_casesm  s   zErrorFlightServer.error_casesc                 C   s>   t  }|j|v r||j d|jdkrd}td|t)Nr8   protobuf   this is an error message)r   r   r;   r   r   r   )rP   r]   r   r   err_msgr   r   r   r   z  s   

zErrorFlightServer.do_actionc                 c   s.    t tg t jdg ddV  t d)NrU   rV   r8   )r   rX   r2   rY   rZ   r[   r   r\   r   r   r   r_     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   internalr8   s   timedouts   cancels   unauthenticateds   unauthorizeds   protobufr   )commandr   r   r   r   r   r   )rP   r]   r}   r~   r   r   r   r   r   r     s   










zErrorFlightServer.do_putN)	rf   rg   rh   ri   r   r   r   r_   r   r   r   r   r   r   j  s    
		r   c                       sJ   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )ExchangeFlightServerz A server for testing DoExchange.Nc                    rl   rm   rn   ro   rS   r   r   rM     rp   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: {})Zdescriptor_typer   ZDescriptorTypeZCMDr2   r   r   exchange_echoexchange_do_getexchange_do_putexchange_transformr   r   r   r   r   r     s   





z ExchangeFlightServer.do_exchangec                 C   s:   t jjt tddgdgd}||j || dS )Emulate DoGet with DoExchange.r    (  rE   r0   N)r2   r4   r5   r3   r   beginrY   write_table)rP   r]   r~   r   r6   r   r   r   r     s   z$ExchangeFlightServer.exchange_do_getc                 C   s>   d}|D ]}|j std|d7 }q|t|d dS )Emulate DoPut with DoExchange.r   zAll chunks must have data.r<   r   N)r6   r2   r   write_metadatastrr   )rP   r]   r~   r   Z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.Fr`   TzShould not happenN)r6   r   rY   rO   app_metadatawrite_with_metadatar   write_batch)rP   r]   r~   r   startedr   r   r   r   r     s   
z"ExchangeFlightServer.exchange_echoc                 C   s   |j D ]}tj|jstdt| q| }dg|j }|D ]}t	|D ]\}}	||  |	
 7  < q(q"tjjt|gdgd}
||
j  ||
 dS )zSum rows in an uploaded table.zInvalid field: r   sumr0   N)rY   r2   types
is_integerr;   r   reprr   num_rowsr   Zas_pyr4   r5   r3   r   r   )rP   r]   r~   r   fieldrc   Zsumscolumnrowvalueresultr   r   r   r     s   
z'ExchangeFlightServer.exchange_transformr   )rf   rg   rh   ri   rM   r   r   r   r   r   rj   r   r   rS   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   rL   rM   credsrP   r  rS   r   r   rM        

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   passwordrz   r   )rP   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  rP   tokenr   r   r   is_valid  s
   


z#HttpBasicServerAuthHandler.is_validrf   rg   rh   ri   rM   r  r  rj   r   r   rS   r   r    
    	r  c                       r  )HttpBasicClientAuthHandlerr  c                    s"   t    t||| _d | _d S r   )rL   rM   r   r  
basic_authr  rP   r  r  rS   r   r   rM     s   

z#HttpBasicClientAuthHandler.__init__c                 C   s"   | j  }|| | | _d S r   )r  	serializerz   r   r  )rP   r  r  r  r   r   r   r    s   

z'HttpBasicClientAuthHandler.authenticatec                 C      | j S r   r  rP   r   r   r   	get_token     z$HttpBasicClientAuthHandler.get_tokenrf   rg   rh   ri   rM   r  r  rj   r   r   rS   r   r    s
    r  c                       r  )TokenServerAuthHandler:An example implementation of authentication via handshake.c                    r  r   r  r  rS   r   r   rM     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  rz   base64	b64encoder   r   )rP   r  r  r  r  r   r   r   r    s   z#TokenServerAuthHandler.authenticatec                 C   s*   t |}|dstd|dd  S )Nr$  zinvalid token   )r%  	b64decode
startswithr   r   r  r   r   r   r    s   


zTokenServerAuthHandler.is_validr  r   r   rS   r   r"    r  r"  c                       r  )TokenClientAuthHandlerr#  c                    s    t    || _|| _d| _d S )Nr   )rL   rM   r  r  r  r  rS   r   r   rM   %  s   

zTokenClientAuthHandler.__init__c                 C   s&   | | j | | j | | _d S r   )rz   r  r  r   r  rP   r  r  r   r   r   r  +  s   z#TokenClientAuthHandler.authenticatec                 C   r  r   r  r  r   r   r   r  0  r   z TokenClientAuthHandler.get_tokenr!  r   r   rS   r   r*  "  s
    r*  c                   @   r   )NoopAuthHandlerzA no-op auth handler.c                 C      dS )zDo nothing.Nr   r+  r   r   r   r  7  s    zNoopAuthHandler.authenticatec                 C   r-  )zV
        Returning an empty string.
        Returning None causes Type error.
        r   r   r  r   r   r   r  :  s   zNoopAuthHandler.is_validN)rf   rg   rh   ri   r  r  r   r   r   r   r,  4      r,  c                 C   s,   | D ]}|  |  kr| |  S qdS )zcLookup the value of given key in the given headers.
       The key lookup is case-insensitive.
    N)lowerr   )headersZ
lookup_keyr'   r   r   r   case_insensitive_header_lookupB  s
   r1  c                   @   r   )	!ClientHeaderAuthMiddlewareFactoryz@ClientMiddlewareFactory that creates ClientAuthHeaderMiddleware.c                 C   
   g | _ d S r   call_credentialr  r   r   r   rM   N     
z*ClientHeaderAuthMiddlewareFactory.__init__c                 C      t | S r   )ClientHeaderAuthMiddlewarerP   r   r   r   r   
start_callQ     z,ClientHeaderAuthMiddlewareFactory.start_callc                 C   
   || _ d S r   r4  )rP   r5  r   r   r   set_call_credentialT  r6  z5ClientHeaderAuthMiddlewareFactory.set_call_credentialN)rf   rg   rh   ri   rM   r:  r=  r   r   r   r   r2  K  s
    r2  c                   @   r   )r8  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   r<  r   factoryrP   r?  r   r   r   rM   h  r6  z#ClientHeaderAuthMiddleware.__init__c                 C   s(   t |d}| jd|d dg d S )NAuthorization   authorizationr   r   )r1  r?  r=  r   )rP   r0  auth_headerr   r   r   received_headersk  s
   

z+ClientHeaderAuthMiddleware.received_headersN)rf   rg   rh   ri   rM   rD  r   r   r   r   r8  X  s    r8  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|)NrA  r    r   zInvalid credentialsZBasicr<   r   :testr  Z	token1234ZBearer)r1  splitr%  r(  decoder   r   HeaderAuthServerMiddleware)	rP   r   r0  rC  valuesr  error_messagedecodedpairr   r   r   r:  u  s(   


z,HeaderAuthServerMiddlewareFactory.start_callNrf   rg   rh   ri   r:  r   r   r   r   rE  r  r   rE  c                   @   r   )rK  zBA ServerMiddleware that transports incoming username and password.c                 C   r<  r   r  r  r   r   r   rM     r6  z#HeaderAuthServerMiddleware.__init__c                 C   s   dd| j  iS )NauthorizationzBearer r  r  r   r   r   sending_headers  r   z*HeaderAuthServerMiddleware.sending_headersNrf   rg   rh   ri   rM   rR  r   r   r   r   rK    r.  rK  c                   @   r   )HeaderAuthFlightServerz<A Flight server that tests with basic token authentication. c                 C   s@   | d}|rt| d}|d}|d dgS td)Nr  rA  rF  r<   r   zNo token auth middleware found.)get_middlewarer1  rR  rI  r   r   r   )rP   r]   r   
middlewarerC  rL  r   r   r   r     s   

z HeaderAuthFlightServer.do_actionNrf   rg   rh   ri   r   r   r   r   r   rT    r   rT  c                   @   r   )'ArbitraryHeadersServerMiddlewareFactoryz<A ServerMiddlewareFactory that transports arbitrary headers.c                 C      t |S r   ) ArbitraryHeadersServerMiddlewarerP   r   r0  r   r   r   r:    r;  z2ArbitraryHeadersServerMiddlewareFactory.start_callNrP  r   r   r   r   rX    r   rX  c                   @   r   )rZ  z5A ServerMiddleware that transports arbitrary headers.c                 C   r<  r   r  )rP   r  r   r   r   rM     r6  z)ArbitraryHeadersServerMiddleware.__init__c                 C   r  r   r\  r  r   r   r   rR    r   z0ArbitraryHeadersServerMiddleware.sending_headersNrS  r   r   r   r   rZ    r.  rZ  c                   @   r   )ArbitraryHeadersFlightServerz6A Flight server that tests multiple arbitrary headers.c           	      C   sX   | d}|r'| }t|d}t|d}|d d}|d d}||gS td)Narbitrary-headersztest-header-1ztest-header-2r   r   zNo headers middleware found)rU  rR  r1  r   r   FlightServerError)	rP   r]   r   rV  r0  Zheader_1Zheader_2Zvalue1Zvalue2r   r   r   r     s   

z&ArbitraryHeadersFlightServer.do_actionNrW  r   r   r   r   r]    r   r]  c                   @   r   )HeaderServerMiddlewarez/Expose a per-call value to the RPC method body.c                 C   r<  r   )special_value)rP   ra  r   r   r   rM     r6  zHeaderServerMiddleware.__init__N)rf   rg   rh   ri   rM   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   r:    r;  z(HeaderServerMiddlewareFactory.start_callNrP  r   r   r   r   rb    r   rb  c                   @   r   )HeaderFlightServerz(Echo back the per-call hard-coded value.c                 C   s    | d}|r|j gS dgS )NrH  r   )rU  ra  r   )rP   r]   r   rV  r   r   r   r     s   
zHeaderFlightServer.do_actionNrW  r   r   r   r   rc    r   rc  c                   @   r   )MultiHeaderFlightServer8Test sending/receiving multiple (binary-valued) headers.c                 C   s    | d}t|jd}|gS )NrH  r   )rU  r   client_headersr   )rP   r]   r   rV  r0  r   r   r   r     s   
z!MultiHeaderFlightServer.do_actionNrW  r   r   r   r   rd    r   rd  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`  )rP   r   r0  r  r   r   r   r:    s   


z/SelectiveAuthServerMiddlewareFactory.start_callNrP  r   r   r   r   rg    r   rg  c                   @      e Zd Zdd ZdS )$SelectiveAuthClientMiddlewareFactoryc                 C   s   t  S r   )SelectiveAuthClientMiddlewarer9  r   r   r   r:    r   z/SelectiveAuthClientMiddlewareFactory.start_callN)rf   rg   rh   r:  r   r   r   r   rm         rm  c                   @   rl  )rn  c                 C   s   ddiS )Nrh  r  r   r  r   r   r   rR    s   z-SelectiveAuthClientMiddleware.sending_headersN)rf   rg   rh   rR  r   r   r   r   rn    ro  rn  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   rL   rM   methodsr  rS   r   r   rM     r	  z)RecordingServerMiddlewareFactory.__init__c                 C      | j |j d S r   ru  appendri  r[  r   r   r   r:       z+RecordingServerMiddlewareFactory.start_callrf   rg   rh   ri   rM   r:  rj   r   r   rS   r   rq        rq  c                       rp  ) RecordingClientMiddlewareFactoryrr  c                    rs  r   rt  r  rS   r   r   rM     r	  z)RecordingClientMiddlewareFactory.__init__c                 C   rv  r   rw  r9  r   r   r   r:    ry  z+RecordingClientMiddlewareFactory.start_callrz  r   r   rS   r   r|    r{  r|  c                   @   r   )"MultiHeaderClientMiddlewareFactoryre  c                 C   s
   i | _ d S r   )last_headersr  r   r   r   rM   '  s   
z+MultiHeaderClientMiddlewareFactory.__init__c                 C   r7  r   )MultiHeaderClientMiddlewarer9  r   r   r   r:  ,  r;  z-MultiHeaderClientMiddlewareFactory.start_callN)rf   rg   rh   ri   rM   r:  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  re  r8   rA          r9   )zx-textzx-binary-binzx-MIXED-cases   x-other-MIXED-casec                 C   r<  r   r>  r@  r   r   r   rM   ;  r6  z$MultiHeaderClientMiddleware.__init__c                 C   r  r   )EXPECTEDr  r   r   r   rR  >  r   z+MultiHeaderClientMiddleware.sending_headersc                 C   s   | j j| d S r   )r?  r~  update)rP   r0  r   r   r   rD  A  s   z,MultiHeaderClientMiddleware.received_headersN)rf   rg   rh   ri   r  rM   rR  rD  r   r   r   r   r  0  s    r  c                   @   r   )"MultiHeaderServerMiddlewareFactoryre  c                 C   rY  r   )MultiHeaderServerMiddlewarer[  r   r   r   r:  J  r;  z-MultiHeaderServerMiddlewareFactory.start_callNrP  r   r   r   r   r  G  r   r  c                   @   r   )r  re  c                 C   r<  r   )rf  )rP   rf  r   r   r   rM   Q  r6  z$MultiHeaderServerMiddleware.__init__c                 C   s   t jS r   )r  r  r  r   r   r   rR  T  r   z+MultiHeaderServerMiddleware.sending_headersNrS  r   r   r   r   r  N  r.  r  c                       r  )LargeMetadataFlightServerz Regression test for ARROW-13253.c                    s    t  j|i | dd | _d S )N           )rL   rM   	_metadata)rP   argsrR   rS   r   r   rM   [  s   z"LargeMetadataFlightServer.__init__c                 C   s6   t dt  fg}t|t jdgg|d| jfgS )NrE   r<   r   )r2   rY   int64r   rq   record_batchr  )rP   r]   ra   rY   r   r   r   rd   _  s   z LargeMetadataFlightServer.do_getc                 C   s   | | j d S r   )r   r  r   r   r   r   r   e  s   z%LargeMetadataFlightServer.do_exchange)rf   rg   rh   ri   rM   rd   r   rj   r   r   rS   r   r  X  s
    r  c                  C   s  d} d}d}d}d}d}d}d}d	}d
}	t tdd| ks J t tdd|ks,J t tdd|ks8J t tjd|ksDJ t tdg |ksPJ tt	
g tj g dd}
t |
|ksgJ t td|ksrJ t td|ks}J t tt	
g |ksJ t tt	
dgdksJ t td|	ksJ tt td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'>zY<pyarrow.flight.FlightEndpoint ticket=<pyarrow.flight.Ticket ticket=b'foo'> locations=[]>z<pyarrow.flight.FlightInfo schema= descriptor=<pyarrow.flight.FlightDescriptor path=[]> endpoints=[] total_records=-1 total_bytes=-1>z6<pyarrow.flight.Location b'grpc+tcp://localhost:1234'>z&<pyarrow.flight.Result body=(3 bytes)>z'<pyarrow.flight.SchemaResult schema=()>z%<pyarrow.flight.Ticket ticket=b'foo'>r8   r   rA   userpass   foorV   grpc+tcp://localhost:1234)intr  z1<pyarrow.flight.SchemaResult schema=(int: int64)>)r   r   Actionr   r  rZ   for_commandr   rX   r2   rY   r[   r   Resultr   Ticketpytestraises	TypeError)Zaction_reprZaction_type_reprZbasic_auth_reprZdescriptor_reprZendpoint_reprZ	info_reprZlocation_reprZresult_reprZschema_result_reprZticket_reprr   r   r   r   	test_repri  s<   "r  c                  C   s   dd dd dd dd dd dd dd d	d d
d dd g
} | D ]}| \}}| \}}||ks4J ||ks:J ||ks@J q"d S )Nc                   S      t ddt ddfS )Nr8   r      bar)r   r  r   r   r   r   <lambda>  s    ztest_eq.<locals>.<lambda>c                   S   r  )Nr8   rA   r9   r   r   r   r   r   r       
 
c                   S   s   t ddt ddfS )Nr  r  Zuser2)r   r  r   r   r   r   r    r  c                   S   s   t jdt jdfS )Nr8   )r   rZ   r  r[   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 tg t j g ddt tg t jdg ddfS )NrV   r  *   )r   rX   r2   rY   rZ   r[   r  r   r   r   r   r    s   c                   S      t dt dfS )Nr  zgrpc+tls://localhost:1234)r   r   r   r   r   r   r    s    c                   S   r  )Nr  r  )r   r  r   r   r   r   r        c                   S   s*   t tg t tdt fgfS )NZints)r   r   r2   rY   r  r   r   r   r   r    s    c                   S   r  )Nr   r  )r   r  r   r   r   r   r    r  r   )itemsgenZlhs1Zrhs1Zlhs2Zrhs2r   r   r   test_eq  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)	locationsrQ   serverr   r   r   $test_flight_server_location_argument  s   
r  c                	   C   sN   t t t  t 1 sw   Y  W d    d S 1 s w   Y  d S r   )r  r  
ValueErrorr   r   r   r   r   #test_server_exit_reraises_exception  s
   "r  c                     s   dt  f d }  fdd}t *}tj|dd}|  t }|jdd t | }|dks3J W d    d S 1 s>w   Y  d S )	Nr   c                      s   t d t at  d S r   )r   r   r   r  server   rQ   r   r   r    s   
z-test_client_wait_for_available.<locals>.serveTtargetdaemonr-   timeoutr   )r   r   	threadingThreadstartr   Z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)rH   r   connectportlistr_   rW   len)r  r  Z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   )rH   r   r  r  r  r_   closer  r  r2   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   rI   Nmetadata_versionr`   z+expected IpcWriteOptions, got <class 'int'>matchr  )r7   rH   r   r  r  rd   r  r   ru   r2   ipcIpcWriteOptionsMetadataVersionV4Z	to_readerr  r  r_  )rc   r  r  r6   rO   r   r   r   test_flight_do_get_ints  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   rI   r/   r   N)r7   rH   r   r  r  rd   r  Zread_pandasr  r   Z	to_pylistrc   r  r  r6   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   rJ   )	r@   rH   r   r  r  rd   r  r   ru   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:   rE   r0   s
   the-ticket)r   r   N)r2   r3   r   r4   r5   r   r   r  r  rd   r  r   ru   )r   rc   r  r  r6   r   r   r   test_flight_do_get_ticket  s   Pr  c                  C   s   t  k} td| jf}|tjd}|jdksJ |jdks"J |j	t
	dt
 fgks1J t|jdks:J t|jd jdksFJ |jd jd tdksUJ |jd jd tjdd	ksfJ W d
   d
S 1 sqw   Y  d
S )z8Make sure FlightEndpoint accepts string and object URIs.r   r   rV   rE   r=   r   r<   r   r   N)r   r   r  r   r   rZ   r  total_recordstotal_bytesrY   r2   r   r  	endpointsr  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   rE   N)
r   r   r  r   r   rZ   r  rY   r2   r   r  r   r   r   test_flight_get_schema3  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   r  r   r   r   simple_action_resultsR  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-actionr8   arrow-exceptionforeverc                   3   s        sdV     rd S d S )Nr  )is_cancelledr   r]   r   r   r  `  s   z(ConvenienceServer.do_action.<locals>.gen)r;   r  bodyr2   ArrowMemoryError)rP   r]   r   r  r   r  r   r   V  s   




zConvenienceServer.do_actionN)rf   rg   rh   ri   propertyr  r   r   r   r   r   r  M  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   r  .0xr   r   r   
<listcomp>k      z5test_do_action_result_convenience.<locals>.<listcomp>r  s   the-bodyc                 S   r  r   r  r  r   r   r   r  p  r  r  )r  r   r  r   r  )r  r  resultsr  r   r   r   !test_do_action_result_conveniencef  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  r  r  r  )	r  r   r  r  r  r   r_  r  r   r  r   r   r   test_nicer_server_exceptionst  s    Pr  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   r  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  rI   rJ   N)tempfileNamedTemporaryFiler  r   r   Zfor_grpc_unixnamerH   r   rd   r  r7   rY   ru   r   r@   )sockrQ   r  r~   rc   r6   r   r   r   test_flight_domain_socket  s.   
 "r  c               	   C   s   t jjt tddgdgd} t| jdP}td|jf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   rE   r0   )r   r   rH  r   N)r2   r4   r5   r3   r   r   rY   r   r  r   r   rZ   r[   r   r  rd   r  r   ru   r6   r  r  r   _r  r   r   r   test_flight_large_message  s"   Pr  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   rE   r0   r   rH  r   N)r2   r4   r5   r3   r   r   r   r  r   r   rZ   r[   rY   r   r  rd   r  r   ru   r  r   r   r   test_flight_generator_stream  s"   
Pr  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  r2   ArrowExceptionrd   r   r  r   r  r   r   r   $test_flight_invalid_generator_stream  s   Pr  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  r`   N)r   r   r  r   r  FlightCallOptionsr  r  r   r  r   )r  r  r   rO   r   r   r   test_timeout_fires  s   Pr  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  rI   r`   N)rH   r   r  r   r  rd   r  r   )r  r  rO   r   r   r   test_timeout_passes  s   Pr  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.rB   rF   r0   r   r<   )Zincluded_fields)Zread_optionsrK   r`   r=   N)r2   r4   r5   r3   rH   r   r  r   r  r   rd   r  r   Znum_columnsrG   )expectedr  r  rO   Z	response1Z	response2r   r   r   test_read_options  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   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   rH  p4ssw0rdr  N)r   r  r   r  r   r  r  r  r   nextr  ry   )r  r  r   r  identityZ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  rH  wrongN)r   r  r   r  r   r  r  r  r   r  r  r  r   r  r   r   r   %test_http_basic_auth_invalid_password  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   rH  r  r  N)r   token_auth_handlerr   r  r   r  r  r*  r  r   r  ry   )r  r  r   r	  r   r   r   test_token_auth&  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   rH  r  N)
r   r  r   r  r  r  r   r   r  r*  r  r   r   r   test_token_auth_invalid0  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  rV  r   r     passwordr   rB  r<      Bearer token1234N)rT  no_op_auth_handlerrE  r   r  authenticate_basic_token)r  r  
token_pairr   r   r   test_authenticate_basic_token<  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)
rT  r  rE  r   r  r  r  r   r   r  r  r   r   r   .test_authenticate_basic_token_invalid_passwordG  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   rB  r<   r  r0  test-actionr   r   rO   	   token1234N)rT  r  rE  r   r  r  r   r  r  r   r  r  ry   r  r  r  rO   r  r   r   r   (test_authenticate_basic_token_and_actionQ  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   rV  s   test:passwordrB  s   Basic r  r  r   r  r   r  r<   r  N)rT  r  rE  r2  r   r  r%  r&  r   r  r  r   r  r  ry   r5  r  )r  Zclient_auth_middlewarer  Zencoded_credentialsrO   r  Z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   rB  r<   r  )s   test-header-1   value1)s   test-header-2   value2r  r  r   r`   r!  r"  N)r]  r  rE  rX  r   r  r  r   r  r  r   r  r  ry   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  r2   r   r   r  rH   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:rI   N)r*   rH   r   r   r  r  r  r   FlightUnavailableErrorrd   r  r   certssr  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_certsrI   N)
r7   r*   rH   r   r  rd   r   r  r   ru   rc   r,  r-  r  r6   r   r   r   test_tls_do_get  s   
Pr1  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Zdisable_server_verificationz4disable_server_verification feature is not availablerI   N)r7   r*   rH   r   r  r   r  skiprd   r   r  r   ru   r  r0  r   r   r   $test_tls_disable_server_verification  s   


"r4  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/  Zoverride_hostnamerI   N)
r*   rH   r   r  r  r  r  r*  rd   r  r+  r   r   r   test_tls_override_hostname  s   Pr6  c            
   
   C   s  t g dg} t jj| dgd}g }t k}td|jfK}|t	d}d}	 z |
 \}}|| td| \}	||	ksEJ |d	7 }W n	 tyS   Y nw q*t j|} | |sbJ W d
   n1 slw   Y  W d
   d
S W d
   d
S 1 sw   Y  d
S )z'Try a simple do_get call with metadata.r+   rE   r0   r   r   r   Trs   r<   N)r2   r3   r4   r5   rk   r   r  rd   r   r  rt   rx  rw   rx   ry   r|   from_batchesru   )
r6   rc   batchesr  r  r~   r   r   metadata
server_idxr   r   r   test_flight_do_get_metadata  s0   
	Pr;  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+   rE   r0   r  r`   r   r   N)r2   r4   r5   r3   r  r  r  r  rk   r   r  rd   r   r  r   ru   )rc   rO   r  r  r~   r6   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+   rE   r0   r   r   r<   r   rs   N)r2   r3   r4   r5   rk   r   r  r   r   rZ   r[   rY   r   r   rw   r{   r   r   rx   ry   )r6   rc   r  r  r   metadata_readerr   r   r9  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   )ZdtyperE   r0   r   i   )Zwrite_size_limit_bytesr   zexceeded soft limitr  Nr   i  r   )r2   rv   r5   r3   npZonesr  r   r   r  r   r   rZ   r[   rY   r  r  ZFlightWriteSizeExceededErrorr   r   limitslicer4   r7  rd   r  r   )
Zlarge_batchr  r  r   r=  excinfoZsmaller_batchesr   r  actualr   r   r   test_flight_do_put_limit  sD   


PrD  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   rI   z(?i).*cancel.*r  N)rH   r   r  rd   r   r  r   r  r  r   rt   )r  r  r~   r   r   r   test_cancel_do_get:  s   
PrE  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   rI   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  )rt   setwaitr   r   r   Zraised_proper_exceptionZread_first_messager~   Zresult_lockZstream_canceledr   r   
block_readR  s   
&z/test_cancel_do_get_threaded.<locals>.block_readTr  r-   r  r<   N)r   r   r  rd   r   r  r  EventLockr  r  rG  r   rF  joinis_set)r  r  rI  r  r   rH  r   test_cancel_do_get_threadedF  s*   
PrN  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   r  r   r  )r  r   r  r   r   r  r  r  )r  r  r  r   r   r   test_streaming_do_actiong  s   PrO  c            	      C   s  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gdd}t j| }|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 j| ksJ dS )z(Make sure serializable types round-trip.Zaction1s   action1-bodyr8   s   result1Z	username1Z	password1rE   rH  rF   z
test.arrowr   r   r   r   rV   N)r   r  r  r  r  r  r  r   r2   rY   r   rZ   r  r[   rX   r   r   r   r}   r  r  r  )	r   ra   r  r  Zschema_resultZdescr   Zinfo2Zendpointr   r   r   test_roundtrip_typesp  sN   


rP  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+   rE   r0   )r   r   r   r   r   )r   r   r  r   r  r  r  r  r   r   r  r   r_   r2   r3   r4   r5   r   r   r   r   r   rZ   r  rY   r   r  )r  r  argexc_typer6   rc   
exceptionsr   	exceptionr   r~   r   r   r   test_roundtrip_errors  sN   




PrU  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+   rE   r0   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   rs   N)r2   r3   r4   r5   rk   r   r  r   r   rZ   r[   rY   r  r  r  r   r   rw   r{   r   done_writingrL  r  )r6   rc   r  r  r   rX  r  r8  r   r   r9  r   rV  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.rH  r  r   r  r   r<   r   s   right valueN)rc  rb  r   r  r  r   r   r  r  r  ry   )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.rH  r  r   Nr   r  )rc  rg  r   r  r  r  r2   ZArrowNotImplementedErrorr  r   r   r   r   r  rm  r  r  ry   )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.rH  r  r   r   N)#rq  r|  r   r   r  r   rZ   r  r  r  r   r  r_   r   r   rd   r  r   r2   rY   r  r   r  r   r   rj  ZLIST_FLIGHTSZGET_FLIGHT_INFOZ
GET_SCHEMAZDO_GETZDO_PUTZ	DO_ACTIONrk  ZDO_EXCHANGEru  )Zserver_middlewareZclient_middlewarer  r  r}   r   r  r  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   Prc  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)  Zverify_clientZroot_certificatesr   )r/  
cert_chainZprivate_keyrI   N)r*   r7   rH   r   r  r&   r'   rd   r   r  r   ru   )r,  rc   r-  r  r6   r   r   r   	test_mtlsJ  s&   Pre  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   rE   r0   r   r   N)r2   r4   r5   r3   r   r   r   r  r   rZ   r  r   r   )r  r  r  r}   r   r~   rc   r   r   r   test_doexchange_get]  s    
Prf  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   rE   r0      r   r   r   Nr   )r2   r4   r5   r3   r   r   r   r   r  r   rZ   r  r   r   rY   r   rZ  rt   r6   r   r  r   r   )
r6   r8  r  r  r}   r   r~   r   r   Zexpected_bufr   r   r   test_doexchange_putl  s0   Prh  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   rE   r0   rg  r   r   r   r.   r   N)r2   r4   r5   r3   r   r   r   r   r  r   rZ   r  r   r   r   r   rt   r6   r   r   rY   r   r   r   )r6   r8  r  r  r}   r   r~   ir   r   r   r   r   r   test_doexchange_echo  sH   

Prj  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   rE   r0   rg  r   r  r`   r   r   N)r2   r4   r5   r3   r   r   r  r  r  r  r   r   r  r   rZ   r  r   r   rY   r   rt   r6   r   )
r6   r8  rO   r  r  r}   r   r~   r   r   r   r   r   test_doexchange_echo_v4  s6   
Prk  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  )rE   rF   cr0   rC   i  r   r   r   N)r2   r4   r5   r3   r   r   r   r  r   rZ   r  r   r   rY   r   rZ  r   )r6   r  r  r  r}   r   r~   rc   r   r   r   test_doexchange_transform  s4   

Prm  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 )re  rH  r  r   r   r   asciiN)rd  r  r}  r   r  r  r   r   r  r  ry   rJ  astliteral_evalr  r  r  r/  r  bytesr   r~  )r  r0  r  r]  Zraw_headersrf  headerrL  r   r   r   test_middleware_multi_header  s0   


"rs  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_overrider5  r   r(   )r/  Zgeneric_optionsrI   N)zgrpc.max_receive_message_length    )r*   rH   r   r  r  r  r  r*  rd   r  r  r2   r   r   )r,  r-  rO   r  r   r   r   test_generic_options  s*   
"ru  c                   @   r   )CancelFlightServerzA server for testing StopToken.c                 C   s,   t g }t jjg |d}t|t|S )Nr   )r2   rY   rv   r5   r   rq   r   r   )rP   r]   ra   rY   r   r   r   r   rd     s   
zCancelFlightServer.do_getc                 C   sP   t g }t jjg |d}|| | s&|| td | rd S d S )Nr   r   )	r2   rY   rv   r5   r   r  r   r   r   )rP   r]   r}   r~   r   rY   r   r   r   r   r     s   



zCancelFlightServer.do_exchangeN)rf   rg   rh   ri   rd   r   r   r   r   r   rv    r  rv  c                     s  t  jt  jkrtd t f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yb   Y nw W d    n1 smw   Y  W d    d S W d    d S 1 sw   Y  d S )	Nz'test only works from main Python threadc                      s   t d  tj d S r   )r   r   signalSIGINTr   )raise_signalr   r   signal_from_thread  s   
z*test_interrupt.<locals>.signal_from_threadc                    s   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 )NrY  z2KeyboardInterrupt didn't interrupt Flight read_all)r  r  r  r  r  rL  KeyboardInterruptZfailr   r  r2   ArrowCancelled__context__)r   texc_infora  )	exc_typesrz  r   r   rH  "  s    ztest_interrupt.<locals>.testr   r   r   )r  current_threadidentmain_threadr  r3  r   Zget_raise_signalr{  r2   r|  rv  r   r  rd   r   r  r   rZ   r  r   r  r   )rH  r  r  r~   r}   r   r   )r  ry  rz  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_  rd   r  r   r   )r  r  r  rc   r   r   r   test_never_sends_dataD  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   rZ   r  r   r  r  r  r  OSErrorr   r2   rY   r  r  r   )Zlarge_descriptorr  r  r   r  r   r   r   test_large_descriptorR  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   rZ   r  r   r  r  r  r  r2   ZArrowCapacityErrorr   rY   r   r  r   r  r_  rd   r  r   r  )r}   r9  r  r  r   r  r~   r   r   r   test_large_metadata_clientd  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   rx  T)r;   jsondumpsVALUESr   rx  r   r   r   r   r   r     s   

z ActionNoneFlightServer.do_actionN)rf   rg   rh   ri   r  r   r   r   r   r   r    s    r  c               	   C   s   t  I} td| jf)}|tdd |tdd}tt|j	
 dgks-J W d   n1 s7w   Y  W d   dS W d   dS 1 sOw   Y  dS )zEnsure that actions are executed even when we don't consume iterator.

    See https://issues.apache.org/jira/browse/ARROW-14255
    r   rx  r   r  TN)r  r   r  r   r   r  r  loadsr  r  ry   )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.
    r8   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)rf   rg   rh   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  r<   r   Nc                      r  r   )rt   r   r  r   r  r   r   r    r  r  )r   r   rZ   r  r2   rY   r  r   r   r  r   r  r  r  r  r  r   r  r   r`  r  rL  r   r   )Zexpected_messageZexpected_infor}   rY   r  r  r  r   r  r  r  r   )r  r~   r   test_write_error_propagation  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   Zinvoke_scriptr   r   r   r   test_interpreter_shutdown  s   r  c                   @   r   )TracingFlightServerz/A server that echoes back trace context values.c                 C   s   | dj}dd | D S )Ntracingc                 s   s(    | ]\}}| d |  dV  qdS )z: r   N)r   )r  r'   r   r   r   r   	<genexpr>  s    z0TracingFlightServer.do_action.<locals>.<genexpr>)rU  trace_contextr  )rP   r]   r   r  r   r   r   r     s   zTracingFlightServer.do_actionNrW  r   r   r   r   r    r   r  c               	   C   s   t dt id:} td| jf}tjddgd}|jd|dD ]}q!W d    n1 s.w   Y  W d    d S W d    d S 1 sFw   Y  d S )	Nr  r  r   )s   traceparents7   00-000ff00f00f0ff000f0f00ff0f00fff0-000f0000f0f00000-00)s
   tracestater   r  )r   r   r`   )r  r   ZTracingServerMiddlewareFactoryr   r  r  r   )r  r  rO   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:9643Tr2  zRArgument 'schema' has incorrect type \(expected pyarrow.lib.Schema, got NoneType\)r  r8   r   )r   r  r  r  r   r   rZ   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                   @   rl  )z:test_headers_trailers.<locals>.HeadersTrailersFlightServerc                 S   sH   | dd | dd |dd |dd ttg |g d	d	S )
Nx-headerheader-valuex-header-binzheadervalue	x-trailertrailer-valuex-trailer-binztrailervaluerV   )
add_headerZadd_trailerr   rX   r2   rY   r   r   r   r   r   	  s   zJtest_headers_trailers.<locals>.HeadersTrailersFlightServer.get_flight_infoN)rf   rg   rh   r   r   r   r   r   HeadersTrailersFlightServer	  ro  r  c                       s    e Zd Zdd Z fddZdS )z?test_headers_trailers.<locals>.HeadersTrailersMiddlewareFactoryc                 S   r3  r   r  r  r   r   r   rM   )	  r6  zHtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.__init__c                    s    | S r   r   r9  HeadersTrailersMiddlewarer   r   r:  ,	  r;  zJtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.start_callN)rf   rg   rh   rM   r:  r   r  r   r    HeadersTrailersMiddlewareFactory(	  s    r  c                   @   s   e Zd Zdd Zdd ZdS )z8test_headers_trailers.<locals>.HeadersTrailersMiddlewarec                 S   r<  r   r>  r@  r   r   r   rM   0	  r6  zAtest_headers_trailers.<locals>.HeadersTrailersMiddleware.__init__c                 S   s2   |  D ]\}}|D ]}| jj||f q
qd S r   )r  r?  r0  rx  )rP   r0  r'   rL  r   r   r   r   rD  3	  s
   zItest_headers_trailers.<locals>.HeadersTrailersMiddleware.received_headersN)rf   rg   rh   rM   rD  r   r   r   r   r  /	  s    r  r   r  r   )r  r  )r  s   headervalue)r  r  )r  s   trailervalueN)
r   r   r   r   r  r   r   rZ   r[   r0  )r  r  r?  r  r  r   r  r   test_headers_trailers	  s   	Pr  )ro  r%  r   r   r   rw  rw   r  r  r   r    r  numpyr?  r  r   r2   Zpyarrow.libr   r   Zpyarrow.utilr   Zpyarrow.testsr   r   r   r   r   r	   r
   r   r   r   r   ImportErrorobjectmarkZ
pytestmarkr   r   r%   r*   r7   r@   rG   rH   rk   r   r   r   r   r   r   r   r   r   r   r   r  r  r"  r*  r,  r1  r2  r8  rE  rK  rT  rX  rZ  r]  r`  rb  rc  rd  rg  rm  rn  rq  r|  r}  r  r  r  r  r  r  r  r  Zslowr  r  r  r  Zpandasr  r  r  r  r  r  r  r  r  r  Zskipifr  r  r  r  r  r  r  r   r  r  r  r
  r  r  r  Z%header_auth_server_middleware_factoryr  r  r  r  r   r#  r%  r'  Zrequires_testing_datar.  r1  r4  r6  r;  r<  r>  rD  rE  rN  rO  rP  rU  r[  r\  r^  r_  rc  re  rf  rh  rj  rk  rm  rs  ru  rv  r  r  Zlarge_memoryr  r  r  r  r  r  r  r  r  r  r   r   r   r   <module>   sr  ,


	#*2F	


	
'"
	


	
	






 	




 	3&',
&
. 
F	
