U
    k/euJ                    @   sL  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlmZmZ d dlmZ d dlmZ z8d dlmZ d dlmZmZmZmZmZmZm Z m!Z! W nB e"k
r   dZe#e# ZZe#e# ZZe#e# ZZe#e# Z Z!Y nX ej$jZ%dd Z&d	d
 Z'dd Z(dd Z)dd Z*dd Z+dd Z,G dd deZ-G dd deZ.G dd deZ/G dd de/Z0G dd deZ1G dd  d eZ2G d!d" d"eZ3G d#d$ d$eZ4G d%d& d&eZ5G d'd( d(eZ6G d)d* d*eZ7G d+d, d,eZ8G d-d. d.eZ9G d/d0 d0eZ:G d1d2 d2eZ;G d3d4 d4eZ<G d5d6 d6eZ=G d7d8 d8eZ>d9d: Z?G d;d< d<e!Z@G d=d> d>e ZAG d?d@ d@eZBG dAdB dBeZCG dCdD dDeZDG dEdF dFeZEG dGdH dHeZFG dIdJ dJeZGG dKdL dLeZHG dMdN dNeZIG dOdP dPeZJG dQdR dReZKG dSdT dTeZLG dUdV dVe!ZMG dWdX dXe ZNG dYdZ dZeZOG d[d\ d\e!ZPG d]d^ d^e!ZQG d_d` d`e ZRG dadb dbeZSG dcdd ddeZTG dedf dfeZUdgdh ZVdidj ZWdkdl ZXdmdn ZYej$jZdodp Z[dqdr Z\dsdt Z]dudv Z^ej$j_dwdx Z`dydz Zad{d| Zbd}d~ Zcdd Zddd ZeG 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 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   =/tmp/pip-unpacked-wheel-seu8352k/pyarrow/tests/test_flight.pytest_import;   s    r   c                   C   s(   t jdstdtt jd d S )z-Get the path to the test resources directory.ZARROW_TEST_DATAzITest resources not found; set ARROW_TEST_DATA to <repo root>/testing/datar   )osenvirongetRuntimeErrorpathlibPathr   r   r   r   resource_root@   s    r   c              
   C   sp   t  }|sdS z0||  d}| W  5 Q R  W S Q R X W n, tk
rj   td||  t Y nX dS )z)Get the contents of a test resource file.NrbzNTest resource {} not found; did you initialize the test resource submodule?
{})r   openreadFileNotFoundErrorr   format	traceback
format_exc)pathrootfr   r   r   read_flight_resourceH   s     r%   c                   C   s6   t dtjt dt ddtjt dt ddgdS )z'Get the paths to test TLS certificates.zroot-ca.pemz	cert0.pemz	cert0.key)certkeyz	cert1.pemz	cert1.key)	root_certcertificates)r%   r   ZCertKeyPairr   r   r   r   example_tls_certsW   s    r*   c                  C   s(   t dddddgg} t jj| dgdS )Nr      
   	some_intsnames)paarrayTablefrom_arrays)datar   r   r   simple_ints_tableh   s    r7   c                  C   sX   t jdddgt  d} t t jddd g| t jddg| gg}t jj|dgd	S )
NfoobazZquuxtype   r      Z
some_dictsr0   )r2   r3   utf8Zchunked_arrayZDictionaryArrayr5   r4   )dict_valuesr6   r   r   r   simple_dicts_tableo   s    r@   c                   C   s4   t jjt ddddgt ddddggd	d
gdS )Nr8   barr9   Zquxr<   r=         abr0   )r2   r4   r5   r3   r   r   r   r   multiple_column_tablez   s
    rF   c                       s6   e Zd ZdZdZd
 fdd	Zdd Zdd	 Z  ZS )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| tttd| _|| _d S )N)   ints   dicts   multi)super__init__r7   r@   rF   table_factoriesoptions)selflocationrN   kwargs	__class__r   r   rL      s    zConstantFlightServer.__init__c                 c   s0   || j kr,ttg tjdg ddV  d S )N/foo)CRITERIAr   
FlightInfor2   schemaFlightDescriptorfor_pathrO   contextZcriteriar   r   r   list_flights   s    

 z!ConstantFlightServer.list_flightsc                 C   s   | j |j  }tj|| jdS )NrN   )rM   ticketr   RecordBatchStreamrN   )rO   r\   r_   tabler   r   r   do_get   s    zConstantFlightServer.do_get)NN)	__name__
__module____qualname____doc__rV   rL   r]   rb   __classcell__r   r   rR   r   rG      s
   
	rG   c                       s>   e Zd ZdZd fdd	Zdd Zdd Zed	d
 Z  Z	S )MetadataFlightServerz4A Flight server that numbers incoming/outgoing data.Nc                    s   t  jf | || _d S NrK   rL   rN   rO   rN   rQ   rR   r   r   rL      s    zMetadataFlightServer.__init__c                 C   sB   t dddddgg}t jj|dgd}tj|j| || jdS )	Nr+   r,   r   r-   r.   rD   r0   r^   )	r2   r3   r4   r5   r   GeneratorStreamrX   number_batchesrN   )rO   r\   r_   r6   ra   r   r   r   rb      s    zMetadataFlightServer.do_getc           
      C   s   d}dddddg}z||  \}}|tjt|| ggdgsHt|d k	sTttd|	 \}	||	ksrt|
td| |d7 }W q tk
r   Y d S X qd S )	Nr   r+   r,   r-   r.   rD   <ir<   )
read_chunkequalsr2   RecordBatchr5   r3   AssertionErrorstructunpack
to_pybyteswritepackStopIteration)
rO   r\   
descriptorreaderwritercounterZexpected_databatchbufZclient_counterr   r   r   do_put   s    

zMetadataFlightServer.do_putc                 c   s0   t |  D ]\}}td|}||fV  qd S )Nrn   )	enumerate
to_batchesrs   rw   )ra   idxr}   r~   r   r   r   rm      s    z#MetadataFlightServer.number_batches)N)
rc   rd   re   rf   rL   rb   r   staticmethodrm   rg   r   r   rR   r   rh      s   
rh   c                       s:   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Z  ZS )EchoFlightServerz4A Flight server that returns the last data uploaded.Nc                    s    t  j|f| d | _|| _d S ri   )rK   rL   last_messageexpected_schema)rO   rP   r   rQ   rR   r   r   rL      s    zEchoFlightServer.__init__c                 C   s   t | jS ri   )r   r`   r   rO   r\   r_   r   r   r   rb      s    zEchoFlightServer.do_getc                 C   s$   | j r| j |jkst| | _d S ri   )r   rX   rr   read_allr   rO   r\   ry   rz   r{   r   r   r   r      s    zEchoFlightServer.do_putc                 C   s   |D ]}qd S ri   r   )rO   r\   ry   rz   r{   chunkr   r   r   do_exchange   s    zEchoFlightServer.do_exchange)NN)	rc   rd   re   rf   rL   rb   r   r   rg   r   r   rR   r   r      s
   r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	EchoStreamFlightServerz6An echo server that streams individual record batches.c                 C   s   t | jj| jjddS )N   Zmax_chunksize)r   rl   r   rX   r   r   r   r   r   rb      s    zEchoStreamFlightServer.do_getc                 C   s   g S ri   r   rO   r\   r   r   r   list_actions   s    z#EchoStreamFlightServer.list_actionsc                 C   s(   |j dkr | | dgS td S )Nwho-am-iutf-8)r;   Zpeer_identityZpeerencodeNotImplementedErrorrO   r\   actionr   r   r   	do_action   s    
z EchoStreamFlightServer.do_actionN)rc   rd   re   rf   rb   r   r   r   r   r   r   r      s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )GetInfoFlightServerz)A Flight server that tests GetFlightInfo.c                 C   sD   t tdt fg|t ddgt dt jddggddS )NrD       grpc://test	localhost  rU   )r   rW   r2   rX   int32FlightEndpointLocationfor_grpc_tcp)rO   r\   ry   r   r   r   get_flight_info   s    z#GetInfoFlightServer.get_flight_infoc                 C   s   |  ||}t|jS ri   )r   r   SchemaResultrX   )rO   r\   ry   infor   r   r   
get_schema  s    zGetInfoFlightServer.get_schemaN)rc   rd   re   rf   r   r   r   r   r   r   r      s   r   c                   @   s$   e Zd ZdZedd Zdd ZdS )ListActionsFlightServer'A Flight server that tests ListActions.c                 C   s   ddt ddgS )N)action-1description)zaction-2 zaction-3zmore detailr   
ActionType)clsr   r   r   expected_actions  s    
z(ListActionsFlightServer.expected_actionsc                 c   s   |   E d H  d S ri   )r   r   r   r   r   r     s    z$ListActionsFlightServer.list_actionsN)rc   rd   re   rf   classmethodr   r   r   r   r   r   r   
  s   
