
    /_iQ}                       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 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jN                  j6                  Z(d Z)d	 Z*d
 Z+d Z,d Z-d Z.d Z/ G d de      Z0 G d de      Z1 G d de      Z2 G d de2      Z3 G d de      Z4 G d de      Z5 G d de      Z6 G d de      Z7 G d d e      Z8 G d! d"e      Z9 G d# d$e      Z: G d% d&e      Z; G d' d(e      Z< G d) d*e      Z= G d+ d,e       Z> G d- d.e      Z? G d/ d0e       Z@ G d1 d2e      ZAd3 ZB G d4 d5e$      ZC G d6 d7e#      ZD G d8 d9e"      ZE G d: d;e!      ZF G d< d=e      ZG G d> d?e"      ZH G d@ dAe!      ZI G dB dCe      ZJ G dD dEe!      ZK G dF dGe"      ZL G dH dIe      ZM G dJ dKe      ZN G dL dMe"      ZO G dN dOe$      ZP G dP dQe#      ZQ G dR dSe"      ZR G dT dUe$      ZS G dV dWe$      ZT G dX dYe#      ZU G dZ d[e"      ZV G d\ d]e!      ZW G d^ d_e      ZXd` ZYda ZZdb Z[dc Z\dd Z]ejN                  j                  ejN                  j                  de               Z_df Z`dg Zadh ZbejN                  j                  di        Zddj Zedk Zfdl Zgdm Zhdn Zi G do dpe      Zjdq Zkdr Zlds ZmejN                  j                  ej                  dtk(  duv      dw        ZpejN                  j                  dx        Zqdy Zrdz Zsd{ Ztd| Zud} Zv e=d~di      Zw e?d~di      ZxejN                  j                  d        ZyejN                  j                  ej                  dtk(  dv      d        Zzd Z{d Z|d Z} eE       Z~ eA       Zd Zd Zd Zd Zd Zd Zd ZejN                  j                  ejN                  j                  d               ZejN                  j                  d        ZejN                  j                  d        ZejN                  j                  d        Zd Zd Zd Zd ZejN                  j                  d        ZejN                  j                  d        ZejN                  j                  ejN                  j                  d               Zd Zd Zd Zd Zd Zd Zd Zd ZejN                  j                  d        Zd Zd Zd Zd Zd Zd ZejN                  j                  d        Z G d de      ZejN                  j                  d        Zd ZejN                  jL                  ejN                  j                  d               ZejN                  jL                  ejN                  j                  d               Z G d de2      Zd ZejN                  j                  d        Zd Z G d de      Zd Zd Zd Zd Zejd                  d        ZejN                  ji                  dddgd      d        Zy# e$ r dZY w xY w# e$ r dZe&e&cZZe&e&cZZ e&e&cZ!Z"e&e&cZ#Z$e&Z%Y w xY w)    N)datetime)IpcReadOptions	ReadStatstobytes)find_free_port)util)flight)	FlightClientFlightServerBaseServerAuthHandlerClientAuthHandlerServerMiddlewareServerMiddlewareFactoryClientMiddlewareClientMiddlewareFactoryFlightCallOptionsc                      dd l } y )Nr   )pyarrow.flight)pyarrows    X/var/www/html/land_sniper/venv/lib/python3.12/site-packages/pyarrow/tests/test_flight.pytest_importr   A   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"   F   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-   N   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_certsr4   ]   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_tablerB   n   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)rD   rE   rF   new)   r   N   rJ   r      
some_dictsr;   )r=   r>   utf8chunked_arrayDictionaryArrayr@   r?   )dict_valuesnew_dict_valuesrA   s      r   simple_dicts_tablerS   u   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)rD   barrE   quxrJ   rK   rL      abr;   )r=   r?   r@   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__rB   rS   r[   table_factoriesoptions)selflocationre   kwargs	__class__s       r   rc   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rf   contextcriterias      r   list_flightsz!ConstantFlightServer.list_flights   sL     t}}$##		"''008  %s   AAc                      | j                   |j                            }t        j                  || j                        S )Nre   )rd   ticketr	   RecordBatchStreamre   )rf   rr   rw   tables       r   do_getzConstantFlightServer.do_get   s4     4$$V]]35''t||DDr   NN)	__name__
__module____qualname____doc__rl   rc   rt   rz   __classcell__ri   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!   rb   rc   re   rf   re   rh   ri   s      r   rc   zMetadataFlightServer.__init__       "6"r   c                     t        j                  g d      g}t         j                  j                  |dg      }t	        j
                  |j                  | j                  |      | j                        S )Nr6   rY   r;   rv   )	r=   r>   r?   r@   r	   GeneratorStreamrn   number_batchesre   )rf   rr   rw   rA   ry   s        r   rz   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   r6   rJ   rY   <i   r8   )statsnum_messagesequalsr=   RecordBatchr@   r>   structunpack
