
    "hh                       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 	 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 	 d dlmZ d dlmZmZmZmZm Z m!Z!m"Z"m#Z# ejJ                  j4                  Z&d Z'd	 Z(d
 Z)d Z*d Z+d Z,d Z- G d de      Z. G d de      Z/ G d de      Z0 G d de0      Z1 G d de      Z2 G d de      Z3 G d de      Z4 G d de      Z5 G d d e      Z6 G d! d"e      Z7 G d# d$e      Z8 G d% d&e      Z9 G d' d(e      Z: G d) d*e      Z; G d+ d,e      Z< G d- d.e      Z= G d/ d0e      Z> G d1 d2e      Z?d3 Z@ G d4 d5e#      ZA G d6 d7e"      ZB G d8 d9e!      ZC G d: d;e       ZD G d< d=e      ZE G d> d?e!      ZF G d@ dAe       ZG G dB dCe      ZH G dD dEe       ZI G dF dGe!      ZJ G dH dIe      ZK G dJ dKe      ZL G dL dMe!      ZM G dN dOe#      ZN G dP dQe"      ZO G dR dSe!      ZP G dT dUe#      ZQ G dV dWe#      ZR G dX dYe"      ZS G dZ d[e!      ZT G d\ d]e       ZU G d^ d_e      ZVd` ZWda ZXdb ZYdc ZZdd Z[ejJ                  j                  ejJ                  j                  de               Z]df Z^dg Z_dh Z`ejJ                  j                  di        Zbdj Zcdk Zddl Zedm Zfdn Zg G do dpe      Zhdq Zidr Zjds ZkejJ                  j                  ej                  dtk(  duv      dw        ZnejJ                  j                  dx        Zody Zpdz Zqd{ Zrd| Zsd} Zt e;d~di      Zu e=d~di      ZvejJ                  j                  d        ZwejJ                  j                  ej                  dtk(  dv      d        Zxd Zyd Zzd Z{ eC       Z| e?       Z}d Z~d Zd Zd Zd Zd Zd ZejJ                  j                  ejJ                  j
                  d               ZejJ                  j
                  d        ZejJ                  j
                  d        ZejJ                  j
                  d        Zd Zd Zd Zd ZejJ                  j                  d        ZejJ                  j                  d        ZejJ                  j                  ejJ                  j                  d               Zd Zd Zd Zd Zd Zd Zd Zd ZejJ                  j
                  d        Zd Zd Zd Zd Zd Zd ZejJ                  j
                  d        Z G d de      ZejJ                  j                  d        Zd ZejJ                  jH                  ejJ                  j                  d               ZejJ                  jH                  ejJ                  j                  d               Z G d de0      Zd ZejJ                  j                  d        Zd Z G d de      Zd Zd Zd Zy# e$ r dZY w xY w# e$ r dZe$e$cZZe$e$cZZe$e$cZ Z!e$e$cZ"Z#Y w xY w)    N)datetime)IpcReadOptionstobytes)find_free_port)util)flight)FlightClientFlightServerBaseServerAuthHandlerClientAuthHandlerServerMiddlewareServerMiddlewareFactoryClientMiddlewareClientMiddlewareFactoryc                      dd l } y )Nr   )pyarrow.flight)pyarrows    V/var/www/html/sandstorm/venv/lib/python3.12/site-packages/pyarrow/tests/test_flight.pytest_importr   ?   s        c                      t         j                  j                  d      st        d      t	        j
                  t         j                  d         dz  S )z-Get the path to the test resources directory.ARROW_TEST_DATAzITest resources not found; set ARROW_TEST_DATA to <repo root>/testing/datar   )osenvirongetRuntimeErrorpathlibPath r   r   resource_rootr    D   sF    ::>>+, I J 	J<<

#456AAr   c                    t               }|sy	 || z  j                  d      5 }|j                         cddd       S # 1 sw Y   yxY w# t        $ r1 t	        dj                  || z  t        j                                     w xY 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fs      r   read_flight_resourcer,   L   s    ?DKTk% 	668	 	 	 K++16$+2;2F2F2H,JK 	KKs%   A	 =	A	 AA	 A	 	:Bc                      t        d      t        j                  t        d      t        d            t        j                  t        d      t        d            gdS )z'Get the paths to test TLS certificates.zroot-ca.pemz	cert0.pemz	cert0.key)certkeyz	cert1.pemz	cert1.key)	root_certcertificates)r,   r   CertKeyPairr   r   r   example_tls_certsr3   [   sY     *-8)+6(5 )+6(5	
 r   c                  v    t        j                  g d      g} t         j                  j                  | dg      S )Nir      
   	some_intsnames)paarrayTablefrom_arrays)datas    r   simple_ints_tablerA   l   s4    
$%D 88[M::r   c                  L   t        j                  g dt        j                               } t        j                  t         j                  j                  g d|       t         j                  j                  ddg|       g      g}t         j                  j                  |dg      S )N)foobazquuxtype)   r   N   rH   
some_dictsr:   )r<   r=   utf8chunked_arrayDictionaryArrayr?   r>   )dict_valuesr@   s     r   simple_dicts_tablerO   s   s    ((1	BK
**<E**Aq6;?
 	D 88\N;;r   c                      t         j                  j                  t        j                  g d      t        j                  g d      gddg      S )N)rC   barrD   quxrH   rI         abr:   )r<   r>   r?   r=   r   r   r   multiple_column_tablerX   ~   sB    88*F!G!#,!7!9'*Cj   2 2r   c                   4     e Zd ZdZdZd fd	Zd Zd Z x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 criteriac                 b    t        |   |fi | t        t        t        d| _        || _        y )N)   ints   dicts   multi)super__init__rA   rO   rX   table_factoriesoptions)selflocationrb   kwargs	__class__s       r   r`   zConstantFlightServer.__init__   s3    ,V, '(+ 

 r   c              #      K   || j                   k(  rJt        j                  t        j                  g       t        j
                  j                  d      g        y y w)N/foo)CRITERIAr   
FlightInfor<   schemaFlightDescriptorfor_pathrc   contextcriterias      r   list_flightsz!ConstantFlightServer.list_flights   sL     t}}$##		"''008  %s   AAc                      | j                   |j                            }t        j                  || j                        S )Nrb   )ra   ticketr   RecordBatchStreamrb   )rc   ro   rt   tables       r   do_getzConstantFlightServer.do_get   s4     4$$V]]35''t||DDr   NN)	__name__
__module____qualname____doc__ri   r`   rq   rw   __classcell__rf   s   @r   rZ   rZ      s     (HEr   rZ   c                   @     e Zd ZdZd fd	Zd Zd Zed        Z xZ	S )MetadataFlightServerz4A Flight server that numbers incoming/outgoing data.c                 2    t        |   di | || _        y Nr   r_   r`   rb   rc   rb   re   rf   s      r   r`   zMetadataFlightServer.__init__       "6"r   c                     t        j                  g d      g}t         j                  j                  |dg      }t	        j
                  |j                  | j                  |      | j                        S )Nr5   rV   r:   rs   )	r<   r=   r>   r?   r   GeneratorStreamrk   number_batchesrb   )rc   ro   rt   r@   rv   s        r   rw   zMetadataFlightServer.do_get   sb    HH()
 $$T#$7%%LL&LL" 	"r   c           	      n   d}g d}|D ]  \  }}|j                  t        j                  j                  t        j                  ||   g      gdg            sJ |J t        j                  d|j                               \  }	||	k(  sJ |j                  t        j                  d|             |dz  } y )Nr   r5   rV   <irH   )
equalsr<   RecordBatchr?   r=   structunpack
to_pybyteswritepack)
rc   ro   
descriptorreaderwritercounterexpected_databatchbufclient_counters
             r   do_putzMetadataFlightServer.do_put   s    +  		JE3<< : :=1234!    ?"?$mmD#..2BCONn,,,LLT734qLG		r   c              #      K   t        | j                               D ]!  \  }}t        j                  d|      }||f # y w)Nr   )	enumerate
to_batchesr   r   )rv   idxr   r   s       r   r   z#MetadataFlightServer.number_batches   sA     #E$4$4$67 	JC++dC(C*	s   ?AN)
ry   rz   r{   r|   r`   rw   r   staticmethodr   r}   r~   s   @r   r   r      s)    >"  r   r   c                   6     e Zd ZdZd fd	Zd Zd Zd Z xZS )EchoFlightServerz4A Flight server that returns the last data uploaded.c                 B    t        |   |fi | d | _        || _        y r   )r_   r`   last_messageexpected_schema)rc   rd   r   re   rf   s       r   r`   zEchoFlightServer.__init__   s%    ,V, .r   c                 @    t        j                  | j                        S r   )r   ru   r   rc   ro   rt   s      r   rw   zEchoFlightServer.do_get   s    ''(9(9::r   c                 |    | j                   r| j                   |j                  k(  sJ |j                         | _        y r   )r   rk   read_allr   rc   ro   r   r   r   s        r   r   zEchoFlightServer.do_put   s2    ''6==888"OO-r   c                     |D ]  } y r   r   )rc   ro   r   r   r   chunks         r   do_exchangezEchoFlightServer.do_exchange   s     	E	r   rx   )	ry   rz   r{   r|   r`   rw   r   r   r}   r~   s   @r   r   r      s    >/
;.
r   r   c                   "    e Zd ZdZd Zd Zd Zy)EchoStreamFlightServerz6An echo server that streams individual record batches.c                     t        j                  | j                  j                  | j                  j	                  d            S )N   max_chunksize)r   r   r   rk   r   r   s      r   rw   zEchoStreamFlightServer.do_get   s;    %%$$((t(<> 	>r   c                     g S r   r   rc   ro   s     r   list_actionsz#EchoStreamFlightServer.list_actions   s    	r   c                     |j                   dk(  r/|j                         |j                         j                  d      gS t        )Nwho-am-iutf-8)rG   peer_identitypeerencodeNotImplementedErrorrc   ro   actions      r   	do_actionz EchoStreamFlightServer.do_action   s9    ;;*$))+W\\^-B-B7-KLL!!r   N)ry   rz   r{   r|   rw   r   r   r   r   r   r   r      s    @>
"r   r   c                       e Zd ZdZd Zd Zy)GetInfoFlightServerz)A Flight server that tests GetFlightInfo.c                    t        j                  t        j                  dt        j                         fg      |t        j
                  ddg      t        j
                  dt         j                  j                  dd      gt        j                  d      j                  t        j                  d            d      gd	d
dd      S )NrV   r   grpc://test	localhost  2023-04-05T12:34:56.789012345nszendpoint app metadatarH   *   Tzinfo app metadata)r   rj   r<   rk   int32FlightEndpointLocationfor_grpc_tcpscalarcast	timestamprc   ro   r   s      r   get_flight_infoz#GetInfoFlightServer.get_flight_info   s      IIRXXZ()*%%cM?;%%__11+tDEII=>CCBLLQUDVW+	 
 	
r   c                 d    | j                  ||      }t        j                  |j                        S r   )r   r   SchemaResultrk   )rc   ro   r   infos       r   
get_schemazGetInfoFlightServer.get_schema  s)    ##GZ8""4;;//r   N)ry   rz   r{   r|   r   r   r   r   r   r   r      s    3
&0r   r   c                   &    e Zd ZdZed        Zd Zy)ListActionsFlightServer'A Flight server that tests ListActions.c                 4    ddt        j                  dd      gS )N)action-1description)zaction-2 zaction-3zmore detailr   
ActionType)clss    r   expected_actionsz(ListActionsFlightServer.expected_actions  s$     (j-8
 	
r   c              #   @   K   | j                         E d {    y 7 wr   )r   r   s     r   r   z$ListActionsFlightServer.list_actions  s     ((***s   N)ry   rz   r{   r|   classmethodr   r   r   r   r   r   r     s    1
 
+r   r   c                       e Zd ZdZd Zy)ListActionsErrorFlightServerr   c              #      K   d d y w)N)r   r   rC   r   r   s     r   r   z)ListActionsErrorFlightServer.list_actions  s     s   
N)ry   rz   r{   r|   r   r   r   r   r   r     s
    1r   r   c                   0     e Zd ZdZd fd	Zd Zd Z xZS )CheckTicketFlightServerzDA Flight server that compares the given ticket to an expected value.c                 4    t        |   |fi | || _        y r   )r_   r`   expected_ticket)rc   r   rd   re   rf   s       r   r`   z CheckTicketFlightServer.__init__'  s    ,V,.r   c                     | j                   |j                  k(  sJ t        j                  g dt        j                               g}t        j
                  j                  |dg      }t        j                  |      S )Nr5   rF   rV   r:   )	r   rt   r<   r=   r   r>   r?   r   ru   )rc   ro   rt   data1rv   s        r   rw   zCheckTicketFlightServer.do_get+  s`    ##v}}444-BHHJ?@$$U3%$8''..r   c                 .    |j                         | _        y r   )r   r   )rc   ro   r   r   s       r   r   zCheckTicketFlightServer.do_put1  s    "OO-r   r   )ry   rz   r{   r|   r`   rw   r   r}   r~   s   @r   r   r   $  s    N//.r   r   c                   ^    e Zd ZdZ ej
                  d ej                         fg      Zd Zy)InvalidStreamFlightServerzEA Flight server that tries to return messages with differing schemas.rV   c                    t        j                  g dt        j                               g}t        j                  g dt        j                               g}|j                  |j                  k7  sJ t         j
                  j                  |dg      }t         j
                  j                  |dg      }|j                  | j                  k(  sJ t        j                  | j                  ||g      S )Nr5   rF   )g      $g      g              @g      $@rV   r:   )