r   c                   @   s   e Zd ZdZdd ZdS )ListActionsErrorFlightServerr   c                 c   s   dV  dV  d S )N)r   r   r8   r   r   r   r   r   r     s    z)ListActionsErrorFlightServer.list_actionsN)rc   rd   re   rf   r   r   r   r   r   r     s   r   c                       s2   e Zd ZdZd	 fdd	Zdd Zdd Z  ZS )
CheckTicketFlightServerzDA Flight server that compares the given ticket to an expected value.Nc                    s   t  j|f| || _d S ri   )rK   rL   expected_ticket)rO   r   rP   rQ   rR   r   r   rL   $  s    z CheckTicketFlightServer.__init__c                 C   sJ   | j |jksttjdddddgt dg}tjj|dgd}t	|S 	Nr+   r,   r   r-   r.   r:   rD   r0   )
r   r_   rr   r2   r3   r   r4   r5   r   r`   )rO   r\   r_   data1ra   r   r   r   rb   (  s    zCheckTicketFlightServer.do_getc                 C   s   |  | _d S ri   )r   r   )rO   r\   ry   rz   r   r   r   r   .  s    zCheckTicketFlightServer.do_put)N)rc   rd   re   rf   rL   rb   r   rg   r   r   rR   r   r   !  s   r   c                   @   s,   e Zd ZdZede fgZdd ZdS )InvalidStreamFlightServerzEA Flight server that tries to return messages with differing schemas.rD   c                 C   s   t jdddddgt  dg}t jddd	d
dgt  dg}|j|jksLtt jj|dgd}t jj|dgd}|j| jkstt	
| j||gS )Nr+   r,   r   r-   r.   r:   g      $g      g              @g      $@rD   r0   )r2   r3   r   Zfloat64r;   rr   r4   r5   rX   r   rl   )rO   r\   r_   r   Zdata2Ztable1Ztable2r   r   r   rb   7  s    z InvalidStreamFlightServer.do_getNrc   rd   re   rf   r2   rX   r   rb   r   r   r   r   r   2  s   r   c                   @   s,   e Zd ZdZede fgZdd ZdS )NeverSendsDataFlightServerz0A Flight server that never actually yields data.rD   c                 C   s\   |j dkrB| j | j tjjtdg| jdg}t| j|S t| jt	
| j S )N
   yield_datar-   rX   )r_   rX   Zempty_tabler2   rq   r5   ranger   rl   	itertoolsrepeat)rO   r\   r_   r6   r   r   r   rb   G  s    
 z!NeverSendsDataFlightServer.do_getNr   r   r   r   r   r   B  s   r   c                   @   s,   e Zd ZdZdd Zdd Zedd ZdS )	SlowFlightServerz;A Flight server that delays its responses to test timeouts.c                 C   s    t tdt fg|  S )NrD   )r   rl   r2   rX   r   slow_streamr   r   r   r   rb   X  s    zSlowFlightServer.do_getc                 C   s   t d g S N      ?)timesleepr   r   r   r   r   \  s    
zSlowFlightServer.do_actionc                  c   sT   t jdddddgt  dg} t jj| dgdV  td t jj| dgdV  d S r   )r2   r3   r   r4   r5   r   r   )r   r   r   r   r   `  s    
zSlowFlightServer.slow_streamN)rc   rd   re   rf   rb   r   r   r   r   r   r   r   r   U  s
   r   c                   @   s4   e Zd ZdZedd Zdd Zdd Zdd	 Zd
S )ErrorFlightServerz9A Flight server that uses all the Flight-specific errors.c                	   C   s"   t jt jt jt jt jttjt	dS )N)internaltimedoutcancelunauthenticatedunauthorizedZnotimplementedinvalidr'   )
r   FlightInternalErrorFlightTimedOutErrorFlightCancelledErrorFlightUnauthenticatedErrorFlightUnauthorizedErrorr   r2   ArrowInvalidKeyErrorr   r   r   r   error_casesm  s    zErrorFlightServer.error_casesc                 C   sD   t  }|j|kr"||j dn|jdkr<d}td|td S )Nr8   protobuf   this is an error message)r   r   r;   r   r   r   )rO   r\   r   r   err_msgr   r   r   r   z  s    

zErrorFlightServer.do_actionc                 c   s0   t tg t jdg ddV  t dd S )NrT   rU   r8   )r   rW   r2   rX   rY   rZ   r   r[   r   r   r   r]     s    
 zErrorFlightServer.list_flightsc                 C   s   |j dkrtdnr|j dkr,tdn\|j dkrBtdnF|j dkrXtdn0|j dkrntdn|j dkrd}td|d S )	Ns   internalr8   s   timedouts   cancels   unauthenticateds   unauthorizeds   protobufr   )commandr   r   r   r   r   r   )rO   r\   ry   rz   r{   r   r   r   r   r     s    





zErrorFlightServer.do_putN)	rc   rd   re   rf   r   r   r   r]   r   r   r   r   r   r   j  s   
		r   c                       sJ   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zdd Zdd Z	  Z
S )ExchangeFlightServerz A server for testing DoExchange.Nc                    s   t  jf | || _d S ri   rj   rk   rR   r   r   rL     s    zExchangeFlightServer.__init__c                 C   s   |j tjjkrtdnr|jdkr2| |||S |jdkrJ| |||S |jdkrb| 	|||S |jdkrz| 
|||S td|jd S )Nz!Must provide a command descriptor   echo   get   put	   transformzUnknown command: {})Zdescriptor_typer   ZDescriptorTypeZCMDr2   r   r   exchange_echoexchange_do_getexchange_do_putexchange_transformr   r   r   r   r   r     s    