to_pybyteswritepacknum_record_batches)
rf   rr   
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   )ry   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   rc   rz   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   )rb   rc   last_messageexpected_schema)rf   rg   r   rh   ri   s       r   rc   zEchoFlightServer.__init__   s%    ,V, .r   c                 @    t        j                  | j                        S r   )r	   rx   r   rf   rr   rw   s      r   rz   zEchoFlightServer.do_get   s    ''(9(9::r   c                 |    | j                   r| j                   |j                  k(  sJ |j                         | _        y r   )r   rn   read_allr   rf   rr   r   r   r   s        r   r   zEchoFlightServer.do_put   s2    ''6==888"OO-r   c                     |D ]  } y r   r!   )rf   rr   r   r   r   chunks         r   do_exchangezEchoFlightServer.do_exchange   s     	E	r   r{   )	r|   r}   r~   r   rc   rz   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   rn   r   r   s      r   rz   zEchoStreamFlightServer.do_get   s;    %%$$((t(<> 	>r   c                     g S r   r!   rf   rr   s     r   list_actionsz#EchoStreamFlightServer.list_actions   s    	r   c                     |j                   dk(  r/|j                         |j                         j                  d      gS t        )Nwho-am-iutf-8)rH   peer_identitypeerencodeNotImplementedErrorrf   rr   actions      r   	do_actionz EchoStreamFlightServer.do_action   s9    ;;*$))+W\\^-B-B7-KLL!!r   N)r|   r}   r~   r   rz   r   r   r!   r   r   r   r      s    @>
"r   r   c                       e Zd ZdZd Zd Zy)GetInfoFlightServerz)A Flight server that tests GetFlightInfo.c                    t        j                  t        j                  dt        j                         fg      |t        j
                  ddg      t        j
                  dt         j                  j                  dd      gt        j                  d      j                  t        j                  d            d      gd	d
dd      S )NrY   r   grpc://test	localhost  2023-04-05T12:34:56.789012345nszendpoint app metadatarJ   *   Tzinfo app metadata)r	   rm   r=   rn   int32FlightEndpointLocationfor_grpc_tcpscalarcast	timestamprf   rr   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	   SchemaResultrn   )rf   rr   r   infos       r   
get_schemazGetInfoFlightServer.get_schema  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_actions  s     ((***s   N)r|   r}   r~   r   classmethodr   r   r!   r   r   r   r     s    1
 
+r   r   c                       e Zd ZdZd Zy)ListActionsErrorFlightServerr   c              #      K   d d y w)N)r   r   rD   r!   r   s     r   r   z)ListActionsErrorFlightServer.list_actions&  s     s   
N)r|   r}   r~   r   r   r!   r   r   r   r   #  s
    1r   r   c                   0     e Zd ZdZd fd	Zd Zd Z xZS )CheckTicketFlightServerzDA Flight server that compares the given ticket to an expected value.c                 4    t        |   |fi | || _        y r   )rb   rc   expected_ticket)rf   r   rg   rh   ri   s       r   rc   z CheckTicketFlightServer.__init__.  s    ,V,.r   c                     | j                   |j                  k(  sJ t        j                  g dt        j                               g}t        j
                  j                  |dg      }t        j                  |      S )Nr6   rG   rY   r;   )	r   rw   r=   r>   r   r?   r@   r	   rx   )rf   rr   rw   data1ry   s        r   rz   zCheckTicketFlightServer.do_get2  s`    ##v}}444-BHHJ?@$$U3%$8''..r   c                 .    |j                         | _        y r   )r   r   )rf   rr   r   r   s       r   r   zCheckTicketFlightServer.do_put8  s    "OO-r   r   )r|   r}   r~   r   rc   rz   r   r   r   s   @r   r   r   +  s    N//.r   r   c                   ^    e Zd ZdZ ej
                  d ej                         fg      Zd Zy)InvalidStreamFlightServerzEA Flight server that tries to return messages with differing schemas.rY   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 )Nr6   rG   )g      $g      g              @g      $@rY   r;   )
r=   r>   r   float64rH   r?   r@   rn   r	   r   )rf   rr   rw   r   data2table1table2s          r   rz   z InvalidStreamFlightServer.do_getA  s    -BHHJ?@7bjjlKLzzUZZ'''%%eC5%9%%eC5%9}}+++%%dkkFF3CDDr   Nr|   r}   r~   r   r=   rn   r   rz   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.rY   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_datar8   rn   )rw   rn   empty_tabler=   r   r@   ranger	   r   	itertoolsrepeat)rf   rr   rw   rA   s       r   rz   z!NeverSendsDataFlightServer.do_getQ  s    ==M) '')'')**E!H:dkk*JD
 ))$++t<<%%KK))$++*A*A*CDF 	Fr   Nr   r!   r   r   r   r   L  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 )NrY   )r	   r   r=   rn   r   slow_streamr   s      r   rz   zSlowFlightServer.do_getb  s:    %%bii#rxxz1B0C&D&*&6&6&8: 	:r   c                 0    t        j                  d       g S N      ?)timesleepr   s      r   r   zSlowFlightServer.do_actionf  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)Nr6   rG   rY   r;   r9   )r=   r>   r   r?   r@   r  r  )r   s    r   r
  zSlowFlightServer.slow_streamj  se     -BHHJ?@hh""5"66 	

2hh""5"66s   BBN)r|   r}   r~   r   rz   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invalidr0   )
r	   FlightInternalErrorFlightTimedOutErrorFlightCancelledErrorFlightUnauthenticatedErrorFlightUnauthorizedErrorr   r=   ArrowInvalidKeyErrorr!   r   r   error_caseszErrorFlightServer.error_casesw  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
        )NrD   protobuf   this is an error message)r  r"  rH   r	   r  r   )rf   rr   r   r"  err_msgs        r   r   zErrorFlightServer.do_action  s\    '335;;+%*+fkk*511[[J&1G00@@!!r   c              #      K   t        j                  t        j                  g       t         j                  j                  d      g        t        j                  d      w)Nrk   rD   )r	   rm   r=   rn   ro   rp   r  rq   s      r   rt   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   internalrD   s   timedouts   cancels   unauthenticateds   unauthorizeds   protobufr%  )commandr	   r  r  r  r  r  )rf   rr   r   r   r   r&  s         r   r   zErrorFlightServer.do_put  s    ,,,U33;.,,U339,--e44#5533E::?20077;.1G00@@ /r   N)	r|   r}   r~   r   r   r"  r   rt   r   r!   r   r   r  r  t  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   rc   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=   r   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    (  rY   r;   N)r=   r?   r@   r>   r  beginrn   write_table)rf   rr   r   r   rA   s        r   r6  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.rJ   r   N)	rA   r=   r   r   r   r   write_metadatastrr   )rf   rr   r   r   num_batchesr   s         r   r7  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   Frv   TzShould not happenN)
r   r   rA   r<  rn   re   app_metadatawrite_with_metadatar@  write_batch)rf   rr   r   r   startedr   s         r   r5  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   rn   r=   types
is_integerrH   r   reprr   num_rowsr   as_pyr?   r@   r>   r<  r=  )rf   rr   r   r   fieldry   sumscolumnrowvalueresults              r   r8  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   rc   r   r6  r7  r5  r8  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   rb   rc   credsrf   rZ  ri   s     r   rc   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usernamerZ  r  passwordr   r   )rf   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 providedr^  )r	   r  rZ  rf   tokens     r   is_validz#HttpBasicServerAuthHandler.is_valid  s9    334HII

"33NCCr   r|   r}   r~   r   rc   rf  rj  r   r   s   @r   rV  rV    s    A/r   rV  c                   .     e Zd ZdZ fdZd Zd Z xZS )HttpBasicClientAuthHandlerrW  c                 f    t         |           t        j                  ||      | _        d | _        y r   )rb   rc   r	   r_  
basic_authri  rf   ra  rb  ri   s      r   rc   z#HttpBasicClientAuthHandler.__init__  s)     **8X>
r   c                     | j                   j                         }|j                  |       |j                         | _        y r   )ro  	serializer   r&   ri  )rf   rc  rd  re  s       r   rf  z'HttpBasicClientAuthHandler.authenticate  s-    ((*t]]_
r   c                     | j                   S r   ri  rf   s    r   	get_tokenz$HttpBasicClientAuthHandler.get_token      zzr   r|   r}   r~   r   rc   rf  rv  r   r   s   @r   rm  rm  
  s    A
%
r   rm  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   rY  r[  s     r   rc   zTokenServerAuthHandler.__init__  r\  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&   rZ  r   base64	b64encoder	   r  )rf   rc  rd  ra  rb  s        r   rf  z#TokenServerAuthHandler.authenticate"  sf    ==?==?tzz!djj&:h&FNN6++J,ABC33+- -r   c                     t        j                  |      }|j                  d      st        j                  d      |dd  S )Nr~  zinvalid token   )r  	b64decode
startswithr	   r  rh  s     r   rj  zTokenServerAuthHandler.is_valid+  s=      '
+33ODDQRyr   rk  r   s   @r   rz  rz    s    D-r   rz  c                   .     e Zd ZdZ fdZd Zd Z xZS )TokenClientAuthHandlerr{  c                 L    t         |           || _        || _        d| _        y )Nr   )rb   rc   ra  rb  ri  rp  s      r   rc   zTokenClientAuthHandler.__init__5  s#      
r   c                     |j                  | j                         |j                  | j                         |j                         | _        y r   )r   ra  rb  r&   ri  rf   rc  rd  s      r   rf  z#TokenClientAuthHandler.authenticate;  s/    t}}%t}}%]]_
r   c                     | j                   S r   rt  ru  s    r   rv  z TokenClientAuthHandler.get_token@  rw  r   rx  r   s   @r   r  r  2  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   rf  zNoopAuthHandler.authenticateG  s    r   c                      y)zV
        Returning an empty string.
        Returning None causes Type error.
        r   r!   rh  s     r   rj  zNoopAuthHandler.is_validJ  s    
 r   N)r|   r}   r~   r   rf  rj  r!   r   r   r  r  D  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_keyr0   s      r   case_insensitive_header_lookupr  R  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_credentialru  s    r   rc   z*ClientHeaderAuthMiddlewareFactory.__init__^  s
    !r   c                     t        |       S r   )ClientHeaderAuthMiddlewarerf   r   s     r   
start_callz,ClientHeaderAuthMiddlewareFactory.start_calla  s    )$//r   c                     || _         y r   r  )rf   r  s     r   set_call_credentialz5ClientHeaderAuthMiddlewareFactory.set_call_credentiald  s
    .r   N)r|   r}   r~   r   rc   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rf   r  s     r   rc   z#ClientHeaderAuthMiddleware.__init__x  	    r   c                     t        |d      }|r0| j                  j                  d|d   j                  d      g       y y )NAuthorization   authorizationr   r   )r  r  r  r   )rf   r  auth_headers      r   received_headersz+ClientHeaderAuthMiddleware.received_headers{  sB    4WoNLL,, A%%g..0 1 r   N)r|   r}   r~   r   rc   r  r!   r   r   r  r  h  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BasicrJ   r   :testrb  	token1234Bearer)r  splitr  r  decoder	   r  HeaderAuthServerMiddleware)	rf   r   r  r  valuesri  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   rt  rh  s     r   rc   z#HeaderAuthServerMiddleware.__init__  s	    
r   c                 $    dd| j                   z   iS )NauthorizationzBearer rt  ru  s    r   sending_headersz*HeaderAuthServerMiddleware.sending_headers  s    TZZ!788r   Nr|   r}   r~   r   rc   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      )Nre  r  r  rJ   r   zNo token auth middleware found.)get_middlewarer  r  r  r   r	   r  )rf   rr   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rf   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   rd  )rf   rd  s     r   rc   z)ArbitraryHeadersServerMiddleware.__init__  s	     r   c                     | j                   S r   r  ru  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)	rf   rr   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)rf   r  s     r   rc   zHeaderServerMiddleware.__init__  s
    *r   N)r|   r}   r~   r   rc   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   )rf   rr   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  rL  client_headersr   )rf   rr   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   rb  zInvalid token)methodr	   FlightMethodLIST_ACTIONSr   r  r  )rf   r   r  ri  s       r   r  z/SelectiveAuthServerMiddlewareFactory.start_call  sl    ;;&--:::N+33J??aJ33ODD%e,,r   Nr  r!   r   r   r  r    s
    ;-r   r  c                       e Zd Zd Zy)$SelectiveAuthClientMiddlewareFactoryc                     t               S r   )SelectiveAuthClientMiddlewarer  s     r   r  z/SelectiveAuthClientMiddlewareFactory.start_call  s    ,..r   N)r|   r}   r~   r  r!   r   r   r  r    s    /r   r  c                       e Zd Zd Zy)r  c                 
    ddiS )Nr  rb  r!   ru  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   rb   rc   methodsrf   ri   s    r   rc   z)RecordingServerMiddlewareFactory.__init__       r   c                 N    | j                   j                  |j                         y r   r  appendr  r  s      r   r  z+RecordingServerMiddlewareFactory.start_call$      DKK(r   r|   r}   r~   r   rc   r  r   r   s   @r   r  r        *r   r  c                   (     e Zd ZdZ fdZd Z xZS ) RecordingClientMiddlewareFactoryr  c                 0    t         |           g | _        y r   r  r  s    r   rc   z)RecordingClientMiddlewareFactory.__init__,  r  r   c                 N    | j                   j                  |j                         y r   r  r  s     r   r  z+RecordingClientMiddlewareFactory.start_call0  r  r   r  r   s   @r   r  r  )  r  r   r  c                       e Zd ZdZd Zd Zy)"MultiHeaderClientMiddlewareFactoryr  c                     i | _         y r   )last_headersru  s    r   rc   z+MultiHeaderClientMiddlewareFactory.__init__8  s     r   c                     t        |       S r   )MultiHeaderClientMiddlewarer  s     r   r  z-MultiHeaderClientMiddlewareFactory.start_call=  s    *400r   N)r|   r}   r~   r   rc   r  r!   r   r   r	  r	  5  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  rD   rU          rE   )zx-textzx-binary-binzx-MIXED-cases   x-other-MIXED-casec                     || _         y r   r  r  s     r   rc   z$MultiHeaderClientMiddleware.__init__L  r  r   c                     | j                   S r   )EXPECTEDru  s    r   r  z+MultiHeaderClientMiddleware.sending_headersO  r  r   c                 N    | j                   j                  j                  |       y r   )r  r  update)rf   r  s     r   r  z,MultiHeaderClientMiddleware.received_headersR  s     	!!((1r   N)r|   r}   r~   r   r  rc   r  r  r!   r   r   r  r  A  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  X  s
    B4r   r  c                       e Zd ZdZd Zd Zy)r  r  c                     || _         y r   )r  )rf   r  s     r   rc   z$MultiHeaderServerMiddleware.__init__b  s
    ,r   c                 "    t         j                  S r   )r  r  ru  s    r   r  z+MultiHeaderServerMiddleware.sending_headerse  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           )rb   rc   	_metadata)rf   argsrh   ri   s      r   rc   z"LargeMetadataFlightServer.__init__l  s!    $)&)-r   c                     t        j                  dt        j                         fg      }t        j                  |t        j
                  dgg|      | j                  fg      S )NrY   rJ   r  )r=   rn   int64r	   r   record_batchr"  )rf   rr   rw   rn   s       r   rz   z LargeMetadataFlightServer.do_getp  sS    S"((*-./%%f__qcU62DNNC/
  	r   c                 :    |j                  | j                         y r   )r@  r"  r   s        r   r   z%LargeMetadataFlightServer.do_exchangev  s    dnn-r   )r|   r}   r~   r   rc   rz   r   r   r   s   @r   r  r  i  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'>rD   r   rU   userpass   foo2023-04-05T12:34:56s   endpoint app metadatarJ   r   T   test app metadatagrpc+tcp://localhost:1234)intr%  z1<pyarrow.flight.SchemaResult schema=(int: int64)>z<pyarrow.flight.FlightInfo schema=None descriptor=<pyarrow.flight.FlightDescriptor path=[]> endpoints=[] total_records=1 total_bytes=42 ordered=True app_metadata=b'test app metadata'>r   s   grpc://testz2023-04-05T01:02:03)expiration_timei  rX   r8   rK   rL   rD  )rL  r	   Actionr   r_  ro   for_commandr   r=   r   r   r   rm   rn   rp   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_reprrG  z  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 )NrD   r   rU   r	   r4  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 )NrD   r      barrJ  r!   r   r   rK  ztest_eq.<locals>.<lambda>  s!    uc*FMM%,HI r   c                  Z    t        j                  dd      t        j                  dd      fS )NrD   rU   rE   r   r!   r   r   rK  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	   r_  r!   r   r   rK  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*  pass2rQ  r!   r   r   rK  ztest_eq.<locals>.<lambda>  s(    !!&&1!!&'24 r   c                  ~    t         j                  j                  d      t         j                  j                  d      fS )NrD   )r	   ro   r5  rp   r!   r   r   rK  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+  rM  r	   r   r!   r   r   rK  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+  r0  grpc+tls://localhost:1234)r	   r   r   r!   r   r   rK  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   rK  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   r3     metarW  r!   r   r   rK  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	   rm   r=   rn   ro   rp   r%  r!   r   r   rK  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	   rm   r=   rn   ro   rp   r5  r!   r   r   rK  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 rV  )r	   rm   r=   rn   ro   rp   r   r!   r   r   rK  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_recordsrJ   r	   rm   r=   rn   ro   rp   r!   r   r   rK  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 )Nre  )total_bytesr   rg  r!   r   r   rK  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)orderedTrg  r!   r   r   rK  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   r3  r]  rg  r!   r   r   rK  ztest_eq.<locals>.<lambda>  sl    		"''002BSJ 		"''002BWN	O r   c                  V    t        j                  d      t        j                  d      fS )Nr0  rY  )r	   r   r!   r   r   rK  ztest_eq.<locals>.<lambda>  s"    !<=!<=? r   c                  V    t        j                  d      t        j                  d      fS rV  )r	   r6  r!   r   r   rK  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 r_  )r	   r   r=   rn   r%  r!   r   r   rK  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	   r7  r!   r   r   rK  ztest_eq.<locals>.<lambda>  s    s#V]]6%:; r   r!   )itemsgenlhs1rhs1lhs2rhs2s         r   test_eqrw    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 )Nre  )rf  ri  )r	   rm   r=   rn   ro   rp   rf  ri  )fi1fi2fi3s      r   test_flight_info_defaultsr|  *  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)	locationsrg   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   )r8  r9  
ValueErrorr   r!   r   r   #test_server_exit_reraises_exceptionr  G  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rg   s   r   r  z-test_client_wait_for_available.<locals>.serveS  s!    

3!(+r   Ttargetdaemonr8   timeoutr  )r   r
   	threadingThreadstartr  wait_for_available)r  r  clientthreadrG  elapsedrg   s         @r   test_client_wait_for_availabler  M  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   rJ   N)r]   r	   connectportlistrt   rl   len)r  r  flightss      r   test_flight_list_flightsr  c  s    		 '6NNK56':@F'')*b000%%&:&C&CD4=!Q&&&	' ' ' ' ' 's#   "B"ABB"B	B""B+c                     t               5 } t        j                  d| j                  f      5 }t	        |j                               g k(  sJ |j                          |j                          t        j                  t        j                        5  t	        |j                                d d d        d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr   )r]   r	   r  r  r  rt   closer8  r9  r=   r   r  r  s     r   test_flight_client_closer  l  s    		 (6NNK56(:@F'')*b000]]2??+ 	($$&'	(( ( (
	( 	(( ( ( (s;   "CA"CC)C1CCCC	CC#c                  <   t               } t               5 }t        j                  d|j                  f      5 }|j                  t        j                  d            j                         }|j                  |       sJ 	 ddd       ddd       t        j                  j                  t        j                  j                  j                        }t        |      5 }t        j                  d|j                  f      5 }|j                  t        j                  d            j                         }|j                  |       sJ |j                  t        j                  d            j                         j                         }|j                  |       sJ 	 ddd       ddd       t        j                   t        j"                  d      5  t        d      5 }t        j                  d|j                  f      5 }|j                  t        j                  d            j                         }ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   LxY w# 1 sw Y   PxY w# 1 sw Y   yxY w)	Try a simple do_get call.r   r_   Nmetadata_versionrv   z+expected IpcWriteOptions, got <class 'int'>matchr   )rB   r]   r	   r  r  rz   r7  r   r   r=   ipcIpcWriteOptionsMetadataVersionV4	to_readerr8  r9  r  )ry   r  r  rA   re   s        r   test_flight_do_get_intsr  v  s   E		 "6NNK56":@}}V]]734==?{{5!!!" "
 ff$$//22 % 4G	g	. "&NNK56":@}}V]]734==?{{5!!! }}V]]734>>@IIK{{5!!!" " 
v//J
L D!"- 	DV[[9:	D>D==w!78AACD	D 	DD D!" " " "" " " "	D 	D 	D 	DD Ds   "IAI>I"I.>BI"I.J"J<3I:/J7JI	II"I+	'I..I7:J?JJ	JJc                     t               } t               5 }t        j                  d|j                  f      5 }|j                  t        j                  d            j                         }t        |d         | j                  d      j                         k(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)r  r   r_   r:   r   N)rB   r]   r	   r  r  rz   r7  read_pandasr  rQ  	to_pylist)ry   r  r  rA   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   r`   rJ   r   rL   rK   r   r   r   num_dictionary_batchesnum_dictionary_deltasnum_replaced_dictionaries)rS   r]   r	   r  r  rz   r7  r   r   r   r   r   )ry   r  r  r   rA   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.r6   rG   rY   r;   s
   the-ticket)r   r   N)r=   r>   r   r?   r@   r   r	   r  r  rz   r7  r   r   )r   ry   r  r  rA   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   rJ   r   s   info app metadatarY   rK   r   Nr   z#2023-04-05T12:34:56.789012345+00:00r   UTCr.  r   )r   r
   r  r   r	   ro   r5  rf  ri  rk  rD  rn   r=   r   r  	endpointsr  r2  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   rY   N)