r<   r=   r   float64rG   r>   r?   rk   r   r   )rc   ro   rt   r   data2table1table2s          r   rw   z InvalidStreamFlightServer.do_get:  s    -BHHJ?@7bjjlKLzzUZZ'''%%eC5%9%%eC5%9}}+++%%dkkFF3CDDr   Nry   rz   r{   r|   r<   rk   r   rw   r   r   r   r   r   5  s+    ORYYhbhhj)*+FEr   r   c                   ^    e Zd ZdZ ej
                  d ej                         fg      Zd Zy)NeverSendsDataFlightServerz0A Flight server that never actually yields data.rV   c                    |j                   dk(  r| j                  j                         | j                  j                         t        j                  j                  t        d      g| j                        g}t        j                  | j                  |      S t        j                  | j                  t        j                  | j                  j                                     S )N
   yield_datar7   rk   )rt   rk   empty_tabler<   r   r?   ranger   r   	itertoolsrepeat)rc   ro   rt   r@   s       r   rw   z!NeverSendsDataFlightServer.do_getJ  s    ==M) '')'')**E!H:dkk*JD
 ))$++t<<%%KK))$++*A*A*CDF 	Fr   Nr   r   r   r   r   r   E  s+    :RYYhbhhj)*+FFr   r   c                   ,    e Zd ZdZd Zd Zed        Zy)SlowFlightServerz;A Flight server that delays its responses to test timeouts.c                     t        j                  t        j                  dt        j                         fg      | j                               S )NrV   )r   r   r<   rk   r   slow_streamr   s      r   rw   zSlowFlightServer.do_get[  s:    %%bii#rxxz1B0C&D&*&6&6&8: 	:r   c                 0    t        j                  d       g S N      ?)timesleepr   s      r   r   zSlowFlightServer.do_action_  s    

3	r   c               #     K   t        j                  g dt        j                               g} t         j                  j	                  | dg       t        j                  d       t         j                  j	                  | dg       y w)Nr5   rF   rV   r:   r8   )r<   r=   r   r>   r?   r  r  )r   s    r   r  zSlowFlightServer.slow_streamc  se     -BHHJ?@hh""5"66 	

2hh""5"66s   BBN)ry   rz   r{   r|   rw   r   r   r  r   r   r   r  r  X  s#    E: 7 7r   r  c                   2    e Zd ZdZed        Zd Zd Zd Zy)ErrorFlightServerz9A Flight server that uses all the Flight-specific errors.c            	          t         j                  t         j                  t         j                  t         j                  t         j
                  t        t        j                  t        dS )N)internaltimedoutcancelunauthenticatedunauthorizednotimplementedinvalidr/   )
r   FlightInternalErrorFlightTimedOutErrorFlightCancelledErrorFlightUnauthenticatedErrorFlightUnauthorizedErrorr   r<   ArrowInvalidKeyErrorr   r   r   error_caseszErrorFlightServer.error_casesp  sH     222211%@@"::1	
 		
r   c                     t         j                         }|j                  |v r ||j                     d      |j                  dk(  rd}t        j                  d|      t
        )NrC   protobuf   this is an error message)r  r  rG   r   r  r   )rc   ro   r   r  err_msgs        r   r   zErrorFlightServer.do_action}  s\    '335;;+%*+fkk*511[[J&1G00@@!!r   c              #      K   t        j                  t        j                  g       t         j                  j                  d      g        t        j                  d      w)Nrh   rC   )r   rj   r<   rk   rl   rm   r  rn   s      r   rq   zErrorFlightServer.list_flights  sN     IIbM##,,V4
 	

 ((//s   AA!c                    |j                   dk(  rt        j                  d      |j                   dk(  rt        j                  d      |j                   dk(  rt        j                  d      |j                   dk(  rt        j
                  d      |j                   dk(  rt        j                  d      |j                   dk(  rd}t        j                  d|      y )	Ns   internalrC   s   timedouts   cancels   unauthenticateds   unauthorizeds   protobufr  )commandr   r  r  r  r  r  )rc   ro   r   r   r   r  s         r   r   zErrorFlightServer.do_put  s    ,,,U33;.,,U339,--e44#5533E::?20077;.1G00@@ /r   N)	ry   rz   r{   r|   r   r  r   rq   r   r   r   r   r  r  m  s'    C

 

"0Ar   r  c                   B     e Zd ZdZd fd	Zd Zd Zd Zd Zd Z	 xZ
S )	ExchangeFlightServerz A server for testing DoExchange.c                 2    t        |   di | || _        y r   r   r   s      r   r`   zExchangeFlightServer.__init__  r   r   c                    |j                   t        j                  j                  k7  rt	        j
                  d      |j                  dk(  r| j                  |||      S |j                  dk(  r| j                  |||      S |j                  dk(  r| j                  |||      S |j                  dk(  r| j                  |||      S t	        j
                  dj                  |j                              )Nz!Must provide a command descriptor   echo   get   put	   transformzUnknown command: {})descriptor_typer   DescriptorTypeCMDr<   r  r"  exchange_echoexchange_do_getexchange_do_putexchange_transformr&   r   s        r   r   z ExchangeFlightServer.do_exchange  s    %%)>)>)B)BB//"EFF7*%%gvv>>6)''@@6)''@@</**7FFCC//%,,Z-?-?@B Br   c                     t         j                  j                  t        j                  t	        dd            gdg      }|j                  |j                         |j                  |       y)Emulate DoGet with DoExchange.r    (  rV   r:   N)r<   r>   r?   r=   r   beginrk   write_table)rc   ro   r   r   r@   s        r   r/  z$ExchangeFlightServer.exchange_do_get  sX    xx##HHU1i()%
 $  	T[[!4 r   c                     d}|D ](  }|j                   st        j                  d      |dz  }* |j                  t	        |      j                  d             y)Emulate DoPut with DoExchange.r   zAll chunks must have data.rH   r   N)r@   r<   r  write_metadatastrr   )rc   ro   r   r   num_batchesr   s         r   r0  z$ExchangeFlightServer.exchange_do_put  sW     	E::oo&BCC1K	 	c+.55g>?r   c                    d}|D ]  }|s?|j                   r3|j                  |j                   j                  | j                         d}|j                  r3|j                   r'|j                  |j                   |j                         |j                  r|j                  |j                         |j                   r|j                  |j                          J d        y)zRun a simple echo server.Frs   TzShould not happenN)r@   r5  rk   rb   app_metadatawrite_with_metadatar9  write_batch)rc   ro   r   r   startedr   s         r   r.  z"ExchangeFlightServer.exchange_echo  s     	2EuzzUZZ..E!!ejj**5::u7I7IJ##%%e&8&89""5::.111u	2r   c                 (   |j                   D ]L  }t        j                  j                  |j                        r-t        j
                  dt        |      z          |j                         }dg|j                  z  }|D ]0  }t        |      D ]   \  }}	||xx   |	j                         z  cc<   " 2 t        j                  j                  t        j                  |      gdg      }
|j                  |
j                          |j                  |
       y)zSum rows in an uploaded table.zInvalid field: r   sumr:   N)rk   r<   types
is_integerrG   r  reprr   num_rowsr   as_pyr>   r?   r=   r5  r6  )rc   ro   r   r   fieldrv   sumscolumnrowvalueresults              r   r1  z'ExchangeFlightServer.exchange_transform  s    ]] 	GE88&&uzz2oo&7$u+&EFF	G !sU^^# 	+F'/ +
US	U[[]*	+	+ %%rxx~&6ug%FV]]#6"r   r   )ry   rz   r{   r|   r`   r   r/  r0  r.  r1  r}   r~   s   @r   r$  r$    s&    *B!@2 #r   r$  c                   .     e Zd ZdZ fdZd Zd Z xZS )HttpBasicServerAuthHandler7An example implementation of HTTP basic authentication.c                 0    t         |           || _        y r   r_   r`   credsrc   rS  rf   s     r   r`   z#HttpBasicServerAuthHandler.__init__      
r   c                 z   |j                         }t        j                  j                  |      }|j                  | j
                  vrt        j                  d      | j
                  |j                     |j                  k7  rt        j                  d      |j                  t        |j                               y )Nunknown userzwrong password)
r$   r   	BasicAuthdeserializeusernamerS  r  passwordr   r   )rc   outgoingincomingr   auths        r   authenticatez'HttpBasicServerAuthHandler.authenticate  s    mmo++C0==

*33NCC::dmm$5334DEEwt}}-.r   c                 z    |st        j                  d      || j                  vrt        j                  d      |S )Nztoken not providedrW  )r   r  rS  rc   tokens     r   is_validz#HttpBasicServerAuthHandler.is_valid  s9    334HII

"33NCCr   ry   rz   r{   r|   r`   r_  rc  r}   r~   s   @r   rO  rO    s    A/r   rO  c                   .     e Zd ZdZ fdZd Zd Z xZS )HttpBasicClientAuthHandlerrP  c                 f    t         |           t        j                  ||      | _        d | _        y r   )r_   r`   r   rX  
basic_authrb  rc   rZ  r[  rf   s      r   r`   z#HttpBasicClientAuthHandler.__init__  s)     **8X>
r   c                     | j                   j                         }|j                  |       |j                         | _        y r   )rh  	serializer   r$   rb  )rc   r\  r]  r^  s       r   r_  z'HttpBasicClientAuthHandler.authenticate  s-    ((*t]]_
r   c                     | j                   S r   rb  rc   s    r   	get_tokenz$HttpBasicClientAuthHandler.get_token	      zzr   ry   rz   r{   r|   r`   r_  ro  r}   r~   s   @r   rf  rf    s    A
%
r   rf  c                   .     e Zd ZdZ fdZd Zd Z xZS )TokenServerAuthHandler:An example implementation of authentication via handshake.c                 0    t         |           || _        y r   rR  rT  s     r   r`   zTokenServerAuthHandler.__init__  rU  r   c                     |j                         }|j                         }|| j                  v r:| j                  |   |k(  r(|j                  t        j                  d|z                y t        j                  d      )N   secret:zinvalid username/password)r$   rS  r   base64	b64encoder   r  )rc   r\  r]  rZ  r[  s        r   r_  z#TokenServerAuthHandler.authenticate  sf    ==?==?tzz!djj&:h&FNN6++J,ABC33+- -r   c                     t        j                  |      }|j                  d      st        j                  d      |dd  S )Nrw  zinvalid token   )rx  	b64decode
startswithr   r  ra  s     r   rc  zTokenServerAuthHandler.is_valid  s=      '
+33ODDQRyr   rd  r~   s   @r   rs  rs    s    D-r   rs  c                   .     e Zd ZdZ fdZd Zd Z xZS )TokenClientAuthHandlerrt  c                 L    t         |           || _        || _        d| _        y )Nr   )r_   r`   rZ  r[  rb  ri  s      r   r`   zTokenClientAuthHandler.__init__'  s#      
r   c                     |j                  | j                         |j                  | j                         |j                         | _        y r   )r   rZ  r[  r$   rb  rc   r\  r]  s      r   r_  z#TokenClientAuthHandler.authenticate-  s/    t}}%t}}%]]_
r   c                     | j                   S r   rm  rn  s    r   ro  z TokenClientAuthHandler.get_token2  rp  r   rq  r~   s   @r   r  r  $  s    D%
r   r  c                       e Zd ZdZd Zd Zy)NoopAuthHandlerzA no-op auth handler.c                      y)zDo nothing.Nr   r  s      r   r_  zNoopAuthHandler.authenticate9  s    r   c                      y)zV
        Returning an empty string.
        Returning None causes Type error.
        r   r   ra  s     r   rc  zNoopAuthHandler.is_valid<  s    
 r   N)ry   rz   r{   r|   r_  rc  r   r   r   r  r  6  s    r   r  c                 z    | D ]6  }|j                         |j                         k(  s%| j                  |      c S  y)zcLookup the value of given key in the given headers.
       The key lookup is case-insensitive.
    N)lowerr   )headers
lookup_keyr/   s      r   case_insensitive_header_lookupr  D  s9      $99;***,,;;s##$r   c                   "    e Zd ZdZd Zd Zd Zy)!ClientHeaderAuthMiddlewareFactoryz@ClientMiddlewareFactory that creates ClientAuthHeaderMiddleware.c                     g | _         y r   call_credentialrn  s    r   r`   z*ClientHeaderAuthMiddlewareFactory.__init__P  s
    !r   c                     t        |       S r   )ClientHeaderAuthMiddlewarerc   r   s     r   
start_callz,ClientHeaderAuthMiddlewareFactory.start_callS  s    )$//r   c                     || _         y r   r  )rc   r  s     r   set_call_credentialz5ClientHeaderAuthMiddlewareFactory.set_call_credentialV  s
    .r   N)ry   rz   r{   r|   r`   r  r  r   r   r   r  r  M  s    J"0/r   r  c                       e Zd ZdZd Zd Zy)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                     || _         y r   factoryrc   r  s     r   r`   z#ClientHeaderAuthMiddleware.__init__j  	    r   c                 z    t        |d      }| j                  j                  d|d   j                  d      g       y )NAuthorization   authorizationr   r   )r  r  r  r   )rc   r  auth_headers      r   received_headersz+ClientHeaderAuthMiddleware.received_headersm  s:    4WoN((N!!'**, 	-r   N)ry   rz   r{   r|   r`   r  r   r   r   r  r  Z  s    -r   r  c                       e Zd ZdZd Zy)!HeaderAuthServerMiddlewareFactoryz)Validates incoming username and password.c                    t        |d      }|d   j                  d      }d}d}|d   dk(  rjt        j                  |d         }|j	                  d      j                  d	      }|d   d
k(  r|d   dk(  st        j                  |      d}t        |      S |d   dk(  r|d   }|dk(  s*t        j                  |      t        j                  |      t        |      S )Nr  r    r   zInvalid credentialsBasicrH   r   :testr[  	token1234Bearer)r  splitrx  r|  decoder   r  HeaderAuthServerMiddleware)	rc   r   r  r  valuesrb  error_messagedecodedpairs	            r   r  z,HeaderAuthServerMiddlewareFactory.start_callw  s    4
 Q%%c*-!9&&vay1G>>'*005DGv%$q'Z*?77FFE *%00 AY("1IEK'77FF33MBB)%00r   Nry   rz   r{   r|   r  r   r   r   r  r  t  s
    31r   r  c                       e Zd ZdZd Zd Zy)r  zBA ServerMiddleware that transports incoming username and password.c                     || _         y r   rm  ra  s     r   r`   z#HeaderAuthServerMiddleware.__init__  s	    
r   c                 $    dd| j                   z   iS )NauthorizationzBearer rm  rn  s    r   sending_headersz*HeaderAuthServerMiddleware.sending_headers  s    TZZ!788r   Nry   rz   r{   r|   r`   r  r   r   r   r  r    s    L9r   r  c                       e Zd ZdZd Zy)HeaderAuthFlightServerz<A Flight server that tests with basic token authentication. c                     |j                  d      }|r@t        |j                         d      }|j                  d      }|d   j	                  d      gS t        j                  d      )Nr^  r  r  rH   r   zNo token auth middleware found.)get_middlewarer  r  r  r   r   r  )rc   ro   r   
middlewarer  r  s         r   r   z HeaderAuthFlightServer.do_action  sk    ++F3
8**,o?K &&s+F1I$$W-..//-/ 	/r   Nry   rz   r{   r|   r   r   r   r   r  r    s
    F/r   r  c                       e Zd ZdZd Zy)'ArbitraryHeadersServerMiddlewareFactoryz<A ServerMiddlewareFactory that transports arbitrary headers.c                     t        |      S r   ) ArbitraryHeadersServerMiddlewarerc   r   r  s      r   r  z2ArbitraryHeadersServerMiddlewareFactory.start_call  s    /88r   Nr  r   r   r   r  r    s
    F9r   r  c                       e Zd ZdZd Zd Zy)r  z5A ServerMiddleware that transports arbitrary headers.c                     || _         y r   r]  )rc   r]  s     r   r`   z)ArbitraryHeadersServerMiddleware.__init__  s	     r   c                     | j                   S r   r  rn  s    r   r  z0ArbitraryHeadersServerMiddleware.sending_headers      }}r   Nr  r   r   r   r  r    s    ?!r   r  c                       e Zd ZdZd Zy)ArbitraryHeadersFlightServerz6A Flight server that tests multiple arbitrary headers.c                     |j                  d      }|rT|j                         }t        |d      }t        |d      }|d   j                  d      }|d   j                  d      }||gS t	        j
                  d      )Narbitrary-headersztest-header-1ztest-header-2r   r   zNo headers middleware found)r  r  r  r   r   FlightServerError)	rc   ro   r   r  r  header_1header_2value1value2s	            r   r   z&ArbitraryHeadersFlightServer.do_action  s    ++,?@
 002G5H 6H a[''0Fa[''0FF##&&'DEEr   Nr  r   r   r   r  r    s    @Fr   r  c                       e Zd ZdZd Zy)HeaderServerMiddlewarez/Expose a per-call value to the RPC method body.c                     || _         y r   )special_value)rc   r  s     r   r`   zHeaderServerMiddleware.__init__  s
    *r   N)ry   rz   r{   r|   r`   r   r   r   r  r    s
    9+r   r  c                       e Zd ZdZd Zy)HeaderServerMiddlewareFactoryz:Expose a per-call hard-coded value to the RPC method body.c                     t        d      S )Nzright value)r  r  s      r   r  z(HeaderServerMiddlewareFactory.start_call  s    %m44r   Nr  r   r   r   r  r    s
    D5r   r  c                       e Zd ZdZd Zy)HeaderFlightServerz(Echo back the per-call hard-coded value.c                 d    |j                  d      }|r|j                  j                         gS dgS )Nr  r   )r  r  r   )rc   ro   r   r  s       r   r   zHeaderFlightServer.do_action  s4    ++F3
,,33566ur   Nr  r   r   r   r  r    s
    2r   r  c                       e Zd ZdZd Zy)MultiHeaderFlightServer8Test sending/receiving multiple (binary-valued) headers.c                 r    |j                  d      }t        |j                        j                  d      }|gS )Nr  r   )r  rE  client_headersr   )rc   ro   r   r  r  s        r   r   z!MultiHeaderFlightServer.do_action  s5    ++F3
z00188Ayr   Nr  r   r   r   r  r    s
    Br   r  c                       e Zd ZdZd Zy)$SelectiveAuthServerMiddlewareFactoryz1Deny access to certain methods based on a header.c                     |j                   t        j                  j                  k(  ry |j	                  d      }|st        j
                  d      |d   }|dk7  rt        j
                  d      t        |      S )Nx-auth-tokenzNo tokenr   r[  zInvalid token)methodr   FlightMethodLIST_ACTIONSr   r  r  )rc   r   r  rb  s       r   r  z/SelectiveAuthServerMiddlewareFactory.start_call  sl    ;;&--:::N+33J??aJ33ODD%e,,r   Nr  r   r   r   r  r    s
    ;-r   r  c                       e Zd Zd Zy)$SelectiveAuthClientMiddlewareFactoryc                     t               S r   )SelectiveAuthClientMiddlewarer  s     r   r  z/SelectiveAuthClientMiddlewareFactory.start_call  s    ,..r   N)ry   rz   r{   r  r   r   r   r  r    s    /r   r  c                       e Zd Zd Zy)r  c                 
    ddiS )Nr  r[  r   rn  s    r   r  z-SelectiveAuthClientMiddleware.sending_headers  s    J
 	
r   N)ry   rz   r{   r  r   r   r   r  r    s    
r   r  c                   (     e Zd ZdZ fdZd Z xZS ) RecordingServerMiddlewareFactory Record what methods were called.c                 0    t         |           g | _        y r   r_   r`   methodsrc   rf   s    r   r`   z)RecordingServerMiddlewareFactory.__init__      r   c                 N    | j                   j                  |j                         y r   r  appendr  r  s      r   r  z+RecordingServerMiddlewareFactory.start_call      DKK(r   ry   rz   r{   r|   r`   r  r}   r~   s   @r   r  r        *r   r  c                   (     e Zd ZdZ fdZd Z xZS ) RecordingClientMiddlewareFactoryr  c                 0    t         |           g | _        y r   r  r  s    r   r`   z)RecordingClientMiddlewareFactory.__init__  r  r   c                 N    | j                   j                  |j                         y r   r  r  s     r   r  z+RecordingClientMiddlewareFactory.start_call!  r  r   r  r~   s   @r   r  r    r  r   r  c                       e Zd ZdZd Zd Zy)"MultiHeaderClientMiddlewareFactoryr  c                     i | _         y r   )last_headersrn  s    r   r`   z+MultiHeaderClientMiddlewareFactory.__init__)  s     r   c                     t        |       S r   )MultiHeaderClientMiddlewarer  s     r   r  z-MultiHeaderClientMiddlewareFactory.start_call.  s    *400r   N)ry   rz   r{   r|   r`   r  r   r   r   r  r  &  s    B
1r   r  c                   <    e Zd ZdZddgddgdgdgdZd Zd	 Zd
 Zy)r  r  rC   rQ          rD   )zx-textzx-binary-binzx-MIXED-cases   x-other-MIXED-casec                     || _         y r   r  r  s     r   r`   z$MultiHeaderClientMiddleware.__init__=  r  r   c                     | j                   S r   )EXPECTEDrn  s    r   r  z+MultiHeaderClientMiddleware.sending_headers@  r  r   c                 N    | j                   j                  j                  |       y r   )r  r  update)rc   r  s     r   r  z,MultiHeaderClientMiddleware.received_headersC  s     	!!((1r   N)ry   rz   r{   r|   r  r`   r  r  r   r   r   r  r  2  s6    B %. '* %wH2r   r  c                       e Zd ZdZd Zy)"MultiHeaderServerMiddlewareFactoryr  c                     t        |      S r   )MultiHeaderServerMiddlewarer  s      r   r  z-MultiHeaderServerMiddlewareFactory.start_callL  s    *733r   Nr  r   r   r   r  r  I  s
    B4r   r  c                       e Zd ZdZd Zd Zy)r  r  c                     || _         y r   )r  )rc   r  s     r   r`   z$MultiHeaderServerMiddleware.__init__S  s
    ,r   c                 "    t         j                  S r   )r  r  rn  s    r   r  z+MultiHeaderServerMiddleware.sending_headersV  s    *333r   Nr  r   r   r   r  r  P  s    B-4r   r  c                   .     e Zd ZdZ fdZd Zd Z xZS )LargeMetadataFlightServerz Regression test for ARROW-13253.c                 8    t        |   |i | ddz  | _        y )N           )r_   r`   	_metadata)rc   argsre   rf   s      r   r`   z"LargeMetadataFlightServer.__init__]  s!    $)&)-r   c                     t        j                  dt        j                         fg      }t        j                  |t        j
                  dgg|      | j                  fg      S )NrV   rH   r   )r<   rk   int64r   r   record_batchr  )rc   ro   rt   rk   s       r   rw   z LargeMetadataFlightServer.do_geta  sS    S"((*-./%%f__qcU62DNNC/
  	r   c                 :    |j                  | j                         y r   )r9  r  r   s        r   r   z%LargeMetadataFlightServer.do_exchangeg  s    dnn-r   )ry   rz   r{   r|   r`   rw   r   r}   r~   s   @r   r  r  Z  s    *..r   r  c                  
   d} d}d}d}d}d}d}d}d	}d
}	t        t        j                  dd            | k(  sJ t        t        j                  dd            |k(  sJ t        t        j                  dd            |k(  sJ t        t        j
                  j                  d            |k(  sJ t        j                  dg t        j                  d      j                  t        j                  d            d      }
t        |
      |k(  sJ t        j                  t        j                  g       t        j
                  j                         g dddd      }t        |      |k(  sJ t        t        j                  d            |k(  sJ t        t        j                   d            |k(  sJ t        t        j"                  t        j                  g                   |k(  sJ t        t        j"                  t        j                  dg                  dk(  sJ t        t        j$                  d            |	k(  sJ t'        j(                  t*              5  t        j                  dd        d d d        t'        j(                  t*              5  t        j                  t-               g        d d d        t'        j(                  t*              5  t        j                  dddt-               g       d d d        t'        j(                  t*              5  t        j                  dg d       d d d        t'        j(                  t*              5  t        j                  dg t/        dd d!dd"d#             d d d        t'        j(                  t*              5  t        j                  dg t-               $       d d d        y # 1 sw Y   RxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ~xY w# 1 sw Y   y xY w)%Nz1<pyarrow.flight.Action type='foo' body=(0 bytes)>z)ActionType(type='foo', description='bar')z?<pyarrow.flight.BasicAuth username=b'user' password=(redacted)>z,<pyarrow.flight.FlightDescriptor cmd=b'foo'>z<pyarrow.flight.FlightEndpoint ticket=<pyarrow.flight.Ticket ticket=b'foo'> locations=[] expiration_time=2023-04-05 12:34:56+00:00 app_metadata=b'endpoint app metadata'>z<pyarrow.flight.FlightInfo schema= descriptor=<pyarrow.flight.FlightDescriptor path=[]> endpoints=[] total_records=1 total_bytes=42 ordered=True app_metadata=b'test app metadata'>z6<pyarrow.flight.Location b'grpc+tcp://localhost:1234'>z&<pyarrow.flight.Result body=(3 bytes)>z'<pyarrow.flight.SchemaResult schema=()>z%<pyarrow.flight.Ticket ticket=b'foo'>rC   r   rQ   userpass   foo2023-04-05T12:34:56s   endpoint app metadatarH   r   T   test app metadatagrpc+tcp://localhost:1234)intr  z1<pyarrow.flight.SchemaResult schema=(int: int64)>r   s   grpc://testz2023-04-05T01:02:03)expiration_timei  rU   r7   rI   rT   r=  )rE  r   Actionr   rX  rl   for_commandr   r<   r   r   r   rj   rk   rm   r   Resultr   Ticketpytestraises	TypeErrorobjectr   )action_repraction_type_reprbasic_auth_reprdescriptor_reprendpoint_repr	info_reprlocation_reprresult_reprschema_result_reprticket_reprendpointr   s               r   	test_reprr@  k  sj   EKBWODO>M	-  MM:KB9KeS)*k999!!%/04DDDD  01_DDD''33E:;NNN$$BII3499",,s:KL H >]***
		"v..7792	2t)D :""" ;<=NNNf%&+555##BIIbM237IIII##BII/?.@$ABC;< < <f%&+555	y	! #eT"# 
y	! ,fh+,	y	! Pem^VX%NOP	y	! PeR9NOP	y	! XeR$1aQRTU9VWX	y	! @eRfh?@ @# #, ,P PP PX X@ @sH   N;O"OO!	'O-!O9;OOO!O*-O69Pc                      d d d d d d d d d	 d
 d d d d d d d d d d d g} | D ]G  } |       \  }} |       \  }}||k(  sJ ||k(  sJ ||k(  sJ ||k(  sJ ||k(  sJ ||k(  sJ ||k7  rGJ  y )Nc                  Z    t        j                  dd      t        j                  dd      fS )NrC   r   rQ   r   r-  r   r   r   <lambda>ztest_eq.<locals>.<lambda>  s!    uc*FMM%,EF r   c                  Z    t        j                  dd      t        j                  dd      fS )NrC   r      barrC  r   r   r   rD  ztest_eq.<locals>.<lambda>  s!    uc*FMM%,HI r   c                  Z    t        j                  dd      t        j                  dd      fS )NrC   rQ   rD   r   r   r   r   rD  ztest_eq.<locals>.<lambda>  s(    ""5%0""5%02 r   c                  Z    t        j                  dd      t        j                  dd      fS )Nr"  r#  user2r   rX  r   r   r   rD  ztest_eq.<locals>.<lambda>  s(    !!&&1!!'624 r   c                  Z    t        j                  dd      t        j                  dd      fS )Nr"  r#  pass2rJ  r   r   r   rD  ztest_eq.<locals>.<lambda>  s(    !!&&1!!&'24 r   c                  ~    t         j                  j                  d      t         j                  j                  d      fS )NrC   )r   rl   r.  rm   r   r   r   rD  ztest_eq.<locals>.<lambda>  s0    ((44U;((11%8: r   c                  Z    t        j                  dg       t        j                  dg       fS Nr$  rF  r   r   r   r   r   rD  ztest_eq.<locals>.<lambda>  s(    &&vr2&&vr24 r   c                      t        j                  dt        j                  d      g      t        j                  dt        j                  d      g      fS )Nr$  r)  grpc+tls://localhost:1234)r   r   r   r   r   r   rD  ztest_eq.<locals>.<lambda>  sK    !!)DEFH!!)DEFH
 r   c            
      2   t        j                  dg t        j                  d      j	                  t        j
                  d                  t        j                  dg t        j                  d      j	                  t        j
                  d                  fS )Nr$  r%  r&  z2023-04-05T12:34:56.789ms)r   r   r<   r   r   r   r   r   r   rD  ztest_eq.<locals>.<lambda>  ss    !!BII&;<AA",,sBSTV!!		3499",,t:LMOP r   c                  b    t        j                  dg d      t        j                  dg d      fS )Nr$  r   r,     metarP  r   r   r   rD  ztest_eq.<locals>.<lambda>  s-    &&vrD&&vrHJ r   c                  D   t        j                  t        j                  g       t         j                  j                         g       t        j                  t        j                  dt        j                         fg      t         j                  j                         g       fS Nints)r   rj   r<   rk   rl   rm   r  r   r   r   rD  ztest_eq.<locals>.<lambda>  st    		"''002B8 		FBHHJ/01''002B8	9 r   c                     t        j                  t        j                  g       t         j                  j                         g       t        j                  t        j                  g       t         j                  j                  d      g       fS Nr$  )r   rj   r<   rk   rl   rm   r.  r   r   r   rD  ztest_eq.<locals>.<lambda>  si    		"''002B8 		"''33F;RA	B r   c            	      n   t        j                  t        j                  g       t         j                  j                         t        j                  dg       g      t        j                  t        j                  g       t         j                  j                         t        j                  dg       g      fS rO  )r   rj   r<   rk   rl   rm   r   r   r   r   rD  ztest_eq.<locals>.<lambda>  s    		"''002&&vr235 		"''002&&vr2356 r   c                  "   t        j                  t        j                  g       t         j                  j                         g d      t        j                  t        j                  g       t         j                  j                         g d      fS )N)total_recordsrH   r   rj   r<   rk   rl   rm   r   r   r   rD  ztest_eq.<locals>.<lambda>  sl    		"''002BbJ 		"''002BaI	J r   c                  "   t        j                  t        j                  g       t         j                  j                         g d      t        j                  t        j                  g       t         j                  j                         g d      fS )Nr^  )total_bytesr   r`  r   r   r   rD  ztest_eq.<locals>.<lambda>  sl    		"''002BBH 		"''002BBH	I r   c                  "   t        j                  t        j                  g       t         j                  j                         g d      t        j                  t        j                  g       t         j                  j                         g d      fS )NF)orderedTr`  r   r   r   rD  ztest_eq.<locals>.<lambda>  sl    		"''002BG 		"''002BF	G r   c                  "   t        j                  t        j                  g       t         j                  j                         g d      t        j                  t        j                  g       t         j                  j                         g d      fS )Nr   r,  rV  r`  r   r   r   rD  ztest_eq.<locals>.<lambda>  sl    		"''002BSJ 		"''002BWN	O r   c                  V    t        j                  d      t        j                  d      fS )Nr)  rR  )r   r   r   r   r   rD  ztest_eq.<locals>.<lambda>  s"    !<=!<=? r   c                  V    t        j                  d      t        j                  d      fS rO  )r   r/  r   r   r   rD  ztest_eq.<locals>.<lambda>  s    v&f(=> r   c                      t        j                  t        j                  g             t        j                  t        j                  dt        j                         fg            fS rX  )r   r   r<   rk   r  r   r   r   rD  ztest_eq.<locals>.<lambda>  sD    $$RYYr]3$$RYY0D/E%FGI r   c                  V    t        j                  d      t        j                  d      fS )Nr   r$  )r   r0  r   r   r   rD  ztest_eq.<locals>.<lambda>  s    s#V]]6%:; r   r   )itemsgenlhs1rhs1lhs2rhs2s         r   test_eqrp    s    FI	2	4	4	:	4	
	P	J	9	B	6	J	I	G	O	?>	I;gTEl  	U
dU
dt||t||t||t||t||t||t||	r   c                     t        j                  t        j                  g       t         j                  j                         g       } t        j                  t        j                  g       t         j                  j                         g dd      }t        j                  t        j                  g       t         j                  j                         g d d       }| j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ | j                  dk(  sJ |j                  dk(  sJ |j                  dk(  sJ y )Nr^  )r_  rb  )r   rj   r<   rk   rl   rm   r_  rb  )fi1fi2fi3s      r   test_flight_info_defaultsru  
  s   


BIIbM6+B+B+K+K+Mr
RC



		"((*BbbRC 


		"((*BdPTVC """""""""??b   ??b   ??b   r   c                      d ddt               fg} | D ])  }t        |      5 }t        |t              sJ 	 d d d        + y # 1 sw Y   6xY w)Ngrpc://localhost:0r   )r   r
   
isinstance)	locationsrd   servers      r   $test_flight_server_location_argumentr{    s`    	n&'I
  8h' 	86f&6777	8 	88	8 	8s	   ?A	c                      t        j                  t              5  t               5  t               # 1 sw Y   nxY w	 d d d        y # 1 sw Y   y xY wr   )r1  r2  
ValueErrorr
   r   r   r   #test_server_exit_reraises_exceptionr~  '  sF    	z	"  	,	 	 	  s   A09	AAc                  D   dt               fd } fd}t              5 }t        j                  |d      }|j	                          t        j
                         }|j                  d       t        j
                         |z
  }|dk\  sJ 	 d d d        y # 1 sw Y   y xY w)Nr   c                  n    t        j                  d       t               at        j	                          y r  )r  r  r
   rz  serverd   s   r   r  z-test_client_wait_for_available.<locals>.serve3  s!    

3!(+r   Ttargetdaemonr7   timeoutr  )r   r	   	threadingThreadstartr  wait_for_available)rz  r  clientthreadr@  elapsedrd   s         @r   test_client_wait_for_availabler  -  s     ^-.HF 
h	 6!!t<))+!!!!,))+'#~~  s   A,BBc                  \   t               5 } t        j                  d| j                  f      5 }t	        |j                               g k(  sJ |j                  t         j                        }t        t	        |            dk(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zTry a simple list_flights call.r   rH   N)rZ   r   connectportlistrq   ri   len)rz  r  flightss      r   test_flight_list_flightsr  C  s    		 '6NNK56':@F'')*b000%%&:&C&CD4=!Q&&&	' ' ' ' ' 's#   "B"ABB"B	B""B+c                     t               5 } t        j                  d| j                  f      5 }t	        |j                               g k(  sJ |j                          |j                          t        j                  t        j                        5  t	        |j                                d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr   )rZ   r   r  r  r  rq   closer1  r2  r<   r  rz  r  s     r   test_flight_client_closer  L  s    		 (6NNK56(:@F'')*b000]]2??+ 	($$&'	(( ( (
	( 	(( ( ( (s;   "CA"CC)C1CCCC	CC#c                  <   t               } t               5 }t        j                  d|j                  f      5 }|j                  t        j                  d            j                         }|j                  |       sJ 	 ddd       ddd       t        j                  j                  t        j                  j                  j                        }t        |      5 }t        j                  d|j                  f      5 }|j                  t        j                  d            j                         }|j                  |       sJ |j                  t        j                  d            j                         j                         }|j                  |       sJ 	 ddd       ddd       t        j                   t        j"                  d      5  t        d      5 }t        j                  d|j                  f      5 }|j                  t        j                  d            j                         }ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   LxY w# 1 sw Y   PxY w# 1 sw Y   yxY w)	Try a simple do_get call.r   r\   Nmetadata_versionrs   z+expected IpcWriteOptions, got <class 'int'>matchr   )rA   rZ   r   r  r  rw   r0  r   r   r<   ipcIpcWriteOptionsMetadataVersionV4	to_readerr1  r2  r  )rv   rz  r  r@   rb   s        r   test_flight_do_get_intsr  V  s   E		 "6NNK56":@}}V]]734==?{{5!!!" "
 ff$$//22 % 4G	g	. "&NNK56":@}}V]]734==?{{5!!! }}V]]734>>@IIK{{5!!!" " 
v//J
L D!"- 	DV[[9:	D>D==w!78AACD	D 	DD D!" " " "" " " "	D 	D 	D 	DD Ds   "IAI>I"I.>BI"I.J"J<3I:/J7JI	II"I+	'I..I7:J?JJ	JJc                     t               } t               5 }t        j                  d|j                  f      5 }|j                  t        j                  d            j                         }t        |d         | j                  d      j                         k(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)r  r   r\   r9   r   N)rA   rZ   r   r  r  rw   r0  read_pandasr  rJ  	to_pylistrv   rz  r  r@   s       r   test_do_get_ints_pandasr  q  s     E		 F6NNK56F:@}}V]]734@@BD%&%,,q/*C*C*EEEEF F F F F Fs#   "B8A#B,B8,B5	1B88Cc                  N   t               } t               5 }t        j                  d|j                  f      5 }|j                  t        j                  d            j                         }|j                  |       sJ 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r]   )	rO   rZ   r   r  r  rw   r0  r   r   r  s       r   test_flight_do_get_dictsr  |  s     E		 "6NNK56":@}}V]]845>>@{{5!!!" " " " " "s#   "BAB>BB	BB$c                     t        j                  g dt        j                               g} t         j                  j	                  | dg      }t        d      5 }t        j                  d|j                  f      5 }|j                  t        j                  d            j                         }|j                  |      sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)	z+Make sure Tickets get passed to the server.r5   rF   rV   r:   s
   the-ticket)r   r   N)r<   r=   r   r>   r?   r   r   r  r  rw   r0  r   r   )r   rv   rz  r  r@   s        r   test_flight_do_get_ticketr    s    XX)
;<EHH  se 4E	 	? "6NNK56":@}}V]]=9:CCE{{5!!!" " " " " "s%   "C!=ACC!C	C!!C*c                     t               5 } t        d| j                  f      }|j                  t        j
                  j                  d            }|j                  dk(  sJ |j                  dk(  sJ |j                  sJ |j                  dk(  sJ |j                  t        j                  dt        j                         fg      k(  sJ t        |j                        dk(  sJ t        |j                  d   j                         dk(  sJ |j                  d   j"                  J |j                  d   j                  dk(  sJ |j                  d   j                   d   t	        j$                  d
      k(  sJ |j                  d   j"                  t        j&                  d      j)                  t        j*                  dd            k(  sJ |j                  d   j                  dk(  sJ |j                  d   j                   d   t        j$                  j-                  dd      k(  sJ 	 d	d	d	       y	# 1 sw Y   y	xY w)z8Make sure FlightEndpoint accepts string and object URIs.r   r   rH   r   s   info app metadatarV   rI   r   Nr   z#2023-04-05T12:34:56.789012345+00:00r   UTCr'  r   )r   r	   r  r   r   rl   r.  r_  rb  rd  r=  rk   r<   r   r  	endpointsry  r+  r   r   r   r   r   rz  r  r   s      r   test_flight_get_infor    s   		 <&{FKK89%%f&=&=&I&I#&NO!!Q&&&2%%%|||  $8888{{bii#rxxz):(;<<<<4>>"a'''4>>!$../1444~~a 00888~~a --444~~a **1-1OOOO~~a 00II;<tBLLu-./ 	/ / ~~a --1IIII~~a **1-OO((d;< 	< <#< < <s   HH44H=c                  j   t               5 } t        d| j                  f      5 }|j                  t        j
                  j                  d            }|j                  t        j                  dt        j                         fg      k(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z+Make sure GetSchema returns correct schema.r   r   rV   N)
r   r	   r  r   r   rl   r.  rk   r<   r   r  s      r   test_flight_get_schemar    s    		 =&+v{{34=8>  !8!8!D!DS!IJ{{bii#rxxz):(;<<<<= = = = = =s#   B)A(BB)B&	"B))B2c                  8   t               5 } t        d| j                  f      5 }t        j                  t
        j                  d      5  t        |j                                ddd       ddd       ddd       t               5 } t        d| j                  f      5 }t        |j                               t        j                         k(  sJ 	 ddd       ddd       y# 1 sw Y   ~xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   6xY w# 1 sw Y   yxY w)z6Make sure the return type of ListActions is validated.r   z3Results of list_actions must be ActionType or tupler  N)r   r	   r  r1  r2  r   r  r  r   r   r   r  s     r   test_list_actionsr    s    
&	' (6+v{{34(8>]]((-
 	(
 $$&'	(( ( 
!	" 7f+v{{3478>F'')*#4467 	7 77 7 7	( 	(( ( ( (7 7 7 7s^   C8&C,	C #C,+C8D1DD C)%C,,C5	1C88DD		DDc                   &    e Zd ZdZed        Zd Zy)ConvenienceServerzT
    Server for testing various implementation conveniences (auto-boxing, etc.)
    c                 
    g dS )N)r$  rF  s   bazr   rn  s    r   simple_action_resultsz'ConvenienceServer.simple_action_results  s    ''r   c                    |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                         |j                   dk(  rfd} |       S y )Nsimple-actionecho
bad-actionrC   arrow-exceptionforeverc               3   Z   K    j                         sd  j                         sy y wr[  )is_cancelled)ro   s   r   rk  z(ConvenienceServer.do_action.<locals>.gen  s&     !..0 L "..0s   %++)rG   r  bodyr<   ArrowMemoryError)rc   ro   r   rk  s    `  r   r   zConvenienceServer.do_action  s    ;;/)---[[F"KK= [[L(7N[[--%%''[[I%! 5L	 &r   N)ry   rz   r{   r|   propertyr  r   r   r   r   r  r    s      ( (r   r  c                     t               5 } t        d| j                  f      5 }|j                  d      D cg c]  }|j                   }}|| j
                  k(  sJ d}|j                  d|f      D cg c]  }|j                   }}||gk(  sJ 	 d d d        d d d        y c c}w c c}w # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r  s   the-bodyr  )r  r	   r  r   r  r  )rz  r  xresultsr  s        r   !test_do_action_result_conveniencer    s    		 
!+v{{34
!8> $*#3#3O#DEa166EE&66666 #)#3#3VTN#CDa166DD4&   
! 
! 
! F
 E
! 
! 
! 
!s?   B9B-B#
*B-4B(
B-B9#
B--B6	2B99Cc                     t               5 } t        d| j                  f      5 }t        j                  t
        j                  d      5  t        |j                  d             d d d        t        j                  t
        j                  d      5  t        |j                  d             d d d        d d d        d d d        y # 1 sw Y   bxY w# 1 sw Y   &xY w# 1 sw Y   *xY w# 1 sw Y   y xY w)Nr   za bytes-like object is requiredr  r  r  r  )	r  r	   r  r1  r2  r   r  r  r   r  s     r   test_nicer_server_exceptionsr    s    		 6+v{{3468>]]633!BD 	1!!,/0	1 ]]633!35 	6!!"345	66 6 6	1 	1	6 	66 6 6 6sR   C)&C	C$-CC,C4C)C
CCCC&	"C))C2c                      t        d      } 	 | j                  dkD  sJ 	 | j                          y# | j                          w xY w)zMake sure port() works.rw  r   N)r   r  shutdown)rz  s    r   test_get_portr    s7     !56F{{Qs	   0 Antz'Unix sockets can't be tested on Windows)reasonc                  ,   t        j                         5 } | j                          t        j                  j                  | j                        }t        |      5  t        |      5 }|j                  t        j                  d            }t               }|j                  j                  |j                        sJ |j                         }|j                  |      sJ |j                  t        j                  d            }t               }|j                  j                  |j                        sJ |j                         }|j                  |      sJ 	 ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z3Try a simple do_get call over a Unix domain socket.r  r\   r]   N)tempfileNamedTemporaryFiler  r   r   for_grpc_unixnamerZ   r	   rw   r0  rA   rk   r   r   rO   )sockrd   r  r   rv   r@   s         r   test_flight_domain_socketr    s<    
	$	$	& &$

??00;!84 	&X&	&*0]]6==#9:F%'E==''555??$D;;u%%%]]6==#:;F&(E==''555??$D;;u%%%	& 	&& &	& 	& 	& 	&& &s=   AF
E>'C1E2E>!F
2E;7E>>F	F