z ExchangeFlightServer.do_exchangec                 C   s:   t jjt tddgdgd}||j || dS )Emulate DoGet with DoExchange.r    (  rD   r0   N)r2   r4   r5   r3   r   beginrX   write_table)rO   r\   rz   r{   r6   r   r   r   r     s    z$ExchangeFlightServer.exchange_do_getc                 C   s>   d}|D ]}|j std|d7 }q|t|d dS )Emulate DoPut with DoExchange.r   zAll chunks must have data.r<   r   N)r6   r2   r   write_metadatastrr   )rO   r\   rz   r{   Znum_batchesr   r   r   r   r     s    

z$ExchangeFlightServer.exchange_do_putc                 C   s   d}|D ]x}|s.|j r.|j|j j| jd d}|jrL|j rL||j |j q|jr`||j q|j rt||j  qdstdqdS )zRun a simple echo server.Fr^   TzShould not happenN)	r6   r   rX   rN   app_metadatawrite_with_metadatar   write_batchrr   )rO   r\   rz   r{   startedr   r   r   r   r     s    
z"ExchangeFlightServer.exchange_echoc                 C   s   |j D ]$}tj|jstdt| q| }dg|j }|D ]*}t	|D ]\}}	||  |	
 7  < qPqDtjjt|gdgd}
||
j  ||
 dS )zSum rows in an uploaded table.zInvalid field: r   sumr0   N)rX   r2   types
is_integerr;   r   reprr   num_rowsr   Zas_pyr4   r5   r3   r   r   )rO   r\   rz   r{   fieldra   Zsumscolumnrowvalueresultr   r   r   r     s    
z'ExchangeFlightServer.exchange_transform)N)rc   rd   re   rf   rL   r   r   r   r   r   rg   r   r   rR   r   r     s   	r   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )HttpBasicServerAuthHandler7An example implementation of HTTP basic authentication.c                    s   t    || _d S ri   rK   rL   credsrO   r   rR   r   r   rL     s    
z#HttpBasicServerAuthHandler.__init__c                 C   sZ   |  }tj|}|j| jkr*td| j|j |jkrFtd|t	|j d S )Nunknown userzwrong password)
r   r   	BasicAuthdeserializeusernamer   r   passwordrv   r   )rO   outgoingincomingr~   authr   r   r   authenticate  s    

z'HttpBasicServerAuthHandler.authenticatec                 C   s&   |st d|| jkr"t d|S )Nztoken not providedr   )r   r   r   rO   tokenr   r   r   is_valid  s
    


z#HttpBasicServerAuthHandler.is_validrc   rd   re   rf   rL   r  r  rg   r   r   rR   r   r     s   	r   c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )HttpBasicClientAuthHandlerr   c                    s"   t    t||| _d | _d S ri   )rK   rL   r   r   
basic_authr  rO   r   r   rR   r   r   rL     s    
z#HttpBasicClientAuthHandler.__init__c                 C   s"   | j  }|| | | _d S ri   )r  	serializerv   r   r  )rO   r   r   r   r   r   r   r    s    

z'HttpBasicClientAuthHandler.authenticatec                 C   s   | j S ri   r  rO   r   r   r   	get_token  s    z$HttpBasicClientAuthHandler.get_tokenrc   rd   re   rf   rL   r  r  rg   r   r   rR   r   r    s   r  c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )TokenServerAuthHandler:An example implementation of authentication via handshake.c                    s   t    || _d S ri   r   r   rR   r   r   rL     s    
zTokenServerAuthHandler.__init__c                 C   sL   |  }|  }|| jkr>| j| |kr>|td|  n
tdd S )N   secret:zinvalid username/password)r   r   rv   base64	b64encoder   r   )rO   r   r   r   r   r   r   r   r    s    z#TokenServerAuthHandler.authenticatec                 C   s*   t |}|dstd|dd  S )Nr  zinvalid token   )r  	b64decode
startswithr   r   r  r   r   r   r    s    


zTokenServerAuthHandler.is_validr  r   r   rR   r   r    s   	r  c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )TokenClientAuthHandlerr  c                    s    t    || _|| _d| _d S )Nr   )rK   rL   r   r   r  r  rR   r   r   rL   %  s    
zTokenClientAuthHandler.__init__c                 C   s&   | | j | | j | | _d S ri   )rv   r   r   r   r  rO   r   r   r   r   r   r  +  s    z#TokenClientAuthHandler.authenticatec                 C   s   | j S ri   r
  r  r   r   r   r  0  s    z TokenClientAuthHandler.get_tokenr  r   r   rR   r   r  "  s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )NoopAuthHandlerzA no-op auth handler.c                 C   s   dS )zDo nothing.Nr   r  r   r   r   r  7  s    zNoopAuthHandler.authenticatec                 C   s   dS )zV
        Returning an empty string.
        Returning None causes Type error.
        r   r   r  r   r   r   r  :  s    zNoopAuthHandler.is_validN)rc   rd   re   rf   r  r  r   r   r   r   r  4  s   r  c                 C   s,   | D ]"}|  |  kr| |  S qdS )zcLookup the value of given key in the given headers.
       The key lookup is case insensitive.
    N)lowerr   )headersZ
lookup_keyr'   r   r   r   case_insensitive_header_lookupB  s    r  c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	!ClientHeaderAuthMiddlewareFactoryz@ClientMiddlewareFactory that creates ClientAuthHeaderMiddleware.c                 C   s
   g | _ d S ri   call_credentialr  r   r   r   rL   N  s    z*ClientHeaderAuthMiddlewareFactory.__init__c                 C   s   t | S ri   )ClientHeaderAuthMiddlewarerO   r   r   r   r   
start_callQ  s    z,ClientHeaderAuthMiddlewareFactory.start_callc                 C   s
   || _ d S ri   r  )rO   r  r   r   r   set_call_credentialT  s    z5ClientHeaderAuthMiddlewareFactory.set_call_credentialN)rc   rd   re   rf   rL   r!  r"  r   r   r   r   r  K  s   r  c                   @   s    e Zd ZdZdd Zdd ZdS )r  a  
    ClientMiddleware that extracts the authorization header
    from the server.

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

    Parameters
    ----------
    factory : ClientHeaderAuthMiddlewareFactory
        This factory is used to set call credentials if an
        authorization header is found in the headers from the server.
    c                 C   s
   || _ d S ri   factoryrO   r$  r   r   r   rL   h  s    z#ClientHeaderAuthMiddleware.__init__c                 C   s(   t |d}| jd|d dg d S )NAuthorization   authorizationr   r   )r  r$  r"  r   )rO   r  auth_headerr   r   r   received_headersk  s
    
z+ClientHeaderAuthMiddleware.received_headersN)rc   rd   re   rf   rL   r)  r   r   r   r   r  X  s   r  c                   @   s   e Zd ZdZdd ZdS )!HeaderAuthServerMiddlewareFactoryz)Validates incoming username and password.c           	      C   s   t |d}|d d}d}d}|d dkrrt|d }|dd	}|d d
krb|d dkslt|d}n2|d dkr|d }|dkst|n
t|t|S )Nr&  r    r   zInvalid credentialsZBasicr<   r   :testr   Z	token1234ZBearer)r  splitr  r  decoder   r   HeaderAuthServerMiddleware)	rO   r   r  r(  valuesr  error_messagedecodedpairr   r   r   r!  u  s&    

z,HeaderAuthServerMiddlewareFactory.start_callNrc   rd   re   rf   r!  r   r   r   r   r*  r  s   r*  c                   @   s    e Zd ZdZdd Zdd ZdS )r0  zBA ServerMiddleware that transports incoming username and password.c                 C   s
   || _ d S ri   r
  r  r   r   r   rL     s    z#HeaderAuthServerMiddleware.__init__c                 C   s   dd| j  iS )NauthorizationzBearer r
  r  r   r   r   sending_headers  s    z*HeaderAuthServerMiddleware.sending_headersNrc   rd   re   rf   rL   r7  r   r   r   r   r0    s   r0  c                   @   s   e Zd ZdZdd ZdS )HeaderAuthFlightServerz<A Flight server that tests with basic token authentication. c                 C   sD   | d}|r6t| d}|d}|d dgS tdd S )Nr   r&  r+  r<   r   zNo token auth middleware found.)get_middlewarer  r7  r.  r   r   r   )rO   r\   r   
middlewarer(  r1  r   r   r   r     s    
 
z HeaderAuthFlightServer.do_actionNrc   rd   re   rf   r   r   r   r   r   r9    s   r9  c                   @   s   e Zd ZdZdd ZdS )'ArbitraryHeadersServerMiddlewareFactoryz<A ServerMiddlewareFactory that transports arbitrary headers.c                 C   s   t |S ri   ) ArbitraryHeadersServerMiddlewarerO   r   r  r   r   r   r!    s    z2ArbitraryHeadersServerMiddlewareFactory.start_callNr5  r   r   r   r   r=    s   r=  c                   @   s    e Zd ZdZdd Zdd ZdS )r>  z5A ServerMiddleware that transports arbitrary headers.c                 C   s
   || _ d S ri   r   )rO   r   r   r   r   rL     s    z)ArbitraryHeadersServerMiddleware.__init__c                 C   s   | j S ri   r@  r  r   r   r   r7    s    z0ArbitraryHeadersServerMiddleware.sending_headersNr8  r   r   r   r   r>    s   r>  c                   @   s   e Zd ZdZdd ZdS )ArbitraryHeadersFlightServerz6A Flight server that tests multiple arbitrary headers.c           	      C   s\   | d}|rN| }t|d}t|d}|d d}|d d}||gS tdd S )Narbitrary-headersztest-header-1ztest-header-2r   r   zNo headers middleware found)r:  r7  r  r   r   FlightServerError)	rO   r\   r   r;  r  Zheader_1Zheader_2Zvalue1Zvalue2r   r   r   r     s    
z&ArbitraryHeadersFlightServer.do_actionNr<  r   r   r   r   rA    s   rA  c                   @   s   e Zd ZdZdd ZdS )HeaderServerMiddlewarez/Expose a per-call value to the RPC method body.c                 C   s
   || _ d S ri   )special_value)rO   rE  r   r   r   rL     s    zHeaderServerMiddleware.__init__N)rc   rd   re   rf   rL   r   r   r   r   rD    s   rD  c                   @   s   e Zd ZdZdd ZdS )HeaderServerMiddlewareFactoryz:Expose a per-call hard-coded value to the RPC method body.c                 C   s   t dS )Nzright value)rD  r?  r   r   r   r!    s    z(HeaderServerMiddlewareFactory.start_callNr5  r   r   r   r   rF    s   rF  c                   @   s   e Zd ZdZdd ZdS )HeaderFlightServerz(Echo back the per-call hard-coded value.c                 C   s    | d}|r|j gS dgS )Nr-  r   )r:  rE  r   )rO   r\   r   r;  r   r   r   r     s    
zHeaderFlightServer.do_actionNr<  r   r   r   r   rG    s   rG  c                   @   s   e Zd ZdZdd ZdS )MultiHeaderFlightServer8Test sending/receiving multiple (binary-valued) headers.c                 C   s    | d}t|jd}|gS )Nr-  r   )r:  r   client_headersr   )rO   r\   r   r;  r  r   r   r   r     s    
z!MultiHeaderFlightServer.do_actionNr<  r   r   r   r   rH    s   rH  c                   @   s   e Zd ZdZdd ZdS )$SelectiveAuthServerMiddlewareFactoryz1Deny access to certain methods based on a header.c                 C   sL   |j tjjkrd S |d}|s*td|d }|dkrDtdt|S )Nx-auth-tokenzNo tokenr   r   zInvalid token)methodr   FlightMethodLIST_ACTIONSr   r   rD  )rO   r   r  r  r   r   r   r!    s    


z/SelectiveAuthServerMiddlewareFactory.start_callNr5  r   r   r   r   rK    s   rK  c                   @   s   e Zd Zdd ZdS )$SelectiveAuthClientMiddlewareFactoryc                 C   s   t  S ri   )SelectiveAuthClientMiddlewarer   r   r   r   r!    s    z/SelectiveAuthClientMiddlewareFactory.start_callN)rc   rd   re   r!  r   r   r   r   rP     s   rP  c                   @   s   e Zd Zdd ZdS )rQ  c                 C   s   ddiS )NrL  r   r   r  r   r   r   r7    s     z-SelectiveAuthClientMiddleware.sending_headersN)rc   rd   re   r7  r   r   r   r   rQ    s   rQ  c                       s(   e Zd ZdZ fddZdd Z  ZS ) RecordingServerMiddlewareFactory Record what methods were called.c                    s   t    g | _d S ri   rK   rL   methodsr  rR   r   r   rL     s    
z)RecordingServerMiddlewareFactory.__init__c                 C   s   | j |j d S ri   rU  appendrM  r?  r   r   r   r!    s    z+RecordingServerMiddlewareFactory.start_callrc   rd   re   rf   rL   r!  rg   r   r   rR   r   rR    s   rR  c                       s(   e Zd ZdZ fddZdd Z  ZS ) RecordingClientMiddlewareFactoryrS  c                    s   t    g | _d S ri   rT  r  rR   r   r   rL     s    
z)RecordingClientMiddlewareFactory.__init__c                 C   s   | j |j d S ri   rV  r   r   r   r   r!    s    z+RecordingClientMiddlewareFactory.start_callrX  r   r   rR   r   rY    s   rY  c                   @   s    e Zd ZdZdd Zdd ZdS )"MultiHeaderClientMiddlewareFactoryrI  c                 C   s
   i | _ d S ri   )last_headersr  r   r   r   rL   '  s    z+MultiHeaderClientMiddlewareFactory.__init__c                 C   s   t | S ri   )MultiHeaderClientMiddlewarer   r   r   r   r!  ,  s    z-MultiHeaderClientMiddlewareFactory.start_callN)rc   rd   re   rf   rL   r!  r   r   r   r   rZ  $  s   rZ  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\  rI  r8   rA          r9   )zx-textzx-binary-binzx-MIXED-cases   x-other-MIXED-casec                 C   s
   || _ d S ri   r#  r%  r   r   r   rL   ;  s    z$MultiHeaderClientMiddleware.__init__c                 C   s   | j S ri   )EXPECTEDr  r   r   r   r7  >  s    z+MultiHeaderClientMiddleware.sending_headersc                 C   s   || j _d S ri   )r$  r[  )rO   r  r   r   r   r)  A  s    z,MultiHeaderClientMiddleware.received_headersN)rc   rd   re   rf   r_  rL   r7  r)  r   r   r   r   r\  0  s   r\  c                   @   s   e Zd ZdZdd ZdS )"MultiHeaderServerMiddlewareFactoryrI  c                 C   s   t |S ri   )MultiHeaderServerMiddlewarer?  r   r   r   r!  J  s    z-MultiHeaderServerMiddlewareFactory.start_callNr5  r   r   r   r   r`  G  s   r`  c                   @   s    e Zd ZdZdd Zdd ZdS )ra  rI  c                 C   s
   || _ d S ri   )rJ  )rO   rJ  r   r   r   rL   Q  s    z$MultiHeaderServerMiddleware.__init__c                 C   s   t jS ri   )r\  r_  r  r   r   r   r7  T  s    z+MultiHeaderServerMiddleware.sending_headersNr8  r   r   r   r   ra  N  s   ra  c                       s0   e Zd ZdZ fddZdd Zdd Z  ZS )LargeMetadataFlightServerz Regression test for ARROW-13253.c                    s   t  j|| dd | _d S )N           )rK   rL   	_metadata)rO   argsrQ   rR   r   r   rL   [  s    z"LargeMetadataFlightServer.__init__c                 C   s6   t dt  fg}t|t jdgg|d| jfgS )NrD   r<   r   )r2   rX   int64r   rl   record_batchre  )rO   r\   r_   rX   r   r   r   rb   _  s    z LargeMetadataFlightServer.do_getc                 C   s   | | j d S ri   )r   re  r   r   r   r   r   e  s    z%LargeMetadataFlightServer.do_exchange)rc   rd   re   rf   rL   rb   r   rg   r   r   rR   r   rb  X  s   rb  c               	   C   sv  d} d}d}d}d}d}d}d}d	}d
}	t tdd| ks@tt tdd|ksXtt tdd|ksptt tjd|kstt tdg |kstt	t
g tj g dd}
t |
|kstt td|kstt td|kstt tt
g |kstt tt
dgdks8tt td|	ksPttt tdd  W 5 Q R X d S )Nz1<pyarrow.flight.Action type='foo' body=(0 bytes)>z)ActionType(type='foo', description='bar')z?<pyarrow.flight.BasicAuth username=b'user' password=(redacted)>z,<pyarrow.flight.FlightDescriptor cmd=b'foo'>zY<pyarrow.flight.FlightEndpoint ticket=<pyarrow.flight.Ticket ticket=b'foo'> locations=[]>z<pyarrow.flight.FlightInfo schema= descriptor=<pyarrow.flight.FlightDescriptor path=[]> endpoints=[] total_records=-1 total_bytes=-1>z6<pyarrow.flight.Location b'grpc+tcp://localhost:1234'>z&<pyarrow.flight.Result body=(3 bytes)>z'<pyarrow.flight.SchemaResult schema=()>z%<pyarrow.flight.Ticket ticket=b'foo'>r8   r   rA   userpass   foorU   grpc+tcp://localhost:1234)intrg  z1<pyarrow.flight.SchemaResult schema=(int: int64)>)r   r   Actionrr   r   r   rY   for_commandr   rW   r2   rX   rZ   r   Resultr   Ticketpytestraises	TypeError)Zaction_reprZaction_type_reprZbasic_auth_reprZdescriptor_reprZendpoint_reprZ	info_reprZlocation_reprZresult_reprZschema_result_reprZticket_reprr   r   r   r   	test_repri  sB        
ru  c                  C   s   dd dd dd dd dd dd dd d	d d
d dd g
} | D ]<}| \}}| \}}||ksht ||kstt ||ksDt qDd S )Nc                   S   s   t ddt ddfS )Nr8   r      bar)r   rn  r   r   r   r   <lambda>  r   ztest_eq.<locals>.<lambda>c                   S   s   t ddt ddfS )Nr8   rA   r9   r   r   r   r   r   rw    s   

c                   S   s   t ddt ddfS )Nri  rj  Zuser2)r   r   r   r   r   r   rw    s   

c                   S   s   t jdt jdfS )Nr8   )r   rY   ro  rZ   r   r   r   r   rw    s   

c                   S   s   t dg t dg fS )Nrk  r   )r   r   r   r   r   r   rw    s   

c                   S   s>   t tg t j g ddt tg t jdg ddfS )NrU   rk  *   )r   rW   r2   rX   rY   rZ   ro  r   r   r   r   rw    s       
   c                   S   s   t dt dfS )Nrl  zgrpc+tls://localhost:1234)r   r   r   r   r   r   rw    s   c                   S   s   t dt dfS )Nrk  rv  )r   rp  r   r   r   r   rw    r   c                   S   s*   t tg t tdt fgfS )NZints)r   r   r2   rX   rg  r   r   r   r   rw    s   c                   S   s   t dt dfS )Nr   rk  )r   rq  r   r   r   r   rw    r   )rr   )itemsgenZlhs1Zrhs1Zlhs2Zrhs2r   r   r   test_eq  s"    

r{  c               
   C   s@   d ddt  fg} | D ]&}t|}t|ts0tW 5 Q R X qd S )Ngrpc://localhost:0r   )r   r   
isinstancerr   )	locationsrP   serverr   r   r   $test_flight_server_location_argument  s    
r  c                
   C   s2   t t t  t W 5 Q R X W 5 Q R X d S ri   )rr  rs  
ValueErrorr   r   r   r   r   #test_server_exit_reraises_exception  s    r  c               	      st   dt  f d }  fdd}t H}tj|dd}|  t }|jdd t | }|dksftW 5 Q R X d S )	Nr   c                      s   t d t at  d S r   )r   r   r   r  server   rP   r   r   r    s    
z-test_client_wait_for_available.<locals>.serveTtargetdaemonr-   timeoutr   )r   r   	threadingThreadstartr   Zwait_for_availablerr   )r  r  clientthreadr   elapsedr   r  r   test_client_wait_for_available  s    

r  c               
   C   sf   t  V} td| jf:}t| g ks.t|t j}tt|dksNtW 5 Q R X W 5 Q R X dS )zTry a simple list_flights call.r   r<   N)	rG   r   connectportlistr]   rr   rV   len)r  r  Zflightsr   r   r   test_flight_list_flights  s    r  c                  C   sz   t  j} td| jfN}t| g ks.t|  |  t	t
j t|  W 5 Q R X W 5 Q R X W 5 Q R X d S )Nr   )rG   r   r  r  r  r]   rr   closerr  rs  r2   r   r  r  r   r   r   test_flight_client_close  s    r  c                  C   sJ  t  } t D}td|jf(}|td }|| sBt	W 5 Q R X W 5 Q R X t
jjt
jjjd}t|dj}td|jfN}|td }|| st	|td  }|| st	W 5 Q R X W 5 Q R X tjtjddL tdd6}td|jf}|td }W 5 Q R X W 5 Q R X W 5 Q R X dS )	Try a simple do_get call.r   rH   metadata_versionr^   z+expected IpcWriteOptions, got <class 'int'>matchrx  N)r7   rG   r   r  r  rb   rq  r   rp   rr   r2   ipcIpcWriteOptionsMetadataVersionV4Z	to_readerrr  rs  rC  )ra   r  r  r6   rN   r   r   r   test_flight_do_get_ints  s4    ""r  c               
   C   sj   t  } t T}td|jf8}|td }t|d | 	d
 ksRtW 5 Q R X W 5 Q R X dS )r  r   rH   r/   r   N)r7   rG   r   r  r  rb   rq  Zread_pandasr  r   Z	to_pylistrr   ra   r  r  r6   r   r   r   test_do_get_ints_pandas  s    r  c               
   C   sZ   t  } t D}td|jf(}|td }|| sBt	W 5 Q R X W 5 Q R X d S )Nr   rI   )
r@   rG   r   r  r  rb   rq  r   rp   rr   r  r   r   r   test_flight_do_get_dicts  s    r  c               
   C   s   t jdddddgt  dg} t jj| dgd}td	d
D}td|jf(}|	t
d	 }||sptW 5 Q R X W 5 Q R X dS )z+Make sure Tickets get passed to the server.r+   r,   r   r-   r.   r:   rD   r0   s
   the-ticket)r   r   N)r2   r3   r   r4   r5   r   r   r  r  rb   rq  r   rp   rr   )r   ra   r  r  r6   r   r   r   test_flight_do_get_ticket  s    r  c               	   C   s   t  } td| jf}|tjd}|jdks6t|j	dksDt|j
t
dt fgksbtt|jdksttt|jd jdkst|jd jd tdkst|jd jd tjdd	kstW 5 Q R X d
S )z8Make sure FlightEndpoint accepts string and object URIs.r   r   rU   rD   r=   r   r<   r   r   N)r   r   r  r   r   rY   ro  total_recordsrr   total_bytesrX   r2   r   r  	endpointsr~  r   r   r  r  r   r   r   r   test_flight_get_info$  s    r  c               
   C   s`   t  P} td| jf6}|tjd}|jtdt	 fgksHt