r   r
   r  r   r	   ro   r5  rn   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  r8  r9  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+  rM  s   bazr!   ru  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-actionrD   arrow-exceptionforeverc               3   Z   K    j                         sd  j                         sy y wrb  )is_cancelled)rr   s   r   rr  z(ConvenienceServer.do_action.<locals>.gen  s&     !..0 L "..0s   %++)rH   r  bodyr=   ArrowMemoryError)rf   rr   r   rr  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  r8  r9  r	   r  r  r   r  s     r   test_nicer_server_exceptionsr    s    		 6+v{{3468>]]633!BD 	1!!,/0	1 ]]633!35 	6!!"345	66 6 6	1 	1	6 	66 6 6 6sR   C)&C	C$-CC,C4C)C
CCCC&	"C))C2c                      t        d      } 	 | j                  dkD  sJ 	 | j                          y# | j                          w xY w)zMake sure port() works.r~  r   N)r   r  shutdown)r  s    r   test_get_portr    s7     !56F{{Qs	   0 Antz'Unix sockets can't be tested on Windows)reasonc                  ,   t        j                         5 } | j                          t        j                  j                  | j                        }t        |      5  t        |      5 }|j                  t        j                  d            }t               }|j                  j                  |j                        sJ |j                         }|j                  |      sJ |j                  t        j                  d            }t               }|j                  j                  |j                        sJ |j                         }|j                  |      sJ 	 ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z3Try a simple do_get call over a Unix domain socket.r  r_   r`   N)tempfileNamedTemporaryFiler  r	   r   for_grpc_unixnamer]   r
   rz   r7  rB   rn   r   r   rS   )sockrg   r  r   ry   rA   s         r   test_flight_domain_socketr  (  s<    
	$	$	& &$

??00;!84 	&X&	&*0]]6==#9:F%'E==''555??$D;;u%%%]]6==#:;F&(E==''555??$D;;u%%%	& 	&& &	& 	& 	& 	&& &s=   AF
E>'C1E2E>!F
2E;7E>>F	F