Fc                  z   t         j                  j                  t        j                  t	        dd            gdg      } t        | j                        5 }t        d|j                  f      5 }|j                  t        j                  j                  d      | j                        \  }}|j                  | d       |j                          |j                  t        j                   d            j#                         }|j%                  |       sJ 	 d	d	d	       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   y	xY w)
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   rV   r:   )r   r   r  r   N)r<   r>   r?   r=   r   r   rk   r	   r  r   r   rl   rm   r6  r  rw   r0  r   r   r@   rz  r  r   _rM  s         r   test_flight_large_messager    s    88
q*+,!U   D 
$++	6 #&+v{{34#8>MM&"9"9"B"B6"J"&++/	 	4!12v}}S12;;=}}T"""# # # # # #s%   D1/B$D%D1%D.	*D11D:c                  `   t         j                  j                  t        j                  t	        dd            gdg      } t               5 }t        d|j                  f      5 }|j                  t        j                  j                  d      | j                        \  }}|j                  |        |j                          |j                  t        j                   d            j#                         }|j%                  |       sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)	z?Try downloading a flight of RecordBatches in a GeneratorStream.r   r4  rV   r:   r   r  r   N)r<   r>   r?   r=   r   r   r	   r  r   r   rl   rm   rk   r6  r  rw   r0  r   r   r  s         r   test_flight_generator_streamr  ,  s    88
q)$%!U   D 
 	! #V+v{{34#8>MM&"9"9"B"B6"J"&++/	4 v}}S12;;=}}T"""# # # # # #s%   D$#B#DD$D!	D$$D-c                  n   t               5 } t        d| j                  f      5 }t        j                  t
        j                        5  |j                  t        j                  d            j                          ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z+Try streaming data with mismatched schemas.r   r   N)r   r	   r  r1  r2  r<   ArrowExceptionrw   r   r0  r   r  s     r   $test_flight_invalid_generator_streamr  <  s    	"	$ 9+v{{3498>]]2,,- 	9MM&--,-668	99 9 9	9 	99 9 9 9s:   B+$B3B:BB+BBB(	$B++B4c            	         t               5 } t        d| j                  f      5 }t        j                  dd      }t        j
                  d      }t        j                  t        j                        5  t        |j                  ||             ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z)Make sure timeouts fire on slow requests.r   r   r   g?r  rs   N)r  r	   r  r   r-  FlightCallOptionsr1  r2  r  r  r   )rz  r  r   rb   s       r   test_timeout_firesr  D  s     
	 <v+v{{34<8>r3'**37 ]]6556 	<!!&'!:;	<< < <	< 	<< < < <s;   CAB53B)B5C)B2.B55B>	:CC
