
    j                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlmZ 	 d dlZd dlZd dlZd dlmZmZ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'm(Z( ejT                  j<                  Z+d Z,d	 Z-d
 Z.d Z/d Z0d Z1d Z2 G d de!      Z3 G d de!      Z4 G d de!      Z5 G d de5      Z6 G d de5      Z7 G d de5      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% d&e!      Z> G d' d(e!      Z? G d) d*e!      Z@ G d+ d,e!      ZA G d- d.e"      ZB G d/ d0e#      ZC G d1 d2e"      ZD G d3 d4e#      ZE G d5 d6e"      ZFd7 ZG G d8 d9e'      ZH G d: d;e&      ZI G d< d=e%      ZJ G d> d?e$      ZK G d@ dAe!      ZL G dB dCe%      ZM G dD dEe$      ZN G dF dGe!      ZO G dH dIe$      ZP G dJ dKe%      ZQ G dL dMe!      ZR G dN dOe!      ZS G dP dQe%      ZT G dR dSe'      ZU G dT dUe&      ZV G dV dWe%      ZW G dX dYe'      ZX G dZ d[e'      ZY G d\ d]e&      ZZ G d^ d_e%      Z[ G d` dae$      Z\ G db dce!      Z]dd Z^de Z_df Z`dg Zadh ZbejT                  j                  ejT                  j                  di               Zddj Zedk Zfdl ZgejT                  j                  dm        Zidn Zjdo Zkdp Zldq Zmdr Zn G ds dte!      Zodu Zpdv Zqdw ZrejT                  j                  ej                  dxk(  dyz      d{        ZuejT                  j                  d|        Zvd} Zwd~ Zxd Zyd Zzd Z{d Z|d Z}d Z~d Zd Z eBddi      Z eDddi      ZejT                  j                  d        ZejT                  j                  ej                  dxk(  dz      d        Zd Zd Zd Z eJ       Z eF       Zd Zd Zd Zd Zd Zd Zd ZejT                  j                  ejT                  j"                  d               ZejT                  j"                  d        ZejT                  j"                  d        ZejT                  j"                  d        Zd Zd Zd Zd ZejT                  j                  d        ZejT                  j                  d        ZejT                  j                  ejT                  j                  d               Zd Zd Zd Zd Zd Zd Zd Zd ZejT                  j"                  d        Zd Zd Zd Zd Zd Zd ZejT                  j"                  d        Z G d de!      ZejT                  j                  d        Zd ZejT                  j`                  ejT                  j                  d               ZejT                  j`                  ejT                  j                  d               Z G d de5      Zd ZejT                  j                  d        Zd Z G d de!      Zd ZejT                  j                  ejr                  dk(  dz      d        ZdÄ ZdĄ Zdń Zej|                  dƄ        ZejT                  j                  dddgdʬ˫      d̄        Zy# e$ r dZY ww 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'e)Z(Y ^w xY w)    N)datetime)IpcReadOptions	ReadStatsis_opentelemetry_enabledtobytes)find_free_port)util)flight)	FlightClientFlightServerBaseServerAuthHandlerClientAuthHandlerServerMiddlewareServerMiddlewareFactoryClientMiddlewareClientMiddlewareFactoryFlightCallOptionsc                      dd l } y )Nr   )pyarrow.flight)pyarrows    @/tmp/pip-target-jj7clzyk/lib/python/pyarrow/tests/test_flight.pytest_importr   C   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#   H   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        $ r' t	        d|| z   dt        j                                w xY w)z)Get the contents of a test resource file.NrbzTest resource z< not found; did you initialize the test resource submodule?
)r#   openreadFileNotFoundErrorr   	traceback
format_exc)pathrootfs      r   read_flight_resourcer.   P   s    ?D
Tk% 	668	 	 	 
TD[M *))2)=)=)?(@B
 	

s%   A	 =	A	 AA	 A	 	0A9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_certsr5   _   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_tablerC   p   s4    
$%D 88[M::r   c                     t        j                  g dt        j                               } t        j                  g dt        j                               }t        j                  t         j                  j                  g d|       t         j                  j                  ddg|       t         j                  j                  ddg|      g      g}t         j                  j                  |d	g
      S )N)foobazquuxtype)rE   rF   rG   new)   r   N   rK   r      
some_dictsr<   )r>   r?   utf8chunked_arrayDictionaryArrayrA   r@   )dict_valuesnew_dict_valuesrB   s      r   simple_dicts_tablerT   w   s    ((1	BKhh<2779MO
**<E**Aq6;?**Aq6?C
 	D 88\N;;r   c                      t         j                  j                  t        j                  g d      t        j                  g d      gddg      S )N)rE   barrF   quxrK   rL   rM      abr<   )r>   r@   rA   r?   r"   r   r   multiple_column_tabler\      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__rC   rT   r\   table_factoriesoptions)selflocationrf   kwargs	__class__s       r   rd   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rg   contextcriterias      r   list_flightsz!ConstantFlightServer.list_flights   sL     t}}$##		"''008  %s   AAc                      | j                   |j                            }t        j                  || j                        S )Nrf   )re   ticketr
   RecordBatchStreamrf   )rg   rs   rx   tables       r   do_getzConstantFlightServer.do_get   s4     4$$V]]35''t||DDr   NN)	__name__