Fc                  z   t         j                  j                  t        j                  t	        dd            gdg      } t        | j                        5 }t        d|j                  f      5 }|j                  t        j                  j                  d      | j                        \  }}|j                  | d       |j                          |j                  t        j                   d            j#                         }|j%                  |       sJ 	 d	d	d	       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   y	xY w)
zTry sending/receiving a large message via Flight.

    See ARROW-4421: by default, gRPC won't allow us to send messages >
    4MiB in size.
    r   i   rY   r;   )r   r   r  r   N)r=   r?   r@   r>   r  r   rn   r
   r  r   r	   ro   rp   r=  r  rz   r7  r   r   rA   r  r  r   _rT  s         r   test_flight_large_messager  ?  s    88
q*+,!U   D 
$++	6 #&+v{{34#8>MM&"9"9"B"B6"J"&++/	 	4!12v}}S12;;=}}T"""# # # # # #s%   D1/B$D%D1%D.	*D11D:c                  `   t         j                  j                  t        j                  t	        dd            gdg      } t               5 }t        d|j                  f      5 }|j                  t        j                  j                  d      | j                        \  }}|j                  |        |j                          |j                  t        j                   d            j#                         }|j%                  |       sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)	z?Try downloading a flight of RecordBatches in a GeneratorStream.r   r;  rY   r;   r   r  r   N)r=   r?   r@   r>   r  r   r
   r  r   r	   ro   rp   rn   r=  r  rz   r7  r   r   r  s         r   test_flight_generator_streamr  U  s    88