c                  .   t               5 } t        d| j                  f      5 }t        j                  d      }|j                  t        j                  d      |      j                          ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z0Make sure timeouts do not fire on fast requests.r   r   r  r\   rs   N)rZ   r	   r  r   r  rw   r0  r   )rz  r  rb   s      r   test_timeout_passesr  R  s    		 J6+v{{34J8>**37fmmG,g>GGIJ J J J J Js#   BAA?.B?B	BBc                     t         j                  j                  t        j                  g d      gdg      } t	               5 }t        d|j                  f      5 }t        j                  t        dg            }|j                  t        j                  d      |	      j                         }|j                  t        j                  d            j                         }|j                  d
k(  sJ |j                  dk(  sJ || k(  sJ |t               k(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z"Make sure ReadOptions can be used.rS   rW   r:   r   rH   )included_fields)read_optionsr^   rs   rI   N)r<   r>   r?   r=   rZ   r	   r  r   r  r   rw   r0  r   num_columnsrX   )expectedrz  r  rb   	response1	response2s         r   test_read_optionsr  Z  s   xx##RXXl%;$<SE#JH		 46+v{{3448>**'<>MM&--#& " ((0
 	MM&--"9:CCE	$$)))$$)))H$$$133334 4 4 4 4 4s%   D9C D-D9-D6	2D99E   tests   p4ssw0rd)rS  c                  z   t        t              5 } t        d| j                  f      5 }t	        j
                  dd      }t        j                  t        j                  d      5  t        |j                  |             ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z,Test that auth fails when not authenticated.auth_handlerr   r   r   z.*unauthenticated.*r  N)r   basic_auth_handlerr	   r  r   r-  r1  r2  r  r  r   rz  r  r   s      r   test_http_basic_unauthr  t  s     
 -?	@ +F+v{{34+8>z3/]]6<<!68 	+!!&)*	++ + +	+ 	++ + + +s:   B1<B%%B B%B1B"B%%B.	*B11B:z,ARROW-10013: gRPC on Windows corrupts peer()c                     t        t              5 } t        d| j                  f      5 }t	        j
                  dd      }|j                  t        dd             |j                  |      }t        |      }|j                  j                         dk(  sJ t        |      }|j                  j                         dk7  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)	z:Test a Python implementation of HTTP basic authentication.r  r   r   r   r  p4ssw0rdr  N)r   r  r	   r  r   r-  r_  rf  r   nextr  r   )rz  r  r   r  identitypeer_addresss         r   test_http_basic_authr    s     
 -?	@ 5F+v{{3458>z3/6vzJK""6*=}}'')W444G}  ++-4445 5 5 5 5 5s#   CBCCC	CC'c            	         t        t              5 } t        d| j                  f      5 }t	        j
                  dd      }t        j                  t        j                  d      5  |j                  t        dd             t        |j                  |             d	d	d	       d	d	d	       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y	xY w)