__module____qualname____doc__rm   rd   ru   r{   __classcell__rj   s   @r   r^   r^      s     (HEr   r^   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"   rc   rd   rf   rg   rf   ri   rj   s      r   rd   zMetadataFlightServer.__init__       "6"r   c                     t        j                  g d      g}t         j                  j                  |dg      }t	        j
                  |j                  | j                  |      | j                        S )Nr7   rZ   r<   rw   )	r>   r?   r@   rA   r
   GeneratorStreamro   number_batchesrf   )rg   rs   rx   rB   rz   s        r   r{   zMetadataFlightServer.do_get   sb    HH()
 $$T#$7%%LL&LL" 	"r   c           	         d}g d}|j                   j                  dk(  sJ |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  } |j                   j                  dk(  sJ |j                   j                  dk(  sJ y )Nr   r7   rK   rZ   <i   r9   )statsnum_messagesequalsr>   RecordBatchrA   r?   structunpack
to_pybyteswritepacknum_record_batches)
rg   rs   
descriptorreaderwritercounterexpected_databatchbufclient_counters
             r   do_putzMetadataFlightServer.do_put   s    +||((A---  		JE3<< : :=1234!    ?"?$mmD#..2BCONn,,,LLT734qLG		 ||((A---||..!333r   c              #      K   t        | j                               D ]!  \  }}t        j                  d|      }||f # y w)Nr   )	enumerate
to_batchesr   r   )rz   idxr   r   s       r   r   z#MetadataFlightServer.number_batches   sA     #E$4$4$67 	JC++dC(C*	s   ?AN)
r}   r~   r   r   rd   r{   r   staticmethodr   r   r   s   @r   r   r      s)    >"4"  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   )rc   rd   last_messageexpected_schema)rg   rh   r   ri   rj   s       r   rd   zEchoFlightServer.__init__   s%    ,V, .r   c                 @    t        j                  | j                        S r   )r
   ry   r   rg   rs   rx   s      r   r{   zEchoFlightServer.do_get   s    ''(9(9::r   c                 |    | j                   r| j                   |j                  k(  sJ |j                         | _        y r   )r   ro   read_allr   rg   rs   r   r   r   s        r   r   zEchoFlightServer.do_put   s2    ''6==888"OO-r   c                     |D ]  } y r   r"   )rg   rs   r   r   r   chunks         r   do_exchangezEchoFlightServer.do_exchange   s     	E	r   r|   )	r}   r~   r   r   rd   r{   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   ro   r   r   s      r   r{   zEchoStreamFlightServer.do_get   s;    %%$$((t(<> 	>r   c                     g S r   r"   rg   rs   s     r   list_actionsz#EchoStreamFlightServer.list_actions       	r   c                     |j                   dk(  r/|j                         |j                         j                  d      gS t        Nwho-am-iutf-8rI   peer_identitypeerencodeNotImplementedErrorrg   rs   actions      r   	do_actionz EchoStreamFlightServer.do_action   9    ;;*$))+W\\^-B-B7-KLL!!r   Nr}   r~   r   r   r{   r   r   r"   r   r   r   r      s    @>
"r   r   c                   "    e Zd ZdZd Zd Zd Zy)EchoTableStreamFlightServerz,An echo server that streams the whole table.c                 l    t        j                  | j                  j                  | j                  g      S r   )r
   r   r   ro   r   s      r   r{   z"EchoTableStreamFlightServer.do_get   s0    %%$$! 	!r   c                     g S r   r"   r   s     r   r   z(EchoTableStreamFlightServer.list_actions  r   r   c                     |j                   dk(  r/|j                         |j                         j                  d      gS t        r   r   r   s      r   r   z%EchoTableStreamFlightServer.do_action  r   r   Nr   r"   r   r   r   r      s    6!
"r   r   c                   "    e Zd ZdZd Zd Zd Zy)'EchoRecordBatchReaderStreamFlightServerzCAn echo server that streams the whole table as a RecordBatchReader.c                     t        j                  | j                  j                  | j                  j	                         g      S r   )r
   r   r   ro   	to_readerr   s      r   r{   z.EchoRecordBatchReaderStreamFlightServer.do_get  s9    %%$$((*+- 	-r   c                     g S r   r"   r   s     r   r   z4EchoRecordBatchReaderStreamFlightServer.list_actions  r   r   c                     |j                   dk(  r/|j                         |j                         j                  d      gS t        r   r   r   s      r   r   z1EchoRecordBatchReaderStreamFlightServer.do_action  r   r   Nr   r"   r   r   r   r     s    M-
"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 )NrZ   r   grpc://test	localhost  2023-04-05T12:34:56.789012345nszendpoint app metadatarK   *   Tzinfo app metadata)r
   rn   r>   ro   int32FlightEndpointLocationfor_grpc_tcpscalarcast	timestamprg   rs   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
   SchemaResultro   )rg   rs   r   infos       r   
get_schemazGetInfoFlightServer.get_schema3  s)    ##GZ8""4;;//r   N)r}   r~   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_actionsC  s     ((***s   N)r}   r~   r   r   classmethodr   r   r"   r   r   r   r   8  s    1
 
+r   r   c                       e Zd ZdZd Zy)ListActionsErrorFlightServerr   c              #      K   d d y w)N)r   r   rE   r"   r   s     r   r   z)ListActionsErrorFlightServer.list_actionsJ  s     s   
N)r}   r~   r   r   r   r"   r   r   r   r   G  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   )rc   rd   expected_ticket)rg   r  rh   ri   rj   s       r   rd   z CheckTicketFlightServer.__init__R  s    ,V,.r   c                     | j                   |j                  k(  sJ t        j                  g dt        j                               g}t        j
                  j                  |dg      }t        j                  |      S )Nr7   rH   rZ   r<   )	r  rx   r>   r?   r   r@   rA   r
   ry   )rg   rs   rx   data1rz   s        r   r{   zCheckTicketFlightServer.do_getV  s`    ##v}}444-BHHJ?@$$U3%$8''..r   c                 .    |j                         | _        y r   )r   r   )rg   rs   r   r   s       r   r   zCheckTicketFlightServer.do_put\  s    "OO-r   r   )r}   r~   r   r   rd   r{   r   r   r   s   @r   r   r   O  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.rZ   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 )Nr7   rH   )g      $g      g              @g      $@rZ   r<   )
r>   r?   r   float64rI   r@   rA   ro   r
   r   )rg   rs   rx   r  data2table1table2s          r   r{   z InvalidStreamFlightServer.do_gete  s    -BHHJ?@7bjjlKLzzUZZ'''%%eC5%9%%eC5%9}}+++%%dkkFF3CDDr   Nr}   r~   r   r   r>   ro   r   r{   r"   r   r   r  r  `  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.rZ   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_datar9   ro   )rx   ro   empty_tabler>   r   rA   ranger
   r   	itertoolsrepeat)rg   rs   rx   rB   s       r   r{   z!NeverSendsDataFlightServer.do_getu  s    ==M) '')'')**E!H:dkk*JD
 ))$++t<<%%KK))$++*A*A*CDF 	Fr   Nr  r"   r   r   r  r  p  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 )NrZ   )r
   r   r>   ro   r   slow_streamr   s      r   r{   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)Nr7   rH   rZ   r<   r:   )r>   r?   r   r@   rA   r  r   )r  s    r   r  zSlowFlightServer.slow_stream  se     -BHHJ?@hh""5"66 	

2hh""5"66s   BBN)r}   r~   r   r   r{   r   r   r  r"   r   r   r  r    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invalidr1   )
r
   FlightInternalErrorFlightTimedOutErrorFlightCancelledErrorFlightUnauthenticatedErrorFlightUnauthorizedErrorr   r>   ArrowInvalidKeyErrorr"   r   r   error_caseszErrorFlightServer.error_cases  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
        )NrE   protobuf   this is an error message)r#  r3  rI   r
   r0  r   )rg   rs   r   r3  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)Nrl   rE   )r
   rn   r>   ro   rp   rq   r,  rr   s      r   ru   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   internalrE   s   timedouts   cancels   unauthenticateds   unauthorizeds   protobufr6  )commandr
   r,  r-  r.  r/  r0  )rg   rs   r   r   r   r7  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)	r}   r~   r   r   r   r3  r   ru   r   r"   r   r   r#  r#    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   rd   zExchangeFlightServer.__init__  r   r   c                    |j                   j                  dk(  sJ |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                         )Nr   z!Must provide a command descriptor   echo   get   put	   transformzUnknown command: )r   r   descriptor_typer
   DescriptorTypeCMDr>   r1  r:  exchange_echoexchange_do_getexchange_do_putexchange_transformr   s        r   r   z ExchangeFlightServer.do_exchange  s    ||((A---%%)>)>)B)BB//"EFF7*%%gvv>>6)''@@6)''@@</**7FFCC//#J$6$6#78: :r   c                     t         j                  j                  t        j                  t	        dd            gdg      }|j                  |j                         |j                  |       y)Emulate DoGet with DoExchange.r    (  rZ   r<   N)r>   r@   rA   r?   r  beginro   write_table)rg   rs   r   r   rB   s        r   rG  z$ExchangeFlightServer.exchange_do_get  sX    xx##HHU1i()%
 $  	T[[!4 r   c                     d}|D ]C  }|j                   st        j                  d      |j                  j                  dk7  sJ |dz  }E |j                  j
                  |k(  sJ |j                  t        |      j                  d             y)Emulate DoPut with DoExchange.r   zAll chunks must have data.rK   r   N)	rB   r>   r1  r   r   r   write_metadatastrr   )rg   rs   r   r   num_batchesr   s         r   rH  z$ExchangeFlightServer.exchange_do_put  s     	E::oo&BCC<<,,1111K		
 ||..+===c+.55g>?r   c                 .   |j                   j                  dk(  sJ d}|D ]  }|s?|j                  r3|j                  |j                  j                  | j
                         d}|j                  r3|j                  r'|j                  |j                  |j                         |j                  r|j                  |j                         |j                  r7|j                   j                  dk7  sJ |j                  |j                         J d        y)zRun a simple echo server.r   Frw   TzShould not happenN)