W 5 Q R X W 5 Q R X dS )z+Make sure GetSchema returns correct schema.r   r   rD   N)r   r   r  r   r   rY   ro  rX   r2   r   rr   r  r   r   r   test_flight_get_schema3  s    r  c                  C   s   t  H} td| jf.}tjtjdd t|  W 5 Q R X W 5 Q R X W 5 Q R X t	 8} td| jf}t| t	
 kstW 5 Q R X W 5 Q R X dS )z6Make sure the return type of ListActions is validated.r   z3Results of list_actions must be ActionType or tupler  N)r   r   r  rr  rs  r   rC  r  r   r   r   rr   r  r   r   r   test_list_actions;  s     *
r  c                   @   s$   e Zd ZdZedd Zdd ZdS )ConvenienceServerzT
    Server for testing various implementation conveniences (auto-boxing, etc.)
    c                 C   s
   dddgS )Nrk  rv  s   bazr   r  r   r   r   simple_action_resultsR  s    z'ConvenienceServer.simple_action_resultsc                    sf   |j dkr| jS |j dkr"|jgS |j dkr2dgS |j dkrFt n|j dkrb fdd}| S d S )	Nsimple-actionecho
bad-actionr8   arrow-exceptionforeverc                   3   s      sdV  q d S )Nrk  )is_cancelledr   r\   r   r   rz  `  s    z(ConvenienceServer.do_action.<locals>.gen)r;   r  bodyr2   ArrowMemoryError)rO   r\   r   rz  r   r  r   r   V  s    





zConvenienceServer.do_actionN)rc   rd   re   rf   propertyr  r   r   r   r   r   r  M  s   
r  c               
   C   s|   t  l} td| jfR}dd |dD }|| jks:td}dd |d|fD }||gksdtW 5 Q R X W 5 Q R X d S )Nr   c                 S   s   g | ]
}|j qS r   r  .0xr   r   r   
<listcomp>k  s     z5test_do_action_result_convenience.<locals>.<listcomp>r  s   the-bodyc                 S   s   g | ]
}|j qS r   r  r  r   r   r   r  p  s     r  )r  r   r  r   r  rr   )r  r  resultsr  r   r   r   !test_do_action_result_conveniencef  s    r  c                  C   s   t  t} td| jfZ}tjtjdd t|d W 5 Q R X tjtjdd t|d W 5 Q R X W 5 Q R X W 5 Q R X d S )Nr   za bytes-like object is requiredr  r  r  r  )	r  r   r  rr  rs  r   rC  r  r   r  r   r   r   test_nicer_server_exceptionst  s    r  c                  C   s*   t d} z| jdkstW 5 |   X dS )zMake sure port() works.r|  r   N)r   shutdownr  rr   )r  r   r   r   test_get_port  s    r  ntz'Unix sockets can't be tested on Windows)reasonc                  C   s   t  } |   tj| j}t|d t|}|	t
d}t }|j|js^t| }||stt|	t
d}t }|j|jst| }||stW 5 Q R X W 5 Q R X W 5 Q R X dS )z3Try a simple do_get call over a Unix domain socket.r  rH   rI   N)tempfileNamedTemporaryFiler  r   r   Zfor_grpc_unixnamerG   r   rb   rq  r7   rX   rp   rr   r   r@   )sockrP   r  rz   ra   r6   r   r   r   test_flight_domain_socket  s"    
r  c               
   C   s   t jjt tddgdgd} t| jdp}td|jfV}|	t
jd| j\}}|| d |  |t
d }|| stW 5 Q R X W 5 Q R X d	S )
zTry sending/receiving a large message via Flight.

    See ARROW-4421: by default, gRPC won't allow us to send messages >
    4MiB in size.
    r   i   rD   r0   )r   r   r-  r   N)r2   r4   r5   r3   r   r   rX   r   r  r   r   rY   rZ   r   r  rb   rq  r   rp   rr   r6   r  r  r{   _r   r   r   r   test_flight_large_message  s     r  c               
   C   s   t jjt tddgdgd} t n}td|jfT}|t	j
d| j\}}||  |  |t	d }|| stW 5 Q R X W 5 Q R X dS )	z?Try downloading a flight of RecordBatches in a GeneratorStream.r   r   rD   r0   r   r-  r   N)r2   r4   r5   r3   r   r   r   r  r   r   rY   rZ   rX   r   r  rb   rq  r   rp   rr   r  r   r   r   test_flight_generator_stream  s     
r  c                  C   s\   t  L} td| jf2}ttj |t	d
  W 5 Q R X W 5 Q R X W 5 Q R X dS )z+Try streaming data with mismatched schemas.r   r   N)r   r   r  rr  rs  r2   ArrowExceptionrb   r   rq  r   r  r   r   r   $test_flight_invalid_generator_stream  s    r  c                  C   sr   t  b} td| jfH}tdd}tjdd}ttj t	|j
||d W 5 Q R X W 5 Q R X W 5 Q R X dS )z)Make sure timeouts fire on slow requests.r   r   r   g?r  r^   N)r   r   r  r   rn  FlightCallOptionsrr  rs  r   r  r   )r  r  r   rN   r   r   r   test_timeout_fires  s    r  c               
   C   sT   t  D} td| jf*}tjdd}|jtd|d  W 5 Q R X W 5 Q R X dS )z0Make sure timeouts do not fire on fast requests.r   r   r  rH   r^   N)rG   r   r  r   r  rb   rq  r   )r  r  rN   r   r   r   test_timeout_passes  s    r  c               
   C   s   t jjt ddddggdgd} t }td|jf|}tjt	dgdd	}|j
td
|d }|
td
 }|jdkst|jdkst|| kst|t kstW 5 Q R X W 5 Q R X dS )z"Make sure ReadOptions can be used.r<   r=   rB   rC   rE   r0   r   )Zincluded_fields)Zread_optionsrJ   r^   N)r2   r4   r5   r3   rG   r   r  r   r  r   rb   rq  r   Znum_columnsrr   rF   )expectedr  r  rN   Z	response1Z	response2r   r   r   test_read_options  s$    "

r     tests   p4ssw0rd)r   c                  C   sj   t tdV} td| jf<}tdd}tjtjdd t	|
| W 5 Q R X W 5 Q R X W 5 Q R X dS )z,Test that auth fails when not authenticated.auth_handlerr   r   r   z.*unauthenticated.*r  N)r   basic_auth_handlerr   r  r   rn  rr  rs  r   r  r   r  r  r   r   r   r   test_http_basic_unauth  s    r  z,ARROW-10013: gRPC on Windows corrupts peer()c               
   C   s   t tdz} td| jf`}tdd}|tdd ||}t	|}|j
 dks\tt	|}|j
 dksvtW 5 Q R X W 5 Q R X dS )	z:Test a Python implementation of HTTP basic authentication.r  r   r   r   r-  p4ssw0rdr  N)r   r  r   r  r   rn  r  r  r   nextr  ru   rr   )r  r  r   r  identityZpeer_addressr   r   r   test_http_basic_auth  s    