z-Test that auth fails with the wrong password.r  r   r   r   z.*wrong password.*r  r  wrongN)r   r  r	   r  r   r-  r1  r2  r  r_  rf  r  r   r  s      r   %test_http_basic_auth_invalid_passwordr    s    	-?	@ +F+v{{34+8>z3/]]6<<!57 	+ :67 KL!!&)*	++ + +	+ 	++ + + +s:   C<C %6B4C #C4B=9C  C		CCc                  |   t        t              5 } t        d| j                  f      5 }t	        j
                  dd      }|j                  t        dd             t        |j                  |            }|j                  j                         dk(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)	-Test an auth mechanism that uses a handshake.r  r   r   r   r  r  r  N)r   token_auth_handlerr	   r  r   r-  r_  r  r  r   r  r   )rz  r  r   r  s       r   test_token_authr    s    	-?	@ 5F+v{{3458>z3/26:FG((01}}'')W4445 5 5 5 5 5s#   B2A+B&B2&B/	+B22B;c            	      L   t        t              5 } t        d| j                  f      5 }t	        j
                  t        j                        5  |j                  t        dd             ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)r  r  r   r  r  N)
r   r  r	   r  r1  r2  r   r  r_  r  r  s     r   test_token_auth_invalidr    s    	-?	@ IF+v{{34I8>]]6<<= 	I 6vw GH	II I I	I 	II I I Is:   B$BB)B1BBBB	BB#c                  
   t        t        dt               i      5 } t        d| j                  f      5 }|j                  dd      }|d   dk(  sJ |d   d	k(  sJ 	 d
d
d
       d
d
d
       y
# 1 sw Y   xY w# 1 sw Y   y
xY w)zATest authenticate_basic_token with bearer token and auth headers.r^  r  r  r   r     passwordr   r  rH      Bearer token1234N)r  no_op_auth_handlerr  r	   r  authenticate_basic_token)rz  r  
token_pairs      r   test_authenticate_basic_tokenr    s    	-?13M 
 4
+v{{344 9?44WkJ
!} 0000!} 33334 4 4 4 4 4s"   A9'A-A9-A6	2A99Bc                  P   t        t        dt               i      5 } t        d| j                  f      5 }t        j                  t        j                        5  |j                  dd       ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z7Test authenticate_basic_token with an invalid password.r^  r  r   r  s   badpasswordN)
r  r
  r  r	   r  r1  r2  r   r  r  r  s     r   .test_authenticate_basic_token_invalid_passwordr    s    	-?13M 
 E
+v{{34E 9?]]6<<= 	E++G^D	E	E E E	E 	E	E E E Es:   B$BB+B3BB	BB	BB%c            
         t        t        dt               i      5 } t        d| j                  f      5 }|j                  dd      }|d   dk(  sJ |d   d	k(  sJ t        j                  |g
      }t        |j                  t        j                  dd      |            }|d   j                  j                         dk(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z@Test authenticate_basic_token and doAction after authentication.r^  r  r   r  r  r   r  rH   r	  r  test-actionr   r   rb   	   token1234N)r  r
  r  r	   r  r  r   r  r  r   r-  r  r   rz  r  r  rb   rM  s        r   (test_authenticate_basic_token_and_actionr    s    	-?13M 
 
;
+v{{34
; 9?44WkJ
!} 0000!} 3333**J<@f&&==4g ' G Hay~~((*l:::
; 
; 
; 
; 
; 
;s#   C"BCC"C	C""C+c            	         t        t        dt               i      5 } t               }t	        d| j
                  f|g      }t        j                  d      }t        j                  dd|z   fg      }t        |j                  t        j                  d	d
      |            }|d   j                  j                         dk(  sJ |j                  d   dk(  sJ |j                  d   dk(  sJ t        |j                  t        j                  d	d
      |            }|d   j                  j                         dk(  sJ |j                  d   dk(  sJ |j                  d   dk(  sJ |j!                          ddd       y# 1 sw Y   yxY w)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  rH   r	  N)r  r
  r  r  r	   r  rx  ry  r   r  r  r   r-  r  r   r  r  )rz  client_auth_middlewarer  encoded_credentialsrb   rM  result2s          r   4test_authenticate_basic_token_with_client_middlewarer    s   
 
 -?13M 
 
!B!D&++&./
 %../?@**y+>>?4
  f&&==4g ' G Hay~~((*l:::%55a8<LLLL%55a8%& 	& &v''==4g ( G Hqz))+|;;;%55a8<LLLL%55a8%& 	& &1  s   EE??Fc            
      6   t        t        t               t               d      5 } t	        d| j
                  f      5 }|j                  dd      }|d   dk(  sJ |d   d	k(  sJ t        j                  |d
dg      }t        |j                  t        j                  dd      |            }|d   j                  j                         dk(  sJ |d   j                  j                         dk(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z:Test passing multiple arbitrary headers to the middleware.)r^  r  r  r   r  r  r   r  rH   r	  )s   test-header-1   value1)s   test-header-2   value2r  r  r   rs   r  r  N)r  r
  r  r  r	   r  r  r   r  r  r   r-  r  r   r  s        r   -test_arbitrary_headers_in_flight_call_optionsr     s(   	%'57!H!J

 8
 +v{{348 9?44WkJ
!} 0000!} 3333**))4
 
 f&&v}}3( )0 ' 2 3ay~~((*i777ay~~((*i777%8 8 8 8 8 8s#   DB4D2DD	DDc                  ,   t        j                  t        j                  d      5  t	        j
                  d       ddd       t        j                  t        j                  d      5  t        d       ddd       y# 1 sw Y   CxY w# 1 sw Y   yxY w)zTest constructing invalid URIs.z.*Cannot parse URI:.*r  %N)r1  r2  r<   r  r   r  rZ   r   r   r   test_location_invalidr#  
  sm    	r.E	F s 
r.E	F "S!" " " "s   A>)B
>B
Bc                      t        j                  d      j                  dk(  sJ t        j                  d      j                  dk(  sJ y)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   test_location_unknown_schemer&    sD    ??:&**k999??<=AA*+ + +r   c                     t               } t        | d         5 }t        dt        |j                        z         5 }t        j                  t        j                        5  |j                  t        j                  d            j                          ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z>Make sure clients cannot connect when cert verification fails.r1   tls_certificateszgrpc+tls://localhost:r\   N)r3   rZ   r	   r:  r  r1  r2  r   FlightUnavailableErrorrw   r0  r   certsr&  r  s      r   test_tls_failsr-    s     E 
u^/D	E =03qvv;>?=CI ]]6889 	=MM&--01::<	=	= = =	= 	=	= = = =s:   "C$B8 3B,B8C,B51B88C	=CCc                  b   t               } t               }t        |d         5 }t        d|j                  f|d         5 }|j                  t        j                  d            j                         }|j                  |       sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z"Try a simple do_get call over TLS.r1   r(  r   r0   )tls_root_certsr\   N)
rA   r3   rZ   r	   r  rw   r   r0  r   r   rv   r,  r&  r  r@   s        r   test_tls_do_getr1  *  s     EE	u^/D	E "k166*$)+$6	8";A}}V]]734==?{{5!!!	" " " " " "s$   B%ABB%B"	B%%B.c                     t               } t               }t        |d         5 }	 t        d|j                  fd      }j                  t        j                  d            j                         }|j                  |       sJ |j                          ddd       y# t
        $ r t        j                  d       Y ~w xY w# 1 sw Y   yxY w)	zDTry a simple do_get call over TLS with server verification disabled.r1   r(  r   Tdisable_server_verificationz4disable_server_verification feature is not availabler\   N)rA   r3   rZ   r	   r  r   r1  skiprw   r   r0  r   r   r  r0  s        r   $test_tls_disable_server_verificationr6  7  s     EE	u^/D	E 	P!;"7>BDF }}V]]734==?{{5!!!  # 	PKKNO	P	 s.   CBACB>;C=B>>CC
c                     t               } t        | d         5 }t        j                  d|j                  f| d   d      5 }t        j                  t        j                        5  |j                  t        j                  d             ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)	z5Check that incorrectly overriding the hostname fails.r1   r(  r   r0   fakehostname)r/  override_hostnamer\   N)
r3   rZ   r   r  r  r1  r2  r*  rw   r0  r+  s      r   test_tls_override_hostnamer:  H  s     E	u^/D	E 2QVV,&+K&8)7	92 =C]]6889 	2MM&--01	2	2 2 2	2 	2	2 2 2 2s;   (B<$B0&%B$B0B<$B-)B00B9	5B<<Cc                  ^   t        j                  g d      g} t         j                  j                  | dg      }g }t	               5 }t        d|j                  f      5 }|j                  t        j                  d            }d}|D ]H  \  }}|j                  |       t        j                  d|j                               \  }	||	k(  sJ |dz  }J t         j                  j                  |      } | j                  |      sJ 	 d	d	d	       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   y	xY w)
z'Try a simple do_get call with metadata.r5   rV   r:   r   r   r   r   rH   N)r<   r=   r>   r?   r   r	   r  rw   r   r0  r  r   r   r   from_batchesr   )
r@   rv   batchesrz  r  r   r   r   metadata
server_idxs
             r   test_flight_do_get_metadatar@  U  s    	$%D HH  cU 3EG		 