r   r   rB   rM  ro   rf   app_metadatawrite_with_metadatarQ  write_batch)rg   rs   r   r   startedr   s         r   rF  z"ExchangeFlightServer.exchange_echo  s    ||((A--- 	2EuzzUZZ..E!!ejj**5::u7I7IJ##%%e&8&89||00A555""5::.111u	2r   c                    |j                   j                  dk(  sJ |j                  D ]L  }t        j                  j                  |j                        r-t        j                  dt        |      z          |j                         }|j                   j                  dk7  s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.r   zInvalid field: sumr<   N)r   r   ro   r>   types
is_integerrI   r1  reprr   num_rowsr   as_pyr@   rA   r?   rM  rN  )rg   rs   r   r   fieldrz   sumscolumnrowvalueresults              r   rI  z'ExchangeFlightServer.exchange_transform  s   ||((A---]] 	GE88&&uzz2oo&7$u+&EFF	G !||((A---sU^^# 	+F'/ +
US	U[[]*	+	+ %%rxx~&6ug%FV]]#6"r   r   )r}   r~   r   r   rd   r   rG  rH  rF  rI  r   r   s   @r   r<  r<    s%    *: !	@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   rc   rd   credsrg   rk  rj   s     r   rd   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usernamerk  r/  passwordr   r   )rg   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 providedro  )r
   r/  rk  rg   tokens     r   is_validz#HttpBasicServerAuthHandler.is_valid&  s9    334HII

"33NCCr   r}   r~   r   r   rd   rw  r{  r   r   s   @r   rg  rg    s    A/r   rg  c                   .     e Zd ZdZ fdZd Zd Z xZS )HttpBasicClientAuthHandlerrh  c                 f    t         |           t        j                  ||      | _        d | _        y r   )rc   rd   r
   rp  
basic_authrz  rg   rr  rs  rj   s      r   rd   z#HttpBasicClientAuthHandler.__init__1  s)     **8X>
r   c                     | j                   j                         }|j                  |       |j                         | _        y r   )r  	serializer   r'   rz  )rg   rt  ru  rv  s       r   rw  z'HttpBasicClientAuthHandler.authenticate6  s-    ((*t]]_
r   c                     | j                   S r   rz  rg   s    r   	get_tokenz$HttpBasicClientAuthHandler.get_token;      zzr   r}   r~   r   r   rd   rw  r  r   r   s   @r   r~  r~  .  s    A
%
r   r~  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   rj  rl  s     r   rd   zTokenServerAuthHandler.__init__B  rm  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'   rk  r   base64	b64encoder
   r/  )rg   rt  ru  rr  rs  s        r   rw  z#TokenServerAuthHandler.authenticateF  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 )Nr  zinvalid token   )r  	b64decode
startswithr
   r/  ry  s     r   r{  zTokenServerAuthHandler.is_validO  s=      '
+33ODDQRyr   r|  r   s   @r   r  r  ?  s    D-r   r  c                   .     e Zd ZdZ fdZd Zd Z xZS )TokenClientAuthHandlerr  c                 L    t         |           || _        || _        d| _        y )Nr   )rc   rd   rr  rs  rz  r  s      r   rd   zTokenClientAuthHandler.__init__Y  s#      
r   c                     |j                  | j                         |j                  | j                         |j                         | _        y r   )r   rr  rs  r'   rz  rg   rt  ru  s      r   rw  z#TokenClientAuthHandler.authenticate_  s/    t}}%t}}%]]_
r   c                     | j                   S r   r  r  s    r   r  z TokenClientAuthHandler.get_tokend  r  r   r  r   s   @r   r  r  V  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   rw  zNoopAuthHandler.authenticatek  s    r   c                      y)zV
        Returning an empty string.
        Returning None causes Type error.
        r   r"   ry  s     r   r{  zNoopAuthHandler.is_validn  s    
 r   N)r}   r~   r   r   rw  r{  r"   r   r   r  r  h  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_keyr1   s      r   case_insensitive_header_lookupr  v  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_credentialr  s    r   rd   z*ClientHeaderAuthMiddlewareFactory.__init__  s
    !r   c                     t        |       S r   )ClientHeaderAuthMiddlewarerg   r   s     r   
start_callz,ClientHeaderAuthMiddlewareFactory.start_call  s    )$//r   c                     || _         y r   r  )rg   r  s     r   set_call_credentialz5ClientHeaderAuthMiddlewareFactory.set_call_credential  s
    .r   N)r}   r~   r   r   rd   r  r  r"   r   r   r  r    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rg   r  s     r   rd   z#ClientHeaderAuthMiddleware.__init__  	    r   c                     t        |d      }|r0| j                  j                  d|d   j                  d      g       y y )NAuthorization   authorizationr   r   )r  r  r  r   )rg   r  auth_headers      r   received_headersz+ClientHeaderAuthMiddleware.received_headers  sB    4WoNLL,, A%%g..0 1 r   N)r}   r~   r   r   rd   r  r"   r   r   r  r    s    1r   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BasicrK   r   :testrs  	token1234Bearer)r  splitr  r  decoder
   r/  HeaderAuthServerMiddleware)	rg   r   r  r  valuesrz  error_messagedecodedpairs	            r   r  z,HeaderAuthServerMiddlewareFactory.start_call  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r}   r~   r   r   r  r"   r   r   r  r    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   r  ry  s     r   rd   z#HeaderAuthServerMiddleware.__init__  s	    
r   c                 $    dd| j                   z   iS )NauthorizationzBearer r  r  s    r   sending_headersz*HeaderAuthServerMiddleware.sending_headers  s    TZZ!788r   Nr}   r~   r   r   rd   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      )Nrv  r  r  rK   r   zNo token auth middleware found.)get_middlewarer  r  r  r   r
   r/  )rg   rs   r   