r  c                  C   sz   t tdf} td| jfL}tdd}tjtjdd$ |	t
dd t|| W 5 Q R X W 5 Q R X W 5 Q R X d	S )
z-Test that auth fails with the wrong password.r  r   r   r   z.*wrong password.*r  r-  wrongN)r   r  r   r  r   rn  rr  rs  r   r  r  r  r   r  r   r   r   %test_http_basic_auth_invalid_password  s    r  c               
   C   sp   t td\} td| jfB}tdd}|tdd t|	|}|j
 dksXtW 5 Q R X W 5 Q R X dS )	-Test an auth mechanism that uses a handshake.r  r   r   r   r-  r  r  N)r   token_auth_handlerr   r  r   rn  r  r  r  r   r  ru   rr   )r  r  r   r  r   r   r   test_token_auth&  s    r  c                  C   s\   t tdH} td| jf.}ttj |t	dd W 5 Q R X W 5 Q R X W 5 Q R X dS )r  r  r   r-  r  N)
r   r  r   r  rr  rs  r   r   r  r  r  r   r   r   test_token_auth_invalid0  s    r  c               
   C   sh   t tdt idL} td| jf2}|dd}|d dks@t|d d	ksPtW 5 Q R X W 5 Q R X d
S )zATest authenticate_basic_token with bearer token and auth headers.r   r  r;  r   r     passwordr   r'  r<      Bearer token1234N)r9  no_op_auth_handlerr*  r   r  authenticate_basic_tokenrr   )r  r  
token_pairr   r   r   test_authenticate_basic_token<  s     r  c                  C   s`   t tdt idD} td| jf*}ttj |	dd W 5 Q R X W 5 Q R X W 5 Q R X dS )z7Test authenticate_basic_token with an invalid password.r   r  r   r  s   badpasswordN)
r9  r  r*  r   r  rr  rs  r   r   r  r  r   r   r   .test_authenticate_basic_token_invalid_passwordG  s     r  c               
   C   s   t tdt id} td| jfp}|dd}|d dks@t|d d	ksPttj|gd
}t	|j
tdd|d}|d j dkstW 5 Q R X W 5 Q R X dS )z@Test authenticate_basic_token and doAction after authentication.r   r  r   r  r  r   r'  r<   r  r  test-actionr   r   rN   	   token1234N)r9  r  r*  r   r  r  rr   r   r  r  r   rn  r  ru   r  r  r  rN   r   r   r   r   (test_authenticate_basic_token_and_actionQ  s"     
 r  c               	   C   s  t tdt id} t }td| jf|gd}td}tj	dd| fgd}t
|jtd	d
|d}|d j dks~t|jd dkst|jd dkstt
|jtd	d
|d}|d j dkst|jd dkst|jd dkst|  W 5 Q R X dS )zTest authenticate_basic_token with client middleware
       to intercept authorization header returned by the
       HTTP header auth enabled server.
    r   r  r   r;  s   test:passwordr'  s   Basic r  r  r   r  r   r  r<   r  N)r9  r  r*  r  r   r  r  r  r   r  r  r   rn  r  ru   rr   r  r  )r  Zclient_auth_middlewarer  Zencoded_credentialsrN   r   Zresult2r   r   r   4test_authenticate_basic_token_with_client_middleware`  sB     


 
 r  c               
   C   s   t tt t dd} td| jf}|dd}|d dksDt|d d	ksTttj	|d