"6+v{{34
"8>v}}S12% 	OE8NN5! --h.A.A.CDKJ*$$$1HC		
 xx$$W-{{5!!!
" 
" 
" 
" 
" 
"s%   D#B&DD#D 	D##D,c                  T   g } g }t               5 }t        d|j                  f      5 }|j                  t	        j
                  d            }d}	 	 |j                         \  }}| j                  |       t        j                  d|j                               \  }||k(  sJ |dz  }X# t        $ r Y nw xY w	 ddd       n# 1 sw Y   nxY wddd       n# 1 sw Y   nxY wt               5 }t        d|j                  f      5 }|j                  t	        j
                  d            }d}|D ]H  \  }}|j                  |       t        j                  d|j                               \  }||k(  sJ |dz  }J 	 ddd       n# 1 sw Y   nxY wddd       n# 1 sw Y   nxY w| |k(  sJ y)z0Verify the iterator interface works as expected.r   r   r   r   rH   N)r   r	   r  rw   r   r0  
read_chunkr  r   r   r   StopIteration)	batches1batches2rz  r  r   r   r   r>  r?  s	            r   1test_flight_metadata_record_batch_reader_iteratorrF  j  s   HH		 6+v{{348>v}}S12"("3"3"5x&$mmD(2E2E2GH
j(((q  !       
	 6+v{{348>v}}S12% 	OE8OOE" --h.A.A.CDKJ*$$$1HC			      xsl   C(C AB'&C '	B30C 2B33C 7	C C		CC+FA4F8	FF
	FFc                  "   t         j                  j                  t        j                  g d      gdg      } t         j                  j                  t         j                  j                  j                        }t        |      5 }t        d|j                  f      5 }|j                  t        j                  d            }|j                         }|j                  |       sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)	z2Try a simple do_get call with V4 metadata version.r5   rV   r:   r  rs   r   r   N)r<   r>   r?   r=   r  r  r  r  r   r	   r  rw   r   r0  r   r   )rv   rb   rz  r  r   r@   s         r   test_flight_do_get_metadata_v4rH    s    HH  	%	&'u ! 6Eff$$//22 % 4G	g	. "&+v{{34"8>v}}S12 {{5!!!	" " " " " "s%   DAC9(D9D	>DDc            	         t        j                  g d      g} t         j                  j                  | dg      }t	               5 }t        d|j                  f      5 }|j                  t        j                  j                  d      |j                        \  }}|5  t        |j                  d            D ]n  \  }}t        j                  d|      }|j!                  ||       |j#                         }	|	J t        j$                  d|	j'                               \  }
||
k(  rnJ  	 d	d	d	       d	d	d	       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y	xY w)
z'Try a simple do_put call with metadata.r5   rV   r:   r   r   rH   r   r   N)r<   r=   r>   r?   r   r	   r  r   r   rl   rm   rk   r   r   r   r   r>  r$   r   r   )r@   rv   rz  r  r   metadata_readerr   r   r>  r   r?  s              r   test_flight_do_put_metadatarK    sM    	$%D HH  cU 3E		 )6+v{{34)8>"(--##,,R0LL#  	)'(8(8q(8(IJ )
U!;;tS1**5(;%**,&$mmD#..2BC
j((()	)) ) )
	) 	)) ) ) )sC   E?EB	E&E*E2EEEE	EE$c            	         t         j                  j                  t        j                  t	        j
                  dt	        j                                     gdg      } t               5 }t        d|j                  fd      5 }|j                  t        j                  j                  d      | j                        \  }}|5  t        j                   t        j"                  d	
      5 }|j%                  |        ddd       j&                  j(                  dk(  sJ | j+                  dd      | j+                  d      g}|D ]  }|j%                  |        	 ddd       t         j,                  j/                  | g      }|j1                  t        j2                  d            j5                         }	||	k(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   *xY w# 1 sw Y   yxY w)z+Try a simple do_put call with a size limit.i   )dtyperV   r:   r   i   )write_size_limit_bytesr   zexceeded soft limitr  Nr   i  r   )r<   r   r?   r=   nponesr  r   r	   r  r   r   rl   rm   rk   r1  r2  FlightWriteSizeExceededErrorr?  rL  limitslicer>   r<  rw   r0  r   )
large_batchrz  r  r   rJ  excinfosmaller_batchesr   r  actuals
             r   test_flight_do_put_limitrX    s    ..,,
BHHJ/0.U - K 
	 "vk6;;/,0	2"5;"(--##,,R0#   
	*vBB%:< 0?F"";/0 ==&&$...!!!S)!!#&O ) *""5)*
	* 88((+7v}}S12;;=6!!!'" " "0 0
	* 
	*" " " "sV   (G/?G#&G'G	9AGA!G#:G/GGG G##G,	(G//G8c                     t               5 } t        d| j                  f      5 }|j                  t	        j
                  d            }|j                          t        j                  t        j                  d      5  |j                          ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z4Test canceling a DoGet operation on the client side.r   r\   z(?i).*cancel.*r  N)rZ   r	   r  rw   r   r0  r  r1  r2  r  rB  )rz  r  r   s      r   test_cancel_do_getrZ    s     
	  6+v{{34 8>v}}W56]]666!13 	 	 	     	  	 	       s;   B?AB3=B'B3B?'B0,B33B<	8B??Cc                     t               5 } t        d| j                  f      5 }|j                  t	        j
                  d            t        j                         t        j                         t        j                         t        j                         fd}t        j                  |d      }|j                          j                  d       j                          j                          |j                  d       5  j                         sJ 	 d	d	d	       d	d	d	       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y	xY w)
z5Test canceling a DoGet operation from another thread.r   r\   c                     j                          j                          j                  d       	 j                          y # t        j                  $ r+ 5   j                          d d d        Y y # 1 sw Y   Y y xY ww xY w)Nr7   r  )rB  setwaitr   r  )raised_proper_exceptionread_first_messager   result_lockstream_canceleds   r   
block_readz/test_cancel_do_get_threaded.<locals>.block_read  sv    ""$   +2!!#.. 2  2+//12 2 22s)   A BA6,B6B 	;B BTr  r7   r  rH   N)r  r	   r  rw   r   r0  r  EventLockr  r  r^  r  r]  joinis_set)	rz  r  rc  r  r_  r`  r   ra  rb  s	       @@@@@r   test_cancel_do_get_threadedrh    s    
	 4v+v{{3448>v}}W56&__.#//+nn&"+//"3	2 	2 !!DA*A 	4*11333	454 4 44	4 	454 4 4 4s;   EC+EE 'E/E E	EE	EE!c                     t               5 } t        d| j                  f      5 }|j                  t	        j
                  dd            }t        |      j                  dk(  sJ ~d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r  r   r$  )r  r	   r  r   r   r-  r  r  )rz  r  r  s      r   test_streaming_do_actionrj    s~    		 +v{{348>""6==C#@AG}!!V+++     s#   BAA5$B5A>	:BB
c                   	   t        j                  dd      } | t         j                  j                  | j                               k(  sJ t        j                  d      }|t         j                  j                  |j                               k(  sJ t        j
                  d      }|t         j
                  j                  |j                               k(  sJ t        j                  dd      }|t         j                  j                  |j                               k(  sJ t        j                  t        j                  dt        j                         fg            }|t         j                  j                  |j                               k(  sJ t         j                  j                  d      }|t         j                  j                  |j                               k(  sJ t         j                  j                  dd	d
      }|t         j                  j                  |j                               k(  sJ t        j                  t        j                  dt        j                         fg      |t        j                  ddg      t        j                  dt         j                   j#                  dd      gt        j$                  d      j'                  t        j(                  d            d      gdddd      }t         j                  j                  |j                               }|j                  |j                  k(  sJ |j*                  |j*                  k(  sJ |j,                  |j,                  k(  sJ |j.                  |j.                  k(  sJ |j0                  |j0                  k(  sJ |j2                  |j2                  k(  sJ |j4                  |j4                  k(  sJ t        j                  |dt         j                   j#                  dd      gt        j$                  d      j'                  t        j(                  d            d      }|t         j                  j                  |j                               k(  sJ y)z(Make sure serializable types round-trip.action1s   action1-bodyrC   s   result1	username1	password1rV   r  rW   z
test.arrowr   r   r   r   r   r   r'  rH   r   Tr(  r%  r&  N)r   r-  rY  rk  r0  r/  rX  r   r<   rk   r   rl   r.  rm   rj   r   r   r   r   r   r   r   rb  r_  rd  r=  r  )	r   rt   rM  rh  schema_resultdescr   info2r?  s	            r   test_roundtrip_typesrr    s   ]]9o6FV]]..v/?/?/ABBBB]]5!FV]]..v/?/?/ABBBB]]:&FV]]..v/?/?/ABBBB!!+{;J))55j6J6J6LMMMM''		C3D2E(FGMF//;;!# # # # ""..v6D6**66t~~7GHHHH""++ClCD6**66t~~7GHHHH
		C$%&!!#7!!--k4@A		9:??T@RS(		
 	

D" ))$..*:;E;;%,,&&&??e.....u00000!4!4444<<5==((( 2 2222>>U__,,,$$	44[$GH
		'(--bll3.?@ 	H v,,889K9K9MNNNNr   c                     t               5 } t        d| j                  f      5 }t         j                         j	                         D ]S  \  }}t        j                  |d      5  t        |j                  t        j                  |d                   ddd       U t        j                  t        j                  d      5  t        |j                                ddd       t        j                  g d      g}t        j                  j!                  |dg      }t        j                  t        j"                  t        j$                  t        j&                  t        j(                  d	}|j	                         D ]  \  }}t        j                  |d      5  |j+                  t        j,                  j/                  |      |j0                        \  }	}
|	j3                  |       |	j5                          ddd       t        j                  |d      5  |j+                  t        j,                  j/                  |      |j0                        \  }	}
|	j5                          ddd        	 ddd       ddd       y# 1 sw Y   BxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   3xY w# 1 sw Y   ExY w# 1 sw Y   yxY w)
z:Ensure that Flight errors propagate from server to client.r   z.*foo.*r  r   Nr5   rV   r:   )r  r  r  r  r  )r  r	   r  r  rj  r1  r2  r  r   r   r-  r  rq   r<   r=   r>   r?   r  r  r  r  r   rl   r.  rk   r6  r  )rz  r  argexc_typer@   rv   
exceptionsr"  	exceptionr   r   s              r   test_roundtrip_errorsrx  <  sJ   		 !+v{{34!8>.::<BBD 	@MCxy9 @V%%fmmC&=>?@ @	@ ]]655YG 	($$&'	( ,-.$$T#$7 222211%@@"::

 #-"2"2"4 	GYy	: !'++77@LL"" ""5) y	: !'++77@LL"" 	 	)! ! !@ @	( 	(   ;! ! ! !s   J=A J1#/I>	/J1JB=J1AJ	6J1AJ$	"
J1-J=>JJ1JJ1J!J1$J.)J11J:	6J==Kc                     t        j                  g d      g} t         j                  j                  | dg      }t	               5 }t        d|j                  f      5 }|j                  t        j                  j                  d      |j                        \  }dgfd}t        j                  |      }|j                          |j                  d	
      }|5  t!        |      D ]-  \  }}	t#        j$                  d|      }