q)$%!U   D 
 	! #V+v{{34#8>MM&"9"9"B"B6"J"&++/	4 v}}S12;;=}}T"""# # # # # #s%   D$#B#DD$D!	D$$D-c                  n   t               5 } t        d| j                  f      5 }t        j                  t
        j                        5  |j                  t        j                  d            j                          ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z+Try streaming data with mismatched schemas.r   r   N)r   r
   r  r8  r9  r=   ArrowExceptionrz   r	   r7  r   r  s     r   $test_flight_invalid_generator_streamr  e  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  rv   N)r  r
   r  r	   r4  r   r8  r9  r  r  r   )r  r  r   re   s       r   test_timeout_firesr  m  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_   rv   N)r]   r
   r  r	   r   rz   r7  r   )r  r  re   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.rW   rZ   r;   r   rJ   )included_fields)read_optionsra   rv   rK   N)r=   r?   r@   r>   r]   r
   r  r	   r   r   rz   r7  r   num_columnsr[   )expectedr  r  re   	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)rZ  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	   r4  r8  r9  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	   r4  rf  rm  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	   r4  r8  r9  r  rf  rm  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	   r4  rf  r  r  r   r  r   )r  r  r   r  s       r   test_token_authr    s    	-?	@ 5F+v{{3458>z3/26:FG((01}}'')W4445 5 5 5 5 5s#   B2A+B&B2&B/	+B22B;c            	      L   t        t              5 } t        d| j                  f      5 }t	        j
                  t        j                        5  |j                  t        dd             ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)r
  r  r   r  r  N)
r   r  r
   r  r8  r9  r	   r  rf  r  r  s     r   test_token_auth_invalidr    s    	-?	@ IF+v{{34I8>]]6<<= 	I 6vw GH	II I I	I 	II I I Is:   B$BB)B1BBBB	BB#c                  
   t        t        dt               i      5 } t        d| j                  f      5 }|j                  dd      }|d   dk(  sJ |d   d	k(  sJ 	 d
d
d
       d
d
d
       y
# 1 sw Y   xY w# 1 sw Y   y
xY w)zATest authenticate_basic_token with bearer token and auth headers.re  r  r  r   r     passwordr   r  rJ      Bearer token1234N)r  no_op_auth_handlerr  r
   r  authenticate_basic_token)r  r  
token_pairs      r   test_authenticate_basic_tokenr    s    	-?13M 
 4
+v{{344 9?44WkJ
!} 0000!} 33334 4 4 4 4 4s"   A9'A-A9-A6	2A99Bc                  P   t        t        dt               i      5 } t        d| j                  f      5 }t        j                  t        j                        5  |j                  dd       ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z7Test authenticate_basic_token with an invalid password.re  r  r   r  s   badpasswordN)
r  r  r  r
   r  r8  r9  r	   r  r  r  s     r   .test_authenticate_basic_token_invalid_passwordr    s    	-?13M 
 E
+v{{34E 9?]]6<<= 	E++G^D	E	E E E	E 	E	E E E Es:   B$BB+B3BB	BB	BB%c            
         t        t        dt               i      5 } t        d| j                  f      5 }|j                  dd      }|d   dk(  sJ |d   d	k(  sJ t        j                  |g
      }t        |j                  t        j                  dd      |            }|d   j                  j                         dk(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z@Test authenticate_basic_token and doAction after authentication.re  r  r   r  r  r   r  rJ   r  r  test-actionr   r   re   	   token1234N)r  r  r  r
   r  r  r	   r   r  r   r4  r  r   r  r  r  re   rT  s        r   (test_authenticate_basic_token_and_actionr    s    	-?13M 
 
;
+v{{34
; 9?44WkJ
!} 0000!} 3333**J<@f&&==4g ' G Hay~~((*l:::
; 
; 
; 
; 
; 
;s#   C"BCC"C	C""C+c            	         t        t        dt               i      5 } t               }t	        d| j
                  f|g      }t        j                  d      }t        j                  dd|z   fg      }t        |j                  t        j                  d	d
      |            }|d   j                  j                         dk(  sJ |j                  d   dk(  sJ |j                  d   dk(  sJ t        |j                  t        j                  d	d
      |            }|d   j                  j                         dk(  sJ |j                  d   dk(  sJ |j                  d   dk(  sJ |j!                          ddd       y# 1 sw Y   yxY w)zTest authenticate_basic_token with client middleware
       to intercept authorization header returned by the
       HTTP header auth enabled server.
    re  r  r   r  s   test:passwordr  s   Basic r  r  r   r  r   r  rJ   r  N)r  r  r  r  r
   r  r  r  r	   r   r  r   r4  r  r   r  r  )r  client_auth_middlewarer  encoded_credentialsre   rT  result2s          r   4test_authenticate_basic_token_with_client_middlewarer%    s   
 
 -?13M 
 
!B!D&++&./
 %../?@**y+>>?4
  f&&==4g ' G Hay~~((*l:::%55a8<LLLL%55a8%& 	& &v''==4g ( G Hqz))+|;;;%55a8<LLLL%55a8%& 	& &1  s   EE??Fc            
      6   t        t        t               t               d      5 } t	        d| j
                  f      5 }|j                  dd      }|d   dk(  sJ |d   d	k(  sJ t        j                  |d
dg      }t        |j                  t        j                  dd      |            }|d   j                  j                         dk(  sJ |d   j                  j                         dk(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z:Test passing multiple arbitrary headers to the middleware.)re  r  r  r   r  r  r   r  rJ   r  )s   test-header-1   value1)s   test-header-2   value2r  r  r   rv   r'  r(  N)r  r  r  r  r
   r  r  r	   r   r  r   r4  r  r   r  s        r   -test_arbitrary_headers_in_flight_call_optionsr)    s(   	%'57!H!J

 8
 +v{{348 9?44WkJ
!} 0000!} 3333**))4
 
 f&&v}}3( )0 ' 2 3ay~~((*i777ay~~((*i777%8 8 8 8 8 8s#   DB4D2DD	DDc                  ,   t        j                  t        j                  d      5  t	        j
                  d       ddd       t        j                  t        j                  d      5  t        d       ddd       y# 1 sw Y   CxY w# 1 sw Y   yxY w)zTest constructing invalid URIs.z.*Cannot parse URI:.*r  %N)r8  r9  r=   r   r	   r  r]   r!   r   r   test_location_invalidr,  3  sm    	r.E	F s 
r.E	F "S!" " " "s   A>)B
>B
Bc                      t        j                  d      j                  dk(  sJ t        j                  d      j                  dk(  sJ y)z,Test creating locations for unknown schemes.zs3://foos   s3://foozhttps://example.com/bar.parquets   https://example.com/bar.parquetN)r	   r   urir!   r   r   test_location_unknown_schemer/  <  sD    ??:&**k999??<=AA*+ + +r   c                     t               } t        | d         5 }t        dt        |j                        z         5 }t        j                  t        j                        5  |j                  t        j                  d            j                          ddd       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   yxY w)z>Make sure clients cannot connect when cert verification fails.r2   tls_certificateszgrpc+tls://localhost:r_   N)r4   r]   r
   rA  r  r8  r9  r	   FlightUnavailableErrorrz   r7  r   certsr-  r  s      r   test_tls_failsr6  C  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.r2   r1  r   r1   )tls_root_certsr_   N)