dgd}t
|jtdd|d}|d j dkst|d j dkstW 5 Q R X W 5 Q R X dS )z:Test passing multiple arbitrary headers to the middleware.)r   rB  r  r   r  r  r   r'  r<   r  )s   test-header-1   value1)s   test-header-2   value2r  r  r   r^   r  r  N)rA  r  r*  r=  r   r  r  rr   r   r  r  r   rn  r  ru   r  r   r   r   -test_arbitrary_headers_in_flight_call_options  s4    
 r  c                	   C   sN   t jtjdd td W 5 Q R X t jtjdd td W 5 Q R X dS )zTest constructing invalid URIs.z.*Cannot parse URI:.*r  %N)rr  rs  r2   r   r   r  rG   r   r   r   r   test_location_invalid  s    r  c                   C   s,   t djdkstt djdks(tdS )z,Test creating locations for unknown schemes.zs3://foos   s3://foozhttps://example.com/bar.parquets   https://example.com/bar.parquetN)r   r   urirr   r   r   r   r   test_location_unknown_scheme  s    
r  c                  C   sn   t  } t| d dP}tdt|j 2}ttj |	t
d  W 5 Q R X W 5 Q R X W 5 Q R X dS )z>Make sure clients cannot connect when cert verification fails.r)   tls_certificateszgrpc+tls://localhost:rH   N)r*   rG   r   r   r  rr  rs  r   FlightUnavailableErrorrb   rq  r   certssr  r   r   r   test_tls_fails  s    r  c               
   C   sn   t  } t }t|d dJ}td|jf|d d(}|td }|	| sVt
W 5 Q R X W 5 Q R X dS )z"Try a simple do_get call over TLS.r)   r  r   r(   )tls_root_certsrH   N)r7   r*   rG   r   r  rb   r   rq  r   rp   rr   ra   r  r  r  r6   r   r   r   test_tls_do_get  s    
r  c               	   C   s   t  } t }t|d df}ztd|jfdd}W n tk
rP   td Y nX |t	
d }|| stt|  W 5 Q R X dS )	zDTry a simple do_get call over TLS with server verification disabled.r)   r  r   TZdisable_server_verificationz4disable_server_verification feature is not availablerH   N)r7   r*   rG   r   r  r   rr  skiprb   r   rq  r   rp   rr   r  r  r   r   r   $test_tls_disable_server_verification  s    

r	  c                  C   sr   t  } t| d dT}tjd|jf| d dd.}ttj |t	d W 5 Q R X W 5 Q R X W 5 Q R X dS )	z5Check that incorrectly overriding the hostname fails.r)   r  r   r(   fakehostname)r  Zoverride_hostnamerH   N)
r*   rG   r   r  r  rr  rs  r  rb   rq  r   r   r   r   test_tls_override_hostname  s    r  c            
   
   C   s   t dddddgg} t jj| dgd}g }t }td|jf}|t	d	}d}z@|
 \}}|| td
| \}	||	kst|d7 }W qX tk
r   Y qY qXX qXt j|} | |stW 5 Q R X W 5 Q R X dS )z'Try a simple do_get call with metadata.r+   r,   r   r-   r.   rD   r0   r   r   rn   r<   N)r2   r3   r4   r5   rh   r   r  rb   r   rq  ro   rW  rs   rt   ru   rr   rx   from_batchesrp   )
r6   ra   batchesr  r  rz   r   r}   metadata
server_idxr   r   r   test_flight_do_get_metadata  s(    
r  c               
   C   s   t jjt dddddggdgd} t jjt jjjd}t|d	F}t	d
|j
f,}|td}| }|| sztW 5 Q R X W 5 Q R X dS )z2Try a simple do_get call with V4 metadata version.r+   r,   r   r-   r.   rD   r0   r  r^   r   r   N)r2   r4   r5   r3   r  r  r  r  rh   r   r  rb   r   rq  r   rp   rr   )ra   rN   r  r  rz   r6   r   r   r   test_flight_do_get_metadata_v4  s     r  c                  C   s   t dddddgg} t jj| dgd}t }td|jf}|tj	
d	|j\}}|j t|jd
dD ]R\}}td|}||| | }	|	dk	sttd|	 \}
||
ksptqpW 5 Q R X W 5 Q R X W 5 Q R X dS )z'Try a simple do_put call with metadata.r+   r,   r   r-   r.   rD   r0   r   r   r<   r   rn   N)r2   r3   r4   r5   rh   r   r  r   r   rY   rZ   rX   r   r   rs   rw   r   r   rr   rt   ru   )r6   ra   r  r  r{   metadata_readerr   r}   r  r~   r  r   r   r   test_flight_do_put_metadata  s&    
r  c            
      C   s  t jjt tjdt dgdgd} t }td|j	fdd}|
tjd| j\}}|f tjtjd	d
}||  W 5 Q R X |jjdkst| dd| dg}|D ]}|| qW 5 Q R X t j| g}|td }	||	kstW 5 Q R X W 5 Q R X dS )z+Try a simple do_put call with a size limit.i   )ZdtyperD   r0   r   i   )Zwrite_size_limit_bytesr   zexceeded soft limitr  r   i  r   N)r2   rq   r5   r3   npZonesrg  r   r   r  r   r   rY   rZ   rX   rr  rs  ZFlightWriteSizeExceededErrorr   r   limitrr   slicer4   r  rb   rq  r   )
Zlarge_batchr  r  r{   r  excinfoZsmaller_batchesr}   r  actualr   r   r   test_flight_do_put_limit  s<    


r  c                  C   sl   t  \} td| jfB}|td}|  tjtj	dd |
  W 5 Q R X W 5 Q R X W 5 Q R X dS )z4Test canceling a DoGet operation on the client side.r   rH   z(?i).*cancel.*r  N)rG   r   r  rb   r   rq  r   rr  rs  r   ro   )r  r  rz   r   r   r   test_cancel_do_get:  s    r  c                     s   t  } td| jf}|tdt t t t   fdd}tj	|dd}|
  jdd     |jd	d    stW 5 Q R X W 5 Q R X W 5 Q R X d
S )z5Test canceling a DoGet operation from another thread.r   rH   c                      s\        jdd z   W n. tjk
rV       W 5 Q R X Y nX d S )Nr-   r  )ro   setwaitr   r   r   Zraised_proper_exceptionZread_first_messagerz   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  rb   r   rq  r  EventLockr  r  r  r   r  joinis_setrr   )r  r  r  r  r   r  r   test_cancel_do_get_threadedF  s$    
r#  c               
   C   sV   t  F} td| jf,}|tdd}t|jdks<t~W 5 Q R X W 5 Q R X d S )Nr   r  r   rk  )	r  r   r  r   r   rn  r  r  rr   )r  r  r  r   r   r   test_streaming_do_actiong  s    r$  c            	      C   s  t dd} | t j|  ks$tt d}|t j| ksFtt d}|t j| kshtt dd}|t j| kstt t	