|j'                  |	|
       / |j)                          |j+                          ddd       d   t-        |      k(  sJ 	 ddd       ddd       y# 1 sw Y   .xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z7Ensure that separate threads can read/write on a DoPut.r5   rV   r:   r   r   r   c                  d    j                          dxx   dz  cc<   j                         y y )Nr   rH   )r$   )countrJ  s   r   _reader_threadz:test_do_put_independent_read_write.<locals>._reader_threadt  s0    !&&(4aA "&&(4r   r  rH   r   r   N)r<   r=   r>   r?   r   r	   r  r   r   rl   rm   rk   r  r  r  r   r   r   r   r>  done_writingrf  r  )r@   rv   rz  r  r   r|  r  r=  r   r   r>  r{  rJ  s              @@r   "test_do_put_independent_read_writer  b  sj    	$%D HH  cU 3E		 (6+v{{34(8>"(--##,,R0LL# 	 !!8"""3 	'0 <
U!;;tS1**5(;< !KKM	 Qx3w<'''5( ( ( 	 	!( ( ( (s>   F B E4AE(;E4F (E1-E44E=	9F  F	c            
      x   t        dt               i      5 } t        d| j                  f      5 }t	        |j                  t        j                  dd                  }t        |      dk(  sJ |d   j                  j                         }d|k(  sJ 	 d	d	d	       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   y	xY w)
z@Ensure that server middleware run on the same thread as the RPC.r  r  r   r  r   rH   r   s   right valueN)r  r  r	   r  r  r   r   r-  r  r  r   )rz  r  r  rL  s       r   "test_server_middleware_same_threadr    s    	-/( 
 '
+v{{34' 9?v''gs(CDE7|q   
**,&&&' ' ' ' ' 's#   B0A#B$B0$B-	)B00B9c                      t        dt               i      5 } t        d| j                  f      5 }t	        j
                  t        j                        5  t        |j                                ddd       t	        j
                  t        j                        5  t        |j                  t        j                  dd                   ddd       t        d| j                  ft               g      }t        |j                  t        j                  dd                  }d|j                   j#                         k(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   *xY w# 1 sw Y   yxY w)z-Test rejecting an RPC with server middleware.r  r  r   Nr   r  )r  r  r	   r  r1  r2  r<   ArrowNotImplementedErrorr  r   r   r  r   r-  r  r  r  r   )rz  r  responses      r   test_middleware_rejectr    s=   	46( 
 9
+v{{349 9?]]2667 	($$&'	( ]]6<<= 	<!!&--S"9:;	< &++&<>?
 ((sC)@ABhmm668888#9 9 9
	( 	(	< 	<9 9 9 9sS   E4$E(E-+E(/EA7E(?E4EE(E%!E((E1	-E44E=c                     t               } t               }t        d| i      5 }t        d|j                  f|g      5 }t
        j                  j                  d      }t        j                  t              5  t        |j                                ddd       t        j                  t              5  |j                  |       ddd       t        j                  t              5  |j                  |       ddd       t        j                  t              5  |j                  t        j                   d             ddd       t        j                  t              5  |j#                  |t%        j&                  g             \  }}|j)                          ddd       t        j                  t              5  t        |j+                  t        j,                  dd                   ddd       t        j                  t              5  t        |j/                                ddd       t        j                  t              5  |j1                  |      \  }}|j)                          ddd       t
        j2                  j4                  t
        j2                  j6                  t
        j2                  j8                  t
        j2                  j:                  t
        j2                  j<                  t
        j2                  j>                  t
        j2                  j@                  t
        j2                  jB                  g}| jD                  |k(  sJ |jD                  |k(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ZxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   cxY w# 1 sw Y   zxY w# 1 sw Y   yxY w)z/Test that middleware records methods correctly.r  r  r   r   N)#r  r  r
   r	   r  r   rl   r.  r1  r2  r   r  rq   r   r   rw   r0  r   r<   rk   r  r   r-  r   r   r  LIST_FLIGHTSGET_FLIGHT_INFO
GET_SCHEMADO_GETDO_PUT	DO_ACTIONr  DO_EXCHANGEr  )server_middlewareclient_middlewarerz  r  r   r   r  r  s           r   test_middleware_mappingr    s   8:8:	f.?%@	A %5V&++&)*	%5 
,,88=
]]./ 	($$&'	(]]./ 	/"":.	/]]./ 	*j)	*]]./ 	.MM&--,-	.]]./ 	j"))B-@IFALLN	 ]]./ 	<!!&--S"9:;	<]]./ 	($$&'	(]]./ 	**:6IFALLN	
 ,,//**&&&&)),,++	
 !((H444 ((H444K%5 %5 %5	( 	(	/ 	/	* 	*	. 	.	 		< 	<	( 	(	 	-%5 %5 %5 %5s   O"9O7M.!O2M;!O%N7!O%N=!O9N"!O8/N/'!ON<"!O%O	(C4OO".M83O;N ONONO"N,'O/N94O<OO	OOO	O""O+c            
         t               5 } t        d| j                  f      5 }	 t        |j	                  t        j                  dd                   J # t
        j                  $ r+}|j                  J |j                  }|dk(  sJ Y d }~nd }~ww xY w	 d d d        n# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)Nr   r  r   r  )	r  r	   r  r  r   r   r-  r  
extra_info)rz  r  eeis       r   test_extra_infor    s    		 5+v{{3458>	5!!&--
C"@AB5-- 	5<<+++B4444	5 55 5 5 5 5 5sE   B5B 0AB(!B	B BB 	B5 B)	%B55B>c                     t               } t               }t        | d   d   gd| d         5 }t        d|j                  f| d   | d   d   j
                  | d   d   j                        5 }|j                  t        j                  d            j                         }|j                  |      sJ 	 d	d	d	       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   y	xY w)
z!Test mutual TLS (mTLS) with gRPC.r1   r   Tr0   )r)  verify_clientroot_certificatesr   )r/  
cert_chainprivate_keyr\   N)r3   rA   rZ   r	   r  r.   r/   rw   r   r0  r   r   )r,  rv   r&  r  r@   s        r   	test_mtlsr    s     EE	#N3A67#K0
2 
" 67!&&! -^,Q/44n-a044		6	
" :@}}V]]734==?{{5!!!
" 
" 
" 
" 
" 
"s$   ?C,AC3CC		CCc                     t         j                  j                  t        j                  t	        dd            gdg      } t               5 }t        d|j                  f      5 }t        j                  j                  d      }|j                  |      \  }}|5  |j                         }ddd       | k(  sJ 	 ddd       ddd       y# 1 sw Y   "xY w# 1 sw Y   xY w# 1 sw Y   yxY w)r3  r   r4  rV   r:   r   r(  N)r<   r>   r?   r=   r   r$  r	   r  r   rl   r.  r   r   )r  rz  r  r   r   r   rv   s          r   test_doexchange_getr    s    xx##
q)$%%U $ H 
	 !6+v{{34!8>,,88@
++J7 	&OO%E	&5   ! ! !	& 	&	! ! ! !s<   C##6CC*C:C#CCC 	C##C,c                     t         j                  j                  t        j                  t	        dd            gdg      } | j                  d      }t               5 }t        d|j                  f      5 }t        j                  j                  d      }|j                  |      \  }}|5  |j                  | j                         |D ]  }|j                  |        |j!                          |j#                         }|j$                  J t'        t)        |            j+                  d
      }	|j,                  |	k(  sJ 	 d	d	d	       d	d	d	       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y	xY w)r8  r   r4  rV   r:      r   r   r)  Nr   )r<   r>   r?   r=   r   r   r$  r	   r  r   rl   r.  r   r5  rk   r?  r~  rB  r@   r:  r  r   r=  )
r@   r=  rz  r  r   r   r   r   r   expected_bufs
             r   test_doexchange_putr    s[   88
q)$%!U   D ooCo0G		 66+v{{3468>,,88@
++J7 	6LL%  *""5)*!%%'E::%%%s7|,33G<L%%555	6	6 6 6	6 	6	6 6 6 6s=   E356E'+BEE'
E3E$ E''E0	,E33E<c                     t         j                  j                  t        j                  t	        dd            gdg      } | j                  d      }t               5 }t        d|j                  f      5 }t        j                  j                  d      }|j                  |      \  }}|5  t	        d	      D ]\  }t        |      j                  d
      }|j                  |       |j!                         }	|	j"                  J |	j$                  |k(  r\J  |j'                  | j(                         |D ]]  }
|j+                  |
       |j(                  | j(                  k(  sJ |j!                         }	|	j"                  |
k(  sJ |	j$                  ]J  t-        |      D ]c  \  }}
t        |      j                  d
      }|j/                  |
|       |j!                         }	|	j"                  |
k(  sJ |	j$                  |k(  rcJ  	 ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)zTry a DoExchange echo server.r   r4  rV   r:   r  r   r   r'  r8   r   N)r<   r>   r?   r=   r   r   r$  r	   r  r   rl   r.  r   r:  r   r9  rB  r@   r=  r5  rk   r?  r   r>  )r@   r=  rz  r  r   r   r   ir   r   r   s              r   test_doexchange_echor    s#   88
q)$%!U   D ooCo0G		 16+v{{3418>,,88A
++J7 	12Y 1!fmmG,%%c*))+zz)))))S0001 LL%  2""5)}}333))+zzU***))1112 &g. 15!fmmG,**5#6))+zzU***))S0001'	1	1 1 1	1 	1	1 1 1 1sQ   H656H*+A'HA<HA0HHH*H6H'#H**H3	/H66H?c                  Z   t         j                  j                  t        j                  t	        dd            gdg      } | j                  d      }t         j                  j                  t         j                  j                  j                        }t        |      5 }t        d	|j                  f      5 }t        j                  j                  d
      }|j!                  |      \  }}|5  |j#                  | j$                  |       |D ]]  }|j'                  |       |j$                  | j$                  k(  sJ |j)                         }	|	j*                  |k(  sJ |	j,                  ]J  	 ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z;Try a DoExchange echo server using the V4 metadata version.r   r4  rV   r:   r  r   r  rs   r   r'  N)r<   r>   r?   r=   r   r   r  r  r  r  r$  r	   r  r   rl   r.  r   r5  rk   r?  rB  r@   r=  )
r@   r=  rb   rz  r  r   r   r   r   r   s
             r   test_doexchange_echo_v4r  A  s~   88
q)$%!U   D ooCo0Gff$$//22 % 4G	g	. 2&+v{{3428>,,88A
++J7 	2LLgL6  2""5)}}333))+zzU***))1112	2	2 2 2	2 	2	2 2 2 2sC   !F!96F/A<F	,F	0F8F!	FFF	F!!F*c            
      R   t         j                  j                  t        j                  t	        dd            t        j                  t	        dd            t        j                  t	        dd            gg d      } t         j                  j                  t        j                  t	        d	d
d	            gdg      }t               5 }t        d|j                  f      5 }t        j                  j                  d      }|j                  |      \  }}|5  |j                  | j                         |j                  |        |j                          |j!                         }ddd       |k(  sJ 	 ddd       ddd       y# 1 sw Y   "xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z!Transform a table with a service.r   r   rH   i  rI   i  )rV   rW   cr:   rT   i  rB  r   r*  N)r<   r>   r?   r=   r   r$  r	   r  r   rl   r.  r   r5  rk   r6  r~  r   )r@   r  rz  r  r   r   r   rv   s           r   test_doexchange_transformr  Y  sj   88
q$ 
q$ 
q$ ! 	   D
 xx##
q,*+%W $ H 
	 	!6+v{{34	!8>,,88F
++J7 	&LL%t$!OO%E		&
 5   	! 	! 	!	& 	&		! 	! 	! 	!s=   	F!6FAF$F4FF
FF	FF&c            
         t        dt               i      5 } t               }t        d| j                  f|g      5 }t        |j                  t        j                  dd                  }|j                  j                         j                  d      }t        j                  |      }t        j                  j!                         D ]l  \  }}|j#                         }t%        |t&              r|j                  d      }|j)                  |      |k(  sJ |j*                  j)                  |      |k(  rlJ  	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)r  r  r  r   r   r   asciiN)r  r  r  r	   r  r  r   r   r-  r  r   r  astliteral_evalr  r  rj  r  rx  bytesr   r  )rz  r  r  r  raw_headersr  headerr  s           r   test_middleware_multi_headerr  p  sC   	 24- 
 B
46fkk*#9& 	B)/F,,V]]3-DEFH"--224;;GDK --k:N"="F"F"L"L"N Bfe,#]]73F%))&1V;;;++//76AAAB	B	B B	B 	B	B Bs)   %EC6E3E7EE	EEc                     t               } t        | d         5 }dg}t        j                  d|j                  f| d   |      }t        j                  t        j                        5  |j                  t        j                  d             ddd       |j                          d	g}t        j                  d|j                  f| d   |      }t        j                  t        j                  t        j                  f      5  |j                  t        j                  d             ddd       |j                          ddd       y# 1 sw Y   xY w# 1 sw Y   .xY w# 1 sw Y   yxY w)
z$Test setting generic client options.r1   r(  )zgrpc.ssl_target_name_overrider8  r   r0   )r/  generic_optionsr\   N)zgrpc.max_receive_message_length    )r3   rZ   r   r  r  r1  r2  r*  rw   r0  r  r<   r  r  )r,  r&  rb   r  s       r   test_generic_optionsr    s$    E	u^/D	E DEaff 5/4[/A079 ]]6889 	2MM&--01	2:;aff 5/4[/A079 ]]BOOV-H-HIJ 	2MM&--01	2! 	2 	2	2 	2 s=   AE (%EA5E %E'E E	E E	E  E)c                       e Zd ZdZd Zd Zy)CancelFlightServerzA server for testing StopToken.c                     t        j                  g       }t         j                  j                  g |      }t	        j
                  |t        j                  |            S )Nr   )r<   rk   r   r?   r   r   r   r   )rc   ro   rt   rk   r"   s        r   rw   zCancelFlightServer.do_get  sF    2^^''6':%%fi.>.>r.BCCr   c                 "   t        j                  g       }t         j                  j                  g |      }|j	                  |       |j                         s8|j                  |       t        j                  d       |j                         s7y y )Nr   r  )	r<   rk   r   r?   r5  r  r?  r  r  )rc   ro   r   r   r   rk   r"   s          r   r   zCancelFlightServer.do_exchange  sg    2^^''6':V&&(r"JJsO &&(r   N)ry   rz   r{   r|   rw   r   r   r   r   r  r    s    )D
r   r  c                     t        j                         j                  t        j                         j                  k7  rt	        j
                  d       d t        t        j                  ffd} t               5 }t        d|j                  f      5 }|j                  t        j                  d            } | |j                         t        j                   j#                  d      }|j%                  |      \  }} | |j                         	 |j'                          d d d        d d d        y # t        t        j(                  f$ r Y ,w xY w# 1 sw Y   1xY w# 1 sw Y   y xY w)Nz'test only works from main Python threadc                  t    t        j                  d       t        j                  t        j                         y r  )r  r  signalraise_signalSIGINTr   r   r   signal_from_threadz*test_interrupt.<locals>.signal_from_thread  s    

3FMM*r   c                    	 	 t        j                        }t        j                        5 }|j	                           |         d d d        |j                          	 j                  }t        |t        j                  t        f      s-t        |j                  t        j                  t        f      sJ y y # 1 sw Y   txY w# j                          w xY w# t        $ r t        j                  d       Y w xY w)Nr}  z2KeyboardInterrupt didn't interrupt Flight read_all)r  r  r1  r2  r  rf  KeyboardInterruptfailrL  rx  r<   ArrowCancelled__context__)r   texc_infor  	exc_typesr  s       r   r  ztest_interrupt.<locals>.test  s    	N$$,>?]]9- GGIJ  NN!b//1BCDq}}r'8'8:K&LM	N NM E    	N KKLM	Ns:   +C B:C C :C?C CC C<;C<r   r   r'  )r  current_threadidentmain_threadr1  r5  r  r<   r  r  r	   r  rw   r   r0  r   rl   r.  r   r  r  )r  rz  r  r   r   r   r  r  s         @@r   test_interruptr    s&   !''9+@+@+B+H+HH=>+ #B$5$56IN$ 
	 +v{{348>v}}S12V__,,88A
++J7V__	LLN   "6#>#>? 		   sC   >EA<ED4#E4EEEEE	EE(c                     d} t               5 }t        j                  d|j                  f      5 }t	        j
                  t        j                  |       5  |j                  t        j                  d            j                          d d d        |j                  t        j                  d            j                         }|j                  dk(  sJ 	 d d d        d d d        y # 1 sw Y   ^xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nz'application server implementation errorr   r  r   r   r7   )r   r   r  r  r1  r2  r  rw   r0  r   rF  )r  rz  r  rv   s       r   test_never_sends_datar    s    5E	#	% #NNK56#:@]]6335A 	9MM&--,-668	9
 fmmM:;DDF~~"""# # #	9 	9# # # #s;   "C=&C13C%AC1C=%C.*C11C:	6C==Dc            	      X   t         j                  j                  ddz        } t               5 }t        j                  d|j
                  f      5 }t        j                  t        d      5  |j                  | t        j                  g             \  }}|j                          d d d        t        j                  t        j                  d      5  |j                  |        d d d        d d d        d d d        y # 1 sw Y   YxY w# 1 sw Y   &xY w# 1 sw Y   *xY w# 1 sw Y   y xY w)Nr  r  r   z%Failed to serialize Flight descriptorr  )r   rl   r.  r
   r  r  r1  r2  OSErrorr   r<   rk   r  r  r   )large_descriptorrz  r  r   r  s        r   test_large_descriptorr    s    
 ..::		 1vNNK561:@]]7!HJ 	&6		"FIFALLN	 ]]2,,!HJ 	1/0	11 1 1	 		1 	11 1 1 1sS   "D D+9C<$-DD#D+D <DDDDD	D  D)c            	         t         j                  j                  d      } ddz  }t               5 }t        j                  d|j
                  f      5 }t        j                  t        j                  d      5  |j                  | t        j                  g             \  }}|5  |j                  |       |j                          d d d        d d d        t        j                  t        j                  d      5  |j                  |       \  }}|5  |j                  |       d d d        d d d        d d d        d d d        ~t               5 }t        j                  d|j
                  f      5 }t        j                  t         j                   d      5  |j#                  t        j$                  d            }|j'                          d d d        t        j                  t        j(                  d      5  |j                  |       \  }}|5  |j'                          d d d        d d d        d d d        d d d        y # 1 sw Y   ~xY w# 1 sw Y   xY w# 1 sw Y   :xY w# 1 sw Y   ?xY w# 1 sw Y   DxY w# 1 sw Y   IxY w# 1 sw Y   xY w# 1 sw Y   |xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r  r  r   zapp_metadata size overflowr  )r   rl   r.  r   r  r  r1  r2  r<   ArrowCapacityErrorr   rk   r9  r  r   r  r  rw   r0  r   r  )r   r>  rz  r  r   r  r   s          r   test_large_metadata_clientr    sR    ((44S9J{#H		 0vNNK560:@]]200!=? 	j"))B-@IFA %%h/	 ]]200!=? 	0#//
;NFF 0%%h/0	00 0 		"	$ 
"NNK56
":@]]633!=? 	]]6==#56FOO	 ]]2,,!=? 	"#//
;NFF "!"	"
" 
" 
" 	 	0 0	0 	00 0 0 0"	 	" "	" 	"
" 
" 
" 
"s   "J&I47+I""I 	I-I49I'I	"I'*I42J"J>/&J25J
-J27J&J	J&'J2/J> I
III4I$I''I1,I44I>	9JJJJ2J#J&&J/+J22J;	7J>>Kc                       e Zd ZdZg Zd Zy)ActionNoneFlightServerz@A server that implements a side effect to a non iterable action.c                     |j                   dk(  r/t        j                  | j                        j	                  d      gS |j                   dk(  r| j                  j                  d       y t        )N	get_valuer   r  T)rG   jsondumpsVALUESr   r  r   r   s      r   r   z ActionNoneFlightServer.do_action"	  sV    ;;+%JJt{{+227;<<[[H$KKt$!!r   N)ry   rz   r{   r|   r  r   r   r   r   r  r  	  s    JF"r   r  c                     t               5 } t        d| j                  f      5 }|j                  t	        j
                  dd             |j                  t	        j
                  dd            }t        j                  t        |      j                  j                               dgk(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zEnsure that actions are executed even when we don't consume iterator.

    See https://issues.apache.org/jira/browse/ARROW-14255
    r   r  r   r  TN)r  r	   r  r   r   r-  r  loadsr  r  r   )rz  r  rs      r   test_none_action_side_effectr  +	  s     
 	! ?V+v{{34?8>x56V]];<=zz$q',,1134>>>	? ? ? ? ? ?s#   CBB<+C<C	CCc            	         d} d}t        j                  | |      t         j                  j                  d      }t	        j
                  dt	        j                         fg      } G fddt         j                        } |       5 }t        d|j                  f      5 }|j                  ||      \  }fd	}t        j                  |d
      }	|	j                          t        j                  t         j                        5 }
	 |j!                  t	        j"                  dgg|             )# 1 sw Y   nxY w
j$                  j&                  |k(  sJ t        j                  t         j                        5 }
|j)                          ddd       n# 1 sw Y   nxY w|
j$                  j&                  |k(  sJ |	j+                          |j-                  |      \  }fd}t        j                  |d
      }	|	j                          t        j                  t         j                        5 }
	 |j/                  d       # 1 sw Y   nxY w|
j$                  j&                  |k(  sJ t        j                  t         j                        5 }
|j)                          ddd       n# 1 sw Y   nxY w|
j$                  j&                  |k(  sJ |	j+                          ddd       n# 1 sw Y   nxY wddd       y# 1 sw Y   yxY w)z
    Ensure that exceptions during writing preserve error context.

    See https://issues.apache.org/jira/browse/ARROW-16592.
    rC   rF  )r  r   r  c                   "    e Zd Z fdZ fdZy)0test_write_error_propagation.<locals>.FailServerc                     r   r   rc   ro   r   r   r   excs        r   r   z7test_write_error_propagation.<locals>.FailServer.do_putG	      Ir   c                     r   r   r  s        r   r   z<test_write_error_propagation.<locals>.FailServer.do_exchangeJ	  r  r   N)ry   rz   r{   r   r   )r  s   r   
FailServerr  F	  s    		r   r  r   c                  \    	 	  j                          # t        j                  $ r Y y w xY wr   )r$   r   FlightErrorr   s   r   _readerz-test_write_error_propagation.<locals>._readerT	  s1    KKM %%     ++Tr  rH   r   Nc                  \    	 	  j                          # t        j                  $ r Y y w xY wr   )rB  r   r  r  s   r   r  z-test_write_error_propagation.<locals>._readerk	  s4    %%' %% r  r  )r   r  rl   r.  r<   rk   r  r
   r	   r  r   r  r  r  r1  r2  r?  r  rL  r  r  rf  r   r9  )expected_messageexpected_infor   rk   r  rz  r  r   r  r  r  r  r   s              @@r   test_write_error_propagationr  8	  s    M

%
%]4C((44S9JYY"((*-./FV,,  
 /+v{{34/8>z6:	 !!>]]6667 	J8""2??QC5#HI 	J 	J ~~((M999]]6667 	8LLN	 	 	~~((M999  ++J7	 !!>]]6667 	,8%%d+ 	, 	, ~~((M999]]6667 	8LLN	 	 	~~((M999_/ / / / / /s|   	K<!A%K'+D11D:6AK';F	K'FBK'/IIAK'J'	K''J0,2K'	K<'K0	,K<<Lc                  .    t        j                  d       y)z
    Ensure that the gRPC server is stopped at interpreter shutdown.

    See https://issues.apache.org/jira/browse/ARROW-16597.
    zarrow_16597.pyN)r   invoke_scriptr   r   r   test_interpreter_shutdownr  	  s     	'(r   c                       e Zd ZdZd Zy)TracingFlightServerz/A server that echoes back trace context values.c                 f    |j                  d      j                  }d |j                         D        S )Ntracingc              3   N   K   | ]  \  }}| d | j                  d        yw)z: r   N)r   ).0r/   rL  s      r   	<genexpr>z0TracingFlightServer.do_action.<locals>.<genexpr>	  s2      ; S% 55'"**73 ;s   #%)r  trace_contextrj  )rc   ro   r   r  s       r   r   zTracingFlightServer.do_action	  s3    ..y9GG;$1$7$7$9; 	;r   Nr  r   r   r   r  r  	  s
    9;r   r  c                  (   t        dt        j                         i      5 } t        d| j                  f      5 }t        j
                  ddg      }|j                  d|      D ]  } 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)	Nr  r  r   )s   traceparents7   00-000ff00f00f0ff000f0f00ff0f00fff0-000f0000f0f00000-00)s
   tracestater   r  )r   r   rs   )r  r   TracingServerMiddlewareFactoryr	   r  r  r   )rz  r  rb   rL  s       r   test_tracingr  	  s    	v<<>) 
 
+v{{34 9? **5 	4
  %%j'%B 	E	     s"   B1A<+B<B	BBc                      t        dd      } d}t        j                  t        |      5  | j	                  t
        j                  j                  d      d        d d d        y # 1 sw Y   y xY w)Nzgrpc+tls://localhost:9643Tr3  zRArgument 'schema' has incorrect type \(expected pyarrow.lib.Schema, got NoneType\)r  rC   r   )r	   r1  r2  r3  r   r   rl   r.  )r  msgs     r   .test_do_put_does_not_crash_when_schema_is_noner  	  sc    56:<F<C	y	, #f--99%@! 	 	## # #s   1A%%A.c                      G d dt               }  G fddt              } G d dt               |       } |        5 }t        d|j                  f|g      5 }|j                  t        j                  j                  d	             d
|j                  v sJ d|j                  v sJ d|j                  v sJ d|j                  v sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z9Ensure that server-sent headers/trailers make it through.c                       e Zd Zd Zy):test_headers_trailers.<locals>.HeadersTrailersFlightServerc                     |j                  dd       |j                  dd       |j                  dd       |j                  dd       t        j                  t	        j
                  g       |g       S )	Nx-headerheader-valuex-header-binzheadervalue	x-trailertrailer-valuex-trailer-binztrailervalue)
add_headeradd_trailerr   rj   r<   rk   r   s      r   r   zJtest_headers_trailers.<locals>.HeadersTrailersFlightServer.get_flight_info	  sh    z>:~/@A_=1CD$$		" r   N)ry   rz   r{   r   r   r   r   HeadersTrailersFlightServerr  	  s    		r   r  c                       e Zd Zd Z fdZy)?test_headers_trailers.<locals>.HeadersTrailersMiddlewareFactoryc                     g | _         y r   r  rn  s    r   r`   zHtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.__init__	  s	    DLr   c                      |       S r   r   )rc   r   HeadersTrailersMiddlewares     r   r  zJtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.start_call	  s    ,T22r   N)ry   rz   r{   r`   r  )r  s   r    HeadersTrailersMiddlewareFactoryr  	  s    		3r   r  c                       e Zd Zd Zd Zy)8test_headers_trailers.<locals>.HeadersTrailersMiddlewarec                     || _         y r   r  r  s     r   r`   zAtest_headers_trailers.<locals>.HeadersTrailersMiddleware.__init__	  s	    "DLr   c                     |j                         D ]3  \  }}|D ])  }| j                  j                  j                  ||f       + 5 y r   )rj  r  r  r  )rc   r  r/   r  rL  s        r   r  zItest_headers_trailers.<locals>.HeadersTrailersMiddleware.received_headers	  sF    &}} >V# >ELL((//e=>>r   N)ry   rz   r{   r`   r  r   r   r   r  r  	  s    	#	>r   r  r   r  r   )r  r  )r	  s   headervalue)r
  r  )r  s   trailervalueN)
r
   r   r   r	   r  r   r   rl   rm   r  )r  r  r  rz  r  r  s        @r   test_headers_trailersr  	  s    
&6 
3+B 3>$4 > /0G	$	& I&+v{{3	JINTv66??CD+w>>>3wFFF-@@@5HHHI I I I I Is$   C'A/C
C'C$	 C''C0)r  rx  r   r   r   r  r   r  r  r  r'   r  r   numpyrO  ImportErrorr1  r   r<   pyarrow.libr   r   pyarrow.utilr   pyarrow.testsr   r   r   r	   r
   r   r   r   r   r   r   r4  mark
pytestmarkr   r    r,   r3   rA   rO   rX   rZ   r   r   r   r   r   r   r   r   r   r  r  r$  rO  rf  rs  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r@  rp  ru  r{  r~  slowr  r  r  r  pandasr  r  r  r  r  r  r  r  r  r  skipifr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  %header_auth_server_middleware_factoryr
  r  r  r  r  r   r#  r&  requires_testing_datar-  r1  r6  r:  r@  rF  rH  rK  rX  rZ  rh  rj  rr  rx  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  large_memoryr  r  r  r  r  r  r  r  r  r  r   r   r   <module>r(     s  $    	            / ' ?   [[

BK";<2E+ ED#+ #L' *"- ""0* 06+. +#3 .. ."E 0 E F!1 F&7' 7*.A( .AbC#+ C#L!2 0!2 ". .. $' $
/(? 
/-!1 -41(? 189!1 9/- /9.E 9'7 F#3 F*+- +5$; 5) . -+B -&/+B /

$4 
	'> 		'> 		1)@ 	12"2 2.4)@ 44"2 4. 0 ."9@x`F!$8   ('(D6 F F""<.=7$( 2!6 BGGtOD  F&F&* # #*# 9<J4" 0[7   ,[3  
 + + BGGtOI  K
5K
5+5I )J(K %$& 4E;@8."+ ""= # = ""	" #	" "" #  ""	2 #	2"* @
"), " "8     4  4@8Ov#L$(N	'9,)5X	5 """ #"$!6,#1L20!.B, "" #.) " ) )X# 1  1  "  "@
"- 
"
? C CL)	;* 	;$#&I]L  	B"  ?F%+V"L"+16((06--06--?s#   X X XXX=<X=