rB   r4   r]   r
   r  rz   r	   r7  r   r   ry   r5  r-  r  rA   s        r   test_tls_do_getr:  S  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.r2   r1  r   Tdisable_server_verificationz4disable_server_verification feature is not availabler_   N)rB   r4   r]   r
   r  r   r8  skiprz   r	   r7  r   r   r  r9  s        r   $test_tls_disable_server_verificationr?  `  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.r2   r1  r   r1   fakehostname)r8  override_hostnamer_   N)
r4   r]   r	   r  r  r8  r9  r3  rz   r7  r4  s      r   test_tls_override_hostnamerC  q  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.r6   rY   r;   r   r   r   r   rJ   N)r=   r>   r?   r@   r   r
   r  rz   r	   r7  r   r   r   r   from_batchesr   )
rA   ry   batchesr  r  r   r   r   metadata
server_idxs
             r   test_flight_do_get_metadatarI  ~  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   rJ   N)r   r
   r  rz   r	   r7  
read_chunkr   r   r   r   StopIteration)	batches1batches2r  r  r   r   r   rG  rH  s	            r   1test_flight_metadata_record_batch_reader_iteratorrO    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.r6   rY   r;   r  rv   r   r   N)r=   r?   r@   r>   r  r  r  r  r   r
   r  rz   r	   r7  r   r   )ry   re   r  r  r   rA   s         r   test_flight_do_get_metadata_v4rQ    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.r6   rY   r;   r   r   rJ   r   r   N)r=   r>   r?   r@   r   r
   r  r   r	   ro   rp   rn   r   r   r   r   rE  r&   r   r   )rA   ry   r  r  r   metadata_readerr   r   rG  r   rH  s              r   test_flight_do_put_metadatarT    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   )dtyperY   r;   r   i   )write_size_limit_bytesr   zexceeded soft limitr  Nr   i  r   )r=   r   r@   r>   nponesr%  r   r
   r  r   r	   ro   rp   rn   r8  r9  FlightWriteSizeExceededErrorrF  rS  limitslicer?   rE  rz   r7  r   )
large_batchr  r  r   rS  excinfosmaller_batchesr   r  actuals
             r   test_flight_do_put_limitra    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  rz   r	   r7  r  r8  r9  r  rK  )r  r  r   s      r   test_cancel_do_getrc    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)Nr8   r  )rK  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  r8   r  rJ   N)r  r
   r  rz   r	   r7  r  EventLockr  r  rg  r  rf  joinis_set)	r  r  rl  r  rh  ri  r   rj  rk  s	       @@@@@r   test_cancel_do_get_threadedrq    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	   r4  r  r  )r  r  r  s      r   test_streaming_do_actionrs  !  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-bodyrD   s   result1	username1	password1rY   r  rZ   z
test.arrowr   r   r   r   r   r   r.  rJ   r   Tr/  r,  r-  N)r	   r4  r`  rr  r7  r6  r_  r   r=   rn   r   ro   r5  rp   rm   r   r   r   r   r   r   r   ri  rf  rk  rD  r  )	r   rw   rT  ro  schema_resultdescr   info2rF  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   Nr6   rY   r;   )r  r  r  r  r  )r  r
   r  r"  rq  r8  r9  r  r   r	   r4  r  rt   r=   r>   r?   r@   r  r  r  r  r   ro   r5  rn   r=  r  )r  r  argexc_typerA   ry   
exceptionsr)  	exceptionr   r   s              r   test_roundtrip_errorsr  e  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.r6   rY   r;   r   r   r   c                  d    j                          dxx   dz  cc<   j                         y y )Nr   rJ   )r&   )countrS  s   r   _reader_threadz:test_do_put_independent_read_write.<locals>._reader_thread  s0    !&&(4aA "&&(4r   r  rJ   r   r   N)r=   r>   r?   r@   r   r
   r  r   r	   ro   rp   rn   r  r  r  r   r   r   r   rE  done_writingro  r  )rA   ry   r  r  r   r  r  rF  r   r   rG  r  rS  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  r!  r   r  r   rJ   r   s   right valueN)r  r  r
   r  r  r   r	   r4  r  r  r   )r  r  r  rS  s       r   "test_server_middleware_same_threadr    s    	-/( 
 '
+v{{34' 9?v''gs(CDE7|q   
**,&&&' ' ' ' ' 's#   B0A#B$B0$B-	)B00B9c                      t        dt               i      5 } t        d| j                  f      5 }t	        j
                  t        j                        5  t        |j                                ddd       t	        j
                  t        j                        5  t        |j                  t        j                  dd                   ddd       t        d| j                  ft               g      }t        |j                  t        j                  dd                  }d|j                   j#                         k(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   *xY w# 1 sw Y   yxY w)z-Test rejecting an RPC with server middleware.r  r!  r   Nr   r  )r  r  r
   r  r8  r9  r=   ArrowNotImplementedErrorr  r   r	   r  r   r4  r  r  r  r   )r  r  responses      r   test_middleware_rejectr    s=   	46( 
 9
+v{{349 9?]]2667 	($$&'	( ]]6<<= 	<!!&--S"9:;	< &++&<>?
 ((sC)@ABhmm668888#9 9 9
	( 	(	< 	<9 9 9 9sS   E4$E(E-+E(/EA7E(?E4EE(E%!E((E1	-E44E=c                     t               } t               }t        d| i      5 }t        d|j                  f|g      5 }t
        j                  j                  d      }t        j                  t              5  t        |j                                ddd       t        j                  t              5  |j                  |       ddd       t        j                  t              5  |j                  |       ddd       t        j                  t              5  |j                  t        j                   d             ddd       t        j                  t              5  |j#                  |t%        j&                  g             \  }}|j)                          ddd       t        j                  t              5  t        |j+                  t        j,                  dd                   ddd       t        j                  t              5  t        |j/                                ddd       t        j                  t              5  |j1                  |      \  }}|j)                          ddd       t
        j2                  j4                  t
        j2                  j6                  t
        j2                  j8                  t
        j2                  j:                  t
        j2                  j<                  t
        j2                  j>                  t
        j2                  j@                  t
        j2                  jB                  g}| jD                  |k(  sJ |jD                  |k(  sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   ZxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   cxY w# 1 sw Y   zxY w# 1 sw Y   yxY w)z/Test that middleware records methods correctly.r  r!  r   r   N)#r  r  r   r
   r  r	   ro   r5  r8  r9  r   r  rt   r   r   rz   r7  r   r=   rn   r  r   r4  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    s   8:8:	f.?%@	A %5V&++&)*	%5 
,,88=
]]./ 	($$&'	(]]./ 	/"":.	/]]./ 	*j)	*]]./ 	.MM&--,-	.]]./ 	j"))B-@IFALLN	 ]]./ 	<!!&--S"9:;	<]]./ 	($$&'	(]]./ 	**:6IFALLN	
 ,,//**&&&&)),,++	
 !((H444 ((H444K%5 %5 %5	( 	(	/ 	/	* 	*	. 	.	 		< 	<	( 	(	 	-%5 %5 %5 %5s   O"9O7M.!O2M;!O%N7!O%N=!O9N"!O8/N/'!ON<"!O%O	(C4OO".M83O;N ONONO"N,'O/N94O<OO	OOO	O""O+c            
         t               5 } t        d| j                  f      5 }	 t        |j	                  t        j                  dd                   J # t
        j                  $ r+}|j                  J |j                  }|dk(  sJ Y d }~nd }~ww xY w	 d d d        n# 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)Nr   r$  r   r%  )	r  r
   r  r  r   r	   r4  r  
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.r2   r   Tr1   )r2  verify_clientroot_certificatesr   )r8  
cert_chainprivate_keyr_   N)r4   rB   r]   r
   r  r/   r0   rz   r	   r7  r   r   )r5  ry   r-  r  rA   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)r:  r   r;  rY   r;   r   r/  N)r=   r?   r@   r>   r  r+  r
   r  r	   ro   r5  r   r   )r  r  r  r   r   r   ry   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)r?  r   r;  rY   r;      r   r   r0  Nr   )r=   r?   r@   r>   r  r   r+  r
   r  r	   ro   r5  r   r<  rn   rF  r  rK  rA   rA  r  r   rD  r   r   )