dt	 fg}|t j| kstt jd}|t j| kstt jdd	d
}|t j| kstt t	
dt	 fg|t ddgt dt jddggdd}t j| }|j
|j
ksrt|j|jkst|j|jkst|j|jkst|j|jkstt |dt jddg}|t j| kstdS )z(Make sure serializable types round-trip.Zaction1s   action1-bodyr8   s   result1Z	username1Z	password1rD   r-  rE   z
test.arrowr   r   r   r   rU   N)r   rn  r   r	  rr   rq  rp  r   r   r2   rX   r   rY   ro  rZ   rW   r   r   r   ry   r  r  r  )	r   r_   r   r  Zschema_resultdescr   Zinfo2Zendpointr   r   r   test_roundtrip_typesp  sN    


r&  c                  C   sx  t  f} td| jfJ}t   D ]8\}}tj|dd t|t	
|d W 5 Q R X q(tjt	jdd t|  W 5 Q R X tddddd	gg}tjj|d
gd}t	jt	jt	jt	jt	jd}| D ]\}}tj|dd2 |t	j||j\}	}
|	| |	  W 5 Q R X tj|dd( |t	j||j\}	}
|	  W 5 Q R X qW 5 Q R X W 5 Q R X dS )z:Ensure that Flight errors propagate from server to client.r   z.*foo.*r  r   r+   r,   r   r-   r.   rD   r0   )r   r   r   r   r   N)r   r   r  r   ry  rr  rs  r  r   r   rn  r   r]   r2   r3   r4   r5   r   r   r   r   r   rY   ro  rX   r   r  )r  r  argexc_typer6   ra   
exceptionsr   	exceptionr{   rz   r   r   r   test_roundtrip_errors  s>    
"


r+  c                     s  t dddddgg} t jj| dgd}t }td|jf}|tj	
d	|j\}dg  fd
d}tj|d}|  |jdd}|@ t|D ] \}}	td|}
||	|
 q|  |  W 5 Q R X  d t|kstW 5 Q R X W 5 Q R X dS )z7Ensure that separate threads can read/write on a DoPut.r+   r,   r   r-   r.   rD   r0   r   r   c                      s"     d k	r d  d7  < q d S )Nr   r<   )r   r   countr  r   r   _reader_thread  s    z:test_do_put_independent_read_write.<locals>._reader_threadr  r<   r   rn   N)r2   r3   r4   r5   rh   r   r  r   r   rY   rZ   rX   r  r  r  r   r   rs   rw   r   done_writingr!  r  rr   )r6   ra   r  r  r{   r.  r  r  r   r}   r  r   r,  r   "test_do_put_independent_read_write  s.    
r1  c               
   C   sz   t dt id`} td| jfF}t|tdd}t|dksHt	|d j
 }d|ksbt	W 5 Q R X W 5 Q R X d	S )
z@Ensure that server middleware run on the same thread as the RPC.r-  r  r   r  r   r<   r   s   right valueN)rG  rF  r   r  r  r   r   rn  r  rr   r  ru   )r  r  r  r   r   r   r   "test_server_middleware_same_thread  s     r2  c                  C   s   t dt id} td| jf}ttj t|	  W 5 Q R X tt
j t|t
dd W 5 Q R X td| jft gd}t|t
dd}d|j kstW 5 Q R X W 5 Q R X dS )z-Test rejecting an RPC with server middleware.r-  r  r   r   r  N)rG  rK  r   r  rr  rs  r2   ZArrowNotImplementedErrorr  r   r   r   r   rn  rP  r  r  ru   rr   )r  r  responser   r   r   test_middleware_reject  s$      r4  c                  C   s  t  } t }td| id}td|jf|gd}tjd}t	t
 t|  W 5 Q R X t	t
 || W 5 Q R X t	t
 || W 5 Q R X t	t
 |td W 5 Q R X t	t
$ ||tg \}}|  W 5 Q R X t	t
 t|tdd W 5 Q R X t	t
 t|  W 5 Q R X t	t
 ||\}}|  W 5 Q R X tjjtjjtjjtjjtjjtjjtjj tjj!g}| j"|kst#|j"|kst#W 5 Q R X W 5 Q R X dS )z/Test that middleware records methods correctly.r-  r  r   r   N)$rR  rY  r   r   r  r   rY   ro  rr  rs  r   r  r]   r   r   rb   rq  r   r2   rX   r  r   rn  r   r   rN  ZLIST_FLIGHTSZGET_FLIGHT_INFOZ
GET_SCHEMAZDO_GETZDO_PUTZ	DO_ACTIONrO  ZDO_EXCHANGErU  rr   )Zserver_middlewareZclient_middlewarer  r  ry   r{   r  r  r   r   r   test_middleware_mapping  sN     
r5  c                  C   s   t  } td| jfn}z"t|tdd ds8tW nD tjk
r~ } z$|j	d k	s\t|j	}|dksntW 5 d }~X Y nX W 5 Q R X W 5 Q R X d S )Nr   r   r   Fr   )
r   r   r  r  r   r   rn  rr   r   
extra_info)r  r  eeir   r   r   test_extra_info>  s    r9  c               
   C   s   t  } t }t| d d gd| d db}td|jf| d | d d j| d d jd(}|t	d
 }||s|tW 5 Q R X W 5 Q R X d	S )
z!Test mutual TLS (mTLS) with gRPC.r)   r   Tr(   )r  Zverify_clientZroot_certificatesr   )r  Z
cert_chainZprivate_keyrH   N)r*   r7   rG   r   r  r&   r'   rb   r   rq  r   rp   rr   )r  ra   r  r  r6   r   r   r   	test_mtlsJ  s$    r:  c                  C   s   t jjt tddgdgd} t ^}td|jfD}tj	
d}||\}}| | }W 5 Q R X | |ksvtW 5 Q R X W 5 Q R X dS )r   r   r   rD   r0   r   r   N)r2   r4   r5   r3   r   r   r   r  r   rY   ro  r   r   rr   )r  r  r  ry   r{   rz   ra   r   r   r   test_doexchange_get]  s    r;  c            
      C   s   t jjt tddgdgd} | jdd}t }td|jf}t	j
d}||\}}|d || j |D ]}|| qt|  | }|jd	ksttt|d
}	|j|	kstW 5 Q R X W 5 Q R X W 5 Q R X d	S )r   r   r   rD   r0      r   r   r   Nr   )r2   r4   r5   r3   r   r   r   r   r  r   rY   ro  r   r   rX   r   r0  ro   r6   rr   r   r  r   r   )
r6   r  r  r  ry   r{   rz   r}   r   Zexpected_bufr   r   r   test_doexchange_putl  s*    r=  c                  C   s~  t jjt tddgdgd} | jdd}t @}td|jf$}t	j
d}||\}}| td	D ]@}t|d
}|| | }	|	jdkst|	j|ksptqp|| j |D ]B}
||
 |j| jkst| }	|	j|
kst|	jdkstqt|D ]L\}}
t|d
}||
| | }	|	j|
ksHt|	j|kstqW 5 Q R X W 5 Q R X W 5 Q R X dS )zTry a DoExchange echo server.r   r   rD   r0   r<  r   r   r   r.   r   N)r2   r4   r5   r3   r   r   r   r   r  r   rY   ro  r   r   r   r   ro   r6   rr   r   r   rX   r   r   r   )r6   r  r  r  ry   r{   rz   ir~   r   r}   r   r   r   test_doexchange_echo  s@    


r?  c            
      C   s   t jjt tddgdgd} | jdd}t jjt jjj	d}t
|d}td	|jf}tjd
}||\}}|^ |j| j|d |D ]B}|| |j| jkst| }	|	j|kst|	jdkstqW 5 Q R X W 5 Q R X W 5 Q R X dS )z;Try a DoExchange echo server using the V4 metadata version.r   r   rD   r0   r<  r   r  r^   r   r   N)r2   r4   r5   r3   r   r   r  r  r  r  r   r   r  r   rY   ro  r   r   rX   r   rr   ro   r6   r   )
r6   r  rN   r  r  ry   r{   rz   r}   r   r   r   r   test_doexchange_echo_v4  s.    
r@  c                  C   s   t jjt tddt tddt tddgddd	gd
} t jjt tdddgdgd
}t |}td|jfb}tj	
d}||\}}|, || j ||  |  | }W 5 Q R X ||kstW 5 Q R X W 5 Q R X dS )z!Transform a table with a service.r   r   r<   i  r=   i  rD   rE   cr0   rB   i  r   r   r   N)r2   r4   r5   r3   r   r   r   r  r   rY   ro  r   r   rX   r   r0  r   rr   )r6   r  r  r  ry   r{   rz   ra   r   r   r   test_doexchange_transform  s0    
rB  c               
   C   s   t dt id} t }td| jf|gd}t|tdd}|j	
 d}t|}tj D ]J\}}| }t|tr|d}|||kst|j||kshtqhW 5 Q R X W 5 Q R X dS )rI  r-  r  r   r   r   asciiN)rH  r`  rZ  r   r  r  r   r   rn  r  ru   r/  astliteral_evalr\  r_  ry  r  r}  bytesr   rr   r[  )r  r  r  r3  Zraw_headersrJ  headerr1  r   r   r   test_middleware_multi_header  s(     


rH  c               
   C   s   t  } t| d d}dg}tjd|jf| d |d}ttj |t	d W 5 Q R X |
  dg}tjd|jf| d |d}ttjtjf |t	d W 5 Q R X |
  W 5 Q R X d	S )