middlewarer  r  s         r   r   z HeaderAuthFlightServer.do_action  sk    ++F3
8**,o?K &&s+F1I$$W-..//-/ 	/r   Nr}   r~   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rg   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   ru  )rg   ru  s     r   rd   z)ArbitraryHeadersServerMiddleware.__init__  s	     r   c                     | j                   S r   r  r  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)	rg   rs   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)rg   r  s     r   rd   zHeaderServerMiddleware.__init__  s
    *r   N)r}   r~   r   r   rd   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   )rg   rs   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  r]  client_headersr   )rg   rs   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   rs  zInvalid token)methodr
   FlightMethodLIST_ACTIONSr   r/  r  )rg   r   r  rz  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_call6  s    ,..r   N)r}   r~   r   r  r"   r   r   r  r  5  s    /r   r  c                       e Zd Zd Zy)r  c                 
    ddiS )Nr  rs  r"   r  s    r   r  z-SelectiveAuthClientMiddleware.sending_headers;  s    J
 	
r   N)r}   r~   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   rc   rd   methodsrg   rj   s    r   rd   z)RecordingServerMiddlewareFactory.__init__D      r   c                 N    | j                   j                  |j                         y r   r  appendr  r  s      r   r  z+RecordingServerMiddlewareFactory.start_callH      DKK(r   r}   r~   r   r   rd   r  r   r   s   @r   r  r  A      *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   rd   z)RecordingClientMiddlewareFactory.__init__P  r  r   c                 N    | j                   j                  |j                         y r   r  r  s     r   r  z+RecordingClientMiddlewareFactory.start_callT  r  r   r  r   s   @r   r  r  M  r  r   r  c                       e Zd ZdZd Zd Zy)"MultiHeaderClientMiddlewareFactoryr  c                     i | _         y r   )last_headersr  s    r   rd   z+MultiHeaderClientMiddlewareFactory.__init__\  s     r   c                     t        |       S r   )MultiHeaderClientMiddlewarer  s     r   r  z-MultiHeaderClientMiddlewareFactory.start_calla  s    *400r   N)r}   r~   r   r   rd   r  r"   r   r   r  r  Y  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  rE   rV          rF   )zx-textzx-binary-binzx-MIXED-cases   x-other-MIXED-casec                     || _         y r   r  r  s     r   rd   z$MultiHeaderClientMiddleware.__init__p  r  r   c                     | j                   S r   )EXPECTEDr  s    r   r  z+MultiHeaderClientMiddleware.sending_headerss  r  r   c                 N    | j                   j                  j                  |       y r   )r  r  update)rg   r  s     r   r  z,MultiHeaderClientMiddleware.received_headersv  s     	!!((1r   N)r}   r~   r   r   r$  rd   r  r  r"   r   r   r  r  e  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_call  s    *733r   Nr  r"   r   r   r(  r(  |  s
    B4r   r(  c                       e Zd ZdZd Zd Zy)r*  r  c                     || _         y r   )r  )rg   r  s     r   rd   z$MultiHeaderServerMiddleware.__init__  s
    ,r   c                 "    t         j                  S r   )r  r$  r  s    r   r  z+MultiHeaderServerMiddleware.sending_headers  s    *333r   Nr  r"   r   r   r*  r*    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           )rc   rd   	_metadata)rg   argsri   rj   s      r   rd   z"LargeMetadataFlightServer.__init__  s!    $)&)-r   c                     t        j                  dt        j                         fg      }t        j                  |t        j
                  dgg|      | j                  fg      S )NrZ   rK   r  )r>   ro   int64r
   r   record_batchr3  )rg   rs   rx   ro   s       r   r{   z LargeMetadataFlightServer.do_get  sS    S"((*-./%%f__qcU62DNNC/
  	r   c                 :    |j                  | j                         y r   )rQ  r3  r   s        r   r   z%LargeMetadataFlightServer.do_exchange  s    dnn-r   )r}   r~   r   r   rd   r{   r   r   r   s   @r   r/  r/    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 |j                  t        j                  g       k(  sJ t        j                  d t        j
                  j                         g dddd      }d}t        |      |k(  sJ |j                  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'>rE   r   rV   userpass   foo2023-04-05T12:34:56s   endpoint app metadatarK   r   T   test app metadatagrpc+tcp://localhost:1234)intr6  z1<pyarrow.flight.SchemaResult schema=(int: int64)>z<pyarrow.flight.FlightInfo schema=None descriptor=<pyarrow.flight.FlightDescriptor path=[]> endpoints=[] total_records=1 total_bytes=42 ordered=True app_metadata=b'test app metadata'>r   s   grpc://testz2023-04-05T01:02:03)expiration_timei  rY   r9   rL   rM   rU  )r]  r
   Actionr   rp  rp   for_commandr   r>   r   r   r   rn   ro   rq   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_reprrX    s   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;;"))B-'''f%%..0"	2t)D
	-  :""";;	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   P6Q"Q
Q'Q(!Q46Q QQQ%(Q14Q=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 )NrE   r   rV   r
   rE  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 )NrE   r      barr[  r"   r   r   r\  ztest_eq.<locals>.<lambda>  s!    uc*FMM%,HI r   c                  Z    t        j                  dd      t        j                  dd      fS )NrE   rV   rF   r   r"   r   r   r\  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
   rp  r"   r   r   r\  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;  pass2rb  r"   r   r   r\  ztest_eq.<locals>.<lambda>  s(    !!&&1!!&'24 r   c                  ~    t         j                  j                  d      t         j                  j                  d      fS )NrE   )r
   rp   rF  rq   r"   r   r   r\  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<  r^  r
   r   r"   r   r   r\  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<  rA  grpc+tls://localhost:1234)r
   r   r   r"   r   r   r\  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   r\  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   rD     metarh  r"   r   r   r\  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
   rn   r>   ro   rp   rq   r6  r"   r   r   r\  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
   rn   r>   ro   rp   rq   rF  r"   r   r   r\  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 rg  )r
   rn   r>   ro   rp   rq   r   r"   r   r   r\  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_recordsrK   r
   rn   r>   ro   rp   rq   r"   r   r   r\  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 )Nrv  )total_bytesr   rx  r"   r   r   r\  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)orderedTrx  r"   r   r   r\  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   rD  rn  rx  r"   r   r   r\  ztest_eq.<locals>.<lambda>3  sl    		"''002BSJ 		"''002BWN	O r   c                  V    t        j                  d      t        j                  d      fS )NrA  rj  )r
   r   r"   r   r   r\  ztest_eq.<locals>.<lambda>:  s"    !<=!<=? r   c                  V    t        j                  d      t        j                  d      fS rg  )r
   rG  r"   r   r   r\  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 rp  )r
   r   r>   ro   r6  r"   r   r   r\  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
   rH  r"   r   r   r\  ztest_eq.<locals>.<lambda>?  s    s#V]]6%:; r   r"   )itemsgenlhs1rhs1lhs2rhs2s         r   test_eqr    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 )Nrv  )rw  rz  )r
   rn   r>   ro   rp   rq   rw  rz  )fi1fi2fi3s      r   test_flight_info_defaultsr  N  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)	locationsrh   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   )rI  rJ  
ValueErrorr   r"   r   r   #test_server_exit_reraises_exceptionr  k  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   r  serverh   s   r   r  z-test_client_wait_for_available.<locals>.servew  s!    

3!(+r   Ttargetdaemonr9   timeoutr  )r   r   	threadingThreadstartr  wait_for_available)r  r  clientthreadrX  elapsedrh   s         @r   test_client_wait_for_availabler  q  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   rK   N)r^   r
   connectportlistru   rm   len)r  r  flightss      r   test_flight_list_flightsr    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   )r^   r
   r  r  r  ru   closerI  rJ  r>   r1  r  r  s     r   test_flight_client_closer    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_versionrw   z+expected IpcWriteOptions, got <class 'int'>matchr   )rC   r^   r
   r  r  r{   rH  r   r   r>   ipcIpcWriteOptionsMetadataVersionV4r   rI  rJ  r  )rz   r  r  rB   rf   s        r   test_flight_do_get_intsr    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`   r;   r   N)rC   r^   r
   r  r  r{   rH  read_pandasr  rb  	to_pylist)rz   r  r  rB   s       r   test_do_get_ints_pandasr    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            
         t               } t               5 }t        j                  d|j                  f      5 }|j                  t        j                  d            }|j                  j                  dk(  sJ |j                         }|j                  |       sJ |j                  t        ddd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)	Nr   ra   rK   r   rM   rL   r   r   r   num_dictionary_batchesnum_dictionary_deltasnum_replaced_dictionaries)rT   r^   r
   r  r  r{   rH  r   r   r   r   r   )rz   r  r  r   rB   s        r   test_flight_do_get_dictsr    s     E		 
6NNK56
:@v}}X67||((A--- {{5!!!||y #$"#&' 
 
 	
 

 
 
 
 
 
s#   "CBC:CC	CC 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.r7   rH   rZ   r<   s
   the-ticket)r  r   N)r>   r?   r   r@   rA   r   r
   r  r  r{   rH  r   r   )r  rz   r  r  rB   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   rK   r   s   info app metadatarZ   rL   r   Nr   z#2023-04-05T12:34:56.789012345+00:00r   UTCr?  r   )r   r   r  r   r
   rp   rF  rw  rz  r|  rU  ro   r>   r   r  	endpointsr  rC  r   r   r   r   r   r  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   rZ   N)
r   r   r  r   r
   rp   rF  ro   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  rI  rJ  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<  r^  s   bazr"   r  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-actionrE   arrow-exceptionforeverc               3   Z   K    j                         sd  j                         sy y wrs  )is_cancelled)rs   s   r   r  z(ConvenienceServer.do_action.<locals>.gen   s&     !..0 L "..0s   %++)rI   r  bodyr>   ArrowMemoryError)rg   rs   r   r  s    `  r   r   zConvenienceServer.do_action  s    ;;/)---[[F"KK= [[L(7N[[--%%''[[I%! 5L	 &r   N)r}   r~   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  )r  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  rI  rJ  r
   r  r  r   r  s     r   test_nicer_server_exceptionsr  4  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.r  r   N)r   r  shutdown)r  s    r   test_get_portr  C  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`   ra   N)tempfileNamedTemporaryFiler  r
   r   for_grpc_unixnamer^   r   r{   rH  rC   ro   r   r   rT   )sockrh   r  r   rz   rB   s         r   test_flight_domain_socketr  L  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   rZ   r<   )r   r   r  r   N)r>   r@   rA   r?   r  r   ro   r   r  r   r
   rp   rq   rN  r  r{   rH  r   r   rB   r  r  r   _re  s         r   test_flight_large_messager  c  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   rL  rZ   r<   r   r  r   N)r>   r@   rA   r?   r  r   r   r  r   r
   rp   rq   ro   rN  r  r{   rH  r   r   r  s         r   'test_flight_generator_stream_of_batchesr  y  s    88
q)$%!U   D 
 	! #V+v{{34#8>MM&"9"9"B"B6"J"&++/	4 v}}S12;;=}}T"""# # # # # #%   D$#B#DD$D!	D$$D-c            
         t         j                  j                  t        j                  g dt        j                  t        j
                         t        j                                     t        j                  g d      gd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 with dictionaries
    in a GeneratorStream.
    rE   rV   rF   rE   rE   {      iY  i  i7  rZ   r[   r<   r   r  r   Nr>   r@   rA   r?   
dictionaryr6  rO   r   r   r  r   r
   rp   rq   ro   rN  r  r{   rH  r   r   r  s         r   1test_flight_generator_stream_of_batches_with_dictr       
 88
4rxxz27795	7
*+! 3Z	   D 
1	2 #f+v{{34#8>MM&"9"9"B"B6"J"&++/	4 v}}S12;;=}}T"""# # # # # #%   E,+B#E E, E)	%E,,E5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)	z7Try downloading a flight of Table in a GeneratorStream.r   rL  rZ   r<   r   r  r   N)r>   r@   rA   r?   r  r   r   r  r   r
   rp   rq   ro   rN  r  r{   rH  r   r   r  s         r   %test_flight_generator_stream_of_tabler    s    88
q)$%!U   D 
%	& #&+v{{34#8>MM&"9"9"B"B6"J"&++/	4 v}}S12;;=}}T"""# # # # # #r  c            
         t         j                  j                  t        j                  g dt        j                  t        j
                         t        j                                     t        j                  g d      gd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)
zW
    Try downloading a flight of Table with dictionaries
    in a GeneratorStream.
    r  r  rZ   r[   r<   r   r  r   Nr   r  s         r   /test_flight_generator_stream_of_table_with_dictr    r  r  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)	zCTry downloading a flight of RecordBatchReader in a GeneratorStream.r   rL  rZ   r<   r   r  r   N)r>   r@   rA   r?   r  r   r   r  r   r
   rp   rq   ro   rN  r  r{   rH  r   r   r  s         r   3test_flight_generator_stream_of_record_batch_readerr
    s    88
q)$%!U   D 
1	2 #f+v{{34#8>MM&"9"9"B"B6"J"&++/	4 v}}S12;;=}}T"""# # # # # #r  c            
         t         j                  j                  t        j                  g dt        j                  t        j
                         t        j                                     t        j                  g d      gd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)
zc
    Try downloading a flight of RecordBatchReader with dictionaries
    in a GeneratorStream.
    r  r  rZ   r[   r<   r   r  r   Nr   r  s         r   =test_flight_generator_stream_of_record_batch_reader_with_dictr    r  r  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  rI  rJ  r>   ArrowExceptionr{   r
   rH  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  rw   N)r  r   r  r
   rE  r   rI  rJ  r-  r  r   )r  r  r   rf   s       r   test_timeout_firesr    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`   rw   N)r^   r   r  r
   r   r{   rH  r   )r  r  rf   s      r   test_timeout_passesr    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.rX   r[   r<   r   rK   )included_fields)read_optionsrb   rw   rL   N)r>   r@   rA   r?   r^   r   r  r
   r   r   r{   rH  r   num_columnsr\   )expectedr  r  rf   	response1	response2s         r   test_read_optionsr    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)rk  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
   rE  rI  rJ  r/  r  r   r  r  r   s      r   test_http_basic_unauthr"     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
   rE  rw  r~  r   nextr  r   )r  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
   rE  rI  rJ  r/  rw  r~  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
   rE  rw  r  r%  r   r  r   )r  r  r   r&  s       r   test_token_authr/  E  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  rI  rJ  r
   r/  rw  r  r  s     r   test_token_auth_invalidr1  O  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.rv  r  r  r   r     passwordr   r  rK      Bearer token1234N)r  no_op_auth_handlerr  r   r  authenticate_basic_token)r  r  
token_pairs      r   test_authenticate_basic_tokenr9  [  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.rv  r3  r   r  s   badpasswordN)
r  r6  r  r   r  rI  rJ  r
   r/  r7  r  s     r   .test_authenticate_basic_token_invalid_passwordr;  f  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.rv  r3  r   r  r4  r   r  rK   r5  r  test-actionr   r   rf   	   token1234N)r  r6  r  r   r  r7  r
   r   r  r   rE  r  r   r  r  r8  rf   re  s        r   (test_authenticate_basic_token_and_actionrB  p  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.
    rv  r3  r   r  s   test:passwordr  s   Basic r=  r>  r   r?  r   r@  rK   r5  N)r  r6  r  r  r   r  r  r  r
   r   r  r   rE  r  r   r  r  )r  client_auth_middlewarer  encoded_credentialsrf   re  result2s          r   4test_authenticate_basic_token_with_client_middlewarerH    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.)rv  r  r3  r   r  r4  r   r  rK   r5  )s   test-header-1   value1)s   test-header-2   value2r=  r>  r   rw   rJ  rK  N)r  r6  r  r  r   r  r7  r
   r   r  r   rE  r  r   rA  s        r   -test_arbitrary_headers_in_flight_call_optionsrL    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)rI  rJ  r>   r1  r
   r  r^   r"   r   r   test_location_invalidrO    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_schemerR    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.r3   tls_certificateszgrpc+tls://localhost:r`   N)r5   r^   r   rR  r  rI  rJ  r
   FlightUnavailableErrorr{   rH  r   certsr>  r  s      r   test_tls_failsrY    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.r3   rT  r   r2   )tls_root_certsr`   N)
rC   r5   r^   r   r  r{   r
   rH  r   r   rz   rX  r>  r  rB   s        r   test_tls_do_getr]    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.r3   rT  r   Tdisable_server_verificationz4disable_server_verification feature is not availabler`   N)rC   r5   r^   r   r  r   rI  skipr{   r
   rH  r   r   r  r\  s        r   $test_tls_disable_server_verificationrb    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.r3   rT  r   r2   fakehostname)r[  override_hostnamer`   N)
r5   r^   r
   r  r  rI  rJ  rV  r{   rH  rW  s      r   test_tls_override_hostnamerf    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.r7   rZ   r<   r   r   r   r   rK   N)r>   r?   r@   rA   r   r   r  r{   r
   rH  r  r   r   r   from_batchesr   )
rB   rz   batchesr  r  r   r   r   metadata
server_idxs
             r   test_flight_do_get_metadatarl    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   rK   N)r   r   r  r{   r
   rH  
read_chunkr  r   r   r   StopIteration)	batches1batches2r  r  r   r   r   rj  rk  s	            r   1test_flight_metadata_record_batch_reader_iteratorrr    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.r7   rZ   r<   r  rw   r   r   N)r>   r@   rA   r?   r  r  r  r  r   r   r  r{   r
   rH  r   r   )rz   rf   r  r  r   rB   s         r   test_flight_do_get_metadata_v4rt  6  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.r7   rZ   r<   r   r   rK   r   r   N)r>   r?   r@   rA   r   r   r  r   r
   rp   rq   ro   r   r   r   r   rV  r'   r   r   )rB   rz   r  r  r   metadata_readerr   r   rj  r   rk  s              r   test_flight_do_put_metadatarw  C  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   )dtyperZ   r<   r   i   )write_size_limit_bytesr   zexceeded soft limitr  Nr   i  r   )r>   r   rA   r?   nponesr6  r   r   r  r   r
   rp   rq   ro   rI  rJ  FlightWriteSizeExceededErrorrW  rd  limitslicer@   rh  r{   rH  r   )
large_batchr  r  r   rv  excinfosmaller_batchesr   r  actuals
             r   test_flight_do_put_limitr  Y  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)r^   r   r  r{   r
   rH  r'  rI  rJ  r.  rn  )r  r  r   s      r   test_cancel_do_getr  v  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)Nr9   r  )rn  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  r9   r  rK   N)r  r   r  r{   r
   rH  r  EventLockr  r  r  r'  r  joinis_set)	r  r  r  r  r  r  r   r  r  s	       @@@@@r   test_cancel_do_get_threadedr    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
   rE  r%  r  )r  r  r  s      r   test_streaming_do_actionr    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-bodyrE   s   result1	username1	password1rZ   r  r[   z
test.arrowr   r   r   r   r   r   r?  rK   r   Tr@  r=  r>  N)r
   rE  rq  r  rH  rG  rp  r   r>   ro   r   rp   rF  rq   rn   r   r   r   r   r   r   r   rz  rw  r|  rU  r  )	r   rx   re  r  schema_resultdescr   info2rW  s	            r   test_roundtrip_typesr    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   Nr7   rZ   r<   )r%  r&  r'  r(  r)  )r#  r   r  r3  r  rI  rJ  r  r   r
   rE  r,  ru   r>   r?   r@   rA   r-  r.  r/  r0  r   rp   rF  ro   rN  r  )r  r  argexc_typerB   rz   
exceptionsr:  	exceptionr   r   s              r   test_roundtrip_errorsr    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.r7   rZ   r<   r   r   r   c                  d    j                          dxx   dz  cc<   j                         y y )Nr   rK   )r'   )countrv  s   r   _reader_threadz:test_do_put_independent_read_write.<locals>._reader_thread   s0    !&&(4aA "&&(4r   r  rK   r   r   N)r>   r?   r@   rA   r   r   r  r   r
   rp   rq   ro   r  r  r  r   r   r   r   rV  done_writingr  r  )rB   rz   r  r  r   r  r  ri  r   r   rj  r  rv  s              @@r   "test_do_put_independent_read_writer    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  rD  r   r  r   rK   r   s   right valueN)r  r  r   r  r  r   r
   rE  r  r  r   )r  r  r  rd  s       r   "test_server_middleware_same_threadr  5  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  rD  r   Nr   r4  )r  r  r   r  rI  rJ  r>   ArrowNotImplementedErrorr  r   r
   r/  r   rE  r  r%  r  r   )r  r  responses      r   test_middleware_rejectr  A  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  rD  r   r   N)#r  r  r   r   r  r
   rp   rF  rI  rJ  r   r  ru   r   r   r{   rH  r   r>   ro   r  r   rE  r   r   r  LIST_FLIGHTSGET_FLIGHT_INFO
GET_SCHEMADO_GETDO_PUT	DO_ACTIONr   DO_EXCHANGEr  )server_middlewareclient_middlewarer  r  r   r   r  r  s           r   test_middleware_mappingr  W  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   r5  r   r6  )	r#  r   r  r  r   r
   rE  r0  
extra_info)r  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.r3   r   Tr2   )rU  verify_clientroot_certificatesr   )r[  
cert_chainprivate_keyr`   N)r5   rC   r^   r   r  r0   r1   r{   r
   rH  r   r   )rX  rz   r>  r  rB   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)rK  r   rL  rZ   r<   r   r@  N)r>   r@   rA   r?   r  r<  r   r  r
   rp   rF  r   r   )r  r  r  r   r   r   rz   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                  4   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 |j.                  j0                  d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)rP  r   rL  rZ   r<      r   r   rA  Nr   )r>   r@   rA   r?   r  r   r<  r   r  r
   rp   rF  r   rM  ro   rW  r  rn  rB   rR  r  r   rU  r   r   )
rB   ri  r  r  r   r   r   r   r   expected_bufs
             r   test_doexchange_putr    ss   88
q)$%!U   D ooCo0G		 26+v{{3428>,,88@
++J7 
	2LL%  *""5)*!%%'E::%%%s7|,33G<L%%555<<,,111
	2	2 2 2
	2 
	2	2 2 2 2s=   F56F+B1E6F%F6E?;FF	FF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}
|D ]}  }|j+                  |       |j(                  | j(                  k(  sJ |j!                         }	|	j"                  |k(  sJ |	j$                  J |
dz  }
|j,                  j.                  |
k(  r}J  t1        |      D ]  \  }}t        |      j                  d
      }|j3                  ||       |j!                         }	|	j"                  |k(  sJ |	j$                  |k(  sJ |
dz  }
|j,                  j.                  |
k(  r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.r   rL  rZ   r<   r  r   r   r?  r:   r   NrK   )r>   r@   rA   r?   r  r   r<  r   r  r
   rp   rF  r   rR  r   rQ  rn  rB   rU  rM  ro   rW  r   r   r   rV  )rB   ri  r  r  r   r   r   ir   r   rS  r   s               r   test_doexchange_echor    s}   88
q)$%!U   D ooCo0G		 !F6+v{{34!F8>,,88A
++J7 	F2Y 1!fmmG,%%c*))+zz)))))S0001 LL%K  F""5)}}333))+zzU***))111q ||66+EEEF &g. F5!fmmG,**5#6))+zzU***))S000q ||66+EEEF-	F	!F !F !F	F 	F	!F !F !F !FsQ   I856I,+A'I BI 2BI I I,I8 I)%I,,I5	1I88J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   rL  rZ   r<   r  r   r  rw   r   r?  N)r>   r@   rA   r?   r  r   r  r  r  r  r<  r   r  r
   rp   rF  r   rM  ro   rW  rn  rB   rU  )
rB   ri  rf   r  r  r   r   r   r   r   s
             r   test_doexchange_echo_v4r    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   rK   i  rL   i  )rZ   r[   cr<   rM   i  rZ  r   rB  N)r>   r@   rA   r?   r  r<  r   r  r
   rp   rF  r   rM  ro   rN  r  r   )rB   r  r  r  r   r   r   rz   s           r   test_doexchange_transformr  	  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  rD  r   r   r   asciiN)r  r(  r  r   r  r%  r   r
   rE  r  r   r  astliteral_evalr  r$  r  r  r  bytesr   r  )r  r  r  r  raw_headersr  headerr  s           r   test_middleware_multi_headerr  #	  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.r3   rT  )zgrpc.ssl_target_name_overriderd  r   r2   )r[  generic_optionsr`   N)zgrpc.max_receive_message_length    )r5   r^   r
   r  r  rI  rJ  rV  r{   rH  r  r>   r1  r.  )rX  r>  rf   r  s       r   test_generic_optionsr  9	  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>   ro   r   rA   r
   r   r  r  )rg   rs   rx   ro   r%   s        r   r{   zCancelFlightServer.do_getT	  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>   ro   r   rA   rM  r  rW  r  r   )rg   rs   r   r   r   ro   r%   s          r   r   zCancelFlightServer.do_exchangeY	  sg    2^^''6':V&&(r"JJsO &&(r   N)r}   r~   r   r   r{   r   r"   r   r   r  r  Q	  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_threadg	  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  rI  rJ  r  r  KeyboardInterruptfailrd  r  r>   ArrowCancelled__context__)r   texc_infor  	exc_typesr  s       r   r  ztest_interrupt.<locals>.testm	  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_threadrI  ra  r  r>   r  r  r   r  r{   r
   rH  r   rp   rF  r   r  r.  )r  r  r  r   r   r   r  r  s         @@r   test_interruptr  b	  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  r9   )r  r
   r  r  rI  rJ  r  r{   rH  r   r^  )r  r  r  rz   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)Nr1  r2  r   z%Failed to serialize Flight descriptorr  )r
   rp   rF  r   r  r  rI  rJ  OSErrorr   r>   ro   r  r  r   )large_descriptorr  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   r1  r2  r   zapp_metadata size overflowr  )r
   rp   rF  r   r  r  rI  rJ  r>   ArrowCapacityErrorr   ro   rQ  r  r   r/  r  r{   rH  r   r  )r   rj  r  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)rI   jsondumpsVALUESr   r  r   r   s      r   r   z ActionNoneFlightServer.do_action	  sV    ;;+%JJt{{+227;<<[[H$KKt$!!r   N)r}   r~   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
   rE  r  loadsr%  r  r   )r  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.
    rE   r^  )r  r   r6  c                   "    e Zd Z fdZ fdZy)0test_write_error_propagation.<locals>.FailServerc                     r   r"   rg   rs   r   r   r   excs        r   r   z7test_write_error_propagation.<locals>.FailServer.do_put	      Ir   c                     r   r"   r  s        r   r   z<test_write_error_propagation.<locals>.FailServer.do_exchange	  r  r   N)r}   r~   r   r   r   )r  s   r   
FailServerr  	  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>._reader
  s1    KKM %%     ++Tr  rK   r  Nc                  \    	 	  j                          # t        j                  $ r Y y w xY wr   )rn  r
   r  r  s   r   r  z-test_write_error_propagation.<locals>._reader
  s4    %%' %% r  r1  )r
   r.  rp   rF  r>   ro   r6  r   r   r  r   r  r  r  rI  rJ  rW  r7  rd  r  r  r  r   rQ  )expected_messageexpected_infor   ro   r  r  r  r   r  r  r  r  r   s              @@r   test_write_error_propagationr  	  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   2
  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   ).0r1   rd  s      r   	<genexpr>z0TracingFlightServer.do_action.<locals>.<genexpr>C
  s2      ; S% 55'"**73 ;s   #%)r  trace_contextr  )rg   rs   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$  rD  r   )s   traceparents7   00-000ff00f00f0ff000f0f00ff0f00fff0-000f0000f0f00000-00)s
   tracestater   r=  )r   r   rw   )r"  r
   TracingServerMiddlewareFactoryr   r  r   r   )r  r  rf   rd  s       r   test_tracingr+  G
  s    	v<<>) 
 
+v{{34 9? **5 	4
  %%j'%B 	E	     s"   B1A<+B<B	BBwin32z6Opentelemetry traces don't appear on stdout on Windowsc                  V   t               st        j                  d       d} t        j                  j                         }d|d<   d|d<   t        j                  t        j                  d| g|d	      }|j                  d
k(  sJ |j                         d}d|j                  v sJ |       y )Nz"Arrow not built with OpenTelemetrya  if 1:
        import pyarrow.flight as flight
        from pyarrow.flight import FlightServerBase, FlightClient

        class SimpleServer(FlightServerBase):
            def do_action(self, context, action):
                return []

        with SimpleServer(
            middleware={"otel": flight.TracingServerMiddlewareFactory()}
        ) as server:
            with FlightClient(('localhost', server.port)) as client:
                list(client.do_action((b"", b"")))
        ostreamARROW_TRACING_BACKENDzpyarrow-testing-serviceOTEL_SERVICE_NAMEz-cT)envcapture_outputr   z%Expected service name in trace outputs%   service.name: pyarrow-testing-service)r   rI  ra  r   r   copy
subprocessrunsys
executable
returncodestderrstdout)coder1  resmsgs       r   +test_tracing_server_middleware_emits_tracesr>  Z
  s    
 $%89D **//
C#,C 8C
..#..$53(,.C>>Q*

*
1C3szzAF3FAr   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:9643Tr_  zRArgument 'schema' has incorrect type \(expected pyarrow.lib.Schema, got NoneType\)r  rE   r  )r   rI  rJ  rK  r   r
   rp   rF  )r  r=  s     r   .test_do_put_does_not_crash_when_schema_is_noner@  y
  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
   rn   r>   ro   r   s      r   r   zJtest_headers_trailers.<locals>.HeadersTrailersFlightServer.get_flight_info
  sh    z>:~/@A_=1CD$$		" r   N)r}   r~   r   r   r"   r   r   HeadersTrailersFlightServerrC  
  s    		r   rM  c                       e Zd Zd Z fdZy)?test_headers_trailers.<locals>.HeadersTrailersMiddlewareFactoryc                     g | _         y r   r=  r  s    r   rd   zHtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.__init__
  s	    DLr   c                      |       S r   r"   )rg   r   HeadersTrailersMiddlewares     r   r  zJtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.start_call
  s    ,T22r   N)r}   r~   r   rd   r  )rR  s   r    HeadersTrailersMiddlewareFactoryrO  
  s    		3r   rS  c                       e Zd Zd Zd Zy)8test_headers_trailers.<locals>.HeadersTrailersMiddlewarec                     || _         y r   r  r  s     r   rd   zAtest_headers_trailers.<locals>.HeadersTrailersMiddleware.__init__
  s	    "DLr   c                     |j                         D ]3  \  }}|D ])  }| j                  j                  j                  ||f       + 5 y r   )r  r  r  r  )rg   r  r1   r  rd  s        r   r  zItest_headers_trailers.<locals>.HeadersTrailersMiddleware.received_headers
  sF    &}} >V# >ELL((//e=>>r   N)r}   r~   r   rd   r  r"   r   r   rR  rU  
  s    	#	>r   rR  r   rD  r   )rE  rF  )rG  s   headervalue)rH  rI  )rJ  s   trailervalueN)
r   r   r   r   r  r   r
   rp   rq   r  )rM  rS  r  r  r  rR  s        @r   test_headers_trailersrX  
  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c                  J  	 t        ddddd      t        ddddd      d	 G 	fdd	t              }  |        5 }t        d
|j                  f      5 }t	               }dD ]  }t
        j                  j                  |      }|j                  |t        j                  t        j                  j                  d                  \  }}|5  |j                  |j                  t        j                  j                  |dk(               |j                  |       |j!                          |j#                         }d d d        j%                  |      sJ |j&                  	|   k(  rJ  	 d d d        d d d        y # 1 sw Y   ExY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr   rM   rL   rK   r   r  )dict_deltasdict_replacementc                       e Zd Z fdZy)Dtest_flight_dictionary_deltas_do_exchange.<locals>.DeltaFlightServerc                    t               }|j                         }|j                  |      sJ |j                  |j                  j                            k(  sJ |j                  dk(  rNt        j                  j                  d      }|j                  |j                  |       |j                  |       |j                  dk(  r-|j                  |j                         |j                  |       y y )Ns   dict_deltasTemit_dictionary_deltasrw   s   dict_replacement)rT   r   r   r   r:  r  r>   r  r  rM  ro   rN  )	rg   rs   r   r   r   expected_tablereceived_tablerf   expected_statss	           r   r   zPtest_flight_dictionary_deltas_do_exchange.<locals>.DeltaFlightServer.do_exchange
  s    /1N#__.N!((888<<>*2D2D2K2K2M#NNNN!!^3&&000M^22GD"">2!!%88^223"">2 9r   N)r}   r~   r   r   )rc  s   r   DeltaFlightServerr]  
  s    	3r   rd  r   Tr_  )write_optionsrw   rZ  )r   r^   r   r  rT   r
   rp   rF  r   r   r>   r  r  rM  ro   rN  r  r   r   r   )
rd  r  r  ra  r:  r   r   r   rb  rc  s
            @r   )test_flight_dictionary_deltas_do_exchangerf  
  s     #$"#&'
 & #$"#&'
N"30 3 
	 ;+v{{34;8>+-: 	;G00<<WEJ#//00"$&&"8"8/3 #9 #5 0 NFF  3^22BFF<R<R,3},D =S =G H"">2##%!'!23 "((888<<>'#::::%	;; ; ;3 3; ; ; ;sC   FA:FA0F	=-F,F0FF
FF	FF"c                    | j                   dk(  rdd d d dS | j                   dk(  rgddgt        j                  j                  d      t        j                  j	                  d	t        j                  j
                  j                  
      dS i S )NdefaultrM   )r  r  re  r  allr  )s   abcs   defzstd)compressionF)use_threadsensure_alignment)paramr>   r  r  r   	AlignmentDataTypeSpecific)requests    r   call_options_argsrr  
  s    }}	!! 	
 	
 
%	()VV333GFF11!!#!1!1!B!B 2 	
 	
 	r   rr  rh  ri  T)indirectc                     t        di | }|j                         }| j                         D ]  \  }}|||v sJ | d| |v rJ  y )N=r"   )r   __repr__r  )rr  call_optionsr]  r  vals        r   test_call_options_reprry  
  sh     %9'89L  "D%++- &S;$;;au~%%%&r   )r  r  r  r   r    r  r   r4  r6  r  r  r  r)   r  r   numpyr{  ImportErrorrI  r   r>   pyarrow.libr   r   r   r   pyarrow.utilr   pyarrow.testsr	   r
   r   r   r   r   r   r   r   r   r   r   rL  mark
pytestmarkr   r#   r.   r5   rC   rT   r\   r^   r   r   r   r   r   r   r   r   r   r  r  r  r#  r<  rg  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r*  r/  rX  r  r  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.  r"  r(  r+  r/  r1  %header_auth_server_middleware_factoryr6  r9  r;  rB  rH  rL  rO  rR  requires_testing_datarY  r]  rb  rf  rl  rr  rt  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  large_memoryr  r   r  r  r  r   r"  r+  platformr>  r@  rX  rf  fixturerr  parametrizery  r"   r   r   <module>r     sO  $    	     
         T T '   " [[

B
";
<2E+ ED&+ &R' *"- """"2 """.> ""0* 06+. +#3 .. ."E 0 E F!1 F&7' 7*.A( .AbJ#+ J#Z!2 0!2 ". .. $' $
/(? 
/1!1 16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 ."J@Z`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 """ #"$!20(FV20!.B, "" #.) " ) )X# 1  1  "  "@
"- 
"
? C CL)	;* 	;& CLLG+S  UGUG:#&IR5;p  , )U+d  <
&<
&sV  	B$  F%+V"L"+16((06--06--s$    Z1 %Z? 1Z<;Z<?[ [ 