rA   rF  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   r;  rY   r;   r  r   r   r.  r9   r   NrJ   )r=   r?   r@   r>   r  r   r+  r
   r  r	   ro   r5  r   rA  r   r@  rK  rA   rD  r<  rn   rF  r   r   r   rE  )rA   rF  r  r  r   r   r   ir   r   rB  r   s               r   test_doexchange_echor  F  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   r;  rY   r;   r  r   r  rv   r   r.  N)r=   r?   r@   r>   r  r   r  r  r  r  r+  r
   r  r	   ro   r5  r   r<  rn   rF  rK  rA   rD  )
rA   rF  re   r  r  r   r   r   r   r   s
             r   test_doexchange_echo_v4r  q  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   rJ   i  rK   i  )rY   rZ   cr;   rL   i  rI  r   r1  N)r=   r?   r@   r>   r  r+  r
   r  r	   ro   r5  r   r<  rn   r=  r  r   )rA   r  r  r  r   r   r   ry   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  r!  r   r   r   asciiN)r  r  r	  r
   r  r  r   r	   r4  r  r   r  astliteral_evalr  r  rq  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.r2   r1  )zgrpc.ssl_target_name_overriderA  r   r1   )r8  generic_optionsr_   N)zgrpc.max_receive_message_length    )r4   r]   r	   r  r  r8  r9  r3  rz   r7  r  r=   r   r  )r5  r-  re   r  s       r   test_generic_optionsr    s$    E	u^/D	E DEaff 5/4[/A079 ]]6889 	2MM&--01	2:;aff 5/4[/A079 ]]BOOV-H-HIJ 	2MM&--01	2! 	2 	2	2 	2 s=   AE (%EA5E %E'E E	E E	E  E)c                       e Zd ZdZd Zd Zy)CancelFlightServerzA server for testing StopToken.c                     t        j                  g       }t         j                  j                  g |      }t	        j
                  |t        j                  |            S )Nr  )r=   rn   r   r@   r	   r   r  r  )rf   rr   rw   rn   r$   s        r   rz   zCancelFlightServer.do_get  sF    2^^''6':%%fi.>.>r.BCCr   c                 "   t        j                  g       }t         j                  j                  g |      }|j	                  |       |j                         s8|j                  |       t        j                  d       |j                         s7y y )Nr  r  )	r=   rn   r   r@   r<  r  rF  r  r  )rf   rr   r   r   r   rn   r$   s          r   r   zCancelFlightServer.do_exchange  sg    2^^''6':V&&(r"JJsO &&(r   N)r|   r}   r~   r   rz   r   r!   r   r   r  r    s    )D
r   r  c                     t        j                         j                  t        j                         j                  k7  rt	        j
                  d       d t        t        j                  ffd} t               5 }t        d|j                  f      5 }|j                  t        j                  d            } | |j                         t        j                   j#                  d      }|j%                  |      \  }} | |j                         	 |j'                          d d d        d d d        y # t        t        j(                  f$ r Y ,w xY w# 1 sw Y   1xY w# 1 sw Y   y xY w)Nz'test only works from main Python threadc                  t    t        j                  d       t        j                  t        j                         y r  )r  r  signalraise_signalSIGINTr!   r   r   signal_from_threadz*test_interrupt.<locals>.signal_from_thread  s    

3FMM*r   c                    	 	 t        j                        }t        j                        5 }|j	                           |         d d d        |j                          	 j                  }t        |t        j                  t        f      s-t        |j                  t        j                  t        f      sJ y y # 1 sw Y   txY w# j                          w xY w# t        $ r t        j                  d       Y w xY w)Nr  z2KeyboardInterrupt didn't interrupt Flight read_all)r  r  r8  r9  r  ro  KeyboardInterruptfailrS  r  r=   ArrowCancelled__context__)r   texc_infor  	exc_typesr  s       r   r  ztest_interrupt.<locals>.test  s    	N$$,>?]]9- GGIJ  NN!b//1BCDq}}r'8'8:K&LM	N NM E    	N KKLM	Ns:   +C B:C C :C?C CC C<;C<r   r   r.  )r  current_threadidentmain_threadr8  r>  r  r=   r  r  r
   r  rz   r	   r7  r   ro   r5  r   r  r  )r  r  r  r   r   r   r  r  s         @@r   test_interruptr    s&   !''9+@+@+B+H+HH=>+ #B$5$56IN$ 
	 +v{{348>v}}S12V__,,88A