z$Test setting generic client options.r)   r  )zgrpc.ssl_target_name_overrider
  r   r(   )r  Zgeneric_optionsrH   )zgrpc.max_receive_message_length    N)r*   rG   r   r  r  rr  rs  r  rb   rq  r  r2   r   r   )r  r  rN   r  r   r   r   test_generic_options  s$    rJ  c                   @   s    e Zd ZdZdd Zdd ZdS )CancelFlightServerzA server for testing StopToken.c                 C   s,   t g }t jjg |d}t|t|S )Nr   )r2   rX   rq   r5   r   rl   r   r   )rO   r\   r_   rX   r   r   r   r   rb     s    
zCancelFlightServer.do_getc                 C   sF   t g }t jjg |d}|| | sB|| td q$d S )Nr   r   )	r2   rX   rq   r5   r   r  r   r   r   )rO   r\   ry   rz   r{   rX   r   r   r   r   r     s    


zCancelFlightServer.do_exchangeN)rc   rd   re   rf   rb   r   r   r   r   r   rK    s   rK  c                     s   t  jt  jkrtd t fddtt	j
f  fdd} t }td|jfl}|td}| |j tjd}||\}}| |j z|  W n ttjfk
r   Y nX W 5 Q R X W 5 Q R X d S )	Nz'test only works from main Python threadc                      s   t d  tj d S r   )r   r   signalSIGINTr   )raise_signalr   r   signal_from_thread  s    
z*test_interrupt.<locals>.signal_from_threadc              	      s   zDz4tjd}t }|  |   W 5 Q R X W 5 |   X W n tk
rb   td Y nX |j}t	|t
jtfst	|jt
jtfstd S )Nr/  z2KeyboardInterrupt didn't interrupt Flight read_all)r!  r  r  rr  rs  r  KeyboardInterruptZfailr   r}  r2   ArrowCancelled__context__rr   )r   texc_infor7  )	exc_typesrO  r   r   r-  "  s    ztest_interrupt.<locals>.testr   r   r   )r  current_threadidentmain_threadrr  r  r   Zget_raise_signalrP  r2   rQ  rK  r   r  rb   r   rq  r   rY   ro  r   r  r   )r-  r  r  rz   ry   r{   r   )rU  rN  rO  r   test_interrupt  s&    



rY  c                  C   s   d} t  t}td|jfX}tjtj| d |td	  W 5 Q R X |td	 }|j
dksptW 5 Q R X W 5 Q R X d S )Nz'application server implementation errorr   r  r   r   r-   )r   r   r  r  rr  rs  rC  rb   rq  r   r   rr   )r  r  r  ra   r   r   r   test_never_sends_dataD  s    rZ  c                  C   s   t jdd } t }t d|jfd}tjtdd$ |	| t
g \}}|  W 5 Q R X tjt
jdd ||  W 5 Q R X W 5 Q R X W 5 Q R X d S )Nrc  rd  r   z%Failed to serialize Flight descriptorr  )r   rY   ro  r   r  r  rr  rs  OSErrorr   r2   rX   r  r  r   )Zlarge_descriptorr  r  r{   r  r   r   r   test_large_descriptorR  s     r\  c                  C   s  t jd} dd }t }t d|jf}tjtj	dd> |
| tg \}}| || |  W 5 Q R X W 5 Q R X tjtj	dd. || \}}| || W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X ~t }t d|jf|}tjt jdd |t d}|  W 5 Q R X tjtjdd, || \}}| |  W 5 Q R X W 5 Q R X W 5 Q R X W 5 Q R X d S )Nr   rc  rd  r   zapp_metadata size overflowr  )r   rY   ro  r   r  r  rr  rs  r2   ZArrowCapacityErrorr   rX   r   r  r   rb  rC  rb   rq  r   r  )ry   r  r  r  r{   r  rz   r   r   r   test_large_metadata_clientd  sF    
2r]  c                   @   s   e Zd ZdZg Zdd ZdS )ActionNoneFlightServerz@A server that implements a side effect to a non iterable action.c                 C   s@   |j dkrt| jdgS |j dkr8| jd d S td S )N	get_valuer   rW  T)r;   jsondumpsVALUESr   rW  r   r   r   r   r   r     s    

z ActionNoneFlightServer.do_actionN)rc   rd   re   rf   rb  r   r   r   r   r   r^    s   r^  c               
   C   sr   t  b} td| jfH}|tdd |tdd}tt|j	
 dgksZtW 5 Q R X W 5 Q R X dS )zEnsure that actions are executed even when we don't consume iterator.

    See https://issues.apache.org/jira/browse/ARROW-14255
    r   rW  r   r_  TN)r^  r   r  r   r   rn  r`  loadsr  r  ru   rr   )r  r  rr   r   r   test_none_action_side_effect  s    re  c                     s  d} d}t j| |d t jd}tdt fg}G  fdddt j}| r}td|j	fV}|
||\}fd	d
}tj|dd}	|	  tt j }
|tjdgg|d qW 5 Q R X |
jj|ksttt j}
|  W 5 Q R X |
jj|kst|	  ||\}fdd
}tj|dd}	|	  tt j}
|d qTW 5 Q R X |
jj|ks~ttt j}
|  W 5 Q R X |
jj|kst|	  W 5 Q R X W 5 Q R X dS )z
    Ensure that exceptions during writing preserve error context.

    See https://issues.apache.org/jira/browse/ARROW-16592.
    r8   rv  )r6  r   rg  c                       s$   e Zd Z fddZ fddZdS )z0test_write_error_propagation.<locals>.FailServerc                    s    d S ri   r   r   excr   r   r     s    z7test_write_error_propagation.<locals>.FailServer.do_putc                    s    d S ri   r   r   rf  r   r   r     s    z<test_write_error_propagation.<locals>.FailServer.do_exchangeN)rc   rd   re   r   r   r   rf  r   r   
FailServer  s   rh  r   c                      s,   z    qW n tjk
r&   Y d S X d S ri   )r   r   FlightErrorr   rz   r   r   _reader  s    z-test_write_error_propagation.<locals>._readerTr  r<   r   c                      s,   z    qW n tjk
r&   Y d S X d S ri   )ro   r   ri  r   rj  r   r   rk    s    rc  N)r   r   rY   ro  r2   rX   rg  r   r   r  r   r  r  r  rr  rs  r   rh  r   r6  rr   r  r!  r   r   )Zexpected_messageZexpected_infory   rX   rh  r  r  r{   rk  r  rT  r   )rg  rz   r   test_write_error_propagation  sF     
$rl  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    rm  c                   @   s   e Zd ZdZdd ZdS )TracingFlightServerz/A server that echoes back trace context values.c                 C   s   | dj}dd | D S )Ntracingc                 s   s&   | ]\}}| d |  dV  qdS )z: r   N)r   )r  r'   r   r   r   r   	<genexpr>  s   z0TracingFlightServer.do_action.<locals>.<genexpr>)r:  trace_contextry  )rO   r\   r   rq  r   r   r   r     s    zTracingFlightServer.do_actionNr<  r   r   r   r   rn    s   rn  c               
   C   s`   t dt idD} td| jf*}tjddgd}|jd|dD ]}qBW 5 Q R X W 5 Q R X d S )	Nro  r  r   )s   traceparents7   00-000ff00f00f0ff000f0f00ff0f00fff0-000f0000f0f00000-00)s
   tracestater   r  )r   r   r^   )rn  r   ZTracingServerMiddlewareFactoryr   r  r  r   )r  r  rN   r   r   r   r   test_tracing  s     rr  c               	   C   sD   t ddd} d}tjt|d | jtjdd d W 5 Q R X d S )Nzgrpc+tls://localhost:9643Tr  zRArgument 'schema' has incorrect type \(expected pyarrow.lib.Schema, got NoneType\)r  r8   r   )r   rr  rs  rt  r   r   rY   ro  )r  msgr   r   r   .test_do_put_does_not_crash_when_schema_is_none	  s    rt  )rD  r  r   r   r   rL  rs   r  r  r   r    r`  Znumpyr  rr  r   r2   Zpyarrow.libr   r   Zpyarrow.utilr   Zpyarrow.testsr   r   r   r   r   r	   r
   r   r   r   r   ImportErrorobjectmarkZ
pytestmarkr   r   r%   r*   r7   r@   rF   rG   rh   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r*  r0  r9  r=  r>  rA  rD  rF  rG  rH  rK  rP  rQ  rR  rY  rZ  r\  r`  ra  rb  ru  r{  r  r  Zslowr  r  r  r  Zpandasr  r  r  r  r  r  r  r  r  r  Zskipifr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  Z%header_auth_server_middleware_factoryr  r  r  r  r  r  r  r  Zrequires_testing_datar  r  r	  r  r  r  r  r  r  r#  r$  r&  r+  r1  r2  r4  r5  r9  r:  r;  r=  r?  r@  rB  rH  rJ  rK  rY  rZ  Zlarge_memoryr\  r]  r^  re  rl  rm  rn  rr  rt  r   r   r   r   <module>   sp  ,


#*2F	


	
'"
	


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

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