++J7V__	LLN   "6#>#>? 		   sC   >EA<ED4#E4EEEEE	EE(c                     d} t               5 }t        j                  d|j                  f      5 }t	        j
                  t        j                  |       5  |j                  t        j                  d            j                          d d d        |j                  t        j                  d            j                         }|j                  dk(  sJ 	 d d d        d d d        y # 1 sw Y   ^xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nz'application server implementation errorr   r  r   r  r8   )r   r	   r  r  r8  r9  r  rz   r7  r   rM  )r  r  r  ry   s       r   test_never_sends_datar  	  s    5E	#	% #NNK56#:@]]6335A 	9MM&--,-668	9
 fmmM:;DDF~~"""# # #	9 	9# # # #s;   "C=&C13C%AC1C=%C.*C11C:	6C==Dc            	      X   t         j                  j                  ddz        } t               5 }t        j                  d|j
                  f      5 }t        j                  t        d      5  |j                  | t        j                  g             \  }}|j                          d d d        t        j                  t        j                  d      5  |j                  |        d d d        d d d        d d d        y # 1 sw Y   YxY w# 1 sw Y   &xY w# 1 sw Y   *xY w# 1 sw Y   y xY w)Nr   r!  r   z%Failed to serialize Flight descriptorr  )r	   ro   r5  r   r  r  r8  r9  OSErrorr   r=   rn   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   r   r!  r   zapp_metadata size overflowr  )r	   ro   r5  r   r  r  r8  r9  r=   ArrowCapacityErrorr   rn   r@  r  r   r  r  rz   r7  r   r  )r   rG  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)rH   jsondumpsVALUESr   r   r   r   s      r   r   z ActionNoneFlightServer.do_actionR	  sV    ;;+%JJt{{+227;<<[[H$KKt$!!r   N)r|   r}   r~   r   r  r   r!   r   r   r  r  N	  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	   r4  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.
    rD   rM  )r  r   r%  c                   "    e Zd Z fdZ fdZy)0test_write_error_propagation.<locals>.FailServerc                     r   r!   rf   rr   r   r   r   excs        r   r   z7test_write_error_propagation.<locals>.FailServer.do_putw	      Ir   c                     r   r!   r  s        r   r   z<test_write_error_propagation.<locals>.FailServer.do_exchangez	  r  r   N)r|   r}   r~   r   r   )r  s   r   
FailServerr  v	  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  rJ   r  Nc                  \    	 	  j                          # t        j                  $ r Y y w xY wr   )rK  r	   r  r  s   r   r  z-test_write_error_propagation.<locals>._reader	  s4    %%' %% r  r   )r	   r  ro   r5  r=   rn   r%  r   r
   r  r   r  r  r  r8  r9  rF  r&  rS  r  r  ro  r   r@  )expected_messageexpected_infor   rn   r  r  r  r   r  r  r  r  r   s              @@r   test_write_error_propagationr  h	  s    M

%
%]4C((44S9JYY"((*-./FV,,  
 /+v{{34/8>z6:	 !!>]]6667 	J8""2??QC5#HI 	J 	J ~~((M999]]6667 	8LLN	 	 	~~((M999  ++J7	 !!>]]6667 	,8%%d+ 	, 	, ~~((M999]]6667 	8LLN	 	 	~~((M999_/ / / / / /s|   	K<!A%K'+D11D:6AK';F	K'FBK'/IIAK'J'	K''J0,2K'	K<'K0	,K<<Lc                  .    t        j                  d       y)z
    Ensure that the gRPC server is stopped at interpreter shutdown.

    See https://issues.apache.org/jira/browse/ARROW-16597.
    zarrow_16597.pyN)r   invoke_scriptr!   r   r   test_interpreter_shutdownr  	  s     	'(r   c                       e Zd ZdZd Zy)TracingFlightServerz/A server that echoes back trace context values.c                 f    |j                  d      j                  }d |j                         D        S )Ntracingc              3   N   K   | ]  \  }}| d | j                  d        yw)z: r   N)r   ).0r0   rS  s      r   	<genexpr>z0TracingFlightServer.do_action.<locals>.<genexpr>	  s2      ; S% 55'"**73 ;s   #%)r  trace_contextrq  )rf   rr   r   r  s       r   r   zTracingFlightServer.do_action	  s3    ..y9GG;$1$7$7$9; 	;r   Nr  r!   r   r   r  r  	  s
    9;r   r  c                  (   t        dt        j                         i      5 } t        d| j                  f      5 }t        j
                  ddg      }|j                  d|      D ]  } 	 d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)	Nr  r!  r   )s   traceparents7   00-000ff00f00f0ff000f0f00ff0f00fff0-000f0000f0f00000-00)s
   tracestater   r  )r   r   rv   )r  r	   TracingServerMiddlewareFactoryr
   r  r   r   )r  r  re   rS  s       r   test_tracingr  	  s    	v<<>) 
 
+v{{34 9? **5 	4
  %%j'%B 	E	     s"   B1A<+B<B	BBc                      t        dd      } d}t        j                  t        |      5  | j	                  t
        j                  j                  d      d        d d d        y # 1 sw Y   y xY w)Nzgrpc+tls://localhost:9643Tr<  zRArgument 'schema' has incorrect type \(expected pyarrow.lib.Schema, got NoneType\)r  rD   r  )r
   r8  r9  r:  r   r	   ro   r5  )r  msgs     r   .test_do_put_does_not_crash_when_schema_is_noner  	  sc    56:<F<C	y	, #f--99%@! 	 	## # #s   1A%%A.c                      G d dt               }  G fddt              } G d dt               |       } |        5 }t        d|j                  f|g      5 }|j                  t        j                  j                  d	             d
|j                  v sJ d|j                  v sJ d|j                  v sJ d|j                  v sJ 	 ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z9Ensure that server-sent headers/trailers make it through.c                       e Zd Zd Zy):test_headers_trailers.<locals>.HeadersTrailersFlightServerc                     |j                  dd       |j                  dd       |j                  dd       |j                  dd       t        j                  t	        j
                  g       |g       S )	Nx-headerheader-valuex-header-binzheadervalue	x-trailertrailer-valuex-trailer-binztrailervalue)
add_headeradd_trailerr	   rm   r=   rn   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   HeadersTrailersFlightServerr  	  s    		r   r  c                       e Zd Zd Z fdZy)?test_headers_trailers.<locals>.HeadersTrailersMiddlewareFactoryc                     g | _         y r   r  ru  s    r   rc   zHtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.__init__	  s	    DLr   c                      |       S r   r!   )rf   r   HeadersTrailersMiddlewares     r   r  zJtest_headers_trailers.<locals>.HeadersTrailersMiddlewareFactory.start_call	  s    ,T22r   N)r|   r}   r~   rc   r  )r  s   r    HeadersTrailersMiddlewareFactoryr  	  s    		3r   r  c                       e Zd Zd Zd Zy)8test_headers_trailers.<locals>.HeadersTrailersMiddlewarec                     || _         y r   r  r  s     r   rc   zAtest_headers_trailers.<locals>.HeadersTrailersMiddleware.__init__	  s	    "DLr   c                     |j                         D ]3  \  }}|D ])  }| j                  j                  j                  ||f       + 5 y r   )rq  r  r  r   )rf   r  r0   r  rS  s        r   r  zItest_headers_trailers.<locals>.HeadersTrailersMiddleware.received_headers	  sF    &}} >V# >ELL((//e=>>r   N)r|   r}   r~   rc   r  r!   r   r   r  r   	  s    	#	>r   r  r   r!  r   )r  r  )r  s   headervalue)r  r  )r  s   trailervalueN)
r   r   r   r
   r  r   r	   ro   rp   r  )r  r  r  r  r  r  s        @r   test_headers_trailersr#  	  s    
&6 
3+B 3>$4 > /0G	$	& I&+v{{3	JINTv66??CD+w>>>3wFFF-@@@5HHHI I I I I Is$   C'A/C
C'C$	 C''C0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   rL   rK   rJ   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_deltasrv   s   dict_replacement)rS   r   r   r   r)  r  r=   r  r  r<  rn   r=  )	rf   rr   r   r   r   expected_tablereceived_tablere   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   )r.  s   r   DeltaFlightServerr(  
  s    	3r   r/  r   Tr*  )write_optionsrv   r%  )r   r]   r
   r  rS   r	   ro   r5  r   r   r=   r  r  r<  rn   r=  r  r   r   r   )
r/  r  r  r,  r)  r   r   r   r-  r.  s
            @r   )test_flight_dictionary_deltas_do_exchanger1  	
  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defaultrL   )r  r  r0  r  allr  )s   abcs   defzstd)compressionF)use_threadsensure_alignment)paramr=   r  r  r   	AlignmentDataTypeSpecific)requests    r   call_options_argsr=  A
  s    }}	!! 	
 	
 
%	()VV333GFF11!!#!1!1!B!B 2 	
 	
 	r   r=  r3  r4  T)indirectc                     t        di | }|j                         }| j                         D ]  \  }}|||v sJ | d| |v rJ  y )N=r!   )r   __repr__rq  )r=  call_optionsrL  r}  vals        r   test_call_options_reprrD  X
  sh     %9'89L  "D%++- &S;$;;au~%%%&r   )r  r  r  r   r   r  r   r  r  r  r(   r  r   numpyrX  ImportErrorr8  r   r=   pyarrow.libr   r   r   pyarrow.utilr   pyarrow.testsr   r	   r   r
   r   r   r   r   r   r   r   r   r;  mark
pytestmarkr   r"   r-   r4   rB   rS   r[   r]   r   r   r   r   r   r   r   r   r   r  r  r+  rV  rm  rz  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  rG  rw  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  %header_auth_server_middleware_factoryr  r  r  r  r%  r)  r,  r/  requires_testing_datar6  r:  r?  rC  rI  rO  rQ  rT  ra  rc  rq  rs  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  large_memoryr  r  r  r  r  r  r  r  r  r#  r1  fixturer=  parametrizerD  r!   r   r   <module>rT     s  $    	            : : '   " [[

B
";
<2E+ ED&+ &R' *"- ""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)	;* 	;$#&IR5;p  , )U+d  <
&<
&qQ  	B$  F%+V"L"+16((06--06--s#   Y Y YYZ ?